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