У вас вопросы?
У нас ответы:) SamZan.net

процессов встречаются ситуации когда решение проблем в различных проектах имеют сходные структурные черты

Работа добавлена на сайт samzan.net:

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 28.12.2024

Паттерны, их классификация

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

Паттерны ООАП различаются степенью детализации и уровнем абстракции. Предлагается следующая общая классификация паттернов по категориям их применения:

  •  Архитектурные паттерны
  •  Паттерны проектирования
  •  Паттерны анализа
  •  Паттерны тестирования
  •  Паттерны реализации

Архитектурные паттерны(Architectural patterns) - множество предварительно определенных подсистем со спецификацией их ответственности, правил и базовых принципов установления отношений между ними.

Архитектурные паттерны предназначены для спецификации фундаментальных схем структуризации программных систем. Наиболее известными паттернами этой категории являются паттерны GRASP (General Responsibility Assignment Software Pattern). Эти паттерны относятся к уровню системы и подсистем, но не к уровню классов. Как правило, формулируются в обобщенной форме, используют обычную терминологию и не зависят от области приложения. Паттерны этой категории систематизировал и описал К. Ларман.

Паттерны проектирования (Design patterns) - специальные схемы для уточнения структуры подсистем или компонентов программной системы и отношений между ними.

Паттерны проектирования описывают общую структуру взаимодействия элементов программной системы, которые реализуют исходную проблему проектирования в конкретном контексте. Наиболее известными паттернами этой категории являются паттерны GoF (Gang of Four), названные в честь Э. Гаммы, Р. Хелма, Р. Джонсона и Дж. Влиссидеса, которые систематизировали их и представили общее описание. Паттерны GoF включают в себя 23 паттерна. Эти паттерны не зависят от языка реализации, но их реализация зависит от области приложения.

Паттерны анализа (Analysis patterns) - специальные схемы для представления общей организации процесса моделирования.

Паттерны анализа относятся к одной или нескольким предметным областям и описываются в терминах предметной области. Наиболее известными паттернами этой группы являются паттерны бизнес-моделирования ARIS (Architecture of Integrated Information Systems), которые характеризуют абстрактный уровень представления бизнес-процессов. В дальнейшем паттерны анализа конкретизируются в типовых моделях с целью выполнения аналитических оценок или имитационного моделирования бизнес-процессов.

Паттерны тестирования (Test patterns) - специальные схемы для представления общей организации процесса тестирования программных систем.

К этой категории паттернов относятся такие паттерны, как тестирование черного ящика, белого ящика, отдельных классов, системы. Паттерны этой категории систематизировал и описал М. Гранд. Некоторые из них реализованы в инструментальных средствах, наиболее известными из которых является IBM Test Studio. В связи с этим паттерны тестирования иногда называют стратегиями или схемами тестирования.

Паттерны реализации (Implementation patterns) - совокупность компонентов и других элементов реализации, используемых в структуре модели при написании программного кода.

Эта категория паттернов делится на следующие подкатегории: паттерны организации программного кода, паттерны оптимизации программного кода, паттерны устойчивости кода, паттерны разработки графического интерфейса пользователя и др. Паттерны этой категории описаны в работах М. Гранда, К. Бека, Дж. Тидвелла и др. Некоторые из них реализованы в популярных интегрированных средах программирования в форме шаблонов создаваемых проектов. В этом случае выбор шаблона программного приложения позволяет получить некоторую заготовку программного кода.

При разработке систем постоянно возникают вопросы, которые являются определяющими при моделировании:

как распределить обязанности между классами и объектами?

как должны взаимодействовать объекты?

какие функции выполняют конкретные классы?

Некоторые проверенные временем решения таких вопросов, возникающих во время разработки, были сформулированы в виде шаблонов (паттернов) проектирования именованных формул решения проблем, позволяющих систематизировать процесс разработки. Шаблоны проектирования позволяют не решать каждую новую  задачу с нуля, а воспользоваться  предыдущими удачными решениями

В хорошо структурированных системах можно найти множество  образцов. Образец (Pattern) предлагает типичное решение типичной проблемы в данном контексте. Механизм - это образец проектирования, применимый к сообществу классов; каркас (Framework) - это, как правило, архитектурный образец, предлагающий расширяемый шаблон для приложений в одной конкретной области.

Образец, или паттерн (Pattern), - это типичное решение типичной проблемы в данном контексте. Механизм (Mechanism) - это образец проектирования, применимый к сообществу классов. Каркас (Framework) - это архитектурный образец, предлагающий расширяемый шаблон для приложений в одной конкретной области.

Занимаясь разработкой архитектуры новой системы или развитием существующей, вы в любом случае никогда не начинаете с нуля (см. главу 2). Напротив, прежний опыт и принятые соглашения наводят вас на мысль применить типичные способы для решения типичных проблем. Например, при построении системы, активно взаимодействующей с пользователем, вы можете прибегнуть к испытанному подходу "модель-вид-контроллер", который позволяет четко отделить объекты (модель) от их представления (вида) и от агентов, обеспечивающих синхронизацию между тем и другим (контроллеров). Аналогично при создании системы для дешифровки доказала свою полезность архитектура на основе "классной доски" (blackboard), хорошо приспособленная для решения сложных задач методом проб и ошибок.

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

