cpp-2013 #3 oop basics
TRANSCRIPT
Основи об’єктно-орієнтованого програмування
ООП є інструментом розробки ПЗ(одним із багатьох)
The Right Way: вміти користуватись кількома інструментами в залежності від потреб
Мета сьогодні: сформувати «відчуття» ООП
Програмне забезпечення
• Успішне– Legacy (унаслідуване, застаріле)– Maintainable (легко підтримуване)
• Неуспішне
Legacy software
• Довго експлуатується• Продовжує експлуатуватись• Задовільняє потреби замовника• Але разом з тим– Містить дефекти, не містить нових функцій
• Важко покращується
Maintainable software
• Довго експлуатується• Продовжує експлуатуватись• Задовільняє потреби замовника• Але разом з тим– Містить дефекти, не містить нових функцій
• Легко покращується
Неуспішне ПЗ
• Непередбачувано короткий цикл життя• Не задовільняє потреб замовника• Якість не має значення
Легке покращення
• Хочемо змінювати програму– Проясняються старі/з’являються нові вимоги
• Не хочемо змінювати готовий код– Зміна – внесення нестабільності– Потрібно перетестувати– Залежності транзитивні
Складність• Розробка ПЗ – управління складністю
Tony Hoare:There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.
QuickSort NULLApologized
Складність
• Способи зменшення складності:– Підвищення IQ - ?– Декомпозиція– Абстрагування – Перевикористання– …
Structured programming
• if, while, functions замість goto• Краще розуміння того, що робить програма• За рахунок абстрактніших конструкцій• Мета – уникнути «спагетті-коду»• Bad news: самої парадигми виявилось
недостатньо• Непідтримуваний код все ще можливий
Object-oriented
• Об’єкти замість процедур• Краще розуміння того, що робить програма• За рахунок абстрактніших конструкцій• Мета – уникнути «спагетті-коду»• Bad news: самої парадигми виявилось
недостатньо• Непідтримуваний код все ще можливий
Мета ООП
Knitted castle Lego castlevshttp://www.amazon.com/Knit-Enchanted-Castle-Jan-MESSENT/dp/085532600X
ООП
• Набір об’єктів, що взаємодіють між собою (object graph)
• Об’єкти моделюють поняття з – Області задачі (problem domain)– Області реалізації (implementation domain)
Over-engineered HelloWorld• Приклад ООП стилю• Не приклад доцільності ООП• Взаємодіють між собою об’єкти• Класи описують об’єкти (дані та операції)• У об’єкта є 2 типи клієнтів:– Внутрішні (сам об’єкт)– Зовнішні – Плюс ще наслідування реалізації
• Об’єкти можуть мати явно виділений інтерфейс
Що видно з прикладу?
Абстракція– Всі класи
Інкапсуляція– Всі класи– SecureMessageWriter
Наслідування інтерфейсу– MessageWriter
Поліморфізм (subtype polymorphism)– Метод MessageWriter.write()
Абстракція
Ігнорування несуттєвих деталейщоб сфокусуватись на важливому на даний момент
Рівні абстракції (abstraction layers)низький високий
Абстракція даних data abstraction
Абстракція керування control abstraction
Інкапсуляція
Інкапсуляція
Захищається цілісність об’єкту: об’єкт неможливо перевести у невірний стан
Приховується реалізація об’єкту
Інформація доступна через методи
Об’єкт об’єднує дані та методи роботи з даними
Object-oriented word-wrap
• Приклад моделі задачі• Можливих моделей може бути кілька• Модель містить як сутності з області задачі,
так і сутності з області реалізації• Абстрагування від деталей реалізації
Синтаксичні конструкції
• сlass: описує структуру і поведінку об’єктів• Конструктор• Поля• Методи• Модифікатори доступу: public, private• Інтерфейс: virtual void method() = 0;• Наслідування інтерфейсу: class C : public I{}
• ООП є лише одним із інструментів• ООП не є оптимальним для всіх випадків• але:
краще недоцільна якісна реалізація, ніж доцільна неякісна
• Тому існують мультипарадигменні мови