Карта сайта Хакер в RSS Энциклопедия Хакера PDA версия сайта Почтовые рассылки Хакера    Хакер в Twitter
Журналы Новости Форум Видео Life Xakep Live (блоги)
Bugtrack Статьи Блог Поиск English
$1000 на Android: зарабатываем на приложениях для мобильной платформы от Google $1000 НА ANDROID: ЗАРАБАТЫВАЕМ НА ПРИЛОЖЕНИЯХ ДЛЯ МОБИЛЬНОЙ ПЛАТФОРМЫ ОТ GOOGLE
27.07.2010

Пара вечеров экспериментов и неожиданно удачная идея позволили за 2 месяца заработать более $1000. Это гораздо больше, чем я мог ожидать...
Фабрика сплоитов ФАБРИКА СПЛОИТОВ
26.07.2010

Откуда берутся сплоиты? Задумывался ли ты, каким образом тусклая новость из багтрака превращается в реально работающую отмычку...

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

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

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

Как организовать сложный проект на 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, который сменят как только придумают что-то новое. Нет, это фундаментальная задумка на века. И т.д. и т.п., домашнее задание будет расхвалить шаблоны проектирования перед всеми знакомыми. ;)



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





СЛЕДУЮЩИЕ СТАТЬИ
$1000 на Android: зарабатываем на приложениях для мобильной платформы от Google
Модифицируем подписанные библиотеки в .NET
Проникаем в Extended SMRAM или еще раз о потусторонней памяти №2
.NET Remoting: программим системы распределенных grid-вычислений
Реал-тайм в Вебе: технология Comet для построения быстрых веб-приложений
Мобильные шаровары: как разрабатывать и продавать программы для Symbian
Проникаем в Extended SMRAM или еще раз о потусторонней памяти №1
Взрослые игры в электронной песочнице: персональный Sandbox на C#
Подслушиваем Skype: хакерский подход к резервному копированию VoIP-разговоров
Кодинг для Maemo 5: пишем Bluetooth-сканнер для Nokia N900
ПРЕДЫДУЩИЕ СТАТЬИ
Компиляция на форсаже с турбонаддувом
Архитектура доступа к данным в PHP
Cross-Build Injection: сборка для хакера №2
SOAP-2, или восстание машин
Cross-Build Injection: сборка для хакера №1
Невидимые LKM-атаки на Windows NT: поваренная книга руткитмейкера
Не сыпь мне соль на password: реанимируем умерший MD5
Предательский антивирус: тырим данные с flash-модулей и CD/DVD
Большой брат для мобилы
12 языков программирования, которые потрясли мир (тем, что на них нельзя программировать)
ОБСУЖДЕНИЕ СТАТЬИ
Логин:
Пароль:
Регистрации на сервере не требуется, вы можете использовать гостевой доступ.
Если у вас есть форумный логин, вы можете использовать его.
Если нет, то вы можете зарегистрироваться на forum.xakep.ru
Обсуждение этой статьи на forum.xakep.ru
ВСЕ ПОСТЫ ПРОХОДЯТ ПРЕМОДЕРАЦИЮ, не ждите их мгновенного появления в списке комментариев.
Для отправки сообщения введите код, указанный на картинке
Заголовок
Сообщение

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

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

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

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

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


Вообще-то он пересказал книжку Э.Гаммы и Ко. Как ни странно, но программирование существует и вне корпорации Майкрософт.
Guest Отправлено: 23.11.2007 3:05:07
RE: Построй свой код: шаблоны проектирования
хм... на эту тему есть прикольная книжка:
"Приемы объектно-ориентированного проектирования" Гамма,Хлем и еще какие-то :) умная, скажу вам, весчь - мне мозги в свое время вправила!
Страницы: < 1 2 >






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



    Rambler's Top100