Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Базовые паттерны - Mapper,Money , Special Case ,Plugin ,Gateway,Separated Interface , Registry,Service Stub, Value Object,Record Set ,Layer Supertype,Singleton

Лекция



Привет, Вы узнаете о том , что такое базовые паттерны, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое базовые паттерны, mapper, money, special case, plugin, gateway, separated interface, registry service stub , value object, record set, layer supertype, singleton , настоятельно рекомендую прочитать все из категории Проектирование веб сайта или программного обеспечения.

  • Mapper (Распределитель)
  • Money (Деньги)
  • Special Case (Особый Случай)
  • Plugin (Плагин)
  • Gateway (Шлюз)
  • Separated Interface (Выделенный интерфейс)
  • Registry (Реестр)
  • Service Stub (Сервисная заглушка)
  • Value Object (Объект-значение)
  • Record Set ()
  • Layer Supertype (Супертип Уровня)
  • Singleton (Одиночка)

Mapper (Распределитель)

Базовые паттерны - Mapper,Money , Special Case ,Plugin ,Gateway,Separated Interface , Registry,Service Stub, Value Object,Record Set ,Layer Supertype,Singleton

Паттерн проектирования Mapper

Описание Mapper

Объект, который управляет сообщением между независимыми друг от друга объектами.

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

Паттерн Money (Деньги)

Базовые паттерны - Mapper,Money , Special Case ,Plugin ,Gateway,Separated Interface , Registry,Service Stub, Value Object,Record Set ,Layer Supertype,Singleton

Паттерн проектирования Money

Описание Money

Огромное количество компьютеров в мире обрабатывают данные о деньгах. Удивительно, что класс Деньги до сих пор не является базовым в любом языке программирования. Недостаток такого рода типа данных приводит к проблемам, наиболее заметные из которых - работа с валютой. Если все вычисления в программе проделываются в одной валюте, никаких особых проблем нет, но как только вводится многовалютность - надо думать о том, чтобы не сложить 10 долларов с 10 йенами без перевода курсов валют. Менее заметна проблема с округлением. Денежные вычисления часто округляют до наименьшей из существующих мер. При этом легко не учесть копейки из-за ошибок округления.

Что действительно хорошо в ООП, так это то, что вы можете исправить эти проблемы, созданием класса Money (Деньги), чтобы работать с денежными величинами и избегать общих ошибок.

как хранить и работать с денежными суммами.

Программист для хранения значения денежных сумм используют 2 типа данных:
1) Хранение в int
2) Хранение в decimal (float без округления)

1)Хранение денежных сумм в bigint(int)

Плюсы:

  • Нет плавающей точки — меньше неточностей
  • Можно производить стандартные математичесские операции и не бояться, что будут потери при округлении
  • Математические операцим выполняются быстрее в разы
  • Международный стандарт по денежным единицам en.wikipedia.org/wiki/ISO_4217 ISO 4217 , из которого следует что число знаков после запятой у них может быть разное. А значит для простоты разработки, все стоит хранить в минимальной дробной денежной единице валюты в целочисленном формате, осущеставляя конвертацию при выводе

Минусы:

  • Надо помнить о постоянном умножении/делении на 100


2)Хранение денежных сумм в Deciamal/Numeric(вечественное без округления) Decimal(19,4) или Decimal(11,2)
Плюсы:

  • Храниться в естественном виде
  • Не надо дополнительно совершать действий при выводе

Минусы:

  • При неаккуратной работе (не через bcmath- расширение PHP для вычислений с произвольной точностью) можно ошибиться при умножении или делении
  • Работа через bcmath медленее
  • У разной валюты разное количество знаков поле запятой - если в приложении мультивалютная система, будет избыточность данных. Придется делать более 2 знаков после запятой, но они будут нужны не всем
  • Роберт Мартин: «Использовать числа с плавающей точкой для представления денежных сумм — почти преступление»

Special Case (Особый Случай)

Базовые паттерны - Mapper,Money , Special Case ,Plugin ,Gateway,Separated Interface , Registry,Service Stub, Value Object,Record Set ,Layer Supertype,Singleton

Паттерн проектирования Special Case

Описание Special Case

Подкласс, содержащий особую логику для отдельных ситуаций.