Образцы входят в UML просто потому, что являются важной составляющей словаря разработчика. Явно выделив образцы в системе, вы сделаете ее более понятной и простой для развития и сопровождения.

.

При моделировании образцов в UML помните, что они работают на многих уровнях абстракции, начиная от отдельных классов и кончая системой в целом. Самые интересные виды образцов - это механизмы и каркасы. Хорошо структурированный образец обладает следующими свойствами:

  •  решает типичную проблему типичным способом;
  •  включает структурную и поведенческую составляющие;
  •  раскрывает элементы управления и стыковки, с помощью которых его можно настроить на разные контексты;.
  •  является атомарным, то есть не разбивается на меньшие образцы;
  •  oхватывает разные индивидуальные абстракции в системе.

Изображая образец в UML, руководствуйтесь следующими правилами:

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

История

В 1970-е годы архитектор Кристофер Александр (англ.) составил набор шаблонов проектирования. В области архитектуры эта идея не получила такого развития, как позже в области программной разработки.

В 1987 году Кент Бэк (Kent Beck) и Вард Каннигем (Ward Cunningham) взяли идеи Александра и разработали шаблоны применительно к разработке программного обеспечения для разработки графических оболочек на языке Smalltalk.

В 1988 году Эрих Гамма (Erich Gamma) начал писать докторскую диссертацию при цюрихском университете об общей переносимости этой методики на разработку программ.

В 1989—1991 годах Джеймс Коплин (James Coplien) трудился над разработкой идиом для программирования на C++ и опубликовал в 1991 году книгу Advanced C++ Idioms.

В этом же году Эрих Гамма заканчивает свою докторскую диссертацию и переезжает в США, где в сотрудничестве с Ричардом Хелмом (Richard Helm), Ральфом Джонсоном (Ralph Johnson) и Джоном Влиссидсом (John Vlissides) публикует книгу Design Patterns — Elements of Reusable Object-Oriented Software. В этой книге описаны 23 шаблона проектирования. Также команда авторов этой книги известна общественности под названием Банда четырёх (англ. Gang of Four, часто сокращается до GoF). Именно эта книга стала причиной роста популярности шаблонов проектирования.

Польза

Главная польза каждого отдельного шаблона состоит в том, что он описывает решение целого класса абстрактных проблем. Также тот факт, что каждый шаблон имеет свое имя, облегчает дискуссию об абстрактных структурах данных (ADT) между разработчиками, так как они могут ссылаться на известные шаблоны. Таким образом, за счёт шаблонов производится унификация терминологии, названий модулей и элементов проекта.

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

 Критика

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

Нередко шаблонами заменяется отсутствие или недостаточность документации в сложной программной среде.

Есть мнение, что слепое применение шаблонов из справочника, без осмысления причин и предпосылок выделения каждого отдельного шаблона, замедляет профессиональный рост программиста, так как подменяет творческую работу механическим подставлением шаблонов. Люди, придерживающиеся данного мнения, считают, что знакомиться со списками шаблонов надо тогда, когда «дорос» до них в профессиональном плане — и не раньше. Хороший критерий нужной степени профессионализма — выделение шаблонов самостоятельно, на основании собственного опыта. При этом, разумеется, знакомство с теорией, связанной с шаблонами, полезно на любом уровне профессионализма и направляет развитие программиста в правильную сторону. Сомнению подвергается только использование шаблонов «по справочнику».

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

Для преодоления этих недостатков используется рефакторинг.

По словам Кристофера Александра, «любой паттерн описывает задачу, которая снова и снова возникает в нашей работе, а также принцип ее решения, причем таким образом, что это решение можно потом использовать миллион раз, ничего не изобретая заново» [AIS+77]. Хотя Александр имел в виду паттерны, возникающие при проектировании зданий и городов, но его слова верны и в отношении паттернов объектно-ориентированного проектирования. Наши решения выражаются в терминах объектов и интерфейсов, а не стен и дверей, но в обоих случаях смысл паттерна – предложить решение определенной задачи в конкретном контексте.

В общем случае паттерн состоит из четырех основных элементов:

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

Задача. Описание того, когда следует применять паттерн. Необходимо сформулировать задачу и ее контекст. Может описываться конкретная проблема проектирования, например способ представления алгоритмов в виде объектов. Иногда отмечается, какие структуры классов или объектов свидетельствуют о негибком дизайне. Также может включаться перечень условий, при выполнении которых имеет смысл применять данный паттерн.

Решение. Описание элементов дизайна, отношений между ними, функций каждого элемента. Конкретный дизайн или реализация не имеются в виду, поскольку паттерн – это шаблон, применимый в самых разных ситуациях. Просто дается абстрактное описание задачи проектирования и того, как она может быть решена с помощью некоего весьма обобщенного сочетания элементов (в нашем случае классов и объектов).

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

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

Паттерн проектирования именует, абстрагирует и идентифицирует ключевые аспекты структуры общего решения, которые и позволяют применить его для создания повторно используемого дизайна. Он вычленяет участвующие классы и экземпляры, их роль и отношения, а также функции. При описании каждого паттерна внимание акцентируется на конкретной задаче объектно-ориентированного проектирования. Анализируется, когда следует применять паттерн, можно ли его использовать с учетом других проектных ограничений, каковы будут последствия применения метода. Поскольку любой проект в конечном итоге предстоит реализовывать, в состав паттерна включается пример кода на языке C++ (иногда на Smalltalk), иллюстрирующего реализацию.

Хотя, строго говоря, паттерны используются в проектировании, они основаны на практических решениях, реализованных на основных языках объектно-ориентированного программирования типа Smalltalk и C++, а не на процедурных (Pascal, C, Ada и т.п.) или объектно- ориентированных языках с динамической типизацией (CLOS, Dylan, Self). Мы выбрали Smalltalk и C++ из прагматических соображений, поскольку чаще всего работаем с ними и поскольку они завоевывают все большую популярность.

Выбор языка программирования безусловно важен. В наших паттернах подразумевается использование возможностей Smalltalk и C++, и от этого зависит, что реализовать легко, а что – трудно. Если бы мы ориентировались на процедурные языки, то включили бы паттерны наследование, инкапсуляция и полиморфизм. Некоторые из наших паттернов напрямую поддерживаются менее распространенными языками. Так, в языке CLOS есть мультиметоды, которые делают ненужным паттерн посетитель. Собственно, даже между Smalltalk и C++ есть много различий, из-за чего некоторые паттерны проще выражаются на одном языке, чем на другом (см., например, паттерн итератор).

. Паттерны проектирования в нотации языка UML

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

Паттерн проектирования в контексте языка UML представляет собой параметризованную кооперацию вместе с описанием базовых принципов ее использования.

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


Рис. 14.1.  Изображение паттерна в форме параметризованной кооперации

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

Паттерны проектирования позволяют решать различные задачи, с которыми постоянно сталкиваются проектировщики объектно-ориентированных приложений. Ниже представлен полный список паттернов проектирования GoF и краткое описание назначения каждого из них (таблица 14.1).

Таблица 14.1. Полный список паттернов проектирования GoF

Название паттерна

Перевод

Назначение паттерна

1

Abstract Factory

Абстрактная фабрика

Предоставляет интерфейс для создания множества связанных между собой или независимых объектов, конкретные классы которых неизвестны.

2

Adapter(синоним - Wrapper)

Адаптер (Обертка)

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

3

Bridge

Мост

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

4

Builder

Строитель

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

5

Chain of Responsibility

Цепочка обязанностей

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

6

Command

Команда

Инкапсулирует запрос в виде объекта, обеспечивая параметризацию клиентов типом запроса, установление очередности запросов, протоколирование запросов и отмену выполнения операций.

7

Composite

Компоновщик

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

8

Decorator

Декоратор

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

9

Facade

Фасад

Предоставляет единый интерфейс к множеству операций или интерфейсов в системе на основе унифицированного интерфейса для облегчения работы с системой.

10

Factory Method

Фабричный метод

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

11

Flyweight

Приспособленец

Использует принцип разделения для эффективной поддержки большого числа мелких объектов.

12

Interpreter

Интерпретатор

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

13

Iterator

Итератор

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

14

Mediator

Посредник

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

15

Memento

Хранитель

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

16

Observer

Наблюдатель

Специфицирует зависимость типа "один ко многим" между различными объектами, так что при изменении состояния одного объекта все зависящие от него получают извещение и автоматически обновляются.

17

Prototype

Прототип

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

18

Proxy

Заместитель

Подменяет выбранный объект другим объектом для управления контроля доступа к исходному объекту.

19

Singleton

Одиночка

Для выбранного класса обеспечивает выполнение требования единственности экземпляра и предоставления к нему полного доступа.

20

State

Состояние

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

21

Strategy

Стратегия

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

22

Template Method

Шаблонный метод

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

23

Visitor

Посетитель

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

В качестве примеров рассматриваются два паттерна проектирования, которые нашли наибольшее применение при проектировании программных систем: паттерны Фасад и Наблюдатель.

Каркасы приложений

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

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

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

В UML каркас моделируется в виде стереотипного пакета. Раскрыв этот пакет, вы увидите механизмы, существующие в любом из видов системной архитектуры

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

Каркас – это набор взаимодействующих классов, составляющих повторно используемый дизайн для конкретного класса программ [Deu89, JF88]. Например, можно создать каркас для разработки графических редакторов в разных областях: рисовании, сочинении музыки или САПР [VL90, Joh92]. Другим каркасом рекомендуется пользоваться при создании компиляторов для разных языков программирования и целевых машин [JML92]. Третий упростит построение приложений для финансового моделирования [BE93]. Каркас можно подстроить под конкретное приложение путем порождения специализированных подклассов от входящих в него абстрактных классов.

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

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

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

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

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

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

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

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

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

