Карта сайта Хакер в RSS Энциклопедия Хакера PDA версия сайта Почтовые рассылки Хакера    Хакер в Twitter Хакер в ВКонтакте Приложение Хакер для Facebook Хакер на Formspring.me
Журнал Новости Форум Видео Life Xakep Live (блоги)
Bugtrack Статьи Блог Поиск English
Трюки с phpinfo Трюки с phpinfo
Совсем недавно в паблике появилась информация о новом интересном подходе к эксплуатации уязвимостей класса LFI с помощью бесполезной на первый взгляд функции phpinfo() и временных загрузочных файлов. Берем на вооружение этот полезный прием....
Интервью с создателем NGINX Игорем Сысоевым Интервью с создателем NGINX Игорем Сысоевым
Легкий веб-сервер NGINX буквально только что вышел на 2 место по популярности в интернете. А незадолго до этого создатель NGINX привлек 3 млн. долларов инвестиций и основал одноименную компанию. В общем, поводов для общения с Игорем Сысоевым у нас была масса....

Построй свой код: шаблоны проектирования

Bookmark and Share
Используешь ли ты шаблоны при проектировании программ?


Ответить | Результаты   

Все люди делятся на правильных и неправильных. Главное, что нормальные программисты, и правильные, и нет, используют в своих проектах Шаблоны Проектирования, а не лепят все как хотят от балды.

Как организовать сложный проект на PHP, чтобы его можно было легко доработать, сменить ему дизайн, добавить пару модулей и возможность экспортировать данные в любом формате, который придумают всякие умные люди (например, WML, RSS (и вообще XML), JSON, ...)? Налепить кучу страничек и сделать в каждом include 'include.php'? Выглядит разумно, но недостатков куча, например как организовать особый экспорт данных - придется ведь приделывать новую страничку для каждого формата или устраивать кучу if'ов (case'ов). Подумай, во что превратится твоя крутейшая CMS после кучи таких добавлений?

Это - типичная задача проектирования компьютерных программ. Какую бы прогу ты не писал, если она представляет собой нечто большее, чем 'Hello World!', тебе придется задуматься о ее построении - это и называется проектированием. И чтобы не напрягать излишне свой и без того напряженный мозг, люди строят программы по типовым "чертежам", которые называются шаблоны проектирования.

В каждой программе (ну, в каждой "правильной" программе ;) ) используется далеко не один шаблон проектирования. Самыми "главными", основными считаются "фундаментальные" шаблоны - они используются в почти всех программах.

Шаблон функционального дизайна.

Этот шаблон, по идее, должен использоваться во всех программах. Но это, скорее, идеал - к этому надо стремиться, но достигнуть очень сложно. Фишка в том, что каждая часть программы должна делать только то, для чего предназначена, и минимально влиять на другие части программы. То есть, если в твоем крутом калькуляторе вывод на экран и суммирование чисел происходит в одном и том же месте - это не труъ. Когда станешь развивать его, делать ему вывод покруче и научишь вычитать - поймешь, почему стоило сразу разбить код на маленькие кусочки.

Обеспечить такой дизайн достаточно просто - надо к каждой функции (процедуры тоже функции, что бы там не придумывал этот Вирт) приписывать комментарий, что она делает. Если в описании будет слово "и" или "или" ("эта функция стирает носки и готовит кофе"), значит, стоить разбить ее на две ("эта функция стирает носки", "эта функция готовит кофе").

Шаблон Заместитель (Proxy)

Нет, это не шаблон разработки или добычи анонимных соксов :). Этот шаблон описывает объект, замещающий собой другой объект, который невозможно (или не хочется) создать, но при этом он необходим. Например, если ты пишешь браузер, а у тебя не загружена картинка - можно заменить ее таким проксиком.

Реализуется это просто: создается общий интерфейс для замещаемого класса и для заместителя, после чего в заместителе реализуются все функции, часто представляющие собой обычные заглушки. Хорошо спроектированная программа не заметит обмана, а плохо спроектированных программ мы же не пишем, верно? ;)

Это далеко не все "фундаментальные" шаблоны, но как пример они очень даже хороши, а если хочешь узнать побольше - гугль тебе в руки.

Разберем такую задачку: нужно создать систему, абстрагированную от оборудования, типа ввода и вывода данных и т.п. Сделать это весьма тяжело, но на помощь, как всегда, приходят шаблоны - на этот раз "порождающие".

