Лекция
Привет, Вы узнаете о том , что такое базовые паттерны, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое базовые паттерны, mapper, money, special case, plugin, gateway, separated interface, registry service stub , value object, record set, layer supertype, singleton , настоятельно рекомендую прочитать все из категории Проектирование веб сайта или программного обеспечения.
Паттерн проектирования Mapper
Объект, который управляет сообщением между независимыми друг от друга объектами.
Иногда нужно установить сообщение между двумя подсистемами, которые, между тем должны оставаться в неведении друг о друге. Это может быть обусловлено невозможностью изменения этих объектов, или просто нежеланием создавать зависимости между ними или между ними и изолирующей частью.
Паттерн проектирования Money
Огромное количество компьютеров в мире обрабатывают данные о деньгах. Удивительно, что класс Деньги до сих пор не является базовым в любом языке программирования. Недостаток такого рода типа данных приводит к проблемам, наиболее заметные из которых - работа с валютой. Если все вычисления в программе проделываются в одной валюте, никаких особых проблем нет, но как только вводится многовалютность - надо думать о том, чтобы не сложить 10 долларов с 10 йенами без перевода курсов валют. Менее заметна проблема с округлением. Денежные вычисления часто округляют до наименьшей из существующих мер. При этом легко не учесть копейки из-за ошибок округления.
Что действительно хорошо в ООП, так это то, что вы можете исправить эти проблемы, созданием класса Money (Деньги), чтобы работать с денежными величинами и избегать общих ошибок.
как хранить и работать с денежными суммами.
Программист для хранения значения денежных сумм используют 2 типа данных:
1) Хранение в int
2) Хранение в decimal (float без округления)
1)Хранение денежных сумм в bigint(int)
Плюсы:
Минусы:
2)Хранение денежных сумм в Deciamal/Numeric(вечественное без округления) Decimal(19,4) или Decimal(11,2)
Плюсы:
Минусы:
Паттерн проектирования Special Case
Подкласс, содержащий особую логику для отдельных ситуаций.
Null-значения в ООП - неуклюжая вещь, так как она зарубает на корню полиморфизм. Обычно есть возможность вызова какого-либо метода на переменной заданного типа без необходимости беспокоиться о том, принадлежит ли эта переменная конкретному классу или подклассу. В строго типизированных языках эту проверку делает компилятор. Тем не менее, из-за того, что переменная может содержать null, существует опасность возникновения ошибки во время выполнения, при вызове метода на null-значении.
Если переменная может принимать значение null, вам нужно постоянно заботиться о проверках на null и правильной обработке null-значений. Часто, эта "правильная обработка" одинакова во большинстве случаев, и все это заканчивается совершением греха дублированием кода (дословный перевод Мартина Фаулера).
Null-значения - яркий пример таких проблем, которые возникают постоянно и внезапно. А их много. Например, во многих системах приходится работать с бесконечностью, которая имеет особые правила для, например, сложения и нарушает обычные аксиомы, справедливые для натуральных чисел. Такие случаи предполагают изменение обычного поведения типа.
Вместо того, чтобы возвращать null или какое-то дополнительное значение, верните Special Case (Особый Случай) - объект с тем же интерфейсом, но ведущий себя иначе, чем основной.
Паттерн проектирования Plugin
Соединяет классы во время конфигурации, а не компиляции.
Паттерн Separated Interface (Выделенный интерфейс) часто используется, когда один код выполняется в нескольких средах и требует разной реализации отдельной логики. Большинство разработчиков добиваются этого при помощи использования шаблона фабрики. Представим, что надо генерировать первичный ключ при помощи паттерна Separated Interface (Выделенный интерфейс). Можно использовать для юнит-тестирования простой объект-счечик, а на реальной системе - последовательность из БД. Об этом говорит сайт https://intellect.icu . Фабричный метод скорее всего будет содержать условный переход (if), проверяющий, установлен ли флаг тестирования, и возвращать необходимый генератор ключа.
Как только у вас появится еще несколько фабрик - начнется путаница. Создание новой конфигурации, например "запуск юнит-тестов на БД без контроля транзакций" или "запуск в продакшн на DB2 с полной поддержкой транзакций", потребует правок в условиях в большом количестве фабрик, пересборку и переразвертывание.
Конфигурация не должна быть разбросана по приложению, также как и требовать пересборки и переразвертывания. Паттерн Plugin решает обе эти проблемы, предоставляя централизованную динамическую конфигурацию.
Паттерн проектирования Gateway
Объект, который инкапсулирует доступ к внешней системе и ресурсу.
Достойное ПО редко функционирует в изоляции от внешнего мира. Даже самая строго объектно-ориентированная система часто вынуждена взаимодействовать с "не объектами", например реляционная БД, CICS транзакции или структурами XML.
При доступе к такого рода внешним ресурсам, обычно используется API. Однако, API изначально являются чем-то сложным, потому что принимают во внимание структуру ресурса. Каждый, кто хочет понять какой-нибудь ресурс, должен понять его API - будь то JDBC и SQL для реляционных БД или W3C или JDOM для XML. Это делает ПО не только менее понятным, но еще это делает изменения гораздо более сложными, например, если вы собираетесь перейти со временем с SQL на XML.
Решением здесь является обертывание всего специального API в класс, интерфейс которого выглядит как интерфейс обычного объекта. Остальные объекты обращаются к ресурсу через этот Шлюз, который транслирует эти простые вызовы в соответствующий специальный API-код
Паттерн проектирования Separated Interface
Выделение какого-либо интерфейса к объекту в отдельный от объекта пакет
При разработке какой-либо системы, можно добиться улучшение ее архитектуры, уменьшая связанность между ее частями. Это можно сделать так - распределив классы по отдельным пакетам и контролировать зависимости этими пакетами. Тогда можно следовать правилам о том, как классы из одного пакета могут обращаться к классам из другого пакета. Например, то, которое запрещает классам с уровня данных обращаться к классам с уровня представления.
Тем не менее, может возникнуть необходимость реализовать методы, которые противоречат основной структуре зависимостей. В таком случае можно использовать Выделенный Интерфейс, чтобы определить какой-либо интерфейс в одном пакете, а реализовать в другом. Таким образом, любой клиент, которому нужна зависимость от этого интерфейса может совершенно не думать о реализации доступа. Паттерн Separated Interface (Выделенный Интерфейс) предоставляет хорошую точку подключения паттерна Gateway (Шлюз)
Паттерн проектирования Registry
Хорошо известный объект, который используется другими объектами для получения общих объектов и сервисов.
Когда нужно найти какой-нибудь объект, обычно начинают с другого объекта, связанного с целевым. Например, если нужно найти все счета для покупателя, начинают, как раз с покупателя и используют его метод получения счетов. Тем не менее, в некоторых случаях нет подходящего объекта, с которого начать. Например, известен ID покупателя, но нет ссылки на него. Тогда нужен своего рода объект-поисковик, но тогда возникает вопрос - как вы найдете сам поисковик?
Реестр (Registry) - это глобальный объект по сути своей или, по крайней мере, так выглядит - он может функционировать только будучи глобальным.
Паттерн проектирования Service Stub
Ликвидирует зависимость от внешних проблемных сервисов во время тестирования.
Enterprise-системы часто зависят от внешних сервисов, таких как, например, расчет кредитного рейтинга, ставки налогов и т.п. Любой разработчик, который когда-либо имел дело с такими системами пожалуется на лишнюю зависимость от абсолютно неконтролируемого ресурса. Часто эти сервисы не блещут стабильностью и надежностью.
В итоге, эти проблемы могут замедлять разработку. Разработчики вынуждены сидеть и ждать, когда удаленный сервис возобновит свою работу или встраивать в код «костыли», чтобы обходить зависимость от сервиса. Еще хуже, когда не получается выполнять тесты - весь процесс разработки нарушается.
Замена сервиса на заглушку (Service Stub), которая выполняется локально и быстро, улучшит разработку.
Маленький объект для хранения величин таких как деньги или диапазон дат, равенство которых не основано на идентичности.
При работе с ООП, приходишь к выводу, что полезно разделять ссылочные объекты и объекты-значения. Объект-значение обычно гораздо меньше. Он как простой тип данных из тех языков, которые не являются полностью объектно-ориентированными.
Паттерн проектирования Record Set
Представление данных из таблицы в приложении.
За последние двадцать лет основным способом представления данных в БД стали реляционные таблицы. Почти каждый новый разработчик использует реляционные данные.
На этой почве появилось множество инструментов для быстрого построения UI (пользовательского интерфейса). Эти UI-фреймворки основываются на реляционности данных и предоставляют различные UI-элементы, которые легко настраиваются и управляются практически безо всякого программирования.
Обратная сторона медали в том, что, несмотря на невероятную легкость вывода и работы с данными, эти элементы не предусматривают возможности добавления кода бизнес-логики. Проверки типа "правильный ли формат у эта даты" и любые правила исполнения попросту некуда поставить. И в итоге, эта логика либо забивается в БД, либо смешивается в кодом вывода информации.
Суть Record Set в предоставлении структуры данных, которая выглядит в точности как результат SQL-запроса, но может управляться и обрабатываться любыми частями системы.
Тип, выступающий родительским для всех типов в своем уровне
Нередко все классы одного уровня имеют одинаковые методы, которые не хочется дублировать повсеместно. Для того, чтобы избежать дублирования, можно все общие методы перенести в один класс (Layer Supertype), который будет являться Супертипом (читай - родителем) всех классов в своем уровне.
Паттерн проектирования Singleton
В приложении экземпляр определенного класса должен присутствовать гарантировано в одном экземпляре.
По сути создается статический экземпляр класса: защищенный от клонирования, обычного инстанцирования через конструктор, и других способов получения ссылки на единственный экземпляр — кроме статического метода-конструктора.
Пример реализации на PHP7
namespace DesingPatternsRu\Example; | |
/** | |
* | |
* @author samizdam | |
*/ | |
final class Singleton | |
{ | |
private static $instance = null; | |
public static function getInstance(): self | |
{ | |
if (empty(self::$instance)) { | |
self::$instance = new self(); | |
} | |
return self::$instance; | |
} | |
private function __constructor() | |
{ | |
// Защита от прямого создания | |
} | |
private function __clone() | |
{ | |
// Защита от клонирования экземпляра | |
} | |
private function __sleep() | |
{ | |
// Защита от попытки сериализовать с последующием извлечением | |
} | |
} |
view rawSingleton.php hosted with ❤ by GitHub
Singleton часто называют «анти-паттерном», т.к. при использовании он несет следующие проблемы:
Эти причины снижают тестируемость кода.
Поскольку это один из самых простых для понимания шаблонов, его часто используют новички, при этом злоупотребляя им. В то же время, для некоторых задач, когда нужен некий глобальный объект, и простейший способ доступа к нему из любой точки приложения (например Service Locator) самым простым решением является Singleton.
Анализ данных, представленных в статье про базовые паттерны, подтверждает эффективность применения современных технологий для обеспечения инновационного развития и улучшения качества жизни в различных сферах. Надеюсь, что теперь ты понял что такое базовые паттерны, mapper, money, special case, plugin, gateway, separated interface, registry service stub , value object, record set, layer supertype, singleton и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Проектирование веб сайта или программного обеспечения
Комментарии
Оставить комментарий
Проектирование веб сайта или программного обеспечения
Термины: Проектирование веб сайта или программного обеспечения