- •Гагарина. Л.Г., Федоров а.Р., Федоров п.А. Введение в архитектуру проектирования программного обеспечения Москва
- •Оглавление
- •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. Подходы к оцениванию архитектуры
5.11. Паттерны grasp
Информационный эксперт
Низкая связанность
Устойчивый к изменениям
Контроллер
Полиморфизм
Чистая выдумка
Перенаправление
5.12. Антипаттерны
Антипаттерны в управлении разработкой ПО
Антипаттерны в проектировании ПО
Антипаттерны в объектно-ориентированном программировании
Антипаттерны в программировании
Методологические антипаттерны
Антипаттерны управления конфигурацией
Организационные антипаттерны
Шуточные антипаттерны
6. Архитектура и характеристики качества
6.1. Специфика требований к качеству ПО
6.2. Подход к построению архитектуры с позиций качества
6.3. Подходы к оцениванию архитектуры
Заключение
Введение
Cовременная жизнь немыслима без компьютеров – это любая бытовая техника, автомобили, общественный транспорт, телекоммуникационные и корпоративные системы. Продолжать можно практически бесконечно. Разумеется, все это управляется программами более или менее сложными. Постоянно возрастает разнообразие и сложность систем использующих программное обеспечение (ПО) соответственно возрастают финансовые затраты на ПО как на этапе исследований, так и на этапе разработок.
Институт Программной Инженерии Университета Карнеги-Меллон (Software Engineering Institute, SEI) - общепризнанный законодатель в предметной области «Исследований и разработок систем, интенсивно использующих ПО» к классу таких систем относит «системы, в которых ПО представляет существенный сегмент по следующим позициям: функциональность системы, ее стоимость, риски в процессе разработки, время разработки» [1]. В таких системах компоненты ПО взаимодействуют с другими ПО-компонентами, компонентами и подсистемами другой природы, датчиками, приборами и людьми, вовлеченными в процессы ис-пользования ПО.
Для разработок систем, интенсивно использующих ПО, типичны крупномасштабные проекты ─ десятки или сотни разработчиков, месяцы или годы разработки, сотни тысяч или десятки миллионов долларов. К сожалению, разработки таких систем часто приводят к результатам, которые не соответствуют запланированным ожиданиям. Значительное число разработок либо прекращается, либо превышает запланированное время и /или средства, либо завершается в более бедной версии. Степень успешности, выраженная в процентах числа проектов, завершившихся в соответствии с исходными замыслами и планами, невысока и по некоторым оценкам не превышает 35% [2].
К числу негативных факторов, приводящих к снижению успешности и даже провалам крупных разработок, относятся:
- нереальные проектные цели;
- ошибочные оценки необходимых ресурсов;
- неадекватная система требований;
- слабое документирование текущего состояния проекта;
- отсутствие или слабое управление рисками;
- слабое коммуникативное взаимодействие лиц, заинтересованных в проекте;
- использование незрелых технологий;
- неспособность коллектива справиться со сложностью проекта;
- небрежности в разработке;
- слабое управление проектом;
- отсутствие достаточной благоразумности лиц, заинтересованных в проекте;
- коммерческое давление на разработчиков и менеджеров проекта.
Для предостережения разработчиков ПО созданы каталоги классических ошибок. Один из таких каталогов представлен в [3], где типовые ошибки распределены по группам «разработчик», «процесс», «продукт» и «технология». Вот некоторые из них: увеличение числа исполнителей для завершения проекта, нереалистичные ожидания, принятие желаемого за действительное, исключение важных задач из процесса проверок, переключение на другие инструменты по ходу проектирования.
Сложность ПО - это его существенное и не случайное свойство. На технологию разработки систем оказывают влияние законы построения ПО, изменение алгоритмов в процессе разработки ПО, трудности распределения структур и функций, проблемы проектирования, проблемы функциональности, важность организации процесса разработки ПО, воздействие экономики, влияние политики, недостаток воображения.
Уже перечисленного вполне достаточно для того, чтобы понять необходимость применения любых средств, позволяющих снизить сложность как конкретного ПО, так и процесса его разработки.
Важным концептуальным для методологии программной инженерии моментом стало введение понятия «архитектура» в его применении к ПО и системам, базирующимся на ПО. Началом использования современного значения этого понятия принято считать 1992 год - работа Д. Перри и А. Вульфа [4]. Дальнейшие исследования в системной и программной инженерии позволили выввести взаимосвязанную совокупность архитектур [2]:
- программного обеспечения;
- аппаратного обеспечения в базисе основных единиц компьютерной и телекоммуникационной техники;
- информационного обеспечения;
- организационного обеспечения раскрывающего связность организационных структур (в том числе на уровне персонифицированных ролей и ответственности) с бизнес-процессами;
- предприятия с позиций бизнеса, в общем случае выходящего за рамки компании.
Важные результаты, полученные в последние годы:
- создана предметная область «Архитектура ПО», задачи которой для разработки ПО носят принципиальный характер;
- разработан и широко используется на практике ряд международных стандартов, в которых переосмыслен и обобщен опыт разработок ПО с различных позиций (жизненный цикл, работа с требованиями, архитектура, качество, организационно-профессиональная зрелость коллективов разработчиков и другие);
- созданы технологии и инструментальные средства, аналогов которых в предшествующей инженерной практике не было (например, мастер-методология Rational Unified Process (RUP), инструментальные средства программирования для корпоративных сетей, в том числе и для WEB-программирования);
- создан и подтвердил на практике свою исключительную полезность унифицированный язык моделирования UML.
