На главную страницу
Форум txt.version   



Статья :: 9.4. Сопровождение : Гради Буч

9.4. Сопровождение

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

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

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

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

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

Рис. 9-14 иллюстрирует работу такого механизма, продлевающего жизнь объектов за счет работы отдельного агента. Класс Persist является дружественным классу Queue; мы определяем эту связь внутри описания класса Queue следующим образом:

friend class Persist<Item, Queue<Item>>;

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

Параметризованный класс Persist содержит операции записи и считывания put и get, а также функции для подключения потоков обмена данными. Мы можем определить данную абстракцию следующим образом:

template<class Item, class Structure> class Persist { public:

Persist(); Persist(iostream& input, iostream& output); virtual ~Persist(); virtual void setInputStream(iostream&); virtual void setOutputStream(iostream&); virtual void put(Structure&); virtual void get(Structure&);

protected:

iostream* inStreain; iostream* outStream;

};  

Рис. 9-14. Обеспечение сохраняемости с помощью агента.

Реализация данного класса зависит от того, является ли он дружественным классу Structure, который фигурирует в качестве аргумента шаблона. В частности, Persist зависит от наличия в структуре вспомогательных функций purge, cardinality, itemAt, lock, и unlock. Далее срабатывает однородность нашей библиотеки: поскольку каждый базовый класс Structure имеет подобные функции, то persist можно безо всяких изменений использовать для работы со всеми имеющимися в библиотеке структурами.

Рассмотрим в качестве примера реализацию функции Persist::put:

template<class Item, class Structure> void Persist<Item, Structure>::put(Structure& s) {

s.lock(); unsigned int count = s.cardinality(); (*outStream) << count << endl;

for (unsigned int index = 0; index < count; index++)

(*outStream) << s.itemAt(index);

s.unlock();

}

Эта операция использует разработанный нами ранее механизм блокировки, поэтому она будет работать и для защищенных, и для синхронизированных форм. Алгоритм работы функции несложен: сначала в поток выводится количество элементов структуры, а затем, последовательно, все ее элементы. Реализация persist::get аналогично выполняет обратное действие:

template<class Item, class Structure> void Persist<Item, Structure>::get(Structure& s) {

s.lock(); unsigned int count; Item item; if (! inStream->eof()) {

(*inStream) >> count; s.purge(); for (unsigned int index = 0; (index < count) && (! inStream->eof());   index++) {

(*inStream) >> item; s.add(item);

}

} s.unlock();

}

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

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

Дополнительная литература

Бигерстафф и Перлис (Biggerstaffand Perlis) [H 1989] провели исчерпывающий анализ повторного использования программного обеспечения. Вирфс-Брок (Wirfs-Brock) [С 1988] предложил хорошее введение в объектно-ориентированные среды разработки. Джонсон (Johnson) [G 1992] изучал вопросы документирования архитектуры сред разработки и выявил ряд общих моментов.

Библиотека МасАрр [G 1989] для Macintosh является хорошим примером правильно сконструированной объектно-ориентированной прикладной среды разработки. Введение в более раннюю версию этой библиотеки классов может быть найдено у Шмукера (Schmucker) [G 1986]. В недавней работе Голдстейн и Алджер (Goldstein and Alger) [С 1992] обсуждают развитие объектно-ориентированного программного обеспечения для Macintosh.

Другие примеры сред разработки: гипермедиа (Мейровиц (Meirowitz) [С 1986]), распознавание образов (Йошида (Yoshida) [С 1988]), интерактивная графика (Янг (Young) [С 1987]), настольные издательские системы (Феррел (Ferrel) [K 1989]). Среды разработки общего назначения: ЕТ++ (Вейнанд (Weinand) [K 1989]) и управляемые событиями MVC-архитектуры (Шэн (Shan) [G 1989]). Коггинс (Coggins) [С 1990] изучил, в частности, развитие библиотек для C++.

