{"id":14284,"url":"\/distributions\/14284\/click?bit=1&hash=82a231c769d1e10ea56c30ae286f090fbb4a445600cfa9e05037db7a74b1dda9","title":"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u0430\u043d\u0446\u044b \u0441 \u0441\u043e\u0431\u0430\u043a\u0430\u043c\u0438","buttonText":"","imageUuid":""}

Основы объектно-ориентированного анализа и проектирования (ООАП). Часть 2. Паттерны проектирования

Наша первая статья, посвященная ООАП, вызвала горячее обсуждение в комментариях. Здорово, что тема для многих оказалась интересной!

В первой части мы рассказали, зачем нужны паттерны проектирования, и какие они бывают. Настал момент познакомиться с паттернами проектирования поближе. В этой статье мы рассмотрим, как работают паттерны Создание объекта (Create Object), Извлечение (Retrieve), Извлечение нового (Retrieve New), а также, на что обратить внимание аналитику при их использовании.

Паттерн создание объекта (Create object)

Казалось бы, что может быть необычного в создании объекта? Зачем нужно создавать отдельный паттерн для такой типовой задачи проектирования?

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

Паттерн создания объекта является элементарным паттерном, и служит для проектирования того, какие процессы будут происходить с экземпляром класса при его создании.

Важно отметить, что этот паттерн характеризует промежуток времени от момента создания объекта до его первого сохранения в системе (инициализации).

Что предусматривает использование паттерна:

  1. Определение родительского объекта класса и состава свойств и методов создаваемого класса.

  2. Определение способов создания объекта.
  3. Описание ограничений доступности для редактирования свойств.
  4. Описание значений свойств по умолчанию.
  5. Описание проверок на выполнение предварительных условий создания экземпляра класса.

С назначением определились. Теперь разберем работу паттерна на примере.

Предположим, нам нужно спроектировать некоторый новый тип документа в системе - Протокол совещания.

  1. Определяем родительский класс и свойства класса.

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

Изучив все свойства и методы родительского класса, мы можем определить: какие свойства будем использовать, какие следует скрыть, а какие добавить.

2. Определяем способы создания объекта в системе.

Как и в каких местах системы мы сможем создать объект. Возможно это будет отдельный экран или отдельное действие в интерфейсе. А, возможно, у вас будет несколько вариантов создания экземпляра класса.

3. Накладываем ограничения на доступность свойств и методов.

Например, поле Состояние в карточке документа не должно быть доступно для редактирования. В поле Подписал должен быть выбор только определенных сотрудников, в зависимости от инициатора создания документа.

4. Описываем значения свойств по умолчанию.

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

5. Описываем проверки на выполнение предварительных условий.

Например, данный документ могут создавать в системе только сотрудники входящие в преднастроенную роль Секретари совещаний.

Следует держать в уме, что инициализация может происходить на разных уровнях. На уровне класса объекта, на уровне модулей, на уровне решения в целом. Паттерн позволяет не упустить детали при проектировании классов и снизить недопонимание между аналитиком и разработчиком при реализации.

Паттерн Извлечения (Retrieve)

Паттерн Извлечение также относится к классу элементарных паттернов. Он характеризует связь текущего экземпляра класса с другими экземплярами системы.

Его следует применять, если связанный класс оказывает влияние на свойства и методы исходного класса. Использование паттерна подразумевает изучение свойств и методов каждого связанного класса.

Чтобы стало понятнее, как работает паттерн, вновь вернемся к нашему Протоколу совещания. У документа есть свойство Вид документа.

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

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

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

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

Паттерн Извлечение нового (Retrieve New)

Этот паттерн является составным и включает в себя паттерны Создание объекта и Извлечения нового.

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

Рассмотрим сразу пример. В карточке справочника Населенные пункты есть поле Страна с методом Создать страну. Он позволяет создать новую запись справочника Страны из класса Населенные пункты, если необходимая запись отсутствует.

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

Дилара Валитова
Ведущий аналитик Акелон

В следующей главе мы разберем еще четыре паттерна: Получить доступ, Наследование, Абстрактный интерфейс и Fulfill Method. Пишите в комментариях, какой паттерн показался самым полезным? Используете паттерны в своей работе?

0
5 комментариев
Дилара Валитова

Элементарные паттерны описаны вот в этой книге Смит Дж. "Элементарные шаблоны проектирования". Принцип такой - сначала изучаем элементарные паттерны (кирпичи), потом более сложные Банды четырех (стены).
Аналитики изучают основы ООАП и паттерны:
- для того чтобы понимать текущую реализацию и не сломать то, что работает;
- для того, чтобы не тратить время на проекте для нахождения общего языка с разработчиком;
- предварительная проработка архитектуры решения, чтобы сразу увидеть слабые места решения, а также учесть, например, масштабирование.
При этом нет задачи декомпозировать объекты, так как это происходит на уровне кода. Достаточно видеть укрупненно из каких классов будет состоять система и как они между собой связаны.

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Дилара Валитова

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

Ответить
Развернуть ветку
2 комментария
Раскрывать всегда