Поняття про об'єкти
Об'єкт - це досить загальне і широке поняття, яке може мати різні трактування. У широкому сенсі слова об'єкт - це будь-яка сутність, що має певний набір властивостей і володіє деяким поведінкою. Звідси випливає, що об'єктом може бути практично все що завгодно - матеріальні предмети (комп'ютер, автомобіль, людина), логічні поняття (файл, документ, структура даних, вікно в многооконной графічній системі), математичні поняття (наприклад, геометричні об'єкти типу відрізок, окружність ).
Під об'єктом у вузькому сенсі можна розуміти деякий формалізоване опис даної суті, тобто Модель. Для такого опису потрібен деякий мову, наприклад - мову програмування. У цьому випадку об'єкт стає елементом мови, і саме в такому контексті він і буде розглядатися далі. Моделювання реальних об'єктів - це найважливіший етап розробки об'єктних програм, багато в чому визначає успіх всього проекту. Необхідно розуміти, що будь-яка модель - це тільки частина вихідного об'єкта, що моделюється, що відображає ті властивості і атрибути об'єкта, які найбільш важливі з точки зору розв'язуваної задачі. Зміна постановки задачі може привести до істотної зміни моделі. Особливо це характерно для складних об'єктів. Навряд чи має сенс будувати всеосяжну модель "на всі випадки життя", оскільки така модель буде дуже громіздкою і практично непридатною для використання. Тому один з найважливіших принципів побудови моделей - це принцип абстрагування. тобто виділення найбільш істотних рис вихідного об'єкта і відкидання другорядних деталей.
Звідси випливає, що для одного і того ж вихідного об'єкта можна побудувати різні моделі, кожна з яких буде відображати тільки деякі найбільш важливі риси об'єкта.
Наприклад, для початкового об'єкту "людина" можна побудувати такі інформаційні моделі:
· Людина як студент навчального закладу
· Людина як співробітник організації
· Людина як пацієнт закладів охорони здоров'я
· Людина як підопічний органів внутрішніх справ і т.д.
Для опису об'єкта необхідно вказати його властивості (параметри, характеристики), а для опису його поведінки - створити набір підпрограм, званих методами об'єкта. Властивості об'єкта описуються як звичайні поля даних. Під час роботи програми в них зберігаються відповідні значення. Основними типами властивостей є:
· Найпростіші примітивні типи (цілі, строкові, речові, логічні);
· Структуровані типи (масиви, записи або структури);
· Об'єктні властивості, що представляють об'єкти тієї ж самої або іншої природи.
Наявність об'єктних властивостей є проявом одного із способів взаємодії об'єктів - так званої агрегації, котораяболее докладно розглядається в розділі 2.2.
Набір властивостей об'єкта створюється при описі об'єкта і надалі не змінюється. Як приклади властивостей можна привести:
· Об'єкт-файл: ім'я, розмір, дата створення, тип;
· Об'єкт-вікно: положення на екрані, розміри, тип, фон заповнення, тип рамки, оформлення заголовка;
· Об'єкт-автомобіль: вартість, тип, марка, потужність двигуна, колір і т.д .;
· Об'єкт-студент: ім'я та прізвище, група, спеціальність, оцінки;
· Об'єкт-окружність: координати центру, радіус, стан видимості, колір.
Поведінка об'єкта описується набором методів. Кожен метод - програмний код, оформлений у вигляді деякої функції. Об'єднання разом оброблюваних даних (властивостей) і програмного коду для їх обробки (тобто методів) називають принципом інкапсуляції. Цей принцип є одним з базових у ООП. Якщо раніше дані і функції їх обробки існували незалежно один від одного, то в об'єктному підході вони утворюють нову сутність - об'єкт. Іншими словами, об'єкт сам відповідає за обробку своїх даних. Це дозволяє більш чітко розподіляти обов'язки в об'єктної програмі. Об'єкт можна розглядати як «чорний ящик», що виконує певний набір функцій. Реалізація цих функцій не повинна цікавити користувача-клієнта, йому достатньо знати лише набір послуг об'єктом послуг.
Незважаючи на різноманіття об'єктів різної природи, можна виділити наступні групи методів, властиві практично всім об'єктам.
1. Конструктори і деструктори. Конструктор відповідає за створення нового об'єкта, тобто виділення цього об'єкта пам'яті і початкову ініціалізацію цієї пам'яті. Конструктор викликається раніше всіх інших методів. Важливість конструктора визначається тим, що він гарантовано створює об'єкт з якимись початковими значеннями властивостей. Це дозволяє усунути цілий клас неприємних логічних помилок, таких як використання неініціалізованих змінних.
Для одного і того ж об'єкта можна передбачити кілька різних конструкторів, які по-різному ініціалізують властивості створюваного об'єкта. Початкові значення властивостей часто передаються конструктору як вхідні параметри. Деструкція відповідає за знищення об'єкта, тобто звільнення пам'яті, виділеної об'єкту. На відміну від конструкторів, механізм деструкторов реалізований не у всіх ОО-мовами.
2. Методи, за допомогою яких можна дізнатися поточне значення тих чи інших властивостей. Зазвичай для кожного властивості створюється свій метод доступу до що зберігається в ньому значенню. Прийнято привласнювати таким методам імена, що складаються з двох частин - префікса Get і імені відповідного властивості, наприклад - GetColor, GetName, GetPrice. Такі Get-методи зазвичай оформляються як функції, які повертають значення відповідного властивості.
3. Методи, що відповідають за зміну значення одного або декількох властивостей. Їх прийнято починати з префікса Set, наприклад, SetColor, SetName, SetPrice. Нові значення властивостей передаються як параметри Set-методів. Незважаючи на деяке синтаксичне схожість, необхідно розрізняти дії, що виконуються конструкторами і Set-методами: конструктор створює новий об'єкт, а Set-метод лише змінює значення одного або декількох властивостей для вже створеного об'єкта. Досить часто Set-методи перед зміною значень властивостей виконують додаткову роботу, наприклад - перевіряють нові значення властивостей.
Наявність Set / Get-методів пояснюється тим, що відповідно до принципу інкапсуляції властивості об'єкта повинні бути закриті для стороннього втручання. Доступ до властивостей повинен здійснюватися тільки через виклики Get / Set-методів. У цьому випадку деталі внутрішньої реалізації зберігання даних об'єкта повністю закриті від користувачів. Набір методів доступу утворює відкритий інтерфейс об'єкта.
Крім перерахованих методів, об'єкт найчастіше має ще й кілька специфічних унікальних методів, що визначають функціональність об'єкта. наприклад:
· Об'єкт-список: додавання, видалення і пошук елемента;
· Об'єкт-вікно: переміщення, зміна атрибутів, відображення;
· Об'єкт-автомобіль: запуск двигуна, розгін / гальмування, поворот;
· Об'єкт-студент: відвідування занять, виконання завдань, здача контрольних точок, оплата навчання;
· Об'єкт-окружність: відображення, переміщення, розтягнення / стиснення.
В результаті об'єктна програма являє собою набір взаємодіючих об'єктів, які звертаються один до одного за виконанням необхідних дій. При цьому кожен об'єкт проходить певний життєвий цикл: він створюється конструктором, використовується іншими об'єктами і знищується. Очевидно, що одночасно може існувати безліч однотипних об'єктів (безліч файлів, безліч вікон, безліч студентів). Тому необхідний інструмент формального опису таких однотипних об'єктів і в якості такого інструменту виступає найважливіше поняття об'єктного підходу - клас.