Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 9 лет назад пользователемАлексей Уруский
1 Бублик Володимир Васильович Об'єктно-орієнтоване програмування Частина 1. Об'єктне програмування. Лекція 4. Ієрархія обєктів: композиція і агрегація Лекції для студентів 2 курсу Hauptbahnhof, Berlin
2 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 2 Типи ієрархії об'єктів //Layering: вкладання class AnyClass { T _composee; T& _refferee; T* _agregee; };
3 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 3 Композиція об'єктів Відношення між об'єктами і їх складовими Композитний об'єкт (композит) складається з компонентів: Автомобіль складається з кузова, двигуна, рами, тощо Компонент служить (складовою частиною) атрибутом композиту: Атрибутами будинку служать стіни, дах, фундамент…
4 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 4 Приклад 1. Відрізок //Composite class Segment { private: //Components Point _a, _b; ……………… };
5 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 5 Приклад 2. Трикутник //Композиція вершин class Triangle { private: Point _a, _b, _c; };
6 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 6 Різновидність композицій Дослідник об'єкту вирішує, які атрибути вважати первинними, а які виражати через інші. Тому один і той же об'єкт реального світу може зображатися різними композиціями своїх атрибутів
7 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 7 Приклад 3. Знову трикутник //Тепер композиція сторін class Triangle { private: Segment _ab, _bc, _ca; ……………………………. }; Композити самі можуть бути компонентами інших об'єктів: Композит Triangle містить компонентами три композити Segment
8 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 8 Приклад 4. Все той же трикутник //Композиція вершин і сторін class Triangle { private: Point _a, _b, _c; Segment _ab, _bc, _ca; };
9 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 9 Тривалість життя: створення компонент Компоненти створюються конструктором композиту: звичайним або копіювальним Triangle::Triangle (const Point& a, const Point& b, const Point &c): //Ініціалізація компонент _a(a), _b(b), _c(c) { return; }
10 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 10 Тривалість життя: видалення компонент Компоненти не вимагають окремого видалення, оскільки вони видаляються автоматично власними деструкторами при видаленні композиту як його атрибути ~ Triangle ::Triangle() { //_a.~Point(); //_b.~Point(); //_c.~Point(); return; }
11 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 11 Права доступу Звичайно доступ до компонент та їх методів зовні композиту закрито (компоненти служать атрибутами композиту, а атрибути, як правило, закриті) Композит сам не має доступу до закритої частини компоненту Композит має доступ до відритої частини компоненту, при необхідності він може делегувати цей доступ нагору
12 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 12 Доступ до атрибутів: селектор Оскільки компоненти закриті, доступ (модифікація) забезпечуються селекторами (модифікаторами) class Triangle { private: Point _a, _b, _c; public: const Point& apexA() const; const Point& apexB() const; const Point& apexC() const; };
13 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 13 Реалізація селектора const Point& Triangle::apexA() const { return _a; } Чим відрізняються одна від одної ці реалізації? const Point Triangle::apexA() const { return _a; }
14 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 14 Делегування //Delegation of methods class Triangle { private: Segment _ab, _bc, _ca; public: //delegates double length_ab() const; double length_bc() const; double length_ca() const; };
15 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 15 Реалізація делегатів //Delegates //трикутник делегує довжину відрізку double Triangle::length_ab() const { //Delegate //метод трикутника звертається //до методу сегмента, недоступного зовні return _ab.length(); }
16 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 16 Неделеговані методи Реалізація методів композиту може використовувати відкриту частину компоненти або асоційованого об'єкту як будівельний матеріал double Triangle::square() const { // length() і distance(_a) методи відрізка return 0.5*side_a().length()*side_a().distance(_a); } Звідки візьмуться відрізки у варіанті трикутника, складеного лише з вершин?
17 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 17 Асоційовані об'єкти Об'єкти не завжди вкладаються один в інший Асоційовані об'єкти (associate) можуть будуватися на замовлення і існувати поза асоціатором (associater)
18 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 18 Асоційовані об'єкти //Associator class Triangle { private: Point _a, _b, _c; public: //Associate: сторона трикутника const Segment side_a() const; };
19 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 19 Створення асоційованої сторони t.side_a(); //Візьмемо трикутник t
20 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 20 Створення асоційованої сторони t.side_a(); //Він має селектори вершин,
21 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 21 Створення асоційованої сторони t.side_a(); //Він має селектори вершин, //але не сторін
22 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 22 Створення асоційованої сторони t.side_a(); //Візьмемо дві потрібні вершини
23 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 23 Створення асоційованої сторони t.side_a(); //і побудуємо відрізок
24 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 24 Варіант надлишкової композиції class Triangle { private: Point _a, _b, _c; // Асоціанти стали компонентами Segment _ab, _bc, _ca; public: const Point& apexA() const; //Делегати стали селекторами const Segment& side_a() const; };
25 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 25 Селектор замість делегата //Селектор сторони трикутника const Segment& Triangle::side_a() const { return _bc; //return Segment(_b, _c); }
26 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 26 Конструювання компонентів Triangle::Triangle (const Point& a, const Point& b, const Point &c): //Багато зайвих копій _a(a), _b(b), _c(c), _ab(Segment(a, b)), _bc(Segment(b, c)), _ca(Segment(c, a)) { return; }
27 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 27 Consistency (сумісність) Надлишкове копіювання шкідливе можливою несумісністю Візьмемо трикутник t, з вершинами a, b і c; сторонами _bc, _ca і _ab. Змінимо значення вершини a, але забудемо змінити значення сторін _ca і _ab. Трикутник t виявиться несумісним. Проблема сумісності не виникає, якщо трикутник задано лише вершинами
28 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 28 Як правильно обрати компоненти композиту? //Трикутник за трьома сторонами class Triangle { private: Segment _ab, _bc, _ca; public: //а конструктор, як раніше за трьома вершинами Triangle(const Point &, const Point&, const Point&); };
29 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 29 Конструювання сторін Triangle::Triangle (const Point& a, const Point& b, const Point &c): _ab(Segment(a, b)), _bc(Segment(b, c)), _ca(Segment(c, a)) { return; }
30 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 30 Тепер вершини делегуються //Вершина трикутника const Point& Triangle::apexA() const { //return _a; return _ab.start(); }
31 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 31 Знову по сумісність Трикутник складений із сторін знову може стати несумісним при спробі змінити одну із сторін, не змінивши іншої, прилеглої сторони. Проблема: надлишкове кодування приводить до несумісності Рішення: використовувати розвиненіші форми вкладень, а саме агрегацію.
32 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 32 Підсумок композицій Вершини компоненти, сторони асоціанти
33 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 33 Підсумок композицій Вершини і сторони компоненти
34 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 34 Підсумок композицій Сторони компоненти, вершини асоціанти
35 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 35 Агрегація Кожен нетривіальний об'єкт є агрегатом, складеним зі своїх атрибутів Атрибути можуть бути об'єктами композиція; указниками агрегація указниками; відсилками агрегація відсилками
36 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 36 Агрегація указниками Агрегація указниками відрізняється від композиції тривалістю життя: деструктор агрегату сам відповідає за видалення агрегованого об'єкту class Agregate { private: Agregee * _agregee; public: Agregate(): _agregee(0){}; ~Agregate() { delete _agregee; } };
37 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 37 Сторони, агреговані в трикутник class Triangle { private: Point _a, _b, _c; Segment *_ab, *_bc, *_ca; public: Triangle(const Point &, const Point&, const Point& c); ~Triangle(); }
38 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 38 Конструктор агрегату Triangle::Triangle (const Point& a, const Point& b, const Point &c): _a(a), _b(b), _c(c), //Сторони обчислюються і агрегуються //на замовлення (on demand) _ab(0), _bc(0), _ca(0) { return; }
39 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 39 Деструктор агрегату Triangle::~Triangle() { if (_ab!=0) delete _ab;// vs delete _ab; if (_bc!=0) delete _bc; if (_ca!=0) delete _ca; }; Питання: чи необхідна перевірка на нуль?
40 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 40 Модифікований селектор //Сторона трикутника const Segment& Triangle::side_a() const { //Якщо не обчислювали раніше if (_bc == 0) //Обчислюємо і запам'ятовуємо _bc = new Segment(_b, _c); return *_bc; }
41 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 41 Агрегація сторін указниками вершини компоненти сторони агреговані Проблема сумісності відкрита
42 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 42 Агрегація відсилкою Використовується для агрегування об'єктів, тривалість життя яких перевищує тривалість життя агрегату. За створення і видалення агрегованих відсилкою об'єктів агрегат відповідальності не несе class Agregate { private: Agregee & _agregee; public: Agregate (const Agregee & original): _agregee (original) {}; };
43 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 43 Вершини, агреговані в сторону class Segment { private: //Агреговані вершини Point &_a, &_b; ……………… }; Що гарантує сумісність?
44 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 44 Збалансований трикутник // Кінці відрізків // відсилають // до вершин // трикутника class Segment { private: Point &_a, &_b; }; //Сторони трикутника // агреговані указниками class Triangle { private: Point _a, _b, _c; Segment *_ab, *_bc, *_ca; };
45 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 45 Збалансований трикутник
46 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 46 Збалансований трикутник
47 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 47 Збалансований трикутник
48 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 48 Збалансований трикутник
49 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 49 Гарантована сумісність
50 © Бублик В.В. ООП-1. Об'єктне програмування. Ієрархія обєктів: композиція і агрегація 50 Висновок Головна проблема у створенні агрегатів полягає у виборі правильного типу вкладень залежно від тривалості життя об'єктів з метою досягнення максимальної сумісності
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.