как архитектурные элементы, паттерны проектирования мельче, чем каркасы. Типичный каркас содержит несколько паттернов. Обратное утверждение неверно;

паттерны проектирования менее специализированы, чем каркасы. Каркас всегда создается для конкретной предметной области. В принципе каркас графического редактора можно использовать для моделирования работы фабрики, но его никогда не спутаешь с каркасом, предназначенным специально для моделирования. Напротив, включенные в наш каталог паттерны разрешается использовать в приложениях почти любого вида. Хотя, безусловно, существуют и более специализированные паттерны (скажем, паттерны для распределенных систем или параллельного программирования), но даже они не диктуют выбор архитектуры в той же мере, что и каркасы.

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

Типы Группы паттернов проектирования.

    Порождающие паттерны.


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

    Их всего 5:
    1. Абстрактная фабрика (Abstract Factory)
    2. Одиночка (Singleton)
    3. Прототип (Prototype)
    4. Строитель (Builder)
    5. Фабричный метод (Factory Method)

    Структурные паттерны.


    Здесь также есть два типа — паттерны уровня класса и паттерны уровня объекта. Самым ярким примером первых, на мой взгляд является «Адаптер». Общий смысл его в том, что если вдруг у нас есть класс и его интерфейсы не совместимы с другими библиотеками в нашей системе, то что бы разрешить этот конфликт, мы не изменяем код этого класса, а пишем для него адаптер. Очень часто этот паттерн применяется при написании библиотек, которые позволяют работать с различными СУБД. Паттерны уровня объекта позволяют достичь большей гибкости в приложения во время его выполнения. Наиболее популярный из них - «Декоратор».

    Всего 7:
    1. Адаптер (Adapter)
    2. Декоратор (Decorator)
    3. Заместитель (Proxy)
    4. Компоновщик (Composite)
    5. Мост (Bridge)
    6. Приспособленец  (Flyweight)
    7. Фасад (Facade)

    Паттерны поведения.

 
    Основная идея паттернов этого типа — взаимодействие объектов и классов между собой. Но они также делятся на два уровня — паттерны поведения уровня класса и паттерны поведения уровня объекта. Здесь самое сложное это добиться наименьшей степени связанности компонентов системы друг с другом, потому что почти все объекты должны знать о существовании других и нести в себе эту информацию. Отсюда и появились такие сложные паттерны как «Посредник» и «Цепочка обязанностей».

    Их 11:
    1. Интерпретатор (Interpreter)
    2. Итератор (Iterator)
    3. Команда (Command)
    4. Наблюдатель (Observer)
    5. Посетитель (Visitor)
    6. Посредник (Mediator)
    7. Состояние (State)
    8. Стратегия (Strategy)
    9. Хранитель (Memento)
    10. Цепочка обязанностей (Chain of Responsibility)
    11. Шаблонный метод (Template Method)

Абстрактная фабрика (Паттерн)

Абстрактная фабрика (англ. Abstract factory)порождающий шаблон проектирования, позволяющий изменять поведение системы, варьируя создаваемые объекты, при этом сохраняя интерфейсы. Он позволяет создавать целые группы взаимосвязанных объектов, которые, будучи созданными одной фабрикой, реализуют общее поведение. Шаблон реализуется созданием абстрактного класса Factory, который представляет собой интерфейс для создания компонентов системы (например, для оконного интерфейса он может создавать окна и кнопки). Затем пишутся наследующиеся от него классы, реализующие этот интерфейс.

  •  

 Цель

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

Плюсы

  •  изолирует конкретные классы;
  •  упрощает замену семейств продуктов;
  •  гарантирует сочетаемость продуктов.

 Минусы

  •  сложно добавить поддержку нового вида продуктов.

Применимость

  •  Система не должна зависеть от того, как создаются, компонуются и представляются входящие в нее объекты.
  •  Входящие в семейство взаимосвязанные объекты должны использоваться вместе и вам необходимо обеспечить выполнение этого ограничения.
  •  Система должна конфигурироваться одним из семейств составляющих ее объектов.
  •  Требуется предоставить библиотеку объектов, раскрывая только их интерфейсы, но не реализацию.


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

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

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

    Если собрать все в кучу, то при разработке мы должны создать:

  •  абстрактный класс — фабрику;
  •  абстрактные классы — объекты, которые она будет создавать (это может быть и один объект);
  •  написать уже конкретный класс(-ы), который(-ые) будет(-ут) реализовывать методы и/или дополнять их, это будут фабрики производящие семейства объектов;
  •  создать реальные классы продуктов (в некоторых случаях они могут быть пустыми и наследовать функционал от своих абстрактных родителей);

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

   

#include <iostream>

 

// AbstractProductA

class ICar

