Бублик Володимир Васильович Програмування - 2 Лекція  4 . Об'єктне програмування. Ієрархія об’єктів: композиція і агрегаці...
Типи ієрархії об'єктів <ul><li>// Layering : вкладання </li></ul><ul><li>class  AnyClass </li></ul><ul><li>{ </li></ul><ul...
Композиція об'єктів <ul><li>Композит  складається з  компонентів </li></ul><ul><li>Компонент  служить атрибутом  композиту...
Приклад   1. Відрізок <ul><li>// Composite </li></ul><ul><li>class  Segment </li></ul><ul><li>{ </li></ul><ul><li>private ...
Приклад 2. Трикутник <ul><li>// Композиція вершин </li></ul><ul><li>class  Triangle </li></ul><ul><li>{ </li></ul><ul><li>...
Приклад 3. Знову трикутник <ul><li>// Композиція сторін   </li></ul><ul><li>class  Triangle </li></ul><ul><li>{ </li></ul>...
Приклад 4. Все той же трикутник <ul><li>// Композиція вершин і сторін </li></ul><ul><li>class  Triangle </li></ul><ul><li>...
Тривалість життя: створення компонент <ul><li>Компоненти створюються конструктором композиту: звичайним або копіювальним <...
Тривалість життя: видалення компонент <ul><li>Компоненти не вимагають окремого видалення, оскільки вони видаляються автома...
Права доступу <ul><li>Звичайно доступ до компонент та їх методів зовні композиту  закрито  (компоненти служать атрибутами ...
Доступ до атрибутів: селектор <ul><li>Оскільки компоненти закриті, доступ (модифікація) забезпечуються селекторами (модифі...
Реалізація селектора <ul><li>const  Point& Triangle::apexA()  const </li></ul><ul><li>{ </li></ul><ul><li>return  _a; </li...
Делегування <ul><li>// Delegation of methods </li></ul><ul><li>class  Triangle </li></ul><ul><li>{ </li></ul><ul><li>priva...
Реалізація делегатів <ul><li>// Delegator </li></ul><ul><li>// трикутник делегує довжину відрізку </li></ul><ul><li>double...
Неделеговані методи <ul><li>Реалізація методів композиту може використовувати відкриту частину компоненти або асоційованог...
Асоційовані об'єкти  <ul><li>Об'єкти не завжди вкладаються один в інший </li></ul><ul><li>Асоційовані об'єкти  ( associate...
Асоційовані об'єкти  <ul><li>// Associator </li></ul><ul><li>class  Triangle </li></ul><ul><li>{ </li></ul><ul><li>private...
Створення асоційованої сторони t.side_a();  // Візьмемо трикутник  t
Створення асоційованої сторони t.side_a();  // Він має селектори вершин,
Створення асоційованої сторони t.side_a();  // Він має селектори вершин,   // але не сторін
Створення асоційованої сторони t.side_a();  // Візьмемо дві потрібні вершини
Створення асоційованої сторони t.side_a();  // і побудуємо відрізок
Варіант надлишкової композиції <ul><li>class  Triangle </li></ul><ul><li>{ </li></ul><ul><li>private : </li></ul><ul><li>P...
Селектор замість делегата <ul><li>// Селектор сторони трикутника </li></ul><ul><li>const  Segment& Triangle::side_a()  con...
Конструювання компонентів <ul><li>Triangle::Triangle </li></ul><ul><li>( const  Point& a,  const  Point& b,  const  Point ...
Consistency ( сумісність ) <ul><li>Надлишкове копіювання шкідливе можливою несумісністю </li></ul><ul><li>Візьмемо трикутн...
Як правильно обрати компоненти композиту? <ul><li>// Трикутник за трьома сторонами </li></ul><ul><li>class  Triangle </li>...
Конструювання сторін <ul><li>Triangle::Triangle </li></ul><ul><li>( const  Point& a,  const  Point& b,  const  Point &c): ...
Тепер вершини делегуються <ul><li>// Вершина трикутника </li></ul><ul><li>const  Point& Triangle::apexA()  const </li></ul...
Знову по сумісність <ul><li>Трикутник складений із сторін знову може стати несумісним при спробі змінити одну із сторін, н...
Підсумок композицій <ul><li>Вершини компоненти ,   сторони асоціанти </li></ul>
Підсумок композицій <ul><li>Вершини і  сторони   компоненти </li></ul>
Підсумок композицій <ul><li>Сторони   компоненти ,  вершини асоціанти </li></ul>
Агрегація <ul><li>Кожен нетривіальний об'єкт є агрегатом, складеним зі своїх атрибутів </li></ul><ul><li>Атрибути можуть б...
Агрегація указниками <ul><li>Агрегація указниками відрізняється від композиції тривалістю життя: деструктор агрегату сам в...
Сторони, агреговані в трикутник <ul><li>class  Triangle </li></ul><ul><li>{ </li></ul><ul><li>private : </li></ul><ul><li>...
Конструктор агрегату <ul><li>Triangle::Triangle </li></ul><ul><li>( const  Point& a,  const  Point& b,  const  Point &c): ...
Деструктор агрегату <ul><li>Triangle::~Triangle() </li></ul><ul><li>{ </li></ul><ul><li>if  (_ab!=0)  delete  _ab; // vs  ...
Модифікований селектор <ul><li>// Сторона трикутника </li></ul><ul><li>const  Segment& Triangle::side_a()  const </li></ul...
Агрегація сторін указниками <ul><li>вершини   компоненти </li></ul><ul><li>сторони агреговані </li></ul><ul><li>Проблема с...
Агрегація відсилкою <ul><li>Використовується для агрегування об'єктів, тривалість життя яких перевищує тривалість життя аг...
Вершини, агреговані в сторону <ul><li>class  Segment </li></ul><ul><li>{ </li></ul><ul><li>private : </li></ul><ul><li>// ...
Збалансований трикутник <ul><li>// Кінці відрізків </li></ul><ul><li>// відсилають </li></ul><ul><li>// до вершин </li></u...
Збалансований трикутник
Збалансований трикутник
Збалансований трикутник
Збалансований трикутник
Гарантована сумісність
Висновок <ul><li>Головна проблема у створенні агрегатів полягає у виборі правильного типу вкладень залежно від тривалості ...
Upcoming SlideShare
Loading in...5
×

04 Object Hierarchy

292

Published on

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
292
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

04 Object Hierarchy

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

    Clipping is a handy way to collect important slides you want to go back to later.

×