04 Object Hierarchy

Post on 05-Jul-2015

285 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

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

Висновок

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

top related