{

public:

 virtual void printName() = 0;

};

 

// ConcreteProductA1

class Ford : public ICar

{

public:

 virtual void printName() 

 { 

 std::cout << "Ford" << std::endl; 

 }

};

 

// ConcreteProductA2

class Toyota : public ICar

{

public:

 virtual void printName() 

 { 

 std::cout << "Toyota" << std::endl; 

 }

};

 

// AbstractProductB

class IEngine

{

public:

       virtual void printPower() = 0;

};

 

// ConcreteProductB1

class FordEngine : public IEngine

{

public:

 virtual void printPower() 

 { 

        std::cout << "Ford Engine 4.4" << std::endl; 

 }

};

 

// ConcreteProductB2

class ToyotaEngine : public IEngine

{

public:

 virtual void printPower() 

 { 

 std::cout << "Toyota Engine 3.2" << std::endl; 

 }

};

 

 

// AbstractFactory

class ICarFactory

{

public:

 virtual ICar*     createCar()    = 0;

 virtual IEngine*  createEngine() = 0;

};

 

// ConcreteFactory1

class FordFactory : public ICarFactory

{

public:

 // from ICarFactory

 virtual ICar* createCar()

 {

 return new Ford();

 }

 

 virtual IEngine* createEngine()

 {

 return new FordEngine();

 }

};

 

// ConcreteFactory2

class ToyotaFactory : public ICarFactory

{

public:

       // from ICarFactory

       virtual ICar* createCar()

 {

 return new Toyota();

 }

 

 virtual IEngine* createEngine()

 {

 return new ToyotaEngine();

 }

};

 

 

void use(ICarFactory* f)

{

ICar*     myCar     =  f->createCar();

IEngine*  myEngine  =  f->createEngine();

 

 myCar->printName();

myEngine->printPower();

 

 delete myCar;

 delete myEngine;

}

 

 

int main()

{

ToyotaFactory toyotaFactory;

FordFactory fordFactory;

 

use (&toyotaFactory);

use (&fordFactory);

 

 return 0;

}

Что мы получим в итоге?

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

Singleton (Одиночка)

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

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

    Класс "Одиночка" должен иметь как миниму одну операцию - Instance она предоставляет доступ к единственному экземпляру. Как правило это статичная функция.

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

Шаблоны параллельного программирования (Concurrency)

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

  •  Active Object
  •  Balking
  •  Double checked locking/Блокировка с двойной проверкой
  •  Guarded suspension
  •  Half-Sync/Half-Async
  •  Leaders/followers
  •  Monitor Object
  •  Reactor
  •  Read write lock
  •  Scheduler/Планировщик
  •  Thread pool
  •  Thread-Specific Storage
  •  Single Thread Execution/Однопоточное выполнение

MVC

  •  Model-View-Controller (MVC) Модель-представление-контроллер
  •  Model-View-Presenter
  •  Model-View-View Model
  •  Presentation-Abstraction-Control

[править] Enterprise

  •  Business Delegate
  •  Composite Entity/Составная Сущность
  •  Composite View
  •  DAO (Data Access Object) Объект Доступа к Данным
  •  Dispatcher View
  •  Front Controller
  •  Intercepting Filter
  •  Service Activator
  •  Service Locator/Локатор Службы
  •  Service to Worker
  •  Session Facade/Фасад Сессии
  •  Transfer Object Assembler
  •  Transfer Object/Объект Перемещения
  •  Value List Handler/Обработчик Списка Значений
  •  View Helper

[править] Unsorted

  •  Property Container
  •  Event Channel
  •  Repository/Хранилище

[править] Другие типы шаблонов

Также на сегодняшний день существует ряд других шаблонов:

  •  Carrier Rider Mapper, предоставление доступа к хранимой информации
  •  аналитические шаблоны, описывают основной подход для составления требований для программного обеспечения (requirement analysis) до начала самого процесса программной разработки
  •  коммуникационные шаблоны, описывают процесс общения между отдельными участниками/сотрудниками организации
  •  организационные шаблоны, описывают организационную иерархию предприятия/фирмы
  •  Анти-паттерны (Anti-Design-Patterns) описывают как не следует поступать при разработке программ, показывая характерные ошибки в дизайне и в реализации.

нти-паттерны (anti-patterns), также известные как ловушки (pitfalls) — это классы наиболее часто внедряемых плохих решений проблем. Они изучаются, как категория, в случае когда их хотят избежать в будущем, и некоторые отдельные случаи их могут быть распознаны при изучении неработающих систем.

Термин происходит из информатики, из книги «Банды четырёх» Шаблоны проектирования, которая заложила примеры практики хорошего программирования. Авторы назвали эти хорошие методы «шаблонами проектирования», и противоположными им являются «анти-паттерны». Частью хорошей практики программирования является избегание анти-паттернов.

Концепция также прекрасно подходит к машиностроению. Несмотря на то, что термин нечасто используется вне программной инженерии, концепция является универсальной.

Содержание