Абстрактная фабрика

Абстрактная фабрика - давно любимый программистами шаблон, используется он часто, поскольку удобен и чрезвычайно полезен. Идея в том, что сама задача создания объекта возлагается на отдельный модуль, который используя различную информацию создает объект, поддерживающий нужный интерфейс, но неизвестно (для системы) какого класса. Поясню: пусть нам нужна поддержка любой БД, буде то мускул, оракл или постгерс. Тогда мы можем создать класс, который будет возвращать непонятно какой объект, поддерживающий все нужные методы. Фабрика сама решит, какая БД нам нужна.

Прототип

Интересный, хоть и не так часто используемый, шаблон. Пусть нашему модулю передали объект непонятно какого класса (но, разумеется, известного интерфейса), а нам необходимо сделать таких же еще пару десятков. Определять класс и создавать объекты этого класса - не труъ. Круче, если объект сам умеет создавать себе подобных. Кстати, женщина для этого ему не нужна - достаточно метода, создающего объект того же класса и возвращающего на него ссылку.

Синглтон

А это - совсем грустный, одинокий прототип. Если в программе есть объект, который должен быть один на всех - тут-то этот шаблон и пригождается. Идея в том, что вместо создания объекта при помощи new мы создадим в нем метод и статичную (static) переменную - метод будет проверять, создан ли объект, если нет - то создавать и запоминать ссылку на него, а потом просто эту ссылку возвращать (кстати, это лишь вариант реализации - но, в любом случае, new вне класса использоваться не будет). Таким образом, мы можем использовать этот объект сходу, не особо волнуясь, создан ли он уже или нет, а вызывать нужно примерно так: OurSingletonClass::getInstance()->someMethod();.

На этом закончим с "порождающими" шаблонами, и перейдем к "структурным" - управляющим взаимодействием между объектами. Кстати, шаблон Заместителя тоже часто относят к "структурным".

Адаптер

Представь: ты просил своего друга написать тебе класс, например, работы с БД. Он и написал, да вот только ни к какому интерфейсу из используемых тобой этот класс не подходит. То есть ни в фабрику его не всунуть, ни проксик создать... Даа, задача. Но рано браться за циркулярную пилу и идти к другу в гости - как обычно, существует шаблон, который решит все наши проблемы. Называется он Адаптер, и нужен для причесывания объекта под нужный интерфейс. Реализация проста: пишем свой класс под нужный интерфейс, в нем создаем объект "плохого" класса и перебрасываем запросы туда-сюда. Типа как обычный адаптер евророзеток к старорусским. :)

Компоновщик

Помнишь еще про Шаблон функционального дизайна? Он связан с некоторой проблемой: если следовать ему, может случиться так, что ради нужной нам задачи придется создавать туеву хучу разных объектов. Чтобы не возиться со всем этим, придумали шаблон Компоновщик: он сам создаст эти объекты и скажет им что делать. Типа прораб или там прапорщик, кому что ближе. ;)

Третья из основных групп - "поведенческие" шаблоны. Они управляют алгоритмами внутри класса.

Интерпретатор

Этот шаблон отвечает за выполнение кода, написанное на другом языке, например JavaScript. Реализаций много, но основная идея в том, чтобы каждому символу формальной грамматики языка сопоставить свой объект.

Стратегия

Пусть у нас есть несколько алгоритмов: один хорош, когда данных мало, а другой - когда много. А третий вообще замечателен, но работает лишь при определенных условиях. Если все это расписывать в цепочках if'ов, то никаких нервов не хватит потом это дорабатывать. А потому придуман шаблон Стратегия - в объект, созданный по этому шаблону, "запиханы" алгоритмы (оформленные в виде отдельных объектов), и алгоритм выбора алгоритма.

Состояние

Пусть мы пишем браузер, и у нас есть та самая картинка. Пока она не загружена - объект должен работать как прокси. Когда загрузилась - как обычная картинка. А если произошла ошибка - выводить иконку с красным крестиком. Такое изменчивое поведение описывается шаблоном Состояние (State). Обычно состояния оформлены в виде разных классов с единым интерфейсом.

Помимо шаблонов, входящих в эти группы, есть шаблоны, к ним не относящиеся. Например, очень распространенный шаблон MVC (Model View Controller, Модель Представление Контроллер). Идея в том, чтобы обработку данных, их получение и их вывод полностью изолировать друг от друга. Тогда, написав контроллер получения из модели и вывода списка пользователей с именем Василий, мы сможем, меняя класс Представления, выводить данные как в виде HTML, так и в виде XML, JSON, в виде документа Microsoft Word'a или картинки. А меняя класс Модели, мы сможем делать выборку на основе данных из БД, с других сайтов и т.д. Потрясающе, разве нет? И ведь код становится читабельнее, и фреймворков под MVC написано немало.

Так что шаблоны - сила. И это не какой-нибудь развивающийся проект на ближайшие лет 5, который сменят как только придумают что-то новое. Нет, это фундаментальная задумка на века. И т.д. и т.п., домашнее задание будет расхвалить шаблоны проектирования перед всеми знакомыми. ;)



Теги: программирование





СЛЕДУЮЩИЕ СТАТЬИ
Ударь копирайтом по работодателю: возвращаем финансы, честно заработанные на служебных произведениях
Руткит в сетевухе: фантазии программиста о создании непобедимого руткита
Чемпионаты по программированию и не только
Алгоритмическая симфония из одной строчки кода
Kinect: разбираемся с новым девайсом и учимся писать для него приложения
Программное обеспечение: поглощая мир
SMS-похититель для Android: Sсriрting Layer for Android - интересная среда разработки для мобильного телефона
13 утилит для безопасной разработки: инструменты от Microsoft для написания надежного кода
Silverlight: защита и нападение
Кроссплатформенный кодинг для мобильных платформ: покоряем iOS, Android, Bada, Symbian и WM с помощью AirPlaySDK
ПРЕДЫДУЩИЕ СТАТЬИ
Компиляция на форсаже с турбонаддувом
Архитектура доступа к данным в PHP
Cross-Build Injection: сборка для хакера №2
SOAP-2, или восстание машин
Cross-Build Injection: сборка для хакера №1
Невидимые LKM-атаки на Windows NT: поваренная книга руткитмейкера
Не сыпь мне соль на password: реанимируем умерший MD5
Предательский антивирус: тырим данные с flash-модулей и CD/DVD
Большой брат для мобилы
12 языков программирования, которые потрясли мир (тем, что на них нельзя программировать)
ОБСУЖДЕНИЕ СТАТЬИ
Логин:
Пароль:
Если у вас есть форумный логин - вы можете использовать его, иначе анонимный гостевой доступ.

Для оставления комментария вы можете зарегистрироваться по упрощенной процедуре.

Обсуждение этой статьи на forum.xakep.ru
Для отправки сообщения введите код, указанный на картинке
Сообщение

UserГость
13.11.2007 17:38:36
Ответить Ссылка
хм, а как же толкование функции: каждому значению аргумента пологается определенное значение ф-ции (у).... а скажите милсдарь, какое значение у процедуры ?
UserГость
13.11.2007 21:26:48
Ответить Ссылка
ололо, на ксакепе появилась копипаста про паттерны! ух ты!
UserГость
13.11.2007 23:10:28
Ответить Ссылка
по мне так лучше E.Gamma "Design Paterns" ничего еще не написано, а эта статья лишь убогое описание некоторых патернов.

...а по поводу процедур - как было сказано в статье это тоже функция, только она возращает null и поэтому каждому значению аргумента пологается определенное значение ф-ции - null
Useralexbozhko
14.11.2007 1:59:27
Ответить Ссылка
Тема классная. Ну автор хотя бы просто диаграммы привел...
Не говоря уже об описании реализации :(
UserГость
14.11.2007 6:53:51
Ответить Ссылка
нет диаграммы здесь не обязательны, а вот ссылки на ресурсы полезные где эти диаграммы лежат будут полезнее.

Человек правильно сделал что не стал выкладывать реализацию и прочие артефакты. Статья бы в книгу привратилась или конспект лекций по ПриС'у
UserГость
14.11.2007 7:07:51
Ответить Ссылка
правильно, давно пора было это показать людям. Ученье свет, а не ученье тьма.

Ксатит по теме есть оч. неплохой ресурс с диаграмами и реализациями:
http://ooad.asf.ru/
UserГость
14.11.2007 18:50:28
Ответить Ссылка
Вот взял человек и высказал идеи, положенные в основу Microsoft Framework Class Library)
UserAbsurd
17.11.2007 19:33:46
Ответить Ссылка
quote:

