Please enable JavaScript.
Coggle requires JavaScript to display documents.
Pragmatic programmer notes, Programming patterns, Refactoring - Coggle…
-
Programming patterns
Поведенческие
-
Цепочка обязанностей
-
есть И и контейнер, который его наследует, добавляя поле-ссылку на следующий обработчик. Этот следующий обработчик добавляется динамически. В итоге - связанный список
пример
есть три существа: обезьяна, жираф и лев. Выдается банан, который проходит по цепочке. Кто ест банан - съест, кто нет - передает следующему в цепочке
Команда
-
позволяет менять логику для нескольких классов, которые ей пользуются
-
применимость
-
много классов делают одно и то же, общаясь напрямую с бизнес-логикой
-
Итератор
-
-
клиент работает с ИНТЕРФЕЙСОМ итератора. Клиент может создать свой собственный Ит или использовать готовые!
пример
Три варианта посетить Рим: самостоятельно, купить карту, купить екскурсию. Турист выбирает что ему надо сам
-
Хранитель
-
как
создается класс Хранитель и, отдельно, класс который взаимодействует с целевым К и с Х (для сохранения снимков)
-
-
-
Целевой класс имеет методы backup / restore тогда, когда Х не может быть вложенным в него (нет мех-ма вложенности, как в PHP, Python, etc)
Наблюдатель
-
как
-
наблюдатель имеет список всех подписчиков (включая особенности их подписок. Н знает кого оповестить на вызове notify у основного класса
-
Состояние
при наличии дискретного набора нескольких различных состояний, поведение объекта в которых сильно отличается, это поведение выносится в отдельный класс, который наследует интерфейс "состояние"
-
как
И состояние, классы-состояния с целевым объектом в их конструкторе!!
ЦО (целевой объект) меняет свое состояние и делегирует выполнение соответствующих методов состоянию, а не выполняет их сам
Стратегия
-
как
клиент знает про контекст, который знает про интерфейс "стратегия" и устанавливает нужную конкретную С во время выполнения программы
конкретные С наследуют общий интерфейс С, переопределяя метод "выполнить"
Шаблонный метод
разбить алгоритм на шаги, сделав шаблонный метод, который их вызывает. Делегировать части "общего" алгоритма подклассам, которые меняют логику по-умолчанию своей
пример
парсер файлов для разных типов: пдф, док, ...
недостатки
сложно поддерживать ввиду привязки к алгоритму и реализации по-умолчанию, которая должна подходить всем наследникам общего алгоритма
Посетитель
двойная диспетчирезация
для проблемы раннего связывания, возникающего в компилируемых ЯП
если бы Посетитель имел перегруженные методы для работы с каждым К, компилятор выбирал бы только метод, который принимает И, не принимая во внимания других К
-
-
-
как
посетитель
знает о всех К и умеет работать с каждым. Сам метод работы должен вызывать из К из-за двойной диспетчирезации
классы, нследующие И
определяют метод accept(visitor), который говорит visitor какой метод-обработчик выполнить (для обработки этого К)
Структурные
-
-
Мост
применимость
расширение классов в двух независимых плоскостях
П: функциональность, цвет
разбиение монолита на части
П: есть интерфейс для работы с разными БД, его реализации, и абстракция для клиента, которую он исп. для управления БД
-
-
связь между абстракцией и интерфейсом для работы с несколькими классами, которые его Н
Компоновщик (контейнер)
класс, который в ответ на запрос метода "а()" рекурсивно опрашивает своих наследников с их собственным "а()"
Все классы в этой иерархии наследуют ОДИН И для Кл
позволяет клиенту знать про общий интерфейс, а не про конкретный класс (будь то контейнер или его наследник)
-
-
Декоратор
-
конструкция
есть интерфейс А, который наследуют А1 и интерфейс-декоратор Д
-
Конструктор Д принимает на вход объект А1, который он вызывает согласно интерфейсу А, добавляя свои функции
-
пример
интерфейс Данные, класс Файловые данные, декоратор ДатаДекоратор
EncryptionDecorator, CompressionDecorator inherit DataDecorator
Фасад
-
недостаток: легко сделать "божественный" класс. В этом случае нужно сделать доп. фасады, разделив функциональность между ними
аналог из жизни - оператор компании по производству мебели. Клиент общается только с ним, а он - с фабрикой, текстилем и т.п.
Легковес
когда есть очень много похожих объектов с тяжеловесным внутренним состоянием (например, двигатель машины) и меняющимся внешним (например, скорость каждой машины с данным двиателем из 1 000 000 таких машин)
идея
создать псевдо-класс (с тяжеловесными параметрами) и фабрику, которая надстраивает внешние параметры над хранимыми экземплярами псевдо-класса
альтернатива - передавать внешние параметры прямо в метод легковеса, который в них нуждается
-
Порождающие
-
Одиночка
класс может иметь только 1 объект, разделяемый глобально между остальными
-
Фабричный метод
Создание объектов с общим интерфейсом происходит через
интерфейс создателя, который имплементируют классы,
отвечающие за первоначальные объекты
Абстрактная фабрика
изоляция фабрик производства семантически идентичных
елементов. Ю имеет интерфейс создания "кнопок" и "диалогов", не зная, как именно они создаются
Строитель
-
Может идти в паре с паттерном "Директор", когда строителей
становится много. Директор предоставляется пользователю
то объект, который знает, какие шаги строителя нужно вызвать, чтобы получить несколько самых популярных конфигураций автомобилей.
-
Клиент будет привязан к конкретным классам строителей, так как в интерфейсе директора может не быть метода получения результата
Прототип
-
+
Клиент знает только про метод clone(), а не весь класс
Нужно меньше подклассов, которые отличаются лишь наличием доп. полей
Есть возможность создать регистр прототипов, где все прототипы предварительно созданы и доступны по имени
-
Refactoring
Dispensables
definition
A dispensable is something pointless and unneeded whose absence would make the code cleaner, more efficient and easier to understand
-
comments
-
when appropriate?
-
When explaining complex algorithms (when all other methods for simplifying the algorithm have been tried and come up short).
Data class
contains only fields and not behavior,
violates OOP in some way
-
-
Techniques
-
-
Organizing data
-
-
-
-
-
-
Replace type with *
-
-
-
why
abstract operation on class attribute which semantically denotes a type, but is a string / int currently
-
-
-
-
OOP abusers
-
refused bequest
-
-
-
make parent a helper class: create a field in the child class, calling the required methods
-
-
-
Couplers
-
-
Message chains
-
cure? hide delegate (hide part of functionality), extract method to simplify the chain, ...
-