[убрать]

  •  1 Некоторые различаемые анти-паттерны в программировании 
    •  1.1 Анти-паттерны в управлении разработкой ПО
    •  1.2 Анти-паттерны в разработке ПО
    •  1.3 Анти-паттерны в объектно-ориентированном программировании
    •  1.4 Анти-паттерны в программировании
    •  1.5 Методологические анти-паттерны
    •  1.6 Анти-паттерны управления конфигурацией
  •  2 Некоторые организационные анти-паттерны
  •  3 Некоторые социальные анти-паттерны
  •  4 Шуточные анти-паттерны
  •  5 См. также
  •  6 Литература
  •  7 Ссылки

[править] Некоторые различаемые анти-паттерны в программировании

См. Категория:Анти-паттерны для более подробного списка.

[править] Анти-паттерны в управлении разработкой ПО

  •  Дым и зеркала (Smoke and mirrors): Демонстрация того, как будут выглядеть ненаписанные функции (название происходит от двух излюбленных способов, которыми фокусники скрывают свои секреты).
  •  Раздувание ПО (Software bloat): Разрешение последующим версиям системы требовать всё больше и больше ресурсов.
  •  Функции для галочки: Превращение программы в конгломерат плохо реализованных и не связанных между собой функций (как правило, для того, чтобы заявить в рекламе, что функция есть).

[править] Анти-паттерны в разработке ПО

  •  Инверсия абстракции (Abstraction inversion): Создание простых конструкций поверх сложных (спорный)
  •  Неопределённая точка зрения (Ambiguous viewpoint): Представление модели без спецификации её точки рассмотрения
  •  Большой комок грязи (Big ball of mud): Система с нераспознаваемой структурой
  •  Блоб (Blob): см. Божественный объект (God object)
  •  Бензиновая фабрика (Gas factory): Необязательная сложность дизайна
  •  Затычка на ввод данных (Input kludge): Забывчивость в спецификации и выполнении поддержки возможного неверного ввода
  •  Раздувание интерфейса (Interface bloat): Изготовление интерфейса очень мощным и очень трудным для осуществления
  •  Магическая кнопка (Magic pushbutton): Выполнение результатов действий пользователя в виде неподходящего (недостаточно абстрактного) интерфейса. Например, в системах типа Delphi это написание прикладной логики в обработчиках нажатий на кнопку.
  •  Перестыковка (компьютер) (Re-Coupling): Процесс внедрения ненужной зависимости
  •  Дымоход (Stovepipe system): Редко поддерживаемая сборка плохо связанных компонентов
  •  Гонки (Race hazard, Race condition): непредвидение возможности наступления событий в порядке, отличном от ожидаемого

[править] Анти-паттерны в объектно-ориентированном программировании

  •  Базовый класс-утилита (BaseBean): Наследование функциональности из класса-утилиты вместо делегирования к нему
  •  Вызов предка (CallSuper): Для реализации прикладной функциональности методу класса-потомка требуется в обязательном порядке вызывать те же методы класса-предка.
  •  Ошибка пустого подкласса (Empty subclass failure): Создание класса (в Perl), который не проходит «проверку пустоты подкласса» («Empty Subclass Test») из-за различного поведения по сравнению с классом, который наследуется от него без изменений
  •  Божественный объект (God object): Концентрация слишком большого количества функций в одной части системы (классе)

В объектно-ориентированном программировании божественный объект (англ. God object) — это объект, который хранит в себе «слишком много» или делает «слишком много». Является примером анти-паттерна.

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

Подход «божественного объекта» противоположен этому принципу: основная часть функциональности программы кодируется в одном объекте. Так как этот объект хранит большое количество данных и имеет много методов, его роль в программе становится «божественной» (всеобъемлющей).

Вместо того, чтобы общаться друг с другом непосредственно, другие объекты полагаются на божественный объект. Так как на божественный объект ссылается так много кода, его обслуживание (внесение изменений) становится сложным: велик риск сломать существующую функциональность.

Божественный объект — это объектно-ориентированный аналог отказа от использования подпрограмм в процедурном программировании или использования слишком большого количества глобальных переменных для хранения информации о состоянии программы.

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

  •  Объектная клоака (Object cesspool): Переиспользование объектов, находящихся в непригодном для переиспользования состоянии.
  •  Полтергейст (компьютер) (Poltergeist): Объекты, чьё единственное предназначение — передавать информацию другим объектам
  •  Проблема йо-йо (Yo-yo problem): Чрезмерная размытость сильно связанного кода (например, выполняемого по порядку) по иерархии классов
  •  Синглетонизм (Singletonitis): Избыточное использование паттерна синглетон

[править] Анти-паттерны в программировании

  •  Ненужная сложность (Accidental complexity): Внесение ненужной сложности в решение
  •  Действие на расстоянии (Action at a distance): Неожиданное взаимодействие между широко разделёнными частями системы
  •  Накопить и запустить (Accumulate and fire): Установка параметров подпрограмм в наборе глобальных переменных
  •  Слепая вера (Blind faith): Недостаточная проверка (a) корректности исправления ошибки или (b) результата работы подпрограммы
  •  Лодочный якорь (Boat anchor): Сохранение более не используемой части системы
  •  Активное ожидание (Busy spin): Потребление ресурсов ЦПУ (процессорного времени) во время ожидания события, обычно при помощи постоянно повторяемой проверки, вместо того, чтобы использовать систему сообщений
  •  Кэширование ошибки (Caching failure): Забывать сбросить флаг ошибки после её обработки
  •  Воняющий подгузник (The Diaper Pattern Stinks): Сброс флага ошибки без ее обработки или передачи вышестоящему обработчику
  •  Проверка типа вместо интерфейса (Checking type instead of membership, Checking type instead of interface): Проверка того, что объект имеет специфический тип в то время, когда требуется только определённый интерфейс
  •  Инерция кода (Code momentum): Сверхограничение части системы путём постоянного подразумевания её поведения в других частях системы
  •  Кодирование путём исключения (Coding by exception): Добавление нового кода для поддержки каждого специального распознанного случая
  •  Таинственный код (Cryptic code): Использование аббревиатур вместо мнемоничных имён
  •  Жёсткое кодирование (Hard code): Внедрение предположений об окружении системы в слишком большом количестве точек её реализации
  •  Мягкое кодирование (Soft code): Патологическая боязнь жёсткого кодирования, приводящая к тому, что настраивается всё что угодно, при этом конфигурирование системы само по себе превращается в программирование.
  •  Поток лавы (Lava flow): Сохранение нежелательного (излишнего или низкокачественного) кода по причине того, что его удаление слишком дорого или будет иметь непредсказуемые последствия
  •  Магические числа (Magic numbers): Включение в алгоритмы чисел без объяснений их смысла
  •  Процедурный код (Procedural code): Когда другая парадигма является более подходящей
  •  Спагетти-код (Spaghetti code): Код с чрезмерно запутанным порядком выполнения
  •  Мыльный пузырь (Soap bubble): Класс, инициализированый мусором, максимально долго притворяется, что содержит какие-то данные.

[править] Методологические анти-паттерны

  •  Программирование методом копирования-вставки (Copy and paste programming): Копирование (и лёгкая модификация) существующего кода вместо создания общих решений
  •  Дефакторинг (De-Factoring): Процесс уничтожения функциональности и замены её документацией
  •  Золотой молоток (Golden hammer): Сильная уверенность в том, что любимое решение универсально применимо. Название происходит от английской поговорки «когда в руках молоток, все проблемы кажутся гвоздями».
  •  Фактор невероятности (Improbability factor): Предположение о невозможности того, что сработает известная ошибка
  •  Преждевременная оптимизация (Premature optimization): Оптимизация на основе недостаточной информации
  •  Изобретение колеса (Reinventing the wheel): Ошибка адаптации существующего решения
  •  Изобретение квадратного колеса (Reinventing the square wheel): Создание плохого решения, когда существует хорошее

[править] Анти-паттерны управления конфигурацией

  •  Ад зависимостей (Dependency hell): Проблемы с версиями требующихся продуктов, особенно в системах UNIX/GNU/Linux
  •  DLL-ад (DLL hell): Проблемы с версиями, доступностью и увеличением количества DLL, особенно в Microsoft Windows

.

[править] Некоторые организационные анти-паттерны

  •  Аналитический паралич (Analysis paralysis): Выделение непропорционально больших усилий в фазе анализа проекта
  •  Дойная корова (Cash cow): Закрытый продукт, приносящий выгоду, часто ведёт к самоуспокоенности относительно новых продуктов
  •  Продолжительное устаревание (Continuous obsolescence): Выделение непропорционально больших усилий портированию системы в новые окружения
  •  Сваливание расходов (Cost migration): Перенос расходов на проект к уязвимому отделу или бизнес-партнёру
  •  Ползущий улучшизм (Creeping featurism): Добавление новых улучшений в ущерб качеству системы
  •  Разработка комитетом (Design by committee): Результат того, что имеется много содействующих разработке, но не имеется единого видения
  •  Эскалация обязательств (Escalation of commitment): Продолжение реализации решения в том случае, когда неправильность его доказана.
  •  Я тебе это говорил (I told you so): Когда игнорируется предупреждение эксперта, являющееся оправданным
  •  Управление основанное на числах (Management by numbers): Уделение избыточного внимания численным критериям управления, когда они неважны или стоимость их получения слишком высока
  •  Драконовские меры (Management by perkele): Жёстко авторитарный стиль управления, в том случае, когда он не оправдан.
  •  Управление грибами (Mushroom management): Удержание работников в неинформированном и занятом состоянии
  •  Расползание рамок (Scope creep): Дозволение рамкам проекта расти без должного контроля
  •  Замкнутость на продавце (Vendor lock-in): Изготовление системы, жёстко привязанной к одному поставщику.
  •  Тёплое тело (Warm body): Человек, чей вклад в проект под сомнением, особенно если рассмотрен в панике
  •  Единственный знающий человек (Single head of knowledge): ЕЗЧ (SHOK) Единственный человек во всей организации контролирует жизненно-важную область ноу-хау или информации о внутренностях системы. Система оказывается "завязана" на этого человека. При его уходе или бездействии работа останавливается.
  •  Рыцарь на белом коне (Knight in shining armor): РНБК (KISA) происходит тогда, когда личность, которая не совершает ошибок, появляется на сцене и пытается починить всё, без сообщений о том, какие изменения он сделал/сделает и почему.

