Pull to refresh
  • by relevance
  • by date
  • by rating

Мысли вслух. ООП

Lumber room
В очередной раз спорил о смысле ООП в вебе.
Я никогда не понимал зачем объявлять объекты, описывать их. Пользоваться всеми прелястями Полиморфизма объекта при выборе наилучшего решения проблемы, наследовать родительские параметры итп итд…
только для того, чтобы сгенерить 2 килобайта текста в виде html тегов.
Как писал один замечательный автор в книге «Оптимизация web-сервера», цитирую:
«ООП в вебе с легкостью справляется со своей главной задачей — максимально нагрузить сервер ненужными действиями»
Total votes 15: ↑5 and ↓10 -5
Views 708
Comments 128

Классы, объекты и наследование в JavaScript

JavaScript *Programming *
Недавно в офисе Хабра я хотел прочитать своим коллегам небольшой доклад об объектной ориентации и наследовании классов в JavaScript.

Дело в том, что в свое время я был в полном восторге, научившись создавать свои собственные объекты и выстраивать цепочки наследования, и решил, что называется, поделиться с другими своими находками и наблюдениями. (=

Признаюсь, что в процессе подготовки текстов семинара некоторые вещи я открыл для себя заново и был вновь удивлен теми возможностями, которые JavaScript имеет в своем распоряжении, и которые становятся доступными разработчику лишь при пристальном разглядывании и экспериментировании языком.

Пользуясь тем, что семинар все время откладывается «до следующей пятницы», я решил опубликовать тексты семинара в сети, дабы мои восторги оказались полезными еще кому-нибудь.

Весь текст подеён на 5 разделов:
  1. ООП в Java Script (1/5): Объекты
  2. ООП в Java Script (2/5): Классы
  3. ООП в Java Script (3/5): Свойства и методы класса
  4. ООП в Java Script (4/5): Наследование классов
  5. ООП в Java Script (5/5): Полезные ссылки

Читать дальше →
Total votes 25: ↑21 and ↓4 +17
Views 17K
Comments 54

Типы и классы

Lumber room
1. Типы и классы. Объекты. Значения.

Определение типов и классов в языке Lada отличаются лишь ключевым словом. И типы, и классы могут иметь свойства, методы, события и даже операции (отношения или предикаты) можно определять и для класса и для типа. Иногда, даже трудно определить, что создавать тип или класс.

Пример 1. Создание класса Time.
Class Time
{
Dim Hour: Integer
Dim Minute: Integer
Dim Second: Integer
}
Пример 2. Создание типа Time.
Type Time
{
Dim Hour: Integer
Dim Minute: Integer
Dim Second: Integer
}
И в типах и в классах операторами Dim определяются свойства. И, так же как и в классах, мы можем говорить свойство Hour типа (или класса) Time. Но между ними есть существенное отличие в том, что типы создают объекты-значения, а классы создают так называемые ссылочные объекты, на которые можно ссылаться и каждый объект обладает индивидуальностью. Если для данных определенных как тип индивидуальность не важна, то для объектов создаваемых классом это принципиальный момент. Объект, создаваемый классом (например, Клиент) имеет свою индивидуальность и может присутствовать в единственном экземпляре (и соответствовать только одному реальному клиенту). Любой объект, обращающийся к объекту Клиент, делает это по ссылке или указателю. Таким образом, все объекты, обращающиеся к объекту Клиент, могут быть уверены, что имеют дело с одним объектом. Изменения, сделанные в объекте Клиент, будут доступны всем пользователям этого объекта.
Если мы хотим сравнить два объекта созданных классом, то должны сделать идентификацию самих объектов по ссылке или указателю. Как правило, копии ссылочных объектов не делаются. Разве что при необходимости репликации в сети или архивирования. Но в любом случае если копии созданы, то необходимо синхронизировать их обновление. Напротив сравнение двух объектов-значений происходит сравнением свойств этих объектов, даже если они фактически являются разными объектами и находятся в разных областях памяти.
Ценность объектов-значений именно в самом значении. Одновременно могут существовать сотни объектов с одинаковым значением времени и все они взаимозаменяемы. Изменять значение можно, но тогда это будет новый объект. Напротив изменение одного из свойств (например, изменение должности или зарплаты у объекта Клиент) в ссылочном объекте не создает новый (в смысле другой) объект. Изменяет свойства, но это по-прежнему тот, же самый объект.
Применение оператора Dim к типу создает объект-значение (выполнение всех операций необходимых для создания объекта). Применение оператора Dim к классу создает ссылку на объект-класс и никоим образом не выполняет никаких других действий по созданию собственно объекта. Однако надо же и создать объект, что б на него ссылаться. Объекты типы и классы можно отличать цветом. Вот изменяя его можно создавать объект оператором Dim для классов, и наоборот создавать ссылки на объекты значения. Такое тоже бывает нужно.
Читать дальше →
Total votes 9: ↑3 and ↓6 -3
Views 1.2K
Comments 3

Пишем свой MooTools-плагин.

MooTools *
Доброго времени суток.
Это мой первый серьезный пост на Хабре, так что критика приветствуется.
Сегодня я расскажу о написании плагина для JavaScript-библиотеки MooTools на примере модального всплывающего окна.
Итак, поехали
Total votes 76: ↑62 and ↓14 +48
Views 2.7K
Comments 61

JsOOP

Website development *
В статье речь пойдет об имитации классического ООП и строгой типизации в JavaScript (< 2.0).

Я расскажу про JsOOP – мини-фреймворк для написания JavaScript-кода в объектно-ориентированном стиле.

Читать дальше →
Total votes 40: ↑31 and ↓9 +22
Views 618
Comments 145

Perl: Централизованный вызов классов и методов. Из одного отдельно взятого класса.

Lumber room
Идея вот в чем: если, скажем, вы в процессе работы используете определенное окружение, какие-нибудь классы и модули, то может случиться так, что вы захотите, прямо-таки, возжелаете, использовать какой-нибудь класс-проводник между привычными классами и непосредственно вами.
Читать дальше →
Total votes 1: ↑1 and ↓0 +1
Views 158
Comments 2

PHP: Параметры в контексте

Lumber room
Проблема:

Требуется, чтобы несколько взаимодействующих между собой объектов могли управлять логикой определенных методов.

Например: каждый из объектов имеет метод Data(), который возвращает данные, необходимые для отображения объекта на странице (данные для шаблонизатора). Например объект $news класса News должен возвратить 5 последних новостей в приемлемом для шаблонизатора виде, например в виде массива. В свою очередь News::Data() обращается поочередно к объектам $newsPost->Data() (к вложенным объектам) для получения данных, касающихся отдельной новости (заголовок, дата и т.д.). Однако в некоторых случаях требуется, чтобы NewsPosе::Data() возвращал не полные данные, а лишь заголовок (например на главной странице сайта), а в другом случае требуется, чтобы вернулись все данные, включая ссылки на «новости по теме».
Читать дальше →
Total votes 8: ↑3 and ↓5 -2
Views 324
Comments 11

Business Objects

Lumber room
Хочу разобраться и обсудить, насколько выгодна «Доменная модель» (Domain Model) архитектуры WEB-приложений (в частности PHP), с различной точки зрения. Какие вы видите в ней недостатки, приемущества и что можно ей противопоставить.
Читать дальше →
Total votes 3: ↑3 and ↓0 +3
Views 1.6K
Comments 4

Очередной модуль для работы с MySQL

Lumber room
Не хватило кармы для помещения в специализированный блог. Но очень интересно обсудить.
Утомили рутинные операции при работе с БД. Решил хоть как-то исправить ситуацию. Потратил порядка получаса на просмотр существующих классов, не нашол ничего подходящего для себя. И решил, что проще будет, написать свой.

Собственно, что хотелось получить:
1. Сберечь свою память.
По работе приходится поддерживать и писать сайты на 4-5 серверных площадках, в разных странах. Постоянно меняются пароли и(реже но все же) сетевые адреса. Поэтому хотелось как-то централизовать настройки подключение и избавить себя от необходимости запоминать десятки адресов и паролей, а просто раскидать один файл по всем серверам и по мере надобности просто использовать нужный сервер БД.

2. Сберечь свое время.
Я ленивый. Меня быстро утомляют куски кода которые приходиться таскать с собой из скрипта в скрипт. Хотелось отдавать запрос и получать массив.

3. Хотелось свободы.
Многие модули которые попались мне на глаза за недолгое время поиска, пытались сами организовывать запросы.
Конечно кому-то это могло показаться удобнее, чем писать запросы самому, но зачастую приходится использовать сложные запросы и тратить время на анализ того как же надо это все написать, чтобы «умный» модуль превратил это все в корректный и оптимальный запрос.
читать дальше
Total votes 19: ↑2 and ↓17 -15
Views 249
Comments 16

Проектирование ООП классов (php) — линч

Lumber room
Добрый день!
Хотелось бы двигаться дальше в изучении php, и в голове крутится много нужных мне классов для разработки.
Я создал для себя репозиторий, и большинство классов использую во всех своих проектов, однако ощущение, что
я совершаю ошибки в проектировании классов меня не покидает.
Наставников, которые бы использовали ООП и репозитории классов у меня нет, поэтому я прошу хабрасообщество отлинчевать два небольших класса, которые я повсеместно использую.
Первый класс — events {} http://www.pastebin.ru/304393 (Вывод сообщений для пользователя или сохранение в базе данных для администрации). Для использования необходим также класс mysqlLayer (для работы с базой данных)
Второй класс — images {} http://www.pastebin.ru/304394 (Изменение размера картинок). Для использования необходим класс events.

Я хотел бы узнать, какие ошибки в проектировании и в использовании ООП подхода на Ваш взгляд я совершил, и в целом какие Вы можете дать рекоммендации.

UPD: (какие выводы из дискуссии на текущий момент для себя сделал)
1 — Вместо кодов ошибок в цифровом виде использовать слова (вместо 1 — notFile)
2 — Использовать общепринятое название метода getInstance а не load в паттерне Singletone
3 — Использовать enum-классы вместо строковых значений в классе
Total votes 7: ↑6 and ↓1 +5
Views 823
Comments 31

Троллинг и тролли (о том, как составлять классификацию и выделять группы)

GTD *
Устав от обилия «аналитических» статей, посвященных такому социальному явлению, как троллинг, я, честно говоря, в очередной раз составил портрет среднестатистического обитателя сети и призадумался — а насколько вообще возможна классификация этого явления? Естественно, что в 99% виденных мной статей классификация никакой научностью даже не пыталась страдать в лучшем случае оставаясь на уровне «тролль закомплексованный — тролль незакомплексованный», а в худшем — на уровне «тролль хороший — тролль плохой». Естественно, что на основе такой классификации разобраться с этим явлением практически невозможно.

Кроме того, я считаю, что данная статья будет полезна всем, кто так или иначе пытается подходить к вопросу классификации с научной точки зрения. Опираясь на нее, можно составить представление о том, как следует заниматься классификацией, и она будет полезна вам даже в том случае, если вы в гробу видали всех этих троллей и нетроллей. Можете считать, что это статья на тему научной классификации явления на примере явления «троллинг».

Топик находится в блоге «учитесь работать» просто потому, что научитесь уже, блин, составлять классификации!
Читать дальше →
Total votes 34: ↑22 and ↓12 +10
Views 3.4K
Comments 28

Принцип подстановки Барбары Лисков

Programming *
Привет, хабрачеловеки!

Захотелось вот поделиться сокровенным знанием по этой теме. К тому же материалов по этому, достаточно важному принципу проектирования классов и их наследования, в Рунете как-то негусто. Имеются формулировки вида:

«Пусть q(x) является свойством верным относительно объектов x некоторого типа T. Тогда q(y) также должно быть верным для объектов y типа S, где S является подтипом типа T.» © Wikipedia

Но они выносят мой мозг меня совершенно не радуют.

Если хочется услышать объяснение этой хрени умной фразы — прошу под кат.
Читать дальше →
Total votes 85: ↑75 and ↓10 +65
Views 87K
Comments 55

Развертываем системы при производстве компьютеров, а также в компьютерных классах и интернет-кафе

Paragon Software corporate blog
Подготовка больших партий компьютеров связана с необходимостью обеспечить их стандартным набором программного обеспечения. При этом, в зависимости от индивидуальных запросов, типовой список может претерпевать некоторые изменения.

Очевидно, что ручное восстановление образа на каждом PC – не только утомительный и рутинный труд, но также неэффективное использование ресурсов. Для того, чтобы упростить и максимально автоматизировать этот процесс специалисты нашей компании подготовили Paragon Deployment Manager 10 (DM10).

Итак, с помощью Hard Disk Manager, входящего в состав DM10, создаем образы для «эталонных» компьютеров и размещаем их на Infrastructure сервере.

image
Читать дальше →
Total votes 4: ↑3 and ↓1 +2
Views 3.4K
Comments 2

Библиотека генерации пользовательских картинок для сайта

Lumber room
Не так давно возникла у меня необходимость в подключении к проекту псевдослучайных пользовательских картинок (юзерпиков), настройки для которых привязываются к некоторой персональной пользовательской информации (логин, пароль, e-mail, whatever). Я знаю о существовании Gravatar и подобных проектов, но очень не хотелось обращаться к сторонним сервисам за такой мелочью, так что я стал искать нужный мне класс в Интернете.

Поиски продолжались минут 30, за которые я не нашёл ничего приемлемого, из разряда «подключил — заработало», а потому на скорую руку набросал на PHP небольшой класс, который делает то, что мне нужно и отвечает указанному выше принципу. Собственно, пока я искал нужное мне решение, обнаружилось, что в подобных поисках я не одинок, потому решил этот класс выложить в публичный доступ: мало ли, кому потребуется.

Класс называется Avatarco.
Для полноценной работы необходим PHP5 >= 5.3.0, но изменив одну строку можно заставить работать на PHP5 ниже, чем 5.3.0.
Описание работы класса и его исходный код доступны по адресу code.google.com/p/avatarco

Вот случайный пример его работы (или пройдите по ссылке и пообновляйте):
image

Надеюсь, пригодится не только мне.
С удовольствием выслушаю комментарии об ошибках и необходимых улучшениях/доработках.
Total votes 27: ↑24 and ↓3 +21
Views 199
Comments 17

Singleton (Одиночка) или статический класс?

Designing and refactoring *
Статья будет полезна в первую очередь разработчикам, которые теряются на собеседованиях когда слышат вопрос «Назовите основные отличия синглтона от статического класса, и когда следует использовать один, а когда другой?». И безусловно будет полезна для тех разработчиков, которые при слове «паттерн» впадают в уныние или просят прекратить выражаться :)

