Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
конспект лекцій (ТСПП).docx
Скачиваний:
213
Добавлен:
01.05.2015
Размер:
15.59 Mб
Скачать

4.2. Об' єктно - орієнтований аналіз, дизайн і проектування.

ТОП орієнтоване на розробку великих програмних комплексів, що розробляються командою програмістів (можливо, досить великий). Проектування системи в цілому, створення окремих компонент і їх об' єднання в кінцевий продукт при цьому часто виконується різними людьми, і немає жодного фахівця, який знав би про проект усе.

Об' єктно - орієнтоване проектування полягає в описі структури та поведінки проектованої системи, тобто, фактично, у відповіді на два основних питання:

  • З яких частин складається система.

  • У чому полягає відповідальність кожної з частин.

Виділення частин проводитися таким чином, щоб кожна мала мінімальний за обсягом і точно певний набір виконуваних функцій (обов' язків), і при цьому взаємодіяла з іншими частинами якомога менше.

Чимдалі уточнення призводить до виділення більш дрібних фрагментів опису. У міру деталізації опису та визначення відповідальності виявляються дані, які необхідно зберігати, наявність близьких по поведінці агентів, які стають кандидатами на реалізацію у вигляді класів із загальними предками. Після виділення компонентів і визначення інтерфейсів між ними реалізація шкірного компонента може проводитися практично незалежно від інших (зрозуміло, при дотриманні відповідної технологічної дисципліни).

Велике значення має правильна побудова ієрархії класів. Одна з відомих проблем великих систем, побудованих по ООП- технології - так звана проблема крихкості базового класу. Вона полягає в тому, що на пізніх етапах розробки, коли ієрархія класів побудована і на її основі розроблено велику кількість коду, виявляється важко або навіть неможливо внести якісь зміни в код базових класів ієрархії (від яких породжені всі або багато працюють в системі класи ). Навіть якщо вносяться зміни не ткнутися інтерфейс базового класу, зміна його поведінки може непередбачуваним чином відбитися на класах-нащадках. У разі великої системи розробник базового класу просто не в змозі передбачити наслідки змін, він навіть не знає про ті, як саме базовий клас використовується і від яких особливостей його поведінки залежить коректність роботи класів - нащадків.

Споріднені методології

Компонентне програмування - наступний етап розвитку ТОП; прототип-й клас- орієнтоване програмування - різні підходи до створення програми, які можуть комбінуватися, що мають свої переваги і недоліки.

Компонентне програмування

Компонентно- орієнтоване програмування - це своєрідна "надбудова" над ТОП, набір правив і обмежень, спрямованих на побудову великих розвиваються програмних систем з великою годиною життя. Програмна система в цій методології являє собою набір компонентів з добрі визначеними інтерфейсами. Зміни в існуючу систему вносяться шляхом створення нових компонентів на додаток або в якості заміни раніше існуючих. При створенні нових компонентів на основі раніше створених боронує використання спадкування реалізації - новий компонент може успадковувати лише інтерфейси базового. Таким чином компонентне програмування обходити проблему крихкості базового класу.

Прототипних програмування

Прототипних програмування, зберігши частину рис ТОП, відмовилося від базових зрозуміти - класу і наслідування.

Замість механізму опису класів і породження екземплярів мова надає механізм створення об' єкта (шляхом завдання набору полів і методів, які об' єкт повинний мати) і механізм клонування об' єктів.

Кожен новостворений об' єкт є "екземпляром без класу". Кожен об' єкт може статипрототипом - бути використаний для створення нового об' єкту за допомогою операціїклонування. Після клонування новий об' єкт може бути змінений, зокрема, доповнено новими полями і методами.

Клонований об' єкт або стає повною копією прототипу, що зберігає всі значення його полів і дублюючої його методи, або зберігає посилання на прототип, не включаючи в собі клонованих полів і методів до тихий пір, поки сморід не будуть змінені. У останньому випадку Середа виконання забезпечує механізм делегування - якщо при зверненні до об' єкта він сам не містить потрібного методу або поля даних, виклик передається прототипу, від нього, при необхідності - далі по ланцюжку.

Продуктивність об' єктних програм

Граді Буч вказує на наступні заподій, що призводять до зниження продуктивності програм через використання об' єктно - орієнтованих засобів:

Динамічне зв'язування методів.

Забезпечення поліморфного поводження об' єктів призводить до необхідності пов'язувати методи, які викликаються програмою (тобто визначати, який конкретно метод буде викликатися) не на етапі компіляції, а в процесі виконання програми, на що витрачається додатковий години При цьому реально динамічне зв'язування потрібно не більш ніж для 20% викликів, але деякі ООП-мови використовують його постійно.

Значна глибина абстракції.

ООП-розробка часто призводить до створення "багатошарових" додатків, де виконання об' єктом необхідної дії зводиться до безлічі звернень до об' єктів більш низького рівня. У такому додатку відбувається дуже багато викликів методів і повернень з методів, що, природно, позначається на продуктивності.

Спадкування "розмиває" код.

Код, що відноситься до "крайовим" класам ієрархії спадкоємства (які зазвичай і використовуються програмою безпосередньо) - знаходиться не тільки в самих цих класах, але і в їх класах- предків. Відносяться до одного класу методи фактично описуються в різних класах. Це призводить до двох неприємних моментів :

  • Знижується швидкість трансляції, так як компонувальнику доводитися довантажувати опису всіх класів ієрархії.

  • Знижується продуктивність програми в системі із сторінкової пам'яттю - оскільки методи одного класу фізично знаходяться в різних місцях коду, далеко один від одного, при роботі фрагментів програми, активно звертаються до успадкованим методам, система змушена проводити часті перемикання сторінок.

Інкапсуляція знижує швидкість доступу до даних.

Заборона на прямий доступ до полів класу ззовні призводить до необхідності створення та використання методів доступу. І написання, і компіляція, і виконання методів доступу пов'язане з додатковими витратами.

Динамічне створення і знищення об' єктів.

Динамічно створювані об' єкти, як правило, розміщуються в купі, що менш ефективно, ніж розміщення їх на стечу і, тим більше, статичне виділення пам' яті під них на етапі компіляції.

Незважаючи на зазначені недоліки, Буч стверджує, що вигоди від використання ТОП більш вагомі. Крім того, підвищення продуктивності за рахунок кращої організації ТОП-коду, за його словами, в деяких випадках компенсує додаткові накладні витрати на організацію функціонування програми. Можна також зауважити, що багато ефекти зниження продуктивності можуть згладжуватися або навіть повністю усуватися за рахунок якісної оптимізації коду компілятором. Наприклад, згадане вище зниження швидкості доступу до полів класу через використання методів доступу усувається, якщо компілятор замість виклику методу доступу використовує інлайн - підстановку (сучасні компілятори роблять це цілком упевнено).