Э. Гамма, Р. Хелм
Скачать 6.37 Mb.
|
shape[0] shape[1] aLineShape aCircleShape Рис. Б.2. Нотация схем объектов Б.3. СХЕМА ВЗАИМОДЕЙСТВИЙ Порядок исполнения запросов, которые объекты посылают друг другу, по- казан на схеме взаимодействий. Так, на рис. Б.3 представлено, как фигура добавляется к рисунку. Б.3. Схема взаимодействий 421 aCreationTool aDrawing aLineShape new LineShape Add(aLineShape) Refresh() Draw() Рис. Б.3. Нотация схем взаимодействий На схеме взаимодействий время отсчитывается сверху вниз. Сплошная вертикальная линия обозначает время жизни объекта. Соглашение о выборе имен объектов такое же, как на схемах объектов: имени класса предшествует префикс «a» (например, aShape ). Если объект еще не создан к начальному моменту времени, представленному на схеме, то его вертикальная линия идет пунктиром вплоть до момента создания. Вертикальный прямоугольник говорит о том, что объект активен, то есть обрабатывает некоторый запрос. Операция может посылать запросы дру- гим объектам, они изображаются горизонтальной линией, указывающей на объект-получатель. Имя запроса показывается над стрелкой. Запрос на создание объекта пред- ставлен пунктирной линией со стрелкой. Запрос объекта-отправителя само- му себе изображается стрелкой, указывающей на сам этот объект. На рис. Б.3 видно, что первый запрос, исходящий от aCreationTool , пре- следует целью создание объекта aLineShape . Затем aLineShape добавляется к объекту aDrawing с помощью операции Add , после чего aDrawing посылает самому себе запрос на обновление Refresh . Отметим, что частью операции Refresh является отправка объектом aDrawing запроса к aLineShape ПРИЛОЖЕНИЕ В ФУНДАМЕНТАЛЬНЫЕ КЛАССЫ В данном приложении документированы фундаментальные классы, кото- рые применялись нами в примерах кода на C++ в описаниях различных паттернов проектирования. Мы специально стремились сделать эти классы простыми и минимальными. Будут описаны следующие классы: List — упорядоченный список объектов; Iterator — интерфейс для последовательного доступа к объектам в агрегате; ListIterator — итератор для обхода списка; Point — точка с двумя координатами; Rect — прямоугольник, стороны которого параллельны осям координат. Некоторые появившиеся сравнительно недавно стандартные типы C++, возможно, реализованы еще не во всех компиляторах. В частности, если ваш компилятор не поддерживает тип bool , его можно определить само- стоятельно: typedef int bool; const int true = 1; const int false = 0; В.1. LIST Шаблон класса List представляет собой базовый контейнер для хранения упорядоченного списка объектов. В списке хранятся значения элементов, то В.1. List 423 есть он пригоден как для встроенных типов, так и для экземпляров классов. Например, запись List объявляет список целых int. Но в большинстве паттернов в списке хранятся указатели на объекты, скажем, List Это позволяет использовать класс List для хранения разнородных объектов (точнее, указателей на них). Для удобства в классе List есть синонимы для операций со стеком. Это позволяет явно использовать список в роли стека, не определяя дополни- тельного класса: template class List { public: List(long size = DEFAULT_LIST_CAPACITY); List(List&); List(); List& operator=(const List&); long Count() const; Item& Get(long index) const; Item& First() const; Item& Last() const; bool Includes(const Item&) const; void Append(const Item&); void Prepend(const Item&); void Remove(const Item&); void RemoveLast(); void RemoveFirst(); void RemoveAll(); Item& Top() const; void Push(const Item&); Item& Pop(); }; В следующих разделах операции описываются более подробно. Конструктор, деструктор, инициализация и присваивание List(long size) — инициализирует список. Параметр size определяет начальное число элементов в списке. List(List&) — замещает определяемый по умолчанию копирующий конструктор для правильной инициализации данных. 424 Приложение В. Фундаментальные классы List() — освобождает внутренние структуры данных списка, но не эле- менты списка. Не предполагается, что у этого класса будут производные, поэтому деструктор не объявлен виртуальным. List& operator=(const List&) — реализует операцию присваивания. Обращения к элементам Следующие операции предназначены для обращения к элементам списка. long Count() const — возвращает число объектов в списке. Item& Get(long index) const — возвращает объект с заданным индексом. Item& First() const — возвращает первый объект в списке. Item& Last() const — возвращает последний объект в списке. Добавление void Append(const Item&) — добавляет свой аргумент в конец списка. void Prepend(const Item&) — добавляет свой аргумент в начало списка. Удаление void Remove(const Item&) — удаляет заданный элемент из списка. Для применения этой операции требуется, чтобы тип элементов поддерживал оператор проверки равенства == void RemoveFirst() — удаляет первый элемент из списка. void RemoveLast() — удаляет последний элемент из списка. void RemoveAll() — удаляет все элементы из списка. Интерфейс стека Item& Top() const — возвращает элемент, находящийся на вершине стека. void Push(const Item&) — заносит элемент в стек. Item& Pop() — извлекает элемент с вершины стека. В.3. ListIterator 425 В.2. ITERATOR Iterator — это абстрактный класс, который определяет интерфейс обхода агрегата: template class Iterator { public: virtual void First() = 0; virtual void Next() = 0; virtual bool IsDone() const = 0; virtual Item CurrentItem() const = 0; protected: Iterator(); }; Операции класса: virtual void First() — позиционирует итератор на первый объект в агре- гате. virtual void Next() — позиционирует итератор на следующий по порядку объект. virtual bool IsDone() const — возвращает true , если больше не осталось объектов. virtual Item CurrentItem() const — возвращает объект, находящийся в текущей позиции. В.3. LISTITERATOR ListIterator реализует интерфейс класса Iterator для обхода списка List Его конструктор получает в аргументе список, который нужно обойти: template class ListIterator : public Iterator public: ListIterator(const List 426 Приложение В. Фундаментальные классы virtual void First(); virtual void Next(); virtual bool IsDone() const; virtual Item CurrentItem() const; }; В.4. POINT Класс Point представляет точку на плоскости в декартовых координатах и поддерживает минимальный набор арифметических операций над векто- рами. Координаты точки определяются так: typedef float Coord; Операции класса Point не нуждаются в пояснениях: class Point { public: static const Point Zero; Point(Coord x = 0.0, Coord y = 0.0); Coord X() const; void X(Coord x); Coord Y() const; void Y(Coord y); friend Point operator+(const Point&, const Point&); friend Point operator-(const Point&, const Point&); friend Point operator*(const Point&, const Point&); friend Point operator/(const Point&, const Point&); Point& operator+=(const Point&); Point& operator-=(const Point&); Point& operator*=(const Point&); Point& operator/=(const Point&); Point operator-(); friend bool operator==(const Point&, const Point&); friend bool operator!=(const Point&, const Point&); friend ostream& operator<<(ostream&, const Point&); friend istream& operator>>(istream&, Point&); }; Статическая переменная Zero представляет начало координат Point(0, 0) В.5. Rect 427 В.5. RECT Класс Rect представляет прямоугольник, стороны которого параллельны осям координат. Прямоугольник определяется начальной вершиной и раз- мерами, то есть шириной и высотой. Операции класса Rect не нуждаются в пояснениях: class Rect { public: static const Rect Zero; Rect(Coord x, Coord y, Coord w, Coord h); Rect(const Point& origin, const Point& extent); Coord Width() const; void Width(Coord); Coord Height() const; void Height(Coord); Coord Left() const; void Left(Coord); Coord Bottom() const; void Bottom(Coord); Point& Origin() const; void Origin(const Point&); Point& Extent() const; void Extent(const Point&); void MoveTo(const Point&); void MoveBy(const Point&); bool IsEmpty() const; bool Contains(const Point&) const; }; Статическая переменная Zero представляет вырожденный прямоугольник: Rect(Point(0, 0), Point(0, 0)); БИБЛИОГРАФИЯ [Add94] Addison-Wesley, Reading, MA. NEXTSTEP General Reference: Release 3, Volumes 1 and 2, 1994. [AG90] D.B. Anderson and S. Gossain. Hierarchy evolution and the software lifecycle. In TOOLS ’90 Conference Proceedings, pages 41–50, Paris, June 1990. Prentice Hall. [AIS+77] Christopher Alexander, Sara Ishikawa, Murray Silverstein, Max Jacobson, Ingrid Fiksdahl-King, and Shlomo Angel. A Pattern Language. Oxford University Press, New York, 1977. [App89] Apple Computer, Inc., Cupertino, CA. Macintosh Programmers Workshop Pascal 3.0 Reference, 1989. [App92] Apple Computer, Inc., Cupertino, CA. Dylan. An object-oriented dynamic language, 1992. [Arv91] James Arvo. Graphics Gems II. Academic Press, Boston, MA, 1991. [AS85] B. Adelson and E. Soloway. The role of domain experience in software design. IEEE Transactions on Software Engineering, 11(11):1351–1360, 1985. [BE93] Andreas Birrer and Thomas Eggenschwiler. Frameworks in the financial engineering domain: An experience report. In European Conference on Object-Oriented Programming, pages 21–35, Kai- serslautern, Germany, July 1993. Springer-Verlag. [BJ94] Kent Beck and Ralph Johnson. Patterns generate architectures. In European Conference on Object-Oriented Programming, pages 139–149, Bologna, Italy, July 1994. Springer-Verlag. [Boo94] Grady Booch. Object-Oriented Analysis and Design with Appli- cations. Benjamin/Cummings, Redwood City, CA, 1994. Second Edition. Библиография 429 [Bor81] A. Borning. The programming language aspects of ThingLab—a constraint-oriented simulation laboratory. ACM Transactions on Programming Languages and Systems, 3(4):343–387, October 1981. [Bor94] Borland International, Inc., Scotts Valley, CA. A Technical Com- parison of Borland ObjectWindows 2.0 and Microsoft MFC 2.5, 1994. [BV90] Grady Booch and Michael Vilot. The design of the C++ Booch components. In Object-Oriented Programming Systems, Languag- es, and Applications Conference Proceedings, pages 1–11, Ottawa, Canada, October 1990. ACM Press. [Cal93] Paul R. Calder. Building User Interfaces with Lightweight Objects. PhD thesis, Stanford University, 1993. [Car89] J. Carolan. Constructing bullet-proof classes. In Proceedings C++ at Work “89. SIGS Publications, 1989. [Car92] Tom Cargill. C++ Programming Style. Addison-Wesley, Reading, MA, 1992. [CIRM93] Roy H. Campbell, Nayeem Islam, David Raila, and Peter Madeany. De signing and implementing Choices: An object-oriented system in C++. Communications of the ACM, 36(9):117–126, September 1993. [CL90] Paul R. Calder and Mark A. Linton. Glyphs: Flyweight objects for user interfaces. In ACM User Interface Software Technologies Conference, pages 92–101, Snowbird, UT, October 1990. [CL92] Paul R. Calder and Mark A. Linton. The object-oriented imple- mentation of a document editor. In Object-Oriented Programming Systems, Languages, and Applications Conference Proceedings, pages 154–165, Vancouver, British Columbia, Canada, October 1992. ACM Press. [Coa92] Peter Coad. Object-oriented patterns. Communications of the ACM, 35(9):152–159, September 1992. [Coo92] William R. Cook. Interfaces and specifications for the Small- talk-80 collection classes. In Object-Oriented Programming Systems, Languages, and Applications Conference Proceedings, pages 1–15, Vancouver, British Columbia, Cana da, October 1992. ACM Press. 430 Библиография [Cop92] James O. Coplien. Advanced C++ Programming Styles and Idioms. Addison-Wesley, Reading, MA, 1992. [Cur89] Bill Curtis. Cognitive issues in reusing software artifacts. In Ted J. Biggerstaff and Alan J. Perlis, editors, Software Reusability, Volume II: Applications and Experience, pages 269–287. Addi- son-Wesley, Reading, MA, 1989. [dCLF93] Dennis de Champeaux, Doug Lea, and Penelope Faure. Ob- ject-Oriented System Development. Addison-Wesley, Reading, MA, 1993. [Deu89] L. Peter Deutsch. Design reuse and frameworks in the Smalltalk-80 system. In Ted J. Biggerstaff and Alan J. Perlis, editors, Software Reusability, Volume II: Applications and Experience, pages 57–71. Addison-Wesley, Reading, MA, 1989. [Ede92] D. R. Edelson. Smart pointers: They’re smart, but they’re not pointers. In Proceedings of the 1992 USENIX C++ Conference, pages 1–19, Portland, OR, August 1992. USENIX Association. [EG92] Thomas Eggenschwiler and Erich Gamma. The ET++SwapsMan- ager: Using object technology in the financial engineering domain. In Object-Oriented Programming Systems, Languages, and Ap- plications Conference Proceedings, pages 166–178, Vancouver, British Columbia, Canada, October 1992. ACM Press. [ES90] Margaret A. Ellis and Bjarne Stroustrup. The Annotated C++ Reference Manual. Addison-Wesley, Reading, MA, 1990. [Foo92] Brian Foote. A fractal model of the lifecycles of reusable objects. OOPSLA ’92 Workshop on Reuse, October 1992. Vancouver, British Columbia, Canada. [GA89] S. Gossain and D.B. Anderson. Designing a class hierarchy for domain representation and reusability. In TOOLS ’89 Conference Proceedings, pa ges 201–210, CNIT Paris—La Defense, France, November 1989. Prentice Hall. [Gam91] Erich Gamma. Object-Oriented Software Development based on ET++: De sign Patterns, Class Library, Tools (in German). PhD thesis, University of Zurich Institut f ür Informatik, 1991. [Gam92] Erich Gamma. Object-Oriented Software Development based on ET++: De sign Patterns, Class Library, Tools (in German). Spring- er-Verlag, Berlin, 1992. Библиография 431 [Gla90] Andrew Glassner. Graphics Gems. Academic Press, Boston, MA, 1990. [GM92] M. Graham and E. Mettala. The Domain-Specific Software Archi- tecture Program. In Proceedings of DARPA Software Technology Conference, 1992, pages 204–210, April 1992. Also published in CrossTalk, The Journal of Defense Software Engineering, pages 19–21, 32, October 1992. [GR83] Adele J. Goldberg and David Robson. Smalltalk-80: The Language and Its Implementation. Addison-Wesley, Reading, MA, 1983. [HHMV92] Richard Helm, Tien Huynh, Kim Marriott, and John Vlissides. An object-oriented architecture for constraint-based graphical editing. In Proceedings of the Third Eurographics Workshop on Object-Oriented Graphics, pages 1–22, Champ éry, Switzerland, October 1992. Also available as IBM Research Division Technical Report RC 18524 (79392). [HO87] Daniel C. Halbert and Patrick D. O’Brien. Object-oriented devel- opment. IEEE Software, 4(5):71–79, September 1987. [ION94] IONA Technologies, Ltd., Dublin, Ireland. Programmer’s Guide for Orbix, Version 1.2, 1994. [JCJO92] Ivar Jacobson, Magnus Christerson, Patrik Jonsson, and Gunnar Overgaard. Object-Oriented Software Engineering—A Use Case Driven Approach. Addison-Wesley, Wokingham, England, 1992. [JF88] Ralph E. Johnson and Brian Foote. Designing reusable classes. Jour- nal of Object-Oriented Programming, 1(2):22–35, June/July 1988. [JML92] Ralph E. Johnson, Carl McConnell, and J. Michael Lake. The RTL system: A framework for code optimization. In Robert Giegerich and Su san L. Graham, editors, Code Generation—Concepts, Tools, Techniques. Proce edings of the International Workshop on Code Generation, pages 255–274, Dagstuhl, Germany, 1992. Spring- er-Verlag. [Joh92] Ralph Johnson. Documenting frameworks using patterns. In Object-Ori en ted Programming Systems, Languages, and Appli- cations Conference Proceedings, pages 63–76, Vancouver, British Columbia, Canada, October 1992. ACM Press. [JZ91] Ralph E. Johnson and Jonathan Zweig. Delegation in C++. Journal of Object-Oriented Programming, 4(11):22–35, November 1991. 432 Библиография [Kir92] David Kirk. Graphics Gems III. Harcourt, Brace, Jovanovich, Boston, MA, 1992. [Knu73] Donald E. Knuth. The Art of Computer Programming, Volumes 1, 2, and 3. Addison-Wesley, Reading, MA, 1973. [Knu84] Donald E. Knuth. The TЕX book. Addison-Wesley, Reading, MA, 1984. [Kof93] Thomas Kofler. Robust iterators in ET++. Structured Program- ming, 14:62–85, March 1993. [KP88] Glenn E. Krasner and Stephen T. Pope. A cookbook for using the model-view controller user interface paradigm in Smalltalk-80. Journal of Object-Oriented Programming, 1(3):26–49, August/ September 1988. [LaL94] Wilf LaLonde. Discovering Smalltalk. Benjamin/Cummings, Red- wood City, CA, 1994. |