Что такое статический класс?


Для начала вспомним что такое статический класс и для чего он нужен. В любом CLI-совместимом языке используется следующая парадигма инкапсуляции глобальных переменных: глобальных перменных нет. Все члены, в том числе и статические, могут быть объявлены только в рамках какого-либо класса, а сами классы могут (но не должны) быть сгруппированы в каком-либо пространстве имен. И если раньше приходилось иммитировать поведение статического класса с помощью закрытого конструктора, то в .NET Framework 2.0 была добавлена поддержка статических классов на уровне платформы. Основное отличие статического класса от обычного, нестатического, в том, что невозможно создать экземпляр этого класса с помощью оператора new. Статические классы по сути являются некой разновидностью простанства имен — только в отличие от последних предназначены для размещения статических переменных и методов а не типов.

Готовимся к собеседованию дальше?
Total votes 70: ↑58 and ↓12 +46
Views 164K
Comments 84

Визуализация связей внутри класса с помощью GraphViz

PHP *
Прочитав книжку Р. Мартина «Чистый код», я исполнился решимостью и принялся за рефакторинг своего старого, большого и грязного проекта.

И захотелось мне посмотреть, как в одном из самых простых классов связаны между собой методы и поля. PhpCallGraph, быстро нагугленный, наладить не удалось (какие-то проблемы с xdebug), и к тому же, судя по примерам, он показывает связи во всём проекте, трассируя его, а мне нужно было исследовать один класс.

