Программирование >>  Разработка устойчивых систем 

1 ... 166 167 168 [ 169 ] 170 171 172 ... 196


Упражнения

Создайте разновидность программы Singleton Pattern.срр, в которой все функции являются статическими. Нужна ли в этом случае функция instance()?

Начиная с программы SingletonPattern.cpp создайте класс, предназначенный для подключения к системе в целях сохранения и выборки данных из конфигурационного файла.

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

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

в существующую иерархию, которая не может изменяться, почему бы сначала не попробовать множественное наследование? (Хотя даже в этом случае щансы на спасение существующей иерархии невелики.) Также учтите, что для использования Посетителя существующая иерархия должна изначально содержать функцию visit(), поскольку ее последующее добавление означало бы возможность модификации иерархии (но тогда можно было бы просто добавить нужные виртуальные функции). Нет, Посетитель должен быть частью архитектуры с самого начала, а для его применения нужны основания более веские, чем те, что приводятся БЧ.

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

Итоги

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

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



4. Измените программу KissingPrincessZ.cpp и добавьте в систему еще одно состояние, чтобы каждый поцелуй переводил объект в следующее состояние.

5. Найдите класс C16:TStacl<.h из первого тома книги. Создайте для него Адаптер, чтобы к элементам TStack можно было применять алгоритм for each() библиотеки STL. Создайте класс TStack с элементами string, заполните его строками и используйте алгоритм for each() для подсчета букв во всех строках TStack.

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

преобразование всех букв в каждом файле к верхнему регистру;

поиск в файлах слов, содержащихся в первом файле.

7. Измените рещение для упражнения 6 так, чтобы вместо паттерна Шаблонный метод использовался паттерн Стратегия.

8. Измените пример Strategy.cpp и включите в него поддержку Состояния, чтобы Стратегия могла изменяться на протяжении жизненного цикла объекта Context.

9. Измените пример Strategy.cpp так, чтобы в нем использовался паттерн Цепочка ответственности.

10. Добавьте класс Triangle в пример ShapeFactoryl.cpp.

11. Добавьте класс Triangle в пример ShapeFactoryZ.cpp.

12. Добавьте новый тип GameEnvironment с именем GnomesAndFairies в программу AbstractFactory.cpp.

13. Измените пример ShapeFactoryZ.cpp так, чтобы он использовал Абстрактную фабрику для создания разных наборов фигур (например, фабрика одного типа создает толстые фигуры , фабрика другого типа - тонкие фигуры , но каждый объект фабрики способен создавать все фигуры: круги, квадраты, треугольники и т. д.).

14. Измените пример VirtualConstructor.cpp так, чтобы вместо команд if-else в Shape::Shape(string type) использовалось отображение.

15. Разбейте текстовый файл на входной поток слов (не усложняйте задачу и разбивайте входной поток по пропускам). Создайте два Строителя: один заносит слова в множество, а другой создает отображение со словами и количеством вхождений этих слов.

16. Создайте минимальную архитектуру Observer/Observable в двух классах, без базовых классов, без дополнительных аргументов в Observer, h и функций классов в Observable.h. Просто включите в два класса абсолютный минимум возможностей, затем продемонстрируйте работу своей архитектуры.



создав один объект Observable с несколькими объектами Observer. Объект Observable должен обновлять объекты Observer.

17. Измените пример InnerClassIdiom2.cpp так, чтобы вместо идиомы внутреннего класса в Outer использовалось множественное наследование.

18. Измените пример PaperScissorsRock.cpp так, чтобы вместо двойной диспетчеризации в нем был реализован поиск по таблице. Проще всего это делается отображением отображений, в котором ключом является вызов typeid(obj).name(). Поиск выполняется конструкцией map[typeid(objl).name()] [typeid(obj2).name()]. Обратите внимание, насколько упрощается изменение конфигурации системы. В каких случаях это рещение предпочтительнее жесткого кодирования динамической диспетчеризации? Сможете ли вы создать систему, которая бы обладала простотой синтаксиса динамической диспетчеризации, но использовала поиск по таблице?

19. Создайте модель деловой среды с тремя типами обитателей (Inhabitant): Dwarf (инженеры). Elf (специалисты по маркетингу) и Troll (руководство). Создайте класс Project, который создает экземпляры разных обитателей и заставляет их взаимодействовать друг с другом (функция interact()) путем множественной диспетчеризации.

20. Измените предыдущий пример, чтобы взаимодействия стали более конкретными. Каждый объект Inhabitant может случайным образом получить оружие (Weapon) вызовом getWeapon: Dwarf использует Jargon и Play, Elf- InventFeature и SelllmaginaryProduct, a Troll - Edict и Schedule. Решите, какое оружие выигрывает и проигрывает в каждом взаимодействии (по аналогии с PaperScissorsRock.cpp). Включите в Project функцию battle(), которая получает два объекта Inhabitant и заставляет их сражаться друг с другом. Далее определите в Project функцию meeting(), которая создает группы объектов Dwarf, Elf и Troll и заставляет их сражаться друг с другом до тех пор, пока в каждой группе не останется по одному участнику.

21. Добавьте в пример BeeAndFlowers.cpp нового посетителя Hummingbird.

22. Добавьте в пример BeeAndFlowers.cpp тип Sunflower. Обратите внимание на то, что нужно изменить для интеграции нового типа в систему.

23. Измените пример BeeAndFlowers.cpp так, чтобы он не использовал паттерн Посетитель, а возвращался к обычной иерархии классов. Преобразуйте Bee в параметр-Накопитель.



1 ... 166 167 168 [ 169 ] 170 171 172 ... 196

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика