
- •Гагарина. Л.Г., Федоров а.Р., Федоров п.А. Введение в архитектуру проектирования программного обеспечения Москва
- •Оглавление
- •5.11. Паттерны grasp
- •Глава 1. Архитектура как форма концептуального существования по
- •1.1. Определения архитектуры по и ее значимость
- •1.2. Место архитектурных решений
- •1.3. Роль архитектурных решений
- •1.4. Архитектурные концептуальные схемы. Определение и ретроспектива
- •Глава 2. Нормативные практики архитектурного описания по
- •2.1. Основные понятия
- •2.2. Содержание стандарта
- •2.3. Представления схемы ieee-1471
- •Глава 3. Рациональный процесс архитектурного моделирования
- •3.1. Архитектурные парадигмы
- •3.2. Примеры архитектурных стилей и моделей
- •Глава 4. Сравнительное сопоставление архитектурных видов
- •4.1. Сопоставление систем видов
- •4.2. Примеры систем видов
- •Языки описания архитектуры
- •Глава 5. Проектирование с учетом будущих изменений.
- •5.1. Что такое паттерн проектирования.
- •5.2. Как решать задачи проектирования с помощью паттернов
- •3. Зависимость от аппаратной и программной платформ.
- •5.4. Порождающие паттерны
- •5.4.1. Паттерн Фабричный метод (Factory Method) - уровень класса
- •Классический вариант фабричного метода, когда интерфейс фабричных методов объявляется в независимом классе-фабрике, а их реализация определяется конкретными подклассами этого класса (Рис. 33).
- •Реализация паттерна Factory Method на основе обобщенного конструктора
- •Void info() {
- •Void info() {
- •Void info() {
- •Int main()
- •V.Push_back( Warrior::createWarrior( Infantryman_id));
- •V.Push_back( Warrior::createWarrior( Archer_id));
- •V.Push_back( Warrior::createWarrior( Horseman_id));
- •Void info() {
- •Void info() {
- •Void info() {
- •Int main()
- •5.4.2. Паттерн Одиночка (Singleton) - уровень объекта
- •Классическая реализация Singleton
- •If(!p_instance)
- •Singleton Мэйерса
- •Улучшенная версия классической реализации Singleton
- •Void initialize( Singleton* p );
- •Void SingletonDestroyer::initialize( Singleton* p ) {
- •If(!p_instance) {
- •Использование нескольких взаимозависимых одиночек
- •Int main()
- •5.4.3. Паттерн Абстрактная фабрика (Abstract Factory) - уровень объекта
- •Пример кода для паттерна Abstract Factory
- •Void info() {
- •Int main()
- •5.4.4. Паттерн Строитель (Builder) - уровень объекта
- •Void info() {
- •Int main()
- •Infantryman
- •Infantryman
- •5.4.5. Паттерн Прототип (Prototype) - уровень объекта
- •Void info() {
- •Void info() {
- •5.4.6. Обсуждение порождающих паттернов
- •5.5. Структурные паттерны
- •5.5.1. Паттерн Адаптер, обертка (Adapter, wrapper)
- •Адаптер объекта применяет композицию объектов.
- •Int main()
- •Void adjust() {} // Настройка датчика (защищенный метод)
- •5.5.2. Паттерн Мост (Bridge)
- •Void log( string & str );
- •Достоинства паттерна Bridge
- •5.5.3. Паттерн компоновщик (Composite)
- •Описание паттерна Composite
- •Virtual void addUnit(Unit* p) {
- •Int main()
- •Virtual CompositeUnit* getComposite() {
- •Void addUnit(Unit* p);
- •Достоинства паттерна Composite
- •Недостатки паттерна Composite
- •5.5.4. Паттерн декоратор (Decorator , wrapper, обертка)
- •Реализация паттерна Decorator
- •Int width, height;
- •5.5.5. Паттерн фасад (Facade)
- •Void submitNetworkRequest()
- •If (_engineer.CheckOnStatus())
- •5.5.6. Паттерн приспособленец (Flyweight)
- •Структура паттерна приспособленец (Flyweight)
- •Icon(char *fileName)
- •Icon *FlyweightFactory::_icons[];
- •5.5.7 Паттерн заместитель (Proxy, surrogate, суррогат)
- •Void draw()
- •Int balance;
- •5.5.8. Обсуждение структурных паттернов
- •5.6. Паттерны поведения
- •5.6.1. ПаттернЦепочка обязанностей (Chain of Responsibility)
- •Void setNext(Base *n)
- •5.6.2. Паттерн Command (команда)
- •Реализация паттерна Command
- •5.6.3. Паттерн Interpreter (интерпетатор)
- •Совместное использование паттернов Interpreter и Template Method
- •Int interpret(char*); // interpret() for client
- •Virtual void interpret(char *input, int &total)
- •Int index;
- •If (!strncmp(input, nine(), 2))
- •Virtual char one(){}
- •Int items[10];
- •Int main()
- •5.6.5. Паттерн Mediator (посредник)
- •Virtual void changed();
- •Void Widget::changed()
- •Int main()
- •5.6.6. Паттерн Memento (хранитель)
- •Int _state;
- •Void static redo()
- •Int main()
- •Integer: 11
- •5.6.7. Паттерн Observer (наблюдатель)
- •Int value;
- •5.6.8. Паттерн State
- •Void setCurrent(State *s)
- •5.6.9. Паттерн Strategy
- •Void compress( const string & file ) {
- •5.6.10. Паттерн Template Method (шаблонный метод)
- •Void a()
- •V.Visit(this);
- •V.Visit(this);
- •V.Visit(this);
- •Int main()
- •5.6.12. Обсуждение паттернов поведения
- •5.7. Дальнейшее развитие идеи паттернов проектирования
- •5.8. Архитектурные системные паттерны
- •5.9. Паттерны управления
- •5.9.1. Паттерны централизованного управления
- •5.10. Паттерны интеграции корпоративных информационных систем
- •5.10.1. Структурные паттерны интеграции
- •5.10.2. Паттерны по методу интеграции
- •5.10.3. Паттерны интеграции по типу обмена данными
- •5.12. Антипаттерны (anti-patterns)
- •Глава 6. Архитектура и характеристики качества
- •6.1. Специфика требований к качеству по
- •6.2. Подход к построению архитектуры с позиций качества
- •6.3. Подходы к оцениванию архитектуры
2.2. Содержание стандарта
Основу рекомендуемой практики определяет концептуальный каркас (framework), представленный на рис. 11 и раскрывающий то, что целесообразно включать в АО. Концептуальный каркас в стандарте оформлен в виде семантической сети, связывающей определенными отношениями основные понятия архитектуры ПО. За отбор подходящих средств и их использование несет ответственность архитектор.
В рамках концептуального каркаса указаны понятия (и их связи), относящиеся к понятию «архитектурное описание» («заинтересованные лица», «интерес заинтересованных лиц», «вид», «точка зрения» и другие детали) и контексту его употребления (система, среда, миссия, архитектура). За каждым понятием стоит его (потенциальное или реальное) материальное воплощение определенной составляющей (или ряда составляющих) процесса и/или результата разработки ПО. Факт отсутствия такого материального воплощения указывает на отклонение от схемы, которое (как показывает практика разработок ПО) может привести к негативным последствиям разработки [2].
На рис. 11 указаны связи между узлами, но не приведены (чтобы не загромождать рисунок) характеристики степени связи, то есть кратности «один к одному (1..1)», «один ко многим» (1..N) и др.
Рисунок 11. Стандартное описание архитектуры
Отношения: 1 - различается, 2 - различается, 3 - выбирается, 4 - агрегируется, 5 - состоит из видов, 6 - имеет интерес, 7 - адресуется, 8 - реализуется, 9 - покрывает, 10 - устанавливает форму, 11 - состоит из моделей, 12 - содержит, 13 - убеждает, 14 - представляет, 15 - использует, 16 - имеет, 17 - размещена, 18 - обеспечивает.
Выборочно представим содержание узлов схемы. Толкование ряда особо важных понятий каркаса (архитектурной концептуальной схемы ПО) приведем с позиций тех требований, которые они выражают в системе требований к ПО:
1. «Лица, заинтересованные в разработке (Stakeholders)» вводятся для того, чтобы на множестве таких лиц определить типовые роли, исполнение которых осуществляют, в общем случае, группы лиц. Необходимо всегда помнить и принимать в расчет, что архитектура разрабатывается именно для них.
К типовым ролям относятся: лица (Acquirers) приобретающие систему; эксперты-консультанты (Assesors) проверяющие целесообразность приобретения; пропагандисты (Communicators) распространяющие сведения об этом через документы и обучение; разработчики (Developers) создающие систему; сопровождающие (Mainteners) внедряющие, сопровождающие и развивающие систему; снабженцы (Suppliers) поставляющие «комплектующие части»; пользователи (Users) обеспечивающие использование системы по назначению; администраторы (Administrators) обеспечивающие функционирование системы; тестировщики (Testers) проверяющие корректность работы системы.
В конкретных инструментально-технологических системах разработки ПО могут быть использваны не только названные роли, но и многие другие. Так, например, в RUP различается около 70 ролей stackeholders.
Определение группы и конкретных лиц выполнено правильно, если эти лица информированы (что позволяет им принимать хорошие решения), способны принять на себя обязательства и ответственность (даже если решения трудные) и авторитетные (что повышает степень доверия к их решениям).
2. За понятием «Интерес (Concern)» стоит то, что принято называть интересом лица, находящегося в определенной роли к процессу разработки ПО, например, «интерес к тем функциям, которые исполнимы в ПО, а значит к поведению ПО», «интерес к защищенности ПО по отношению к несанкционированному доступу» или «интерес к позитивным эффектам, достижимым при использовании ПО». В общем случае конкретный «интерес» может выражать определенную заинтересованность группы лиц, исполняющих типовую роль, например, групп «разработчики» или «пользователи».
Выявить совокупность таких «интересов» и их значений, необходимых и достаточных для успешной разработки ПО, является одной из первоочередных и важнейших задач концептуального проектирования ПО, ответственного за «систему требований», «архитектуру» и «концептуальный проект».
3. Понятие «Точка зрения. Viewpoint» раскрывает позицию, с которой опреде-ленная группа лиц или группа групп, заинтересованных в разработке ПО, желает, привыкла, готова или в состоянии представить ПО как целое.
4. Понятие «Вид. View» является родственным для «Видов», используемых в машиностроительном или строительном черчении. Понятие «вид» в архитектурных описаниях ПО соответствует «проекции ПО» на определенный интерес или интересы. Для представления архитектурного вида используют, в общем случае, совокупность концептуальных моделей и документов, раскрывающих их содержание или дополняющих содержание, выраженное в моделях. Архитектурные виды АС принято визуализировать в форме, представленной на рис. 12.
Рисунок 12. Визуализированный набор архитектурных видов
Виды в конкретной технологии разработки ПО могут быть оформлены на определенном языке (например, на языке UML и/или других языках описания архитектуры, Architecture Description Language) и визуализированы в соответствии с определенным набором правил: каждый вид соответствует вполне определенной точке зрения (Рис. 13); точка зрения является образцом для конструирования видов, причем точка зрения определяет правила не только для построения видов, но и для их использования.
Рисунок 13. Фрагмент архитектурной семантической сети
Стандарт не фиксирует определенный набор видов, поскольку число разнородных ПО и их приложений многообразно. В рамках вопроса об архитектурах ПО не может быть решен вопрос об окончательном и полном наборе точек зрения и видов. В то же время точка зрения должна быть объявлена до ее использования.
Отношения между «точкой зрения», «интересами» {ci}, «видами», «моделями» {mj} и документами {Dk}, обобщённо представленные на рис. 14, завершают толкование основных понятий стандарта IEEE-1471−2000.
Рисунок 14. Образное представление отношений видов и точки зрения
Намерение использовать варианты употребления понятий стандарта IEEE-1471 в архитектурном описании предписывает определиться с их значениями, или, что то же самое, ввести архитектурные требования в систему требований ПО и специфицировать эти требования [2]. Следовательно, необходимо определиться:
- с «типовыми группами лиц», интересы которых следует или целесообразно учесть в разработке ПО;
- с «интересами» типовых групп, провести их анализ и систематизировать;
- с «точками зрения» (возможно, выбрав подходящие в библиотеке «точек зрения»), на основании которых будет строиться архитектурное описание ПО;
- с совокупностями «видов» на ПО (возможно, выбрав подходящие в библиотеке «видов»), которые будут составлять архитектурное описание.
Решения, принятые относительно этих требований, определят самое важное для действий по проектированию архитектуры ПО, в результате которого архитектурное описание наполнится деталями, в первую очередь подходящими концептуальными моделями и документами.
Стандарт IEEE 1471 отмечает необходимость использования архитектуры системы для решения:
1. Анализ альтернативных проектов системы.
2. Планирование перепроектирования системы, внесения изменений в ее организацию.
3. Общение по поводу системы между различными организациями, вовлеченными в ее разработку, эксплуатацию, сопровождение, приобретающими систему или продающими ее.
4. Выработка критериев приемки системы при ее сдачи в эксплуатацию.
5. Разработка документации по ее использованию и сопровождению, включая обучающие и маркетинговые материалы.
6. Проектирование и разработка отдельных элементов системы.
7. Сопровождение, эксплуатация, управление конфигурациями и внесение изменений и поправок.
8. Планирование бюджета и использования других ресурсов в проектах, связанных с разработкой, сопровождением или эксплуатацией системы.
9. Проведение обзоров, анализ и оценка качества системы.