[править] Некоторые социальные анти-паттерны

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

  •  Цензура (Censorship): Подавление дискуссии и запрещение определённых тем в рамках обсуждения системы, в результате которого система ухудшается по качеству, функциональности или другим показателям
  •  Концентрация власти (Political corruption, Concentrated power): Индивидуальное злоупотребление властью, даже с изначально хорошими помыслами
  •  Демократия (Democracy): Большая группа индивидов не может принимать аргументированные решения, а руководствуется лишь поверхностной информацией.
  •  Диктатура (Dictatorship): Не всегда один индивид имеет все навыки, необходимые для ведения проекта и грамотного управления (контрпример - Королёв).
  •  Дискриминация (Discrimination): Концентрация на неуместных особенностях усиливает экономическую неэффективность и социальную напряжённость
  •  Догма (Dogmatic religion): Догма подавляет индивидуальное мышление и тормозит прогресс
  •  Нетерпимость (Intolerance): Настаивание на изменении нежелательных, но безопасных особенностей других людей влечёт усиление напряжённости и также, очень часто является задачей, которая отнимает время от проекта, и решение которой не имеет значительных плюсов
  •  Монополия (Monopoly): Без соперничества большинство эффектов свободного рынка не работают, и частная компания не имеет стимула действовать максимально эффективно
  •  Система голосования на основе большинства (Plurality voting system): Политика при голосовании на основе большинства вырождается в две полярно-противоположные партии, результатом чего является подавление других политических воззрений
  •  Соревнование в популярности (Popularity contest): Популярность становится самодостаточной величиной и не сопоставима ни с каким другими параметрами или достоинствами
  •  Сегрегация (Racial segregation): Разделение по равноправию весьма редко, если вообще существует; ведёт к напряжённости
  •  Однопартийная система (Single-party system): Аналогично монополии, но внутри компании.
  •  Тоталитаризм (Totalitarianism): Нередко подавление индивидуальности с переходом за определённые рамки, ведёт к напряжённости, которая отрицательно влияет на эффективность.
  •  Преступление без жертв (Victimless crime): Подавление поведения создаёт субкультуру людей, постоянно живущих по другим законам, для которых эта правовая система является врагом
  •  Охота на ведьм (Witch hunt): Попытки отыскать козла отпущения, но если проблема никогда не решается в действительности, результатом будет являться поиск всё новых и новых козлов отпущения
  •  Нулевой Год (Year Zero): Социальное изменение является долгим процессом, ускорение его влечёт катастрофу

[править] Шуточные анти-паттерны

  •  Паблик Морозов: Класс-потомок, созданный в соответствии с этим антипаттерном, выдает по запросу все данные класса-предка, независимо от степени их сокрытия. Название данного анти-паттерна — это каламбур, основанный на созвучии ключевого слова public (паблик), часто означающего открытый доступ к методам и полям класса в объектно-ориентированных языках программирования, и имени пионера-героя Павлика Морозова, известного тем, что он выдал своего отца-кулака.

PAGE  25




1. Тема- Фізіологія збудливих тканин Плазматична мембрана Зовнішня об
2. і. Перші київські князі їх внутрішня та зовнішня політика
3. Тема 1 Конституционное государственное право как отрасль права Задача 1 ООО Лопух и ЗАО Тромбон п
4. Бронхиальная астма
5. Астрономические объекты древнего мира
6. Лабораторная работа 3 Исследования напряженности магнитного поля на результаты сильномагнитных минерало
7. Обзор литературы 7 1
8. Средняя общеобразовательная школа с
9. за того что у неё были проблемы с работой
10. Тема 1Основы экономики
11. Учение об инфекции
12. тема розглядається як соціотехніческая оскільки в сьогоднішньому промисловому виробництві постійно взаємо
13.  Количество Установленная мощность m kи cos~ Средн
14. Россия при Петре I
15. Если веры нет то нет настоящего Если я не прав то судьба меня научит Пусть надо мной тогда сойдутся туч
16. іТолы~ ішкі ша~ылу ~~былысыны~ м~ні Абсолют сыну к~рсеткіші ол ~лшем бірлігі жо~ шама
17. Вариант 1 1 Как называются болезни вызываемые паразитическими червями кишечные палочки; гельминтозы
18. Эффективность производства овощей1
19. Исторический портрет Эрвина Роммеля
20. Топографическая анатомия