Page 91 - 4190
P. 91
незначна. З іншого боку, дизайн що оснований на композиції, буде
містити більше об’єктів (хоча число класів можливо зменшиться), і
поведінка системи почне залежати від їх взаємодії, тоді як при іншо-
му підході це було б визначено в одному класі. Це підводить до дру-
гого правила об”єктно-орієнтованого проектування: надавайте пере-
вагу композиції успадкування класу.
В ідеалі, щоб добитися повторного використання, взагалі не вар-
то би створювати нові компоненти. Добре було б, щоб можна було
отримувати потрібну функціональність, просто збираючи разом усі
існуючі компоненти. На практиці така ситуація виникає рідко, тому
що вибір наявних компонентів все ж не достатньо значний. Повторне
використання шляхом успадкування спрощує створення нових ком-
понентів, які б можна було застосовувати зі старими. Тому успадку-
вання і композицію часто використовують разом. Тим неменше до-
свід проектувальників показує, що програмісти часто зловживають
успадкуванням. Нерідко дизайн міг би стати кращим і простішим,
якщо б програміст частіше використовував композицію.
Делегування. За допомогою делегування композицію можна та-
кож зробити потужним інструментом повторного використання, як і
успадкування. При делегуванні в процесі обробки запитів використо-
вують два об’єкти: одержувач доручає виконання операцій іншому
об’єкту – уповноваженому. Подібно так само підклас делегує відпо-
відальність своєму батьківському класу. Але успадкована операція
завжди може звернутися до об’єкта, що отримує через змінну. Щоб
отримати такий самий ефект через делегування, отримував передає
показчик на самого себе відповідному об’єкту, щоб при виконанні
делегованої операції останній міг звернутися до безпосереднього ад-
ресу запиту. Наприклад, замість того, щоб робити клас Window (вік-
но) підкласу класу Rectangle (прямокутник), оскільки вікно є прямо-
кутником, можна використати в середині Window поведінкою класу
Rectangle, помістивши в клас Window змінну екземпляру типу
Rectangle і делегуючи операції, що специфічні для прямокутників.
Іншими словами, вікно не є прямокутником, а містить його. Тепер
клас Window може явно перенаправляти запити своєму члену
Rectangle, а не успадковувати його операції.
Головна перевага делегування полягає в тому, що вона спрощує
композицію поведінок під час виконання програми. При цьому спосіб
комбінування поведінок можна змінити. Внутрішню область вікна
можна зробити коловою під час виконання, просто підставивши за-
91