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