
- •Міністерство освіти та науки України в.В. Литвин, н.Б. Шаховська Проектування інформаційних систем
- •Передмова наукового редактора серії підручників «комп’ютинґ»
- •1.1. Складність програмного забезпечення
- •1.2. Структура складних систем
- •1.2.1. Приклади складних систем
- •1.2.2. П'ять ознак складної системи
- •1.2.3. Організована і неорганізована складність
- •1.3. Методи подолання складності
- •1.3.1. Роль декомпозиції
- •1.3.3. Роль абстракції
- •1.3.4. Роль ієрархії
- •1.4. Про проектування складних систем
- •1.4.1. Інженерна справа як наука і мистецтво
- •1.4.2. Сенс проектування
- •4. Методи подолання складності.
- •2.1. Базові означення
- •2.2. Методи проектування інформаційних систем
- •2.3. Види інформаційних систем
- •2.4. Рівні моделей даних
- •3. Види інформаційних систем.
- •3.1. Методологія процедурно-орієнтованого програмування
- •3.2. Методологія об'єктно-орієнтованого програмування
- •3.3. Методологія об'єктно-орієнтованого аналізу і проектування
- •3.4. Методологія системного аналізу і системного моделювання
- •4.1. Передісторія. Математичні основи
- •4.1.1. Теорія множин
- •4.1.2. Теорія графів
- •4.1.3. Семантичні мережі
- •4.2. Діаграми структурного системного аналізу
- •4.3. Основні етапи розвитку uml
- •3. Семантичні мережі.
- •5.1. Принципи структурного підходу до проектування
- •5.2. Структурний аналіз
- •5.3. Структурне проектування
- •5.4. Методологія структурного аналізу
- •5.5. Інструментальні засоби структурного аналізу та проектування
- •6.1. Основні елементи
- •6.2. Типи зв’язків
- •6.3. Техніка побудови
- •6.4. Діаграма бізнес – функцій
- •6.4.1. Призначення діаграми бізнес-функцій
- •6.4.2. Основні елементи
- •7.1. Призначення діаграм потоків даних та основні елементи
- •7.1.1. Зовнішні сутності
- •7.1.2. Процеси
- •7.1.3. Накопичувачі даних
- •7.1.4. Потоки даних
- •7.2. Методологія побудови dfd.
- •8.1. Діаграма «сутність-зв’язок»
- •8.2. Діаграма атрибутів
- •8.3. Діаграма категоризації
- •8.4. Обмеження діаграм сутність-зв’язок
- •8.5. Методологія idef1
- •9.1. Основні елементи
- •9.2. Типи керуючих потоків
- •9.3. Принципи побудови
- •10.1. Структурні карти Константайна
- •10.2. Структурні карти Джексона
- •11.1. Призначення case-технологій
- •11.2. Інструментальний засіб bPwin
- •11.2.4. Інші діаграми bpWin
- •11.2.5. Моделі as is і to be
- •11.3.1. Основні властивості
- •11.3.2. Стандарт idef1x
- •11.4. Програмний засіб Visio
- •12.1. Системний аналіз області наукових досліджень
- •12.1.1. Аналіз предметної області
- •12.2. Системний аналіз біржі праці
- •12.2.1. Дерево цілей
- •12.2.2. Опис об’єктів предметної області
- •12.2.3. Концептуальна модель
- •14.1. Еволюція об'єктної моделі
- •14.1.1. Основні положення об'єктної моделі
- •14.2. Складові частини об'єктного підходу
- •14.2.1. Парадигми програмування
- •14.2.2. Абстрагування
- •14.2.3. Інкапсуляція
- •14.2.4. Модульність
- •14.2.5. Ієрархія
- •14.2.7. Паралелізм
- •14.2.8. Збереженість
- •14.3. Застосування об'єктної моделі
- •14.3.1. Переваги об'єктної моделі
- •14.3.2. Використання об'єктного підходу
- •14.3.3. Відкриті питання
- •15.1. Природа об'єкта
- •15.1.1. Що є й що не є об'єктом?
- •15.1.2. Стан
- •15.1.3. Поведінка
- •15.1.4. Ідентичність
- •Void drag(DisplayItem I); // Небезпечно
- •15.2. Відношення між об'єктами
- •15.2.1. Типи відношень
- •15.2.2. Зв'язки
- •15.2.3. Агрегація
- •15.3. Природа класів
- •15.3.1. Що таке клас?
- •15.3.2. Інтерфейс і реалізація
- •15.3.3. Життєвий цикл класу
- •15.4. Відношення між класами
- •15.4.1. Типи відношень
- •15.4.2. Асоціація
- •15.4.3. Успадкування
- •15.4.4. Агрегація
- •15.4.5. Використання
- •15.4.6. Інсталювання (Параметризація)
- •15.4.6. Метакласи
- •15.5. Взаємозв'язок класів і об'єктів
- •15.5.1. Відношення між класами й об'єктами
- •15.5.2. Роль класів і об'єктів в аналізі й проектуванні
- •16.1. Важливість правильної класифікації
- •16.1.1. Класифікація й об’єктно-орієнтовне проектування
- •16.1.2. Труднощі класифікації
- •16.2. Ідентифікація класів і об'єктів
- •16.2.1. Класичний і сучасний підходи
- •16.2.2. Об’єктно-орієнтований аналіз
- •16.3. Ключові абстракції й механізми
- •16.3.1. Ключові абстракції
- •16.3.2. Ідентифікація механізмів
- •17.1. Призначення мови uml
- •17.2. Загальна структура мови uml
- •17.3. Пакети в мові uml
- •17.4. Основні пакети мета-моделі мови uml
- •17.5. Специфіка опису мета-моделі мови uml
- •17.6. Особливості зображення діаграм мови uml
- •18.1. Варіант використання
- •18.2. Актори
- •18.3. Інтерфейси
- •18.4. Примітки
- •18.5. Відношення на діаграмі варіантів використання
- •18.5.1. Відношення асоціації
- •13.5.2. Відношення розширення
- •18.5.3. Відношення узагальнення
- •18.5.4. Відношення включення
- •18.6. Приклад побудови діаграми варіантів використання
- •18.7. Рекомендації з розроблення діаграм варіантів використання
- •19.1. Клас
- •19.1.1. Ім'я класу
- •19.1.2. Атрибути класу
- •19.1.3. Операція
- •19.2. Відношення між класами
- •19.2.1. Відношення залежності
- •19.2.2. Відношення асоціації
- •19.2.3. Відношення агрегації
- •19.2.4. Відношення композиції
- •19.2.5. Відношення узагальнення
- •19.3. Інтерфейси
- •19.5. Шаблони або параметризовані класи
- •19.6. Рекомендації з побудови діаграми класів
- •20.1. Автомати
- •20.2. Стан
- •20.2.1. Ім'я стану
- •20.2.2. Список внутрішніх дій
- •20.2.3. Початковий стан
- •20.2.4. Кінцевий стан
- •20.3. Перехід
- •20.3.2. Сторожова умова
- •20.3.3.Вираз дії
- •15.4. Складений стан і підстан
- •20.4.1. Послідовні підстани
- •20.4.2. Паралельні підстани
- •15.5. Історичний стан
- •20.6. Складні переходи
- •15.6.1. Переходи між паралельними станами
- •20.6.2. Переходи між складеними станами
- •20.6.3. Синхронізуючі стани
- •20.7. Рекомендації з побудови діаграм станів
- •21.1. Стан дії
- •21.2. Переходи
- •21.5. Рекомендації до побудови діаграм діяльності
- •22.1.1. Лінія життя об'єкта
- •22.1.2. Фокус керування
- •22.2. Повідомлення
- •22.2.1. Розгалуження потоку керування
- •22.2.2. Стереотипи повідомлень
- •22.2.3. Тимчасові обмеження на діаграмах послідовності
- •22.2.4. Коментарі або примітки
- •22.3. Приклад побудови діаграми послідовності
- •22.4. Рекомендації з побудови діаграм послідовності
- •23.1. Кооперація
- •23.2.1. Мультиоб'єкт
- •23.2.2. Активний об'єкт
- •23.2.3. Складений об'єкт
- •23.3. Зв'язки
- •23.3.1. Стереотипи зв'язків
- •23.4. Повідомлення
- •23.4.1. Формат запису повідомлень
- •23.5. Приклад побудови діаграми кооперації
- •23.6. Рекомендації з побудови діаграм кооперації
- •24.1. Компоненти
- •24.1.1. Ім'я компоненту
- •24.1.2. Види компонент
- •24.2. Інтерфейси
- •24.3. Залежності
- •24.4. Рекомендації з побудови діаграми компонент
- •25.1. Вузол
- •25.2. З'єднання
- •25.3. Рекомендації з побудови діаграми розгортання
- •26.1. Загальна характеристика case-засобу Rational Rose
- •26.2. Особливості робочого інтерфейсу Rational Rose
- •26.1.1. Головне меню програми
- •26.1.2. Стандартна панель інструментів
- •26.1.3. Вікно браузера
- •26.1.4. Спеціальна панель інструментів
- •26.1.5. Вікно діаграми
- •26.1.6. Вікно документації
- •26.1.7. Вікно журналу
- •26.3. Початок роботи над проектом у середовищі Rational Rose
- •26.4. Розроблення діаграми варіантів використання в середовищі Rational Rose
- •26.5. Розроблення діаграми класів у середовищі Rational Rose
- •26.6. Розроблення діаграми станів у середовищі Rational Rose
- •26.7. Розроблення діаграми послідовності в середовищі Rational Rose
- •26.8. Розроблення діаграми кооперації в середовищі Rational Rose
- •26.9. Розроблення діаграми компонентів у середовищі Rational Rose
- •26.10. Розроблення діаграми розгортання в середовищі Rational Rose
3.2. Методологія об'єктно-орієнтованого програмування
З часом ситуація почала істотно змінюватися. Виявилось, що трудомісткість розроблення програмних засобів на початкових етапах програмування оцінювалася значно нижче за зусилля, що реально витрачалися, що служило причиною додаткових витрат і затягування остаточних термінів готовності програм. У процесі розроблення програм змінювалися функціональні вимоги замовника, що ще більше віддаляло момент закінчення роботи програмістів. Збільшення розмірів програм приводило до необхідності залучення більшого числа програмістів, що, у свою чергу, зажадало додаткових ресурсів для організації їх узгодженої роботи.
Але не менш важливими виявилися якісні зміни, пов'язані із зсувом акценту використання комп'ютерів. Якщо в епоху "великих машин" основними споживачами програмного забезпечення були крупні підприємства, компанії і установи, то пізніше з'явилися персональні комп'ютери, які тепер використовуються в малому і середньому бізнесі. Обчислювальні і розрахунково-алгоритмічні завдання в цій області традиційно займали другорядне місце, а на перший план виступили завдання опрацювання і маніпулювання даними.
Стало очевидним, що традиційні методи процедурного програмування не здатні справитися ні з складністю програм і їх розроблення, що постйно зростає, ні з необхідністю підвищення їх надійності. У другій половині 80-х років виникла потреба в новій методології програмування, яка була б здатна вирішити весь цей комплекс проблем. Такою методологією стало об'єктно-орієнтоване програмування (ООП).
Фундаментальними поняттями ООП є поняття класу і об'єкту. При цьому під класом розуміють деяку абстракцію множини об'єктів, які мають загальний набір властивостей і володіють однаковою поведінкою. Кожний об'єкт у цьому випадку розглядається як екземпляр відповідного класу. Об'єкти, які не мають повністю однакових властивостей або не володіють однаковою поведінкою, за визначенням, не можуть бути віднесені до одного класу.
Примітка
Наведене вище визначення класу є достатньо загальним. У подальших розділах у міру вивчення матеріалу цей термін уточнюватиметься на основі встановлення семантичних зв'язків з іншими поняттями об'єктно-орієнтованого аналізу і проектування.
Важливою особливістю класів є можливість їх організації у вигляді деякої ієрархічної структури, яка на вигляд нагадує схему класифікації понять формальної логіки. У зв'язку з цим слід відмітити, що кожне поняття в логіці має деякий об'єм і зміст. При цьому під об'ємом поняття розуміють всі інші мислимі поняття, для яких початкове поняття може служити визначальною категорією або головною частиною. Зміст поняття складає сукупність всіх його ознак або атрибутів, що відрізняють дане поняття від всіх інших. У формальній логіці має місце закон зворотного відношення: якщо зміст поняття А міститься в змісті поняття В, то об'єм поняття В міститься в об'ємі поняття А.
Ієрархія понять будується таким чином. Найзагальнішим поняттям або категорією береться поняття, що має найбільший об'єм і, відповідно, найменший зміст. Це найвищий рівень абстракції для даної ієрархії. Потім дане загальне поняття деяким чином конкретизується, тим самим зменшується його об'єм і збільшується зміст. З'являється менш загальне поняття, яке на схемі ієрархії буде розташоване на рівень нижче за початкове поняття. Цей процес конкретизації понять може бути продовжений до того часу, поки на самому нижньому рівні не буде отримане поняття, подальша конкретизація якого в даному контексті або неможлива, або недоцільна.
Прикладами найзагальніших понять можуть служити такі абстрактні категорії, як система, структура, інтелект, інформація, сутність, зв'язок, стан, подія і багато інших. У процесі вивчення цих категорій з'являються нові особливості їх змісту і об'єму. Саме з цих причин завжди важко дати їм точне визначення. Як приклади конкретних понять можна привести поняття книги, яку читач тримає в руках, або поняття мікропроцесора Intel Pentium.
Примітка
Як буде видно з подальшого викладу, ієрархічна схема організації понять не тотожна ієрархії класів, оскільки взаємозв'язки між класами можуть мати і інші якісні особливості. З іншої сторони, ієрархія понять є більш загальною категорією в порівнянні з ієрархією рівнів абстракції класів ООП.
Основними принципами ООП є успадкування, інкапсуляція і поліморфізм. Принцип, відповідно до якого знання про загальнішу категорію дозволяється застосовувати для вужчої категорії, називається успадкуванням. Успадкування тісно пов'язане з ієрархією класів, яка визначає, які класи слід вважати найабстрактнішими і загальнішими відносно інших класів. При цьому, якщо деякий батьківський клас (предок) володіє фіксованим набором властивостей і поведінкою, то похідний від нього клас (нащадок) повинен містити цей же набір властивостей і поведінку, а також додаткові, які характеризуватимуть унікальність отриманого таким чином класу. В цьому випадку говорять, що похідний клас успадковує властивості і поведінку батьківського класу.
Для ілюстрації принципу успадкування можна навести наступний приклад. Розглянемо загальний клас "Автомобіль". Даний клас визначається як деяка абстракція властивостей і поведінки всіх реально існуючих автомобілів. При цьому властивостями класу "Автомобіль" можуть бути такі загальні властивості, як наявність двигуна, трансмісії, коліс, рульового керування. Якщо як похідний клас розглянути клас "Легковий автомобіль", то всі виділені вище властивості будуть властиві і цьому класу. Можна сказати, що клас "Легковий автомобіль" успадковує властивості батьківського класу "Автомобіль". Проте, окрім перерахованих властивостей, клас-нащадок міститиме додаткові властивості, наприклад такі, як наявність салону з кількістю посадочних місць 2-5.
У свою чергу, клас "Легковий автомобіль" здатний породжувати інші підкласи, які цілком можуть відповідати, наприклад, моделям конкретних фірм-виробників. Таким чином, можна розглядати клас "Легковий автомобіль виробництва ВАЗ". Оскільки автомобільний завод Волжський випускає декілька моделей автомобілів, одним з похідних класів для попереднього класу може бути конкретна модель автомобіля, наприклад, ВАЗ-21083. Нарешті, виготовлений автомобіль має унікальний заводський номер, що відрізняє один автомобіль від іншого. Таким номером може бути, наприклад, XTA-210830S1594301. В останньому випадку клас складатиметься з єдиного об'єкту або екземпляра, яким буде легковий автомобіль виробництва ВАЗ з вказаним вище заводським номером.
Описана вище інформація про співвідношення класів в нашому прикладі володіє одним серйозним недоліком, а саме відсутністю наочності. У зв'язку з цим виникає питання: а чи можливо представити ієрархію успадкування класів у візуальній формі? Традиційно для зображення понять у формальній логіці використовувалися кола або прямокутники. Тоді для розглянутого прикладу ієрархія породження класів може бути представлена у вигляді вкладених прямокутників, кожен з яких відповідає окремому класу (рис. 3.2).
Рис. 3.2. Ієрархія вкладеності класів для прикладу "Автомобіль"
Поява об'єктно-орієнтованих мов програмування була пов'язана з необхідністю реалізації концепції класів і об'єктів на синтаксичному рівні. З погляду ООП клас є подальшим розширенням структури (structure) або запису (record). Включення у відомі мови програмування С і Pascal класів і деяких інших можливостей привело до появи відповідно C++ і Object Pascal, які на сьогодні є найбільш поширеними мовами розроблення програм. Розповсюдженню C++ і Object Pascal сприяла та обставина, що мова C++ була вибрана як базова для програмного інструментарію MS Visual C++, а мова Object Pascal– для популярного засобу швидкого розроблення програм Borland/Inprise Delphi.
За короткий період часу обидва інструментарії перетворилися на потужні системи розроблення програм з відповідними бібліотеками стандартних класів, що містять сотні різних властивостей і методів. Стосовно середовища MS Visual C++ 5/6 така бібліотека має спеціальну назву – MFC (Microsoft Foundation Classes), тобто фундаментальні класи від Microsoft. При цьому похідні класи успадковують властивості і методи батьківських класів. Нижче приводиться фрагмент ієрархії класів MFC в тому вигляді, як він зображений у відповідній документації (рис. 3.3).
Процес розроблення програм в середовищі Borland/Inprise Delphi також тісно пов'язаний з використанням бібліотеки стандартних класів – VCL (Visual Component Library) або бібліотеки візуальних компонентів. Ця бібліотека теж побудована за ієрархічним принципом, відповідно до якого компоненти рівнів, що знаходяться нижче, успадковують властивості і методи вищерозміщених компонент. Для цього випадку також приводиться фрагмент ієрархії класів VCL (рис. 3.4).
Рис. 3.3. Фрагмент ієрархії класів MFC, використовуваних в середовищі програмування MS Visual C++ 5/6
Рис. 3.4. Фрагмент ієрархії класів VCL використовуваних в середовищі програмування Borland/Inprise Delphi 15.4
Навіть цих простих прикладів досить, щоб зрозуміти наступний факт. Для однієї і тієї ж загальної концепції ієрархії класів використовуються абсолютно різні графічні засоби. У першому випадку – вкладені прямокутники, в другому – зв'язні прямокутники. Насправді різних способів зображення класів запропоновано значно більше, невелика частина з них буде розглянута нижче. Проте вже зараз важливо усвідомити, що подібну ситуацію слід було б уніфікувати, тобто використовувати для цієї мети деяку єдину систему позначень.
Наступний принцип ООП – інкапсуляція. Цей термін характеризує приховування окремих деталей внутрішнього устрою класів від зовнішніх по відношенню до нього об'єктів або користувачів. Дійсно, суб'єктові, що взаємодіє з класом, або клієнтові немає необхідності знати, яким чином реалізований той або інший метод класу, послугами якого він вирішив скористатися. Конкретна реалізація властивих класу властивостей і методів, які визначають поведінку цього класу, є власною справою даного класу. Більше того, окремі властивості і методи класу взагалі можуть бути невидимі за межами цього класу, що є базовою ідеєю введення різних категорій видимості для компонентів класу.
Якщо продовжити розгляд прикладу з класом "Легковий автомобіль", то неважко проілюструвати інкапсуляцію таким чином. Основним суб'єктом, який взаємодіє з цим класом, є водій. Цілком очевидно, що не кожен водій досконало знає внутрішній устрій легкового автомобіля. Більше того, окремі деталі цього пристрою свідомо приховані в корпусі двигуна або в коробці передач. А у разі порушення роботи автомобіля, необхідний ремонт виконує професійний механік.
Інкапсуляція веде своє походження від ділення модулів в деяких мовах програмування на дві частини або секції: інтерфейс і реалізацію. При цьому в інтерфейсній секції модуля описуються всі оголошення функцій і процедур, а можливо і типів даних, доступних за межами даного модуля. Іншими словами, вказані процедури і функції є способами надання послуг зовнішнім клієнтам. У іншій секції модуля, званою реалізацією, міститься програмний код, який визначає конкретну реалізацію оголошених в інтерфейсній частині процедур і функцій.
Принцип розділення модуля на інтерфейс і реалізацію відображає суть наших уявлень про навколишній світ. У інтерфейсній частині вказується вся інформація, необхідна для взаємодії з будь-якими іншими об'єктами. Реалізація приховує або маскує від інших об'єктів всі деталі, що не мають відношення до процесу взаємодії об'єктів (рис. 3.5).
Рис. 3.5. Ілюстрація проховування внутрішніх деталей реалізації методів класів
Примітка
Ступінь затемнення фону на приведеному вище рисунку має глибший сенс, ніж може здатися на перший погляд. Якщо асоціювати реалізацію програмного модуля з водою в акваріумі, то видимість об'єктів, що знаходяться у воді, залежатиме від ступеня її чистоти або забруднення. У ООП існують різні варіанти доступу до властивостей і методів класів, які отримали назву видимості властивостей і методів. У цьому випадку використання різних форм видимості для компонентів класів зручно асоціювати з прозорістю фону рисунка або видимістю у воді акваріума.
Третім принципом ООП є поліморфізм. Під поліморфізмом (грец. Poly– багато, morfos – форма) розуміють властивість деяких об'єктів приймати різні зовнішні форми залежно від обставин. Стосовно ООП поліморфізм означає, що дії, що виконуються однойменними методами, можуть відрізнятися залежно від того, якому з класів відноситься той або інший метод.
Розглянемо, наприклад, три об'єкти або класи: двигун автомобіля, електричне світло в кімнаті і персональний комп'ютер. Для кожного з них можна визначити операцію "вимкнути". Проте суть цієї операції відрізнятиметься для кожного з розглянутих об'єктів. Так для двигуна автомобіля виклик методу двигун_автомобіля.вимкнути() означає припинення подачі палива і його зупинку. Виклик методу Кімната.електричне_світло.вимкнути() означає просте клацання вимикача, після чого кімната зануриться в темноту. В останньому випадку дія персональный_комп'ютер.вимкнути() може бути причиною втрати даних, якщо виконується нерегламентованим чином.
Примітка
У розглянутому вище прикладі використовувалася одна з прийнятих нотацій в деяких мовах програмування (наприклад, в Object Pascal) для позначення приналежності методу тому або іншому класу. Відповідно до цієї нотації, спочатку вказується назва класу, в якому визначений метод, а потім через крапку назва самого методу. Якщо метод визначений в деякому підкласі, то треба вказати весь ланцюжок класів, починаючи з найбільш загального з них. При цьому характерною ознакою методу є пара дужок, які використовуються для вказівки списку аргументів або формальних параметрів даного методу.
У нашому прикладі для операції вимкнути() можна визначити такі додаткові параметри, як час виключення, деяка умова знаходження об'єкту в заздалегідь включеному стані і ін. Для цього після імені операції указуються дужки, в яких можуть бути вказані ці додаткові параметри або аргументи. У разі відсутності аргументів вважається, що список параметрів порожній. Проте дужки все одно записуються і вказують на той факт, що відповідна назва є назвою операції або методу, на відміну від властивостей або атрибутів класу, які записуються без дужок.
Поліморфізм об'єктно-орієнтованих мов пов'язаний з перевантаженням функцій, але не тотожній до неї. Важливо мати на увазі, що імена методів і властивостей тісно пов'язані з класами, в яких вони описані. Ця обставина забезпечує певну надійність роботи програми, оскільки виключає випадкове застосування методу для вирішення невластивого йому завдання.
Широке розповсюдження методології ООП надав вплив на процес розроблення програм. Зокрема, процедурно-орієнтована декомпозиція програм поступилася місцем об'єктно-орієнтованій декомпозиції, де окремими структурними одиницями програми почали бути не процедури і функції, а класи і об'єкти з відповідними властивостями і методами. Як наслідок, програма перестала бути послідовністю зумовлених на етапі кодування дій, а стала керованою подією. Остання обставина стала домінуючою під час розроблення широкого кола сучасних інформаційних систем. У цьому випадку кожна програма є нескінченним циклом очікування деяких заздалегідь певних подій. Ініціаторами подій можуть бути інші програми або користувачі. Коли настає окрема подія, наприклад, натиснення клавіші на клавіатурі або клацання кнопкою миші, програма виходить із стану очікування і реагує на цю подію цілком адекватним чином. Реакція програми при цьому теж зв'язується з наступними подіями.
Найістотнішою обставиною в розвитку методології ООП є усвідомлення того факту, що процес написання програмних кодів може бути відокремлений від процесу проектування структури програми. Дійсно, до того як почати програмування класів, їх властивостей і методів, необхідно визначити, чим же є самі ці класи. Більше того, потрібно дати відповіді на такі питання, як: скільки і які класи потрібно визначити для вирішення поставленого завдання, які властивості і методи необхідні, щоб класи мали необхідну поведінку, а також встановити взаємозв'язки між класами.
Ця сукупність завдань не стільки пов'язана з написанням кодів, скільки із загальним аналізом вимог до майбутньої програми, а також аналізом конкретної предметної області, для якої розробляється програма. Всі ці обставини привели до появи спеціальної методології, що отримала назву методології об’єктно-орієнтованого аналізу і проектування (ООАП).