04 object hierarchy

49
Бублик Володимир Васильович Програмування - 2 Лекція 4. Об'єктне програмування. Ієрархія об’єктів: композиція і агрегація Лекції для студентів 2 курсу

Upload: olegapster

Post on 05-Jul-2015

286 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: 04 Object Hierarchy

Бублик Володимир Васильович

Програмування - 2

Лекція 4. Об'єктне програмування.

Ієрархія об’єктів: композиція і агрегація

Лекції для студентів 2 курсу

Page 2: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 2

Типи ієрархії об'єктів

• // Layering: вкладання• class AnyClass• {• T _composee;• T& _refferee;• T* _agregee;• };

Page 3: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 3

Композиція об'єктів

• Композит складається з компонентів

• Компонент служить атрибутом композиту

Page 4: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 4

Приклад 1. Відрізок

• // Composite• class Segment• {• private:• // Components• Point _a, _b;• ………………• };

Page 5: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 5

Приклад 2. Трикутник

• // Композиція вершин• class Triangle• {• private:• Point _a, _b, _c;• ........................• };

Page 6: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 6

Приклад 3. Знову трикутник

// Композиція сторін class Triangle• {• private:• Segment _ab, _bc, _ca;• …………………………….• };Композити самі можуть бути компонентами

інших об'єктів: Композит Triangle містить компонентами три композити Segment

Page 7: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 7

Приклад 4. Все той же трикутник

• // Композиція вершин і сторін

• class Triangle• {• private:• Point _a, _b, _c;• Segment _ab, _bc, _ca;• ........................• };

Page 8: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 8

Тривалість життя: створення компонент

• Компоненти створюються конструктором композиту: звичайним або копіювальним

• Triangle::Triangle• (const Point& a, const Point& b, const Point &c):• // Ініціалізація компонент• _a(a), _b(b), _c(c)• {• return;• }

Page 9: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 9

Тривалість життя: видалення компонент

• Компоненти не вимагають окремого видалення, оскільки вони видаляються автоматично власними деструкторами при видаленні композиту як його атрибути

• ~ Triangle ::Triangle()• {• // _a.~Point();• // _b.~Point();• // _c.~Point();• return;• }

Page 10: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 10

Права доступу

• Звичайно доступ до компонент та їх методів зовні композиту закрито (компоненти служать атрибутами композиту, а атрибути, як правило, закриті)

• Композит сам не має доступу до закритої частини компоненту

• Композит має доступ до відритої частини компоненту, при необхідності він може делегувати цей доступ нагору

Page 11: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 11

Доступ до атрибутів: селектор

Оскільки компоненти закриті, доступ (модифікація) забезпечуються селекторами (модифікаторами)

• class Triangle• {• private:• Point _a, _b, _c;• public:• const Point& apexA() const;• const Point& apexB() const;• const Point& apexC() const;• };

Page 12: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 12

Реалізація селектора

• const Point& Triangle::apexA() const• {• return _a;• }

• Чим відрізняються одна від одної ці реалізації?

• const Point Triangle::apexA() const• {• return _a;• }

Page 13: 04 Object Hierarchy

© Бублик В.В. Програмування-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;• };

Page 14: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 14

Реалізація делегатів

• // Delegator• // трикутник делегує довжину відрізку• double Triangle::length_ab() const• {• // Delegate• // метод трикутника звертається• // до методу сегмента, недоступного зовні• return _ab.length();• }

Page 15: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 15

Неделеговані методи

• Реалізація методів композиту може використовувати відкриту частину компоненти або асоційованого об'єкту як будівельний матеріал

• double Triangle::square() const• {• // length() і distance(_a) методи відрізка• return 0.5*side_a().length()*side_a().distance(_a);• }• Звідки візьмуться відрізки у варіанті трикутника,

складеного лише з вершин?

Page 16: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 16

Асоційовані об'єкти

• Об'єкти не завжди вкладаються один в інший

• Асоційовані об'єкти (associate) можуть будуватися на замовлення і існувати поза асоціатором (associator)

Page 17: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 17

Асоційовані об'єкти

• // Associator• class Triangle• {• private:• Point _a, _b, _c;• public:• // Associate: сторона трикутника• const Segment side_a() const;• };

Page 18: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 18

Створення асоційованої сторони

t.side_a(); // Візьмемо трикутник t

Page 19: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 19

Створення асоційованої сторони

t.side_a(); // Він має селектори вершин,

Page 20: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 20

Створення асоційованої сторони

t.side_a(); // Він має селектори вершин, // але не сторін

Page 21: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 21

Створення асоційованої сторони

t.side_a(); // Візьмемо дві потрібні вершини

Page 22: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 22

Створення асоційованої сторони

t.side_a(); // і побудуємо відрізок

Page 23: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 23

Варіант надлишкової композиції

• class Triangle• {• private:• Point _a, _b, _c;• // Асоціанти стали компонентами• Segment _ab, _bc, _ca; • public:• const Point& apexA() const;• // Делегати стали селекторами• const Segment& side_a() const; • };

Page 24: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 24

Селектор замість делегата

• // Селектор сторони трикутника• const Segment& Triangle::side_a() const• {• return _bc;• // return Segment(_b, _c);• }

Page 25: 04 Object Hierarchy

© Бублик В.В. Програмування-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;• }

Page 26: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 26

Consistency (сумісність)

• Надлишкове копіювання шкідливе можливою несумісністю

• Візьмемо трикутник t, з вершинами a, b і c; сторонами _bc, _ca і _ab.

• Змінимо значення вершини a, але забудемо змінити значення сторін _ca і _ab.

• Трикутник t виявиться несумісним.

• Проблема сумісності не виникає, якщо трикутник задано лише вершинами

Page 27: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 27

Як правильно обрати компоненти композиту?

• // Трикутник за трьома сторонами• class Triangle• {• private:• Segment _ab, _bc, _ca;• public:• // а конструктор, як раніше за трьома вершинами• Triangle(const Point &, const Point&, const Point&);• };

Page 28: 04 Object Hierarchy

© Бублик В.В. Програмування-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;• }