Вот взял человек и высказал идеи, положенные в основу Microsoft Framework Class Library)


Вообще-то он пересказал книжку Э.Гаммы и Ко. Как ни странно, но программирование существует и вне корпорации Майкрософт.
UserГость
23.11.2007 3:05:07
Ответить Ссылка
хм... на эту тему есть прикольная книжка:
"Приемы объектно-ориентированного проектирования" Гамма,Хлем и еще какие-то :) умная, скажу вам, весчь - мне мозги в свое время вправила!
UserГость
28.11.2007 17:42:42
Ответить Ссылка
Ну хоть так написал. Статья конечно детская, но по крайней мере информирует, что такое существует. Почему детская - например описание MVC, там все гораздо сложнее, например с кнотроллером. Он следит за состоянием модели, если она меняется, то он сообщает об это представлению и она через интерфейс обращается к модели и берет данные ну и тп. Потом ни слова про столь любимый DocumentView на котором пишут еще со времен Turbo Vision, вплоть до WinForms.
UserГость
14.01.2008 7:20:51
Ответить Ссылка
Про адаптеры понравилось, ведь именно так и пишут Виндовз и современные игры - черт знает сколько надстроек над одним классом, чтоб впихнуть его интерфейс в концепцию программы. Ау, а про оптимизацию уже забыли? Четырехядерники появились - и типа все и так полетит? Вот именно что полетит - в татарары! А бесконечная ловля глюков на mfc42.dll? Приятное занятие скажете? Конечно, ООП нам помогло упростить программирование комплексных продуктов, но мозг-то должен быть! И этот мозг должен думать, как сделать программу быстрее, проще, без глюков и утечек. Не это нам предложил Страустрап.

ЗЫ: таки обучение программированию стоит начинать с С и Кнута, а не с MSVC++ и BCB!
UserГость
24.01.2008 14:51:04
Ответить Ссылка
типичная маразматическая статья обьясняющая (на своем примере) только то, почему сейчас так много чуши пишут.
UserГость
25.01.2008 8:52:22
Ответить Ссылка
Статья хороша для ознакомления с тем, что существуют
такие технологии проектирования как паттерны(шаблоны), а те кому это нужно сами найдут необходимый материал для совершенствования, учитывая что сей не является дифицитом.
UserГость
01.03.2008 8:02:49
Ответить Ссылка
2 Про адаптеры понравилось, ведь именно так и пишут Виндовз...

Истину глаголишь. Только проблема кроется не в подходе к программированию а в инструменте - С++, ибо это допотопное гавно является само по себе антипатерном языка программирования, и самое страшное что и новые языки стремяться быть на него похожими (Java, C#). Благо есть люди с мозгами, которые создают языки типа Ruby, за которыми будущее.
UserГость
11.03.2008 1:56:15
Ответить Ссылка
статья для новичков, им ничего не понятно, когда и зачем это использовать, а тем, кто в танке, ничего нового нет.

а так купите книжку "Паттерны ОО проектирования" http://www.ozon.ru/context/detail/id/2457392/ - действительно рульная книжка
UserГость
20.11.2008 10:08:09
Ответить Ссылка
Вы прослушали краткий курс введения в MS .NET
:)
Всем спасибо :) Даже примерчик маленький был на c++ .net
UserГость
09.01.2009 12:08:46
Ответить Ссылка
Лучше тоже самое прочитать из первоисточника. А тут, я вижу, скопипастено и переписано на манер ясный скрипткиддисам на коих журнал и ориентирован.
UserГость
25.01.2009 19:50:00
Ответить Ссылка
Необходимость ручного написания шаблонного кода -- признак плохого дизайна языка. Всё это должно быть на макросах.
UserГость
30.03.2010 1:56:16
Ответить Ссылка
более глупых вещей ни видел...
UserГость
09.09.2010 9:10:00
Ответить Ссылка
Классная статья. Спасибо.
PS Только коротко очень.




Keywords: zPOSTz zSOFTz, zHOWz, zINFOz, zYANDEXz, zVOTEz z41095z
Для Авторов: edit Lock delete Lock



    Rambler's Top100