Эмпирическое изучение объектно-ориентированных архитектур и их влияния на повторное использование можно найти в работе Льюиса (Lewis) [С 1992].





9.4. Сопровождение : Гради Буч

страницы в данном разделе 
Объектно-ориентированный анализ и проектирование с примерами приложений на С++ : Гради Буч Предисловие : Гради Буч
ЧАСТЬ ПЕРВАЯ Концепции : Гради Буч 1.1. Сложность, присущая программному обеспечению : Гради Буч
1.2. Структура сложных систем : Гради Буч 1.3. Внесение порядка в хаос : Гради Буч
1.4. О проектировании сложных систем : Гради Буч Дополнительная литература : Гради Буч
Глава 2 Объектная модель : Гради Буч 2.1. Эволюция объектной модели : Гради Буч
2.2. Составные части объектного подхода : Гради Буч 2.3. Применение объектной модели : Гради Буч
Выводы : Гради Буч Дополнительная литература : Гради Буч
Глава 3 Классы и объекты : Гради Буч 3.1. Природа объекта : Гради Буч
3.2. Отношения между объектами : Гради Буч 3.3. Природа классов : Гради Буч
3.4. Отношения между классами : Гради Буч 3.5. Взаимосвязь классов и объектов. : Гради Буч
3.6. Качество классов и объектов : Гради Буч Дополнительная литература : Гради Буч
Глава 4 Классификация : Гради Буч 4.1. Важность правильной классификации : Гради Буч
4.2. Идентификация классов и объектов : Гради Буч 4.3. Ключевые абстракции и механизмы : Гради Буч
Дополнительная литература : Гради Буч 1.1. Сложность, присущая программному обеспечению : Гради Буч
1.2. Структура сложных систем : Гради Буч 1.3. Внесение порядка в хаос : Гради Буч
1.4. О проектировании сложных систем : Гради Буч Дополнительная литература : Гради Буч
1.1. Сложность, присущая программному обеспечению : Гради Буч 1.2. Структура сложных систем : Гради Буч
1.3. Внесение порядка в хаос : Гради Буч 1.4. О проектировании сложных систем : Гради Буч
Дополнительная литература : Гради Буч 2.1. Эволюция объектной модели : Гради Буч
2.2. Составные части объектного подхода : Гради Буч 2.3. Применение объектной модели : Гради Буч
Выводы : Гради Буч Дополнительная литература : Гради Буч
2.1. Эволюция объектной модели : Гради Буч 2.2. Составные части объектного подхода : Гради Буч
2.3. Применение объектной модели : Гради Буч Выводы : Гради Буч
Дополнительная литература : Гради Буч 3.1. Природа объекта : Гради Буч
3.2. Отношения между объектами : Гради Буч 3.3. Природа классов : Гради Буч
3.4. Отношения между классами : Гради Буч 3.5. Взаимосвязь классов и объектов. : Гради Буч
3.6. Качество классов и объектов : Гради Буч Дополнительная литература : Гради Буч
3.1. Природа объекта : Гради Буч 3.2. Отношения между объектами : Гради Буч
3.3. Природа классов : Гради Буч 3.4. Отношения между классами : Гради Буч
3.5. Взаимосвязь классов и объектов. : Гради Буч 3.6. Качество классов и объектов : Гради Буч
Дополнительная литература : Гради Буч 4.1. Важность правильной классификации : Гради Буч
4.2. Идентификация классов и объектов : Гради Буч 4.3. Ключевые абстракции и механизмы : Гради Буч
Дополнительная литература : Гради Буч 4.1. Важность правильной классификации : Гради Буч
4.2. Идентификация классов и объектов : Гради Буч 4.3. Ключевые абстракции и механизмы : Гради Буч
Дополнительная литература : Гради Буч ЧАСТЬ ВТОРАЯ Метод : Гради Буч
продолжение 70 : Гради Буч 5.1. Элементы обозначений : Гради Буч
5.2. Диаграммы классов : Гради Буч 5.3. Диаграммы состояний и переходов : Гради Буч
5.4. Диаграммы объектов : Гради Буч   5.5. Диаграммы взаимодействия : Гради Буч
5.6. Диаграммы модулей : Гради Буч 5.7. Диаграммы процессов. : Гради Буч
5.8. Применение системы обозначений : Гради Буч Глава 6 Процесс : Гради Буч
6.1. Основные принципы : Гради Буч 6.2. Микропроцесс проектирования : Гради Буч
6.3. Макропроцесс проектирования : Гради Буч Выводы : Гради Буч
Дополнительная литература : Гради Буч Глава 7 Практические вопросы : Гради Буч
7.1. Управление и планирование : Гради Буч 7.2. Кадры : Гради Буч
7.3. Управление релизами : Гради Буч 7.4. Повторное использование : Гради Буч
7.5. Качество и измерения : Гради Буч 7.6. Документация : Гради Буч
7.7. Инструменты : Гради Буч 7.8. Специальные вопросы : Гради Буч
7.9. Выгоды и опасности объектно-ориентированной разработки : Гради Буч Глава 5 Обозначения : Гради Буч
5.1. Элементы обозначений : Гради Буч 5.2. Диаграммы классов : Гради Буч
5.3. Диаграммы состояний и переходов : Гради Буч 5.4. Диаграммы объектов : Гради Буч
  5.5. Диаграммы взаимодействия : Гради Буч 5.6. Диаграммы модулей : Гради Буч
5.7. Диаграммы процессов. : Гради Буч 5.8. Применение системы обозначений : Гради Буч
продолжение 104 5.1. Элементы обозначений : Гради Буч
5.2. Диаграммы классов : Гради Буч 5.3. Диаграммы состояний и переходов : Гради Буч
5.4. Диаграммы объектов : Гради Буч   5.5. Диаграммы взаимодействия : Гради Буч
5.6. Диаграммы модулей : Гради Буч 5.7. Диаграммы процессов. : Гради Буч
5.8. Применение системы обозначений : Гради Буч 6.1. Основные принципы : Гради Буч
6.2. Микропроцесс проектирования : Гради Буч 6.3. Макропроцесс проектирования : Гради Буч
Выводы : Гради Буч Дополнительная литература : Гради Буч
6.1. Основные принципы : Гради Буч 6.2. Микропроцесс проектирования : Гради Буч
6.3. Макропроцесс проектирования : Гради Буч Выводы : Гради Буч
Дополнительная литература : Гради Буч 7.1. Управление и планирование : Гради Буч
7.2. Кадры : Гради Буч 7.3. Управление релизами : Гради Буч
7.4. Повторное использование : Гради Буч 7.5. Качество и измерения : Гради Буч
7.6. Документация : Гради Буч 7.7. Инструменты : Гради Буч
7.8. Специальные вопросы : Гради Буч 7.9. Выгоды и опасности объектно-ориентированной разработки : Гради Буч
7.1. Управление и планирование : Гради Буч 7.2. Кадры : Гради Буч
7.3. Управление релизами : Гради Буч 7.4. Повторное использование : Гради Буч
7.5. Качество и измерения : Гради Буч 7.6. Документация : Гради Буч
7.7. Инструменты : Гради Буч 7.8. Специальные вопросы : Гради Буч
7.9. Выгоды и опасности объектно-ориентированной разработки : Гради Буч ЧАСТЬ ТРЕТЬЯ Примеры приложений : Гради Буч
продолжение 142 : Гради Буч   8.1. Анализ : Гради Буч
8.2. Проектирование : Гради Буч 8.3. Эволюция : Гради Буч
8.4. Сопровождение : Гради Буч Глава 9 Среда разработки: библиотека базовых классов : Гради Буч
продолжение 148 : Гради Буч 9.1. Анализ : Гради Буч
9.2. Проектирование : Гради Буч 9.3. Эволюция : Гради Буч
9.4. Сопровождение : Гради Буч Глава 10 Архитектура клиент-сервер: складской учет : Гради Буч
продолжение 154 : Гради Буч 10.1. Анализ : Гради Буч
10.2. Проектирование : Гради Буч 10.3. Эволюция : Гради Буч
Глава 11 Искусственный интеллект: криптоанализ : Гради Буч продолжение 159 : Гради Буч
11.1. Анализ : Гради Буч 11.2. Проектирование : Гради Буч
11.3. Эволюция : Гради Буч 11.4. Сопровождение : Гради Буч
Глава 12 Управление: контроль за движением поездов : Гради Буч продолжение 165 : Гради Буч
12.1. Анализ : Гради Буч 12.2. Проектирование : Гради Буч
12.3. Эволюция : Гради Буч 12.4. Сопровождение : Гради Буч
Глава 8 Система сбора данных: метеорологическая станция : Гради Буч   8.1. Анализ : Гради Буч
8.2. Проектирование : Гради Буч 8.3. Эволюция : Гради Буч
8.4. Сопровождение : Гради Буч продолжение 175
  8.1. Анализ : Гради Буч 8.2. Проектирование : Гради Буч
8.3. Эволюция : Гради Буч 8.4. Сопровождение : Гради Буч
Глава 9 Среда разработки: библиотека базовых классов : Гради Буч 9.1. Анализ : Гради Буч
9.2. Проектирование : Гради Буч 9.3. Эволюция : Гради Буч
9.4. Сопровождение : Гради Буч продолжение 185
9.1. Анализ : Гради Буч 9.2. Проектирование : Гради Буч
9.3. Эволюция : Гради Буч 9.4. Сопровождение : Гради Буч
Глава 10 Архитектура клиент-сервер: складской учет : Гради Буч 10.1. Анализ : Гради Буч
10.2. Проектирование : Гради Буч 10.3. Эволюция : Гради Буч
продолжение 194 10.1. Анализ : Гради Буч
10.2. Проектирование : Гради Буч 10.3. Эволюция : Гради Буч
Глава 11 Искусственный интеллект: криптоанализ : Гради Буч 11.1. Анализ : Гради Буч
11.2. Проектирование : Гради Буч 11.3. Эволюция : Гради Буч
11.4. Сопровождение : Гради Буч продолжение 203
11.1. Анализ : Гради Буч 11.2. Проектирование : Гради Буч
11.3. Эволюция : Гради Буч 11.4. Сопровождение : Гради Буч
Глава 12 Управление: контроль за движением поездов : Гради Буч 12.1. Анализ : Гради Буч
12.2. Проектирование : Гради Буч 12.3. Эволюция : Гради Буч
12.4. Сопровождение : Гради Буч продолжение 213
12.1. Анализ : Гради Буч 12.2. Проектирование : Гради Буч
12.3. Эволюция : Гради Буч 12.4. Сопровождение : Гради Буч
А.1. Концепции : Гради Буч А.2. Smalltalk : Гради Буч
А.3. Object Pascal : Гради Буч А.4. C++ : Гради Буч
А.5. Common Lisp Object System (CLOS) : Гради Буч А.6. Ada : Гради Буч
A.7. Eiffel : Гради Буч А.1. Концепции : Гради Буч
А.2. Smalltalk : Гради Буч А.3. Object Pascal : Гради Буч
А.4. C++ : Гради Буч А.5. Common Lisp Object System (CLOS) : Гради Буч
А.6. Ada : Гради Буч A.7. Eiffel : Гради Буч
Словарь терминов : Гради Буч Литературные ссылки : Гради Буч

Разделы
Околокомпьютерная литература (375)
Программирование (102)
Программы (75)
ОС и Сети (49)
Интернет (29)
Аппаратное обеспечение (16)
Базы данных (6)
Flutter
React Native
Xamarin