Шаблоны проектирования: руководство для начинающих. Часть первая
by Вредный • 19.08.2010 • OOP, программирование • Комментарии [3]

Многие задаются вопросом, что же такое шаблоны проектирования. В этой заметке я расскажу вам что такое шаблоны проектирования, почему они важны в современном программировании и покажу несколько примеров.
Что есть вообще шаблоны проектирования?
Шаблоны проектирования — универсальные, многократно используемые решения, используемыми нами каждый день. Это не просто класс или библиотека, которые с легкостью мы сможем подключить в свой проект, это нечто большее. Это шаблон, который должен быть использован в нужной ситуации и почти не зависим от языка программирования. Любой шаблон — это палка о двух концах и вы можете понести большие потери, применяя не тот шаблон или применяя его не в том месте. С другой стороны правильно подобранный он сможет выиграть вам кучу времени и сил.
Существует три вида шаблонов проектирования:
- структурные
- порождающие
- поведенческие
Структурные шаблоны определяют различные сложные структуры, которые изменяют интерфейс уже существующих объектов или его реализацию, позволяя облегчить разработку и оптимизировать программу.
Порождающие обеспечивают создание новых объектов в нужной ситуации.
Поведенческие шаблоны отвечают за взаимодействие между сущностями, позволяя сделать этот процесс более гибким и простым.
Почему мы должны их использовать?
Шаблоны проектирования это хорошо продуманные решения задач программирования. Каждый программист сталкивается с этими задачами ежедневно.
Пример
Давайте представим, что перед нами стоит задача по созданию пути объединения двух классов, которые делают разные вещи в зависимости от ситуации. Эти два класса в значительной мере используются заданной системой, придавая определенную сложность для изменения или удаления существующего кода внутри них. Ко всему прочему, изменяя существующий код, мы должны протестировать его, чтобы не добавить себе немного геморроя в виде ошибок. Вместо этого мы можем использовать шаблоны проектирования Стратегия и Адаптер, которые с легкостью справятся с этой ситуацией.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php class StrategyAndAdapterClass { private $_classOne; private $_classTwo; private $_context; public function __construct($context) { $this->_context = $context; } public function doSomething() { if ('contextOfClassOne' == $this->_context) { $this->_classOne->doSomethingInClassOne(); } elseif ('contextOfClassTwo' == $this->_context) { $this->_classTwo->doSomethingInClassTwo(); } } } |
Ничего сложного, не правда ли? Теперь давайте подробнее рассмотрим шаблон Стратегия.
Стратегия
Шаблон проектирование Стратегия — поведенческий шаблон, который позволяет выбрать поведение приложения в зависимости от контекста во время выполнения. Вы инкапсулируете два различных алгоритма в двух классах, выбирая нужный.
Круто, но гдя я могу это использовать ?
Представьте, что вы создаете класс, который или создает или обновляет данные пользователя. На входе те же данные (имя, адрес, телефон и т.д.), но в зависимости от конкретной ситуации, он должен вести себя поразному. Вы возможно используете условие If-else, но что если понадобится использовать сей класс в другом месте? В этом случаем вам придется переписать условия. Но не проще ли указать контекст?
1 2 3 4 5 6 7 8 9 10 11 | class User { public function ($name, $address, $phone, $userID = null) { if (is_null($userID)) { // пользователь не существет, создаем новую запись } else { // пользователь существует, просто обновим его данные исходя из $userID } } } |
В данном примере шаблон Стратегия два алгоритма скрываются за одним классом, использование второго же можно считать расточительством.
Шаблон проектирования Адаптер
Адаптер структурный шаблон проектирования, позволяющий организовать использование методов объекта, недоступных для модификации, через специально созданный интерфейс.
Как я могу использовать его?
Адаптер также называют Оберткой. Это не странно, ведь Адаптер позволяет «обернуть» методы класса и предоставить возможность повторного их использования. Классическим примером может быть создание доменного класса для класса таблицы. Вместо вызова различных табличных классов и вызова из методов по одному, можно инкапсулировать все эти методы в один метод класса Адаптера. Это позволяет нам использовать любые методы в любом месте нашего приложения. Давайте сравним две реализации.
Подход без Адаптера
1 2 3 4 5 6 7 | <?php $user = new User(); $user->createOrUpdate (/* входные данные */); $profile = new Profile(); $profile->createOrUpdate(/* входные данные */); ?> |
Если появится необходимость использовать эти возможности в другом месте приложения, то нам придется переписывать его снова и снова.
Подход с применением Адаптера
1 2 3 4 | <?php $accountDomain = new Account(); $accountDomain->newAccount(...); ?> |
В этой ситуации у нас есть класс обертка, которая и будет нашим доменным классом Account.
1 2 3 4 5 6 7 8 9 10 11 12 | <?php class Account { public function newAccount(...) { $user = new User(); $user->createOrUpdate(...); $profile = new Profile(); $profile->createOrUpdate(...); } } |
Таким образом, мы получаем возможность использовать доменную модель Account снова и снова, ко всему прочему мы можем обернуть другие классы под эту доменную модель.
Первая часть, посвященная шаблонам проектирование, подходит к концу, жду вопросов и пожеланий, удачного вам объектно-ориентированного программирования. Не за горами следующие шаблоны проектирование, подписывайтесь на RSS, чтобы не пропустить. :]
Спасибо, мне понравилось. Сейчас прочту следующую часть.
всегда пожалуйста =)
Теперь я в деталях понял работу этих двух щаблонов… Спасибо вам!