вернуться в оглавление предыдущая глава предыдущий параграф следующий параграф следующая глава


Паттерны проектирования в компьютерном моделировании ОП

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

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

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

По словам Кристофера Александра, который впервые ввёл понятие паттернов в архитектуре: “Любой паттерн описывает задачу, которая снова и снова возникает в нашей работе, а также принцип ее решения, причем таким образом, что его решение можно потом использовать миллион раз, ничего не изобретая заново”. В объектно-ориентированном анализе принято всё четко систематизировать. Также и паттерны:

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

Именно таким образом паттерны описаны в книге “банды четырех”: Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес “Паттерны проектирования” которая является стандартом de facto в объектно-ориентированном проектировании.

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

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

Проектирование на основе паттернов

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

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

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

По назначению выделяют три группы паттернов:

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

Абстрактная фабрика
Одиночка
Прототип
Строитель
Фабричный метод

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

Адаптер
Декоратор
Заместитель
Компоновщик
Мост
Приспособленец
Фасад

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

Интерпретатор
Итератор
Команда
Наблюдатель
Посетитель
Посредник
Состояние
Стратегия
Хранитель
Цепочка обязанностей
Шаблонный метод

Рассмотрим основные паттерны более подробно.

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

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

Паттерн прототип (Prototype)

Описание

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

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

Паттерн одиночка (Singleton)

Описание

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

Эта задача решается с помощью паттерна одиночка. Гарантирует, что у класса есть только один экземпляр и предоставляет к нему глобальную точку доступа.

Паттерн строитель (Builder)

Описание

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

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

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

Паттерн компоновщик (Composite)

Описание

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

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

Паттерн декоратор (Decorator)

Описание

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

Паттерн декоратор добавляет объекту новые обязанности.

Паттерн фасад (Facade)

Описание

При разработке сложных систем отдельные подсистемы реализуются достаточно сложно. Бывает, что для их использования приходится освоить целую область знаний. Например, базы данных. При реализации каталогов оптических материалов используются базы данных. Для работы с базами данных используются такие технологии, как ODBC, SQL. Если всем разработчикам для получения показателя преломления придется установить соединение с базой данных, сформировать запрос на языке SQL, обработать его результаты и т.п., то работа с этими программными модулями будет неэффективной. Гораздо удобнее выполнить одну-две функции.

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

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

Паттерн итератор (Iterator)

Описание

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

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

Паттерн наблюдатель (Observer)

Описание

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

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

Паттерн состояние (State)

Описание

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

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

Паттерн посетитель (Visitor)

Описание

При отображении конструктивных параметров мы можем столкнуться с рядом проблем. Например, у некоторых поверхностей нет такого понятия как радиус. Можно в этой ячейке вывести 0, но как это сделать, если селектора GetRadius у объекта нет?

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