Я решил написать собственное решение, и вот что получилось.
Красивые картинки и не только
Total votes 41: ↑39 and ↓2 +37
Views 6.6K
Comments 19

Подход к проектированию платформы интернет дистрибьюции с помощью шаблонов

Centrobit corporate blog
Привет, Хабравчане!
Хочу рассказать о проекте Agora, которым занимается наша команда.
Agora — это платформа, позволяющая организовать дистрибьюцию товаров через интернет. Платформа интегрируется с ERP дистрибьютора и автоматизирует прием заказов, просмотр остатков, получение актов взаиморасчетов и много другое. Пользователь работает в веб-интерфейсом платформы и все его действия отражаются в ERP дистрибьютора.
Читать дальше →
Total votes 3: ↑0 and ↓3 -3
Views 2.2K
Comments 0

Перестаньте писать классы

Python *Designing and refactoring *
Фото Джэка Дидриха из профиля на G+ Признак того, что объект не должен быть классом — если в нём всего 2 метода, и один из них — инициализация, __init__. Каждый раз видя это, подумайте: «наверное, мне нужна просто одна функция».

Каждый раз когда из написанного класса вы создаёте всего один экземпляр, используете только раз и тут же выбрасываете, следует думать: «ой, надо бы это отрефакторить! Можно сделать проще, намного проще!»

Перевод доклада Джэка Дидриха, одного из ключевых разработчиков языка Питон. Доклад прозвучал 9 марта 2012 на конференции PyCon US.
Читать дальше →
Total votes 234: ↑206 and ↓28 +178
Views 156K
Comments 147