НОУ ІНТУІТ, Лекція, Статичні структури класи

Роль класів

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

p align="justify"> Для розуміння ГО-підходу необхідно ясно уявляти, що класи виконують дві функції, які до появи ГО-технологій завжди були розділені. Клас одночасно є модулем та типом.

Модулі та типи

Засоби, що використовуються при розробці ПЗ, - мови програмування, проектування, специфікацій, графічні системи позначень для аналізу, - завжди включали як можливість застосування модулів, так і систему типів.

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

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

Клас як модуль та як тип

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

Потужність ГО-методу багато в чому наслідок цього ототожнення. Спадкування, зокрема, може бути повністю зрозуміле тільки при розгляді його як модульного розширення, так і одночасно уточнення спеціалізації типу.

Як практично поєднати дві настільки різні на перший погляд концепції? Наступна дискусія та приклади дозволять відповісти на це запитання.

Уніфікована система типів

Важливим аспектом ГО-підходу є простота та універсальність системи типів, що будується на основі фундаментального принципу.

Кожен об'єкт є екземпляромдеякого класу

Об'єктний принцип буде поширюватися не тільки на складові об'єкти, що визначаються розробниками (такі як структури даних, що містять кілька полів), а й на базові об'єкти - цілі та дійсні числа, булеві значення та символи, які будуть розглядатися як екземпляри визначених бібліотечних класів (INTEGER, REAL, DOUBLE, BOOLEAN, CHARACTER).

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