Null-значения в ООП - неуклюжая вещь, так как она зарубает на корню полиморфизм. Обычно есть возможность вызова какого-либо метода на переменной заданного типа без необходимости беспокоиться о том, принадлежит ли эта переменная конкретному классу или подклассу. В строго типизированных языках эту проверку делает компилятор. Тем не менее, из-за того, что переменная может содержать null, существует опасность возникновения ошибки во время выполнения, при вызове метода на null-значении.

Если переменная может принимать значение null, вам нужно постоянно заботиться о проверках на null и правильной обработке null-значений. Часто, эта "правильная обработка" одинакова во большинстве случаев, и все это заканчивается совершением греха дублированием кода (дословный перевод Мартина Фаулера).

Null-значения - яркий пример таких проблем, которые возникают постоянно и внезапно. А их много. Например, во многих системах приходится работать с бесконечностью, которая имеет особые правила для, например, сложения и нарушает обычные аксиомы, справедливые для натуральных чисел. Такие случаи предполагают изменение обычного поведения типа.

Вместо того, чтобы возвращать null или какое-то дополнительное значение, верните Special Case (Особый Случай) - объект с тем же интерфейсом, но ведущий себя иначе, чем основной.

Plugin (Плагин)

Базовые паттерны - Mapper,Money , Special Case ,Plugin ,Gateway,Separated Interface , Registry,Service Stub, Value Object,Record Set ,Layer Supertype,Singleton

Паттерн проектирования Plugin

Описание Plugin

Соединяет классы во время конфигурации, а не компиляции.

Паттерн Separated Interface (Выделенный интерфейс) часто используется, когда один код выполняется в нескольких средах и требует разной реализации отдельной логики. Большинство разработчиков добиваются этого при помощи использования шаблона фабрики. Представим, что надо генерировать первичный ключ при помощи паттерна Separated Interface (Выделенный интерфейс). Можно использовать для юнит-тестирования простой объект-счечик, а на реальной системе - последовательность из БД. Об этом говорит сайт https://intellect.icu . Фабричный метод скорее всего будет содержать условный переход (if), проверяющий, установлен ли флаг тестирования, и возвращать необходимый генератор ключа.

Как только у вас появится еще несколько фабрик - начнется путаница. Создание новой конфигурации, например "запуск юнит-тестов на БД без контроля транзакций" или "запуск в продакшн на DB2 с полной поддержкой транзакций", потребует правок в условиях в большом количестве фабрик, пересборку и переразвертывание.

Конфигурация не должна быть разбросана по приложению, также как и требовать пересборки и переразвертывания. Паттерн Plugin решает обе эти проблемы, предоставляя централизованную динамическую конфигурацию.

Gateway (Шлюз)

Базовые паттерны - Mapper,Money , Special Case ,Plugin ,Gateway,Separated Interface , Registry,Service Stub, Value Object,Record Set ,Layer Supertype,Singleton

Паттерн проектирования Gateway

Описание Gateway

Объект, который инкапсулирует доступ к внешней системе и ресурсу.

Достойное ПО редко функционирует в изоляции от внешнего мира. Даже самая строго объектно-ориентированная система часто вынуждена взаимодействовать с "не объектами", например реляционная БД, CICS транзакции или структурами XML.

При доступе к такого рода внешним ресурсам, обычно используется API. Однако, API изначально являются чем-то сложным, потому что принимают во внимание структуру ресурса. Каждый, кто хочет понять какой-нибудь ресурс, должен понять его API - будь то JDBC и SQL для реляционных БД или W3C или JDOM для XML. Это делает ПО не только менее понятным, но еще это делает изменения гораздо более сложными, например, если вы собираетесь перейти со временем с SQL на XML.

Решением здесь является обертывание всего специального API в класс, интерфейс которого выглядит как интерфейс обычного объекта. Остальные объекты обращаются к ресурсу через этот Шлюз, который транслирует эти простые вызовы в соответствующий специальный API-код

Separated Interface (Выделенный интерфейс)

Базовые паттерны - Mapper,Money , Special Case ,Plugin ,Gateway,Separated Interface , Registry,Service Stub, Value Object,Record Set ,Layer Supertype,Singleton

Паттерн проектирования Separated Interface

Описание Separated Interface

Выделение какого-либо интерфейса к объекту в отдельный от объекта пакет

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

Тем не менее, может возникнуть необходимость реализовать методы, которые противоречат основной структуре зависимостей. В таком случае можно использовать Выделенный Интерфейс, чтобы определить какой-либо интерфейс в одном пакете, а реализовать в другом. Таким образом, любой клиент, которому нужна зависимость от этого интерфейса может совершенно не думать о реализации доступа. Паттерн Separated Interface (Выделенный Интерфейс) предоставляет хорошую точку подключения паттерна Gateway (Шлюз)

Registry (Реестр)

Базовые паттерны - Mapper,Money , Special Case ,Plugin ,Gateway,Separated Interface , Registry,Service Stub, Value Object,Record Set ,Layer Supertype,Singleton

Паттерн проектирования Registry

Описание Registry

Хорошо известный объект, который используется другими объектами для получения общих объектов и сервисов.

Когда нужно найти какой-нибудь объект, обычно начинают с другого объекта, связанного с целевым. Например, если нужно найти все счета для покупателя, начинают, как раз с покупателя и используют его метод получения счетов. Тем не менее, в некоторых случаях нет подходящего объекта, с которого начать. Например, известен ID покупателя, но нет ссылки на него. Тогда нужен своего рода объект-поисковик, но тогда возникает вопрос - как вы найдете сам поисковик?

Реестр (Registry) - это глобальный объект по сути своей или, по крайней мере, так выглядит - он может функционировать только будучи глобальным.

Service Stub (Сервисная заглушка)

Базовые паттерны - Mapper,Money , Special Case ,Plugin ,Gateway,Separated Interface , Registry,Service Stub, Value Object,Record Set ,Layer Supertype,Singleton

Паттерн проектирования Service Stub

Описание Service Stub

Ликвидирует зависимость от внешних проблемных сервисов во время тестирования.

Enterprise-системы часто зависят от внешних сервисов, таких как, например, расчет кредитного рейтинга, ставки налогов и т.п. Любой разработчик, который когда-либо имел дело с такими системами пожалуется на лишнюю зависимость от абсолютно неконтролируемого ресурса. Часто эти сервисы не блещут стабильностью и надежностью.

В итоге, эти проблемы могут замедлять разработку. Разработчики вынуждены сидеть и ждать, когда удаленный сервис возобновит свою работу или встраивать в код «костыли», чтобы обходить зависимость от сервиса. Еще хуже, когда не получается выполнять тесты - весь процесс разработки нарушается.

Замена сервиса на заглушку (Service Stub), которая выполняется локально и быстро, улучшит разработку.

Value Object (Объект-значение)

Описание Value Object

Маленький объект для хранения величин таких как деньги или диапазон дат, равенство которых не основано на идентичности.

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

Record Set

Базовые паттерны - Mapper,Money , Special Case ,Plugin ,Gateway,Separated Interface , Registry,Service Stub, Value Object,Record Set ,Layer Supertype,Singleton

Паттерн проектирования Record Set

Описание Record Set

Представление данных из таблицы в приложении.

За последние двадцать лет основным способом представления данных в БД стали реляционные таблицы. Почти каждый новый разработчик использует реляционные данные.

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

Обратная сторона медали в том, что, несмотря на невероятную легкость вывода и работы с данными, эти элементы не предусматривают возможности добавления кода бизнес-логики. Проверки типа "правильный ли формат у эта даты" и любые правила исполнения попросту некуда поставить. И в итоге, эта логика либо забивается в БД, либо смешивается в кодом вывода информации.

Суть Record Set в предоставлении структуры данных, которая выглядит в точности как результат SQL-запроса, но может управляться и обрабатываться любыми частями системы.

Layer Supertype (Супертип Уровня)

Описание Layer Supertype

Тип, выступающий родительским для всех типов в своем уровне

Нередко все классы одного уровня имеют одинаковые методы, которые не хочется дублировать повсеместно. Для того, чтобы избежать дублирования, можно все общие методы перенести в один класс (Layer Supertype), который будет являться Супертипом (читай - родителем) всех классов в своем уровне.

Singleton (Одиночка)

Базовые паттерны - Mapper,Money , Special Case ,Plugin ,Gateway,Separated Interface , Registry,Service Stub, Value Object,Record Set ,Layer Supertype,Singleton

Паттерн проектирования Singleton

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

создано: 2017-07-31
обновлено: 2024-11-14
84



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Проектирование веб сайта или программного обеспечения

Термины: Проектирование веб сайта или программного обеспечения