Архитектура информационных систем. Часть 1. Учебное пособие
.pdfТаблица 7.3
Основные виды поведенческих паттернов
|
Паттерн |
|
Назначение |
|
|
|
|||
Цепочка ответ- |
Упрощает взаимодействие между объектами путём устранения |
|||
ственности |
|
жёсткой привязки объекта-отправителя запроса от его получа- |
||
(Chain |
of |
Re- |
теля (обработчика). Для этого объекты обработчики связывают- |
|
sponsibility) |
|
ся в цепочку, по которой запрос будет передаваться до тех пор, |
||
|
|
|
|
пока не будет обработан, возможно, несколькими обработчика- |
|
|
|
|
ми. При этом отправителю достаточно хранить только одну |
|
|
|
|
ссылку на начало цепочки |
|
|
|||
Команда (Com- |
Предполагает преобразование запроса на обработку, т.е. неко- |
|||
mand) |
|
|
торой команды, в объект. Это позволяет выполнять над ним |
|
|
|
|
|
любые операции, применимые к объектам: сохранять, переда- |
|
|
|
|
вать иным объектам или функциям в качестве параметра, воз- |
|
|
|
|
вращать в качестве результата. Может использоваться, напри- |
|
|
|
|
мер, в приложениях с интерфейсом пользователя |
|
|
|||
Интерпретатор |
Определяет грамматику некоторого языка и интерпретирует |
|||
(Interpreter) |
|
языковые предложения для решения некоторой задачи |
||
|
|
|||
|
|
|
||
Итератор |
(It- |
Предоставляет общий метод последовательного доступа к эле- |
||
erator) |
|
|
ментам различных структур данных, который не зависит от |
|
|
|
|
|
особенностей структуры и не требует её раскрытия. Упрощает |
|
|
|
|
сопряжение различных алгоритмов обхода с различными струк- |
|
|
|
|
турами данных |
|
|
|||
Моментальный |
Получает и сохраняет внутреннее состояние объекта, что по- |
|||
«снимок» |
или |
зволяет, при необходимости, восстановить объект в том же со- |
||
хранитель (Me- |
стоянии. Соблюдается инкапсуляция, т.е. сохранённое состоя- |
|||
mento) |
|
|
ние недоступно для других объектов. Может быть использован |
|
|
|
|
|
для реализации операций типа "Отмена" |
|
|
|
||
Медиатор |
или |
Предусматривает создание объекта-посредника для снижения |
||
посредник |
|
степени связанности сильно-связанных объектов системы. Объ- |
||
(Mediator) |
|
екты взаимодействуют друг с другом не непосредственно, а |
||
|
|
|
|
только через объект-посредник, вследствие чего снижается чис- |
|
|
|
|
ло взаимосвязей в системе и упрощается её структура |
|
|
|
||
Состояние |
|
Обеспечивает возможность для объекта изменять своё поведе- |
||
(State) |
|
|
ние при изменении его внутреннего состояния. Улучшает гиб- |
|
|
|
|
|
кость изменения поведения по сравнению с использованием для |
|
|
|
|
описания переходов структур данных |
|
|
|
||
Метод |
шабло- |
Позволяет "замещать" методы базового класса методами произ- |
||
на |
(Template |
водных классов. Широко используется в каркасах приложений |
||
Method) |
|
|
|
|
|
|
|
|
|
Порожающие паттерны (creational patterns) служат для созда-
ния объектов в системе (табл. 7.4) [4]. В процессе функционирова-
61
ния объектно-ориентированных систем, создается достаточно много экземпляров объектов. Порождающие паттерны упрощают процесс создания объектов, обеспечивая разработчику ряд возможностей:
•унифицированный способ создания экземпляров объектов, не требующий указания определенных типов классов в программе;
•лёгкость создания объектов: для создания экземпляра объекта не требуется разрабатывать большой объём сложного программного кода;
Паттерны Abstract Factory и Factory Method основаны на идее создания настраиваемых объектов, что предполагает использование механизма расширения создаваемых интерфейсов и классов при модификации системы, в связи с чем указанные паттерны могут совмещаться с другими видами порождающих паттернов.
|
|
|
Таблица 7.4 |
|
|
Основные виды порождающих паттернов |
|
|
|
|
Окончание табл.7.4 |
|
|
|
|
Паттерн |
|
Назначение |
|
|
|
|
|
«Абстрактная |
|
Предоставляет возможность создания групп взаимосвязан- |
|
фабрика» |
|
(Ab- |
ных объектов без необходимости указания конкретных |
stract Factory) |
|
классов объектов. Система становится независимой от ти- |
|
|
|
|
пов создаваемых объектов |
|
|
|
|
«Строитель» |
|
Обеспечивает поэтапное создание объектов большой слож- |
|
(Builder) |
|
|
ности и отделяет алгоритм его создания от внешнего пред- |
|
|
|
ставления объекта. Алгоритм создания сложного объекта |
|
|
|
определяется в специальном классе "распорядитель", а от- |
|
|
|
вечает за "сборку" иерархия классов Builder, подклассы ко- |
|
|
|
торой реализуют его отдельные части |
|
|
|
|
«Фабричный |
ме- |
Обеспечивает расширяемость и независимость системы от |
|
тод» |
(Factory |
процесса порождения объектов и их типов на основе ис- |
|
Method) |
|
|
пользования механизма полиморфизма. Объекты конкрет- |
|
|
|
ных типов создаются в классе-фабрике, методы создания |
|
|
|
классов которого называют фабричными. |
|
|
|
|
«Прототип» |
|
Упрощает создание объектов на основе прототипов (уже |
|
(Prototype) |
|
существующих в системе объектов), поддерживающих кло- |
|
|
нирование, т.е. способных создавать собственные дублика- |
||
|
|
|
|
|
|
|
ты. Объект может быть создан путём клонирования соот- |
|
|
|
ветствующего прототипа |
|
|
|
|
«Одиночка» |
|
Позволяет создать в системе лишь один экземпляр объекта |
|
(Singleton) |
|
|
некоторого класса, предоставляя доступ к нему остальным |
|
|
классам |
|
|
|
|
|
|
|
|
|
62
Паттерны параллельного программирования призваны обеспе-
чивать корректное взаимодействие асинхронно выполняющихся процессов и ориентированы на решение следующих основных проблем:
•совместное использование ресурсов: если операции обращаются к одним и тем же данным (ресурсу), то они могут конфликтовать друг с другом, если осуществляют доступ к данным (ресурсу) в один и тот же момент времени. Для корректного выполнения таких операций их необходимо выполнять таким образом, чтобы доступ к общему ресурсу в каждый момент времени получала только одна операция, при этом следует избегать ситуации их взаимной блокировки;
•управление доступом к ресурсам: при одновременном доступе операций к общему ресурсу, должен быть предусмотрен определенный порядок обращения, например, объект не может быть удален, пока не будет прочитан.
Основные типы паттернов параллельного программирования и их назначение показаны в табл. 7.5.
Таблица 7.5
Основные типы паттернов параллельного программирования и их назначение
|
|
Окончание табл.7.5 |
Паттерн |
Назначение |
|
|
|
|
Однопоточное |
Большая часть задач, связанных с управлением доступа к раз- |
|
выполнение |
деляемым ресурсам, может быть решена на основе использо- |
|
(Single Threaded |
вания однопоточного выполнения |
|
Execution) |
|
|
|
|
|
Охраняемая |
Используется в ситуации, когда поток имеет монопольный |
|
приостановка |
доступ к разделяемому ресурсу и не имеет возможности за- |
|
(Guarded |
Sus- |
вершить выполнение операции над этим ресурсом, так как не |
pension) |
|
имеет доступа к другим необходимым ресурсам |
|
|
|
Объект |
блоки- |
Используется в ситуации, когда необходимо координировать |
ровки (Lock Ob- |
доступ к нескольким различным ресурсам |
|
ject) |
|
|
|
|
|
Отмена |
(Balk- |
Используется в ситуации, когда операция либо должна быть |
ing) |
|
выполнена немедленно, либо не выполнена вообще |
|
|
|
Планировщик |
Используется в ситуации, когда имеет значение порядок вы- |
|
(диспетчер) |
полнения операций |
|
|
|
|
63
|
|
Окончание табл.7.5 |
Паттерн |
|
Назначение |
|
|
|
(Scheduler) |
|
|
|
|
|
Блокировка чте- |
Используется в ситуации, когда одни операции могут совме- |
|
ния/записи |
|
стно использовать некоторый ресурс одновременно, а другие – |
(Read/Write |
|
не могут |
Lock) |
|
|
|
|
|
Производитель- |
Обеспечивает возможность координировать объекты, которые |
|
потребитель |
|
создают некоторый ресурс, и объекты, которые используют |
(Producer |
|
данный ресурс |
/consumer) |
|
|
|
|
|
Двухфазное |
за- |
Обеспечивает правильное последовательное закрытие потоков |
вершение (Two- |
|
|
Phase Termina- |
|
|
tion) |
|
|
|
|
|
Двойная буфе- |
Специальная версия паттерна «Производитель-потребитель», |
|
ризация (Double |
которая позволяет создавать необходимый ресурс заранее |
|
Buffering) |
|
|
|
|
|
Асинхронная |
Устраняет необходимость ожидания результата операции, ес- |
|
обработка |
|
ли этот результат не требуется немедленно |
(Asynchronous |
|
|
Processing) |
|
|
|
|
|
Будущее |
(Fu- |
Позволяет классам, которые вызывают операцию, не иметь |
ture) |
|
информации о характере операции – является она синхронной |
|
|
или асинхронной |
|
|
|
Паттерны различных типов могут описываться различными способами. Наиболее часто используется описание, содержащее следующие разделы [10]: название и тип, другие названия (если имеются), назначение, обоснование (решаемые проблемы), условия целесообразного применения, структура паттерна (в объектноориентированной форме), объекты и паттерны, используемые в самом описываемом паттерне, результаты работы, рекомендации по использованию, пример реализации кода, примеры применения, близкие по назначению паттерны.
7.2. Антипаттерны
Антипаттерны (antipatterns), или ловушки (pitfalls) – это типо-
вые группы (классы) наиболее часто используемых ошибочных или неэффективных способов решения задач проектирования. Во
64
избежание подобных ошибок при проектировании, их также как и паттерны, целесообразно предварительно изучить. В ряде случаев пренебрежение антипаттернами приводит к получению неработоспособных систем [11].
Данный подход с успехом может быть использован не только в программной инженерии, но и во многих других отраслях, например, в приборостроении, строительстве и др.
Антипаттерны применительно к разработке ИС можно разделить на следующие типовые группы [12]:
в управлении разработкой ПО;
в разработке ПО;
в объектно-ориентированном программировании;
в области программирования;
методологические антипаттерны;
организационные антипаттерны.
Наиболее известные антипаттерны в управлении разработкой ПО и их характеристика приведены в табл. 7.6. Антипаттерны в разработке ПО и их характеристика приведены в табл. 7.7. Антипаттерны в объектно-ориентированном проектировании и их характеристика приведены в табл. 7.8.
Таблица 7.6 Антипаттерны в управлении разработкой ПО и их характеристика
Аптипаттерн |
Характеристика |
|
|
|
|
«Дым и зер- |
Иллюстрация вида ещё не реализованной системы. Часто ис- |
|
кала» |
(Smoke |
пользуется для демонстрации финального проекта и его функ- |
and mirrors) |
ционала. Название связано с двумя популярными средствами, |
|
|
|
которыми пользуются фокусники для сокрытия своих секре- |
|
|
тов |
|
|
|
«Раздувание» |
Тенденция к увеличению потребностей в ресурсах для каждой |
|
ПО |
(Software |
последующей версии системы. В более общем контексте при- |
bloat) |
|
меняется для описания программных систем, которые исполь- |
|
|
зуют больше ресурсов, чем необходимо |
|
|
|
«Функции для |
Добавление в программу не связанных между собой, плохо |
|
галочки» (Op- |
реализованных функций, потребность в которых практически |
|
tions checkbox) |
отсутствует (зачастую, для того чтобы лишь прорекламиро- |
|
|
|
вать наличие дополнительных функций) |
|
|
|
65
Таблица 7.7 Антипаттерны в разработке ПО и их характеристика
Аптипаттерн |
Характеристика |
||
|
|
||
Неопределенная |
Представление модели без указания ракурса ее рассмотрения |
||
точка |
|
зрения |
|
(Ambiguous |
|
||
viewpoint) |
|
|
|
|
|
||
«Большой комок |
Система, структуру которой невозможно либо очень сложно |
||
грязи» |
(Big ball |
выявить |
|
of mud) |
|
|
|
|
|
||
«Много шума из |
Необоснованно усложнённый дизайн |
||
ничего» |
(Gas |
|
|
factory) |
|
|
|
|
|
|
|
«Ляп» |
|
ввода |
Неопределённость в спецификации и неполнота поддержки |
данных» |
(Input |
возможного неверного ввода |
|
kludge) |
|
|
|
|
|
||
«Раздувание ин- |
Чрезмерно развитый и сложный интерфейс, трудный в реали- |
||
терфейса» (Inter- |
зации |
||
face bloat) |
|
|
|
|
|
||
«Магическая» |
Внедрение логики работы программы в пользовательский ин- |
||
кнопка |
(Magic |
терфейс, зачастую в программах, созданных в средах визуаль- |
|
pushbutton) |
ной разработки |
||
|
|
||
«Перестыковка» |
Введение зависимости, которая не является необходимой |
||
(Re-Coupling) |
|
||
|
|
||
«Дымоход» |
Структура, в которой потоки информации циркулируют пре- |
||
(Stovepipe |
sys- |
имущественно «вверх-вниз», а не горизонтально, между плохо |
|
tem) |
|
|
связанными компонентами |
|
|
||
«Состояние гон- |
Непредусмотренная возможность наступления событий в по- |
||
ки» (Race condi- |
следовательности, отличной от предполагаемой (в многопо- |
||
tion) |
|
|
точных приложениях) |
|
|
|
|
66
Таблица 7.8 Антипаттерны в объектно-ориентированном программировании
и их характеристика
|
|
Окончание табл.7.8 |
Аптипаттерн |
Характеристика |
|
|
|
|
Базовый |
класс- |
Наследование методов из класса-утилиты вместо делегирова- |
утилита |
(Base |
ния к данному классу |
Bean) |
|
|
|
|
|
Вызов |
предка |
Метод класса-потомка обязательно требует вызова того же |
(Call Super) |
метода класса-предка |
|
|
|
|
«Божествен- |
Сосредоточение чрезмерно большого количества данных и |
|
ный» |
объект |
функций в одной части системы (классе), аналог отказу от мо- |
(God object) |
дульного программирования |
|
|
|
|
«Полтергейст» |
Наличие объектов, которые используются только для переда- |
|
(Poltergeist) |
чи информации другим объектам |
|
|
||
|
|
|
«Проблема йо- |
Высокая степень размытости сильно связанного кода по ие- |
|
йо» (Yo-yo prob- |
рархии классов. Термин происходит от названия игрушки йо- |
|
lem) |
|
йо |
|
|
|
Синглтонизм |
Использование паттерна Одиночка там, где это не является |
|
(Singletonitis) |
необходимым |
|
|
||
|
|
|
Антипаттерны в области программирования и их характеристика приведены в табл. 7.9. Методологические антипаттерны и их характеристика приведены в табл. 7.10. Организационные антипаттерны и их характеристика приведены в табл. 7.11.
Таблица 7.9 Антипаттерны в области программирования и их характеристика
|
|
|
Окончание табл.7.9 |
|
Аптипаттерн |
Характеристика |
|
||
|
|
|
||
Ненужная слож- |
Получение решения, сложность которого необоснованно вы- |
|
||
ность (Acciden- |
сока |
|
||
tal complexity) |
|
|
|
|
|
|
|
|
|
«Действие |
на |
Непредусмотренное взаимодействие между удалёнными час- |
|
|
расстоянии» |
|
тями системы |
|
|
(Action at a dis- |
|
|
|
|
tance) |
|
|
|
|
|
|
|
||
«Накопить и за- |
Использование в качестве параметров подпрограмм набора |
|
||
пустить» |
(Ac- |
глобальных переменных |
|
|
cumulate |
and |
|
|
|
fire) |
|
|
|
|
|
|
|
|
|
67
|
|
|
Продолжение табл. 7.9 |
||
|
|
|
Окончание табл.7.9 |
||
Аптипаттерн |
Характеристика |
|
|||
|
|
|
|
||
«Лодочный |
Сохранение части системы, которая уже не используется |
|
|||
якорь» (Boat an- |
|
|
|
||
chor) |
|
|
|
|
|
|
|
|
|
||
Активное ожи- |
Организация ожидания события с потреблением ресурсов |
|
|||
дание |
(Busy |
центрального процессора, как правило, при помощи цикличе- |
|
||
spin) |
|
|
ски повторяемой проверки, вместо использования системы |
|
|
|
|
|
сообщений |
|
|
|
|
|
|
||
Кэширование |
После обработки ошибки не сброшен её флаг |
|
|||
ошибки |
(Cach- |
|
|
|
|
ing failure) |
|
|
|
||
|
|
|
|
|
|
Инерция |
кода |
Избыточное ограничение части системы, обусловленное по- |
|
||
(Code |
momen- |
стоянным учётом ее поведения в других частях системы |
|
||
tum) |
|
|
|
|
|
|
|
|
|||
Кодирование |
Кодирование путём добавления нового кода для реализации |
|
|||
путем исключе- |
каждого частного случая |
|
|||
ния |
(Coding by |
|
|
|
|
exception) |
|
|
|
||
|
|
|
|||
«Таинствен- |
Использование неизвестных аббревиатур вместо мнемониче- |
|
|||
ный» код (Cryp- |
ских имен, обеспечивающих самодокументирование про- |
|
|||
tic code) |
|
граммы |
|
||
|
|
|
|
||
Жесткое |
коди- |
Добавление в код предположений об окружении системы в |
|
||
рование |
(Hard |
чрезмерно большом количестве (задание в программе кон- |
|
||
code) |
|
кретных значений, например, путей к файлам, имён процес- |
|
||
|
|
|
сов, серверов и т.д.). Снижает переносимость программ |
|
|
|
|
|
|
||
Мягкое |
кодиро- |
Чрезмерное избегание жесткого кодирования, с обеспечением |
|
||
вание |
(Soft |
возможности настройки слишком большого числа парамет- |
|
||
code) |
|
ров, при этом настройка системы существенно усложняется и |
|
||
|
|
|
превращается и программирование |
|
|
|
|
|
|
||
«Поток |
лавы» |
Сохранение уже не используемого или некачественного кода |
|
||
(Lava flow) |
в связи с возможными высокими затратами на его удаление |
|
|||
|
|
|
или в связи с непредсказуемыми последствиями |
|
|
|
|
|
|||
«Магические» |
Включение в программы числовых значений без объяснений |
|
|||
числа |
(Magic |
их смысла. Затрудняет понимание программы |
|
||
numbers) |
|
|
|
|
|
|
|
|
|||
Процедурный |
Использование процедурной/структурной парадигмы во всех |
|
|||
код |
(Procedural |
случаях. Следует использовать ту парадигму, которая лучше |
|
||
code) |
|
соответствует конкретной задаче. Процедурная парадигма на |
|
||
|
|
|
данный момент становится антипаттерном |
|
|
|
|
|
|||
«Спагетти-код» |
Код, порядок выполнения которого затруднен для восприятия |
|
|
||
|
|
|
|
|
|
68
|
|
Окончание табл.7.9 |
Аптипаттерн |
Характеристика |
|
|
|
|
(Spaghetti code) |
|
|
|
|
|
«Мыльный |
пу- |
Класс, содержащий данные, которые никогда не используют- |
зырь» |
(Soap |
ся |
bubble) |
|
|
|
|
|
Таблица 7.10 Методологические антипаттерны и их характеристика
Аптипаттерн |
Характеристика |
|||
|
|
|||
Программиро- |
Программа создаётся путём копирования и небольшой моди- |
|||
вание |
методом |
фикации существующего кода вместо создания общего реше- |
||
копирования- |
ния. Такая методология зачастую приводит к появлению из- |
|||
вставки |
|
(Copy |
быточно больших, сложно читаемых функций, содержащих |
|
and |
paste |
pro- |
большое количество повторяющихся фрагментов кода |
|
gramming) |
|
|
||
|
|
|||
Дефакторинг |
Удаление функциональности с соответствующим изменением |
|||
(Defactoring) |
документации |
|||
|
|
|
||
«Золотой |
моло- |
Применение некоторого решения в качестве универсального |
||
ток» |
|
(Golden |
для решения самых разных задач. Название антипаттерна свя- |
|
hammer) |
|
|
зано с английской поговоркой «когда в руках молоток, все |
|
|
|
|
|
проблемы кажутся гвоздями» |
|
|
|
||
Фактор |
неверо- |
Заблуждение о невозможности срабатывания известной |
||
ятности |
|
(Im- |
ошибки |
|
probability |
fac- |
|
||
tor) |
|
|
|
|
|
|
|||
Преждевремен- |
Оптимизация на ранних этапах на основе ещё недостаточной |
|||
ная оптимизация |
информации |
|||
(Premature |
opti- |
|
||
mization) |
|
|
||
|
|
|||
«Изобретение |
Создание собственного решения, когда уже существует хо- |
|||
колеса» |
|
(Rein- |
рошее готовое решение |
|
venting |
|
the |
|
|
wheel) |
|
|
|
|
|
|
|||
«Изобретение |
Создание плохого собственного решения, когда существует |
|||
квадратного ко- |
хорошее готовое решение |
|||
леса |
(Reinvent- |
|
||
ing |
the |
|
square |
|
wheel) |
|
|
|
|
|
|
|
|
|
69
Таблица 7.11 Организационные антипаттерны и их характеристика
|
|
|
Окончание табл.7.11 |
Аптипаттерн |
Характеристика |
||
|
|
||
«Аналитический |
Приложение чрезмерно больших усилий на этапе анализа |
||
паралич» |
|
|
проекта. Способно привести к закрытию проекта до начала |
(Analysis |
paraly- |
его реализации |
|
sis) |
|
|
|
|
|
|
|
«Дойная |
коро- |
Продукт приносит хороший доход без особых затрат, но на |
|
ва» (Cash cow) |
его развитие или на разработку новых аналогичных продук- |
||
|
|
|
тов средства не выделяются |
|
|
||
Продолжитель- |
Чрезмерно большие усилия, направленные на перенос систе- |
||
ное устаревание |
мы в новые окружения |
||
(Continuous |
ob- |
|
|
solescence) |
|
|
|
|
|
|
|
«Ползущее» |
|
Улучшение отдельных характеристик в ущерб общему каче- |
|
улучшение |
|
ству системы |
|
(Creeping |
featur- |
|
|
ism) |
|
|
|
|
|
|
|
«Разработка |
ко- |
Коллективная разработка проекта при некомпетентном руко- |
|
митетом» |
(De- |
водстве, т.е. без единого системного архитектора. Зачастую на |
|
sign by commit- |
первое место ставятся личные интересы отдельных участни- |
||
tee) |
|
|
ков в ущерб качеству 14 |
|
|
||
«Продвижение |
Продолжение реализации решения даже после того, как была |
||
обязательств» |
доказана его некорректность |
||
(Escalation |
of |
|
|
commitment) |
|
|
|
|
|
||
«Я тебе это го- |
Неоправданное игнорирование мнения эксперта |
||
ворил» |
(I |
told |
|
you so) |
|
|
|
|
|
|
|
Управление, |
ос- |
Чрезмерно большое внимание к численным характеристикам, |
|
нованное |
|
на |
которые либо слабо связаны с управляемой системой, либо |
числах |
(Man- |
сложность получения которых слишком высока |
|
agement by num- |
|
||
bers) |
|
|
|
|
|
||
«Драконовские |
Необоснованно жёсткий стиль управления |
||
меры» (Manage- |
|
||
ment by |
|
|
|
perkele15) |
|
|
|
|
|
|
|
14Известна фраза по тематике этого антипаттерна: «Верблюд – это лошадь, спроектированная комитетом».
15Дьявол (в переводе с финского языка).
70