Page 29: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 29

Тепер вершини делегуються

• // Вершина трикутника• const Point& Triangle::apexA() const• {• // return _a;• return _ab.start();• }

Page 30: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 30

Знову по сумісність

• Трикутник складений із сторін знову може стати несумісним при спробі змінити одну із сторін, не змінивши іншої, прилеглої сторони.

• Проблема: надлишкове кодування приводить до несумісності

• Рішення: використовувати розвиненіші форми вкладень, а саме агрегацію.

Page 31: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 31

Підсумок композицій

Вершини компоненти, сторони асоціанти

Page 32: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 32

Підсумок композицій

Вершини і сторони компоненти

Page 33: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 33

Підсумок композицій

Сторони компоненти, вершини асоціанти

Page 34: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 34

Агрегація

• Кожен нетривіальний об'єкт є агрегатом, складеним зі своїх атрибутів

• Атрибути можуть бути• об'єктами ― композиція;• указниками ― агрегація указниками; • відсилками ― агрегація відсилками

Page 35: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 35

Агрегація указниками

• Агрегація указниками відрізняється від композиції тривалістю життя: деструктор агрегату сам відповідає за видалення агрегованого об'єкту

• class Agregate• {• private:• Agregee * _agregee;• public:• Agregate(): _agregee(0){};• ~Agregate() { delete _agregee; }• };

Page 36: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 36

Сторони, агреговані в трикутник

• class Triangle• {• private:• Point _a, _b, _c;• Segment *_ab, *_bc, *_ca;• public:• Triangle(const Point &, const Point&, const Point& c);• ~Triangle();• }

Page 37: 04 Object Hierarchy

© Бублик В.В. Програмування-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;• }

Page 38: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 38

Деструктор агрегату

• Triangle::~Triangle()• {• if (_ab!=0) delete _ab; // vs delete _ab;• if (_bc!=0) delete _bc;• if (_ca!=0) delete _ca;• };

• Питання: чи необхідна перевірка на нуль?

Page 39: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 39

Модифікований селектор

• // Сторона трикутника• const Segment& Triangle::side_a() const• {• // Якщо не обчислювали раніше• if (_bc == 0) • // Обчислюємо і запам'ятовуємо• _bc = new Segment(_b, _c);• return *_bc;• }

Page 40: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 40

Агрегація сторін указниками

вершини компонентисторони агреговані

Проблема сумісності відкрита

Page 41: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 41

Агрегація відсилкою

• Використовується для агрегування об'єктів, тривалість життя яких перевищує тривалість життя агрегату. За створення і видалення агрегованих відсилкою об'єктів агрегат відповідальності не несе

• class Agregate• {• private:• Agregee & _agregee;• public:• Agregate (const Agregee & original):• _agregee (original) {};• };

Page 42: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 42

Вершини, агреговані в сторону

• class Segment• {• private:• // Агреговані вершини• Point &_a, &_b;• ………………• };

• Що гарантує сумісність?

Page 43: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 43

Збалансований трикутник

// Кінці відрізків// відсилають// до вершин// трикутникаclass Segment{private:

Point &_a, &_b;};

//Сторони трикутника// агреговані указниками

class Triangle{private:

Point _a, _b, _c; Segment *_ab, *_bc, *_ca;};

Page 44: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 44

Збалансований трикутник

Page 45: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 45

Збалансований трикутник

Page 46: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 46

Збалансований трикутник

Page 47: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 47

Збалансований трикутник

Page 48: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 48

Гарантована сумісність

Page 49: 04 Object Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування.Ієрархія об’єктів: композиція і агрегація 49

Висновок

• Головна проблема у створенні агрегатів полягає у виборі правильного типу вкладень залежно від тривалості життя об'єктів з метою досягнення максимальної сумісності