Содержание
- 2. Распространенность парадигм программирования во многом обуславливается их способностями поддерживать современные методологии разработки программного обеспечения. Основной показатель
- 3. На второй план отступает такое требование, как быстрое проектирование первоначальной (полнофункциональной) версии программы, потому что его
- 4. Техника эволюционного развития реализована в возвратном проектировании. Она же используется при экстремальном программировании (X-programming). 1. Буч
- 5. Эволюционная разработка – один из основных факторов, определяющих создание современного программного обеспечения Окончание очередного витка эволюционного
- 6. Его нельзя переделать «мастером», его невозможно автоматически сгенерировать при повторном проектировании. При этом желательно как можно
- 7. Основные виды отношений между программными объектами Отличие парадигм программирования заключается в различных способах реализации моделей состояния
- 8. Известная всем метафора: Алгоритмы + Данные = Программы Отражает только простейшие отношения, существующие между данными и
- 9. Более точным отражением является текущего состояния является: Программа = Конструктив (Данные, Алгоритмы) В борьбе конструктивов и
- 10. ООП предложило более гибкие конструктивы для построения эволюционно расширяемых программ
- 11. Абстрагирование от конкретных экземпляров достигается за счет введения специальных понятий, определяющих как семантические артефакты, например, "абстрактный
- 12. Агрегаты и обобщения используются при конструировании композиций из данных и процедур. В каждой из существующих парадигм
- 13. Конструирование агрегатов Агрегация (агрегирование) - это абстрагирование, посредством которого один объект конструируется из других [Цикритзис]. Агрегирование
- 14. Наиболее типичным является восприятие агрегата как единой абстракции, сформированной непосредственным включением используемых в нем программных объектов.
- 16. Косвенное связывание позволяет формировать агрегаты из отдельных элементов, уже располагаемых в пространстве. Взаимосвязь осуществляется алгоритмическим заданием
- 18. Наследование позволяет создавать структуру объекта, эквивалентную той, которая формируется непосредственным включением. Но поддерживает свойства конкатенации, в
- 20. Образное агрегирование связано с отсутствием специально созданной абстракции, соответствующей формируемому агрегату. Вместо этого агрегат воссоздается только
- 21. A X Z Y adrrZ adrrX Агрегат A из элементов X, Y, Z, построенный на основе
- 22. Наряду с "чистыми" методами, агрегаты могут строиться по смешанному принципу, когда одновременно применяются различные комбинации методов
- 24. К специфике различных парадигм программирования можно отнести способы построения агрегатов и их использования. В частности, при
- 25. Процедурное агрегирование Агрегатам данных соответствуют абстрактные типы данных. Они состоят из объектов данных, подключаемых непосредственно или
- 26. //-------------------------------------------------------- // Простейший контейнер на основе одномерного массива //-------------------------------------------------------- // Контейнер должен знать о фигуре #include
- 27. //-------------------------------------------------- // Процедуры должны знать о контейнере и фигуре, // доступной через модуль, описывающий контейнер #include
- 28. //--------------------------------------------------------- // Необходим прототип функции, формирующей фигуру при вводе shape *In(); //--------------------------------------------------------- // Ввод содержимого контейнера
- 29. //--------------------------------------------------- // Необходим прототип функции вывода отдельной фигуры void Out(shape &s); //--------------------------------------------------- // Вывод содержимого контейнера
- 30. Объектно-ориентированное агрегирование Объектно-ориентированное программирование предлагает следующие варианты композиции для создания агрегатов: Основной агрегирующей единицей является виртуальная
- 31. Обычные процедуры, размещаемые в классе и используемые для изменения своего внутреннего состояния, часто называются методами, функциями-членами
- 32. Пример объектно-ориентированного агрегирования //------------------------------------------------------ // Простейший контейнер на основе одномерного массива //------------------------------------------------------ // Контейнер должен знать
- 33. //----------------------------------------------------------- // Необходимо знать описание контейнера и методов фигуры, // доступных через container_atd.h #include "container_atd.h" //-----------------------------------------------------------
- 34. //------------------------------------------------------ // Ввод содержимого контейнера void container::In() { cout " (yes=\'y\', no=other character)? " char k;
- 35. //------------------------------------------------------------- // Вывод содержимого контейнера void container::Out() { cout for(int i = 0; i cout cont[i]->Out();
- 36. Отличие методов агрегирования ОО агрегирование не имеет никаких преимуществ перед процедурным агрегированием ОО подход лучше описывает
- 37. Процедурный подход позволяет лучше скрывать данные [Meyers] struct simple; simple *create_simple (int val); void destroy_simple(simple* s);
- 38. Резюме ОО агрегирование обеспечивает более компактное написание программ за счет поддержки рациональных методов создания артефактов. Процедурное
- 39. Конструирование обобщений Обобщение - это композиция альтернативных по своим свойствам программных объектов, принадлежащих к единой категории
- 40. Основа специализации – программный объект, который может использоваться в качестве специализации того или иного обобщения. Для
- 41. Методы формирования обобщений При обобщении на основе общего ресурса происходит размещение специализаций в едином адресном пространстве.
- 44. Наличие общего ресурса для нескольких абстракций позволяет использовать такое обобщение в двух различных целях: Хранение одного
- 45. Альтернативное связывание Предполагает независимое размещение специализаций в рассматриваемом обобщении. Использование ссылки или указателя обеспечивает доступ только
- 48. Образное обобщение Как и образное агрегирование, связано с мысленными ассоциациями программиста. Используя ключевой признак, можно связать
- 50. Вариантное обобщение Вариант - основа обобщения данных в процедурном подходе. Обобщение, применяемое в процедурном подходе и
- 51. Обработка вариантных обобщений осуществляется независимыми процедурами, организующими доступ к внутренним переменным через экземпляр обобщения, получаемый, в
- 52. Процедуры, осуществляющие обработку всего вариантного обобщения, используют алгоритмический механизм анализа вариантов по ключевому параметру, содержащему признак
- 53. Использование независимых вариантных процедур для создания кода ведет к централизации процесса обработки обобщений, выделя в нем
- 54. Построение вариантного обобщения на основе общего ресурса Рассмотрим создание обобщенной геометрической фигуры, используемой для представления прямоугольника
- 55. //------------------------------------ // прямоугольник struct rectangle { int x, y; // ширина, высота }; //------------------------------------- // треугольник
- 56. Процедура динамического создания прямоугольника: rectangle *Create_rectangle(int x, int y) Процедура инициализации уже созданного прямоугольника: void Init(rectangle
- 57. Процедура динамического создания треугольника: triangle *Create_triangle (int a, int b, int c) Процедура инициализации уже созданного
- 58. //------------------------------------------------------ // Процедуры, обеспечивающие работу с прямоугольником //------------------------------------------------------ // Динамическое создание прямоугольника по двум сторонам rectangle
- 59. // Ввод параметров прямоугольника void In(rectangle &r) { cout cin >> r.x >> r.y; } //
- 60. //----------------------------------------------------- // Процедуры, обеспечивающие работу с треугольником // Динамическое создание треугольника по трем сторонам triangle *Create_triangle(int
- 61. // Ввод параметров треугольника void In(triangle &t) { cout cin >> t.a >> t.b >> t.c;
- 62. Вариантное обобщение на основе прямого включения строится с применением объединения: // Обобщение на основе // разделяемого
- 63. Объединение включается в агрегат, который также содержит признаки специализаций и ключевую переменную, предназначенную для хранения текущего
- 64. Вариантные процедуры Динамическое создание обобщенной фигуры: shape *Create_shape_rectangle(int x, int y) shape *Create_shape_triangle (int a, int
- 65. //------------------------------------------------------ // Процедуры, обеспечивающие работу с обобщенной фигурой //------------------------------------------------------ // Сигнатуры, необходимые обработчикам вариантов. void Init(rectangle
- 66. // Инициализация обобщенного прямоугольника void Init_rectangle(shape &s, int x, int y) { s.k = shape::key::RECTANGLE; Init(s.r,
- 67. // Ввод параметров обобщенной фигуры из // стандартного потока ввода shape* In() { shape *sp; cout
- 68. // Вывод параметров текущей фигуры в стандартный // поток вывода void Out(shape &s) { switch(s.k) {
- 69. Полная версия примера в pp_examp1.zip. Резюме Вариантные обобщения на основе общего ресурса формируются при написании программы
- 70. Процесс построения языковой структуры вариантного обобщения совпадает по направленности с восходящим проектированием. Это никоим образом не
- 71. Построение вариантного обобщения на основе альтернативного связывания Позволяет обойтись без дополнительных обобщающих конструкций, что обеспечивает большую
- 72. // структура, обобщающая все имеющиеся фигуры struct shape { // значения ключей для каждой из фигур
- 73. Построение вариантного обобщения на основе образного восприятия Для иллюстрации образного восприятия вариантов, введем в нашу программу
- 74. struct container { enum {max_len = 100}; // максимальная длина int len; // текущая длина //
- 75. // структура, обобщающая прямоугольник struct r_shape { // значения ключей для каждой из фигур int k;
- 76. void Out(rectangle &r); void Out(triangle &t); void Out(shape *ps) { switch(ps->k) { case 1: // прямоугольник
- 77. Пример программы на языке программирования Оберон (процедурный стиль) Язык содержит расширяемые типы данных, обеспечивает проверку типов
- 78. (****************************************************** figure.o: содержит модуль figure с процедурами и типами, осуществляющими обработку обобщенных геометрических фигур ********************************************************) MODULE
- 79. (******************************************************* rectangle.o: содержит модуль rectangle с процедурами и типами, осуществляющими обработку прямоугольников ********************************************************) MODULE rectangle; IMPORT
- 80. (* Процедура инициализации уже существующего прямоугольника *) PROCEDURE Init*(VAR r: rect; x, y: INTEGER); BEGIN r.x
- 81. (* Процедура вывода *) PROCEDURE Output*(VAR r: rect); BEGIN Out.String("Rectangle: x = "); Out.Int(r.x, 0); Out.String(",
- 82. (* Процедура вывода в файл, использующая передачу параметра-переменной *) PROCEDURE FileOutput* (VAR outFile : FileIO.TFile; VAR
- 83. (******************************************************** figureproc.o: содержит модуль figureProc с процедурами, осуществляющими обработку специализаций, связанных с обобщенной геометрической фигурой. Эти
- 84. (* Процедура, осуществляющая создание и ввод одной из специализаций после предварительного анализа признака вводимой фигуры *)
- 85. (* Процедура, осуществляющая вывод специализаций через параметр-переменную *) PROCEDURE Output*(VAR f: figure.fig); BEGIN WITH f: rectangle.rect
- 86. (* Процедура Заполнения фигуры из файла *) PROCEDURE FileInput*(VAR inFile : FileIO.TFile) : figure.Pfig; VAR flag
- 87. (* Процедура вывода в файл, использующая передачу параметра-переменной *) PROCEDURE FileOutput*(VAR outFile : FileIO.TFile; VAR f:
- 88. (* test.o: *) MODULE figureTest; IMPORT In, Out, FileIO, Console, figure, rectangle, triangle, figureProc, container; VAR
- 89. (* Предварительная инициализаци контейнера *) container.Init(c); (* Тестовый вывод содержимого контейнера до работы *) Out.String("Initialed Container
- 90. Отличительные особенности объектно-ориентированной альтернативы Основной спецификой ОО подхода является возможность группирования процедур вокруг обрабатываемых ими данных.
- 91. При ООП методы классов напрямую привязываются к обрабатываемым данным. Эта привязка осуществляется во написания кода (в
- 92. Поэтому, когда в ходе выполнения программы формируется экземпляр объекта Di с данными типа ti, создается и
- 93. Объектное обобщение При ОО методе организации альтернатив, не требуется анализа признаков специализаций. Используется зависимость двух статически
- 96. Основная задача выбора альтернативы заключается в вызове соответствующей связанной процедуры. Она решается следующим образом. Через указатель
- 98. Таким образом, в объектном обобщении не нужен специализированный ключ, обеспечивающий анализ существующей альтернативы, так как решение
- 99. Пример использования объектного обобщения // Класс, обобщающий все имеющиеся фигуры. // Является абстрактным, обеспечивая, тем самым,
- 100. Опорные процедуры: virtual void In() virtual void Out() virtual double Area() Все эти виртуальные абстракции начинают
- 101. // прямоугольник class rectangle: public shape { int x, y; // ширина, высота public: // переопределяем
- 102. // Динамическое создание прямоугольника по двум сторонам rectangle::rectangle(int _x, int _y): x(_x), y(_y) {} // Ввод
- 103. class triangle: public shape { int a, b, c; // стороны public: void In(); // ввод
- 104. // Инициализация по трем сторонам triangle::triangle(int _a, int _b, int _c): a(_a), b(_b), c(_c) {} //
- 105. Пример программы на языке программирования Оберон 2 (ОО стиль) Язык дополнительно содержит процедуры, связанные с типом,
- 106. (******************************************************* figure.o: содержит модуль figure с процедурами и типами, осуществляющими обработку обобщенных геометрических фигур ********************************************************) MODULE
- 107. (* Процедура, вычисляющая переметр обобщенной фигуры *) PROCEDURE (VAR f: fig) Perimeter* (): REAL; BEGIN RETURN
- 108. (********************************************************rectangle.o: содержит модуль rectangle с процедурами и типами, осуществляющими обработку прямоугольников ********************************************************) MODULE rectangle; IMPORT In,
- 109. (* Процедура инициализации уже существующего прямоугольника *) PROCEDURE (VAR r: rect) Init*(x, y: INTEGER); BEGIN r.x
- 110. (* Процедура вывода прямоугольника - наследника фигуры *) PROCEDURE (VAR r: rect) Output*; BEGIN Out.String("Rectangle: x
- 111. (* Процедура вывода в файл прямоугольника - наследника фигуры *) PROCEDURE (VAR r: rect) FileOutput*(VAR outFile
- 112. (******************************************************** figureproc.o: ********************************************************) MODULE figureProc; IMPORT In, Out, FileIO, figure, rectangle, triangle; (* Создание и ввод
- 113. (* Процедура заполнения обобщенной фигуры из файла *) PROCEDURE FileInput* (VAR inFile : FileIO.TFile) : figure.Pfig;
- 114. Отличие методов обобщения Основным неоспоримым достоинством объектного обобщения является поддержка быстрого и безболезненного, для уже написанного
- 115. //-------------------------------------------- // структура, обобщающая все имеющиеся фигуры // Изменилась, в связи с добавлением круга struct shape
- 116. // Ввод параметров обобщенной фигуры // Изменилась из-за добавления круга shape* In() { shape *sp; //
- 117. // Вывод параметров текущей фигуры // Изменилась из-за добавления вывода круга void Out(shape &s){ switch(s.k) {
- 118. При разработке же больших программных систем обработка обобщений может осуществляться не одной сотней процедур, каждую из
- 119. ОО подход, в аналогичной ситуации, позволяет провести добавление круга практически без изменений уже написанного кода. При
- 120. // Ввод параметров обобщенной фигуры // Изменяется в связи с добавлением круга shape* In() { shape
- 121. ОО обобщение прекрасно поддерживает эволюционное расширение агрегатов, при котором используется только одна производная альтернатива, заменяющая ту,
- 122. Ограничения техники ООП Проблемы с расширением функциональности альтернатив При добавлении нового обработчика специализации необходимо включить в
- 123. Пример. Добавление вычисления периметра (ПП) // Вычисление периметра прямоугольника double Perimetr(rectangle &r) { return (r.x +
- 124. Пример. Добавление вычисления периметра (ООП) // Класс, обобщающает все имеющиеся фигуры. // Изменился в связи с
- 125. // Измененный прямоугольник (вычисляет периметр) class rectangle: public shape { int x, y; // ширина, высота
- 126. Проблемы при добавлении специализированных действий Пример. Надо выводить все прямоугольники, расположенные в контейнере. Соответствующая процедура должна
- 127. // Вывод только обобщенного прямоугольника // Процедура добавлена без изменений // других объектов bool Out_rectangle(shape &s)
- 128. Объектно-ориентированный подход не позволяет, в данном случае, получить элегантное решение. Возможные пути: Использование динамического анализа типа
- 129. // Класс, обобщающает все имеющиеся фигуры. class shape { public: virtual void In() = 0; //
- 130. // Прямоугольник переопределяет вывод себя class rectangle: public shape { int x, y; // ширина, высота
- 131. Выводы Независимо от техники и парадигм программирования создаются программные объекты и отношения между ними, с использованием
- 133. Скачать презентацию