
- •1.1. Методологія процедурно‑ орієнтованого програмування
- •1.2. Методологія об'єктно-орієнтованого програмування
- •1.3. Методологія об'єктно-орієнтованого аналізу і проектування
- •1.4. Методологія системного аналізу і системного моделювання
- •Розділ 2
- •2.1. Передісторія. Математичні основи
- •Мал. 2.4. Приклади неорієнтованого (а) і орієнтованого (б) графів
- •Мал. 2.5. Приклади неорієнтованого (а) і орієнтованого (б) дерев
- •Мал. 2.6. Ієрархічні схеми неорієнтованого дерева (а) і орієнтованого дерева (б)
- •2.2. Діаграми структурного системного аналізу
- •I (Input) – вхід, т. Е. Все, що поступає в процес або споживається процесом.
- •2.3. Основні етапи розвитку uml
- •2. Забезпечити початкові поняття язика uml можливістю розширення і спеціалізації для більш точного представлення моделей систем в конкретній наочній області.
- •3. Опис язика uml повинен підтримувати таку специфікацію моделей, яка не залежить від конкретних язиків програмування і інструментальних засобів проектування програмних систем.
- •4. Опис язика uml повинен включати семантичний базис для розуміння загальних особливостей ооап.
- •7. Інтегрувати в себе новітні і якнайкращі досягнення практики ооап.
- •3.2. Загальна структура язика uml
- •3.3. Пакети в язиці uml
- •3.4. Основні пакети метамоделі язика uml
- •3.5. Специфіка опису метамоделі язика uml
- •3.6. Особливості зображення діаграм язика uml
- •4.1. Варіант використовування
- •4.2. Актори
- •4.3. Інтерфейси
- •4.4. Примітки
- •4.5. Відносини на діаграмі варіантів використовування
- •4.6. Приклад побудови діаграми варіантів використовування
- •4.7. Рекомендації по розробці діаграм варіантів використовування
- •5.1. Клас
- •5.2. Відносини між класами
- •5.5. Шаблони або класи, що параметризуються
- •5.6. Рекомендації по побудові діаграм класів
- •6.1. Автомати
- •Include – ця мітка використовується для звернення до підавтомата, при цьому наступний за нею вираз дії містить ім'я цього підавтомата.
- •6.3. Перехід
- •6.4. Складовий стан і підстан
- •6.5. Історичний стан
- •Мал. 6.10. Графічне зображення недавнього (а) і давнього (б) історичного стану
- •6.6. Складні переходи
- •Мал. 6.11. Графічне зображення паралельного переходу з паралельних станів (а) і паралельного переходу в паралельні стани (б)
- •6.7. Заключні рекомендації по побудові діаграм станів
- •7.1. Стан дії
- •7.2. Переходи
- •7.5. Рекомендації по побудові діаграм діяльності
- •8.2. Повідомлення
- •Мал. 8.7. Діаграма послідовності із стереотипними значеннями повідомлень
- •8.3. Приклад побудови діаграми послідовності
- •8.4. Заключні рекомендації по побудові діаграм послідовності
- •9.1. Кооперація
- •9.3. Зв'язки
- •9.4. Повідомлення
- •9.6. Заключні рекомендації по побудові діаграм кооперації
- •10.1. Компоненти
- •10.2. Інтерфейси
- •10.3. Залежність
- •10.4. Рекомендації по побудові діаграми компонентів
- •11.1. Вузол
- •11.2. З'єднання
- •Мал. 11.4. Фрагмент діаграми розгортання із з'єднаннями меходу вузлами
- •11.3. Рекомендації по побудові діаграми розгортання
- •12.1. Загальна характеристика case‑ засобу Rational Rose 98/2000
- •12.2. Особливості робочого інтерфейсу Rational Rose
- •12.3. Початок роботи над проектом в середовищі Rational Rose
- •12.4. Розробка діаграми варіантів використовування в середовищі Rational Rose
- •12.5. Розробка діаграми класів в середовищі Rational Rose
- •12.6. Розробка діаграми станів в середовищі Rational Rose
- •12.7. Розробка діаграми послідовності в середовищі Rational Rose
- •12.8. Розробка діаграми кооперації в середовищі Rational Rose
- •12.9. Розробка діаграми компонентів в середовищі Rational Rose
- •12.10. Розробка діаграми розгортання в середовищі Rational Rose
Олександр Васильович Леоненков
Самовчитель UML
Анотація
Мета книги – допомогти менеджерам і керівникам проектів, керівникам інформаційних служб, бізнес‑ аналітикам, корпоративним програмістам і провідним розробникам самостійно освоїти базові концепції і поняття найперспективнішої і сучасної...
Олександр Васильович Леоненков
Самовчитель UML
РОЗДІЛ 1
Вступ
Якщо спробувати охарактеризувати сучасний рівень розвитку комп'ютерних і інформаційних технологій, то перше, на що слід звернути увагу – це зростаюча складність не тільки окремих фізичних і програмних компонентів, але і лежачих в основі цих технологій концепцій і ідей. Здається, ще зовсім недавно професійному програмісту було достатньо досконало володіти одним‑ двома мовами програмування, щоб розробляти серйозні програмні додатки. Вибір платформи і операційної системи, як правило, не був серйозною проблемою. А супровід програми, хоча і було зв'язано з об'єктивними труднощами, міг бути реалізоване простим додаванням або зміною коду початкової програми.
1.1. Методологія процедурно‑ орієнтованого програмування
Поява перших електронних обчислювальних машин або комп'ютерів ознаменувала новий етап в розвитку техніки обчислень. Здавалося, достатньо розробити послідовність елементарних дій, кожне з яких перетворити в зрозумілі комп'ютеру інструкції, і будь-яка обчислювальна задача може бути вирішена. Ця ідея виявилася настільки життєздатною, що довгий час домінувала над всім процесом розробки програм. З'явилися спеціальні мови програмування, які дозволили перетворювати окремі обчислювальні операції у відповідний програмний код.
Основою даної методології розробки програм була процедурна або алгоритмічна організація структури програмного коду. Це було настільки природно для вирішення обчислювальних задач, що ні у кого не викликала сумнівів доцільність такого підходу. Початковим поняттям цієї методології було поняття алгоритму, під яким, в загальному випадку, розуміється деяке розпорядження виконати точно певну послідовність дій, спрямованих на досягнення заданої мети або рішення поставленої задачі. Прикладами алгоритмів є добре відомі правила знаходження коренів квадратного рівняння або коренів лінійної системи рівнянь.
Примітка
Прийнято вважати, що сам термін алгоритм походить від імені середньовічного математика Аль‑ Хорезми, який в 825 р. описав правила виконання арифметичних дій в десятковій системі счислення.
З цієї точки зору вся історія математики тісно пов'язана з розробкою тих або інших алгоритмів рішення актуальних для своєї епохи задач. Більш того, саме поняття алгоритму стало предметом відповідної теорії – теорії алгоритмів, яка займається вивченням загальних властивостей алгоритмів. З часом зміст цієї теорії став настільки абстрактним, що відповідні результати розуміли тільки фахівці. Як дань цієї традиції якийсь період часу мови програмування називалися алгоритмічними, а перший графічний засіб документування програм одержав назву блок-схеми алгоритму. Відповідна система графічних позначень була зафіксована в ГОСТ 19.701‑ 90, який регламентував використовування умовних позначень в схемах алгоритмів, програм, даних і систем.
Проте потреби практики не завжди вимагали встановлення обчислюваності конкретних функцій або вирішуваної окремих задач. В мовах програмування виникло і закріпилося нове поняття процедури, яке конкретизувало загальне поняття алгоритму стосовно рішення задач на комп'ютерах. Так само, як і алгоритм, процедура є закінченою послідовністю дій або операцій, направлених на рішення окремої задачі. В мовах програмування з'явилася спеціальна синтаксична конструкція, яка одержала назву процедури.
З часом розробка великих програм перетворилася на серйозну проблему і зажадала їх розбиття на більш дрібні фрагменти. Основою для такого розбиття якраз і стала процедурна декомпозиція, при якій окремі частини програми або модулі були сукупністю процедур для вирішення деякої сукупності задач. Головна особливість процедурного програмування полягає в тому, що програма завжди має початок в часі або початкову процедуру (початковий блок) і закінчення (кінцевий блок). При цьому вся програма може бути представлена візуально у вигляді направленої послідовності графічних примітивів або блоків (мал. 1.1).
Важливою властивістю таких програм є необхідність завершення всіх дій попередньої процедури для початку дій подальшої процедури. Зміна порядку виконання цих дій навіть в межах однієї процедури зажадала включення в мови програмування спеціальних умовних операторів типу if‑ then‑ eise і Goto для реалізації галуження обчислювального процесу залежно від проміжних результатів рішення задачі.
Мал. 1.1. Графічне представлення програми у вигляді послідовності процедур
Примітка
Поява і інтенсивне використовування умовних операторів і оператора безумовного переходу стала предметом гострих дискусій серед фахівців по програмуванню. Річ у тому, що безконтрольне вживання в програмі оператора безумовного переходу goto здатне серйозно ускладнити розуміння коду. Відповідні програми сталі порівнювати із спагетті, називаючи їх bowl spaghetti, маючи у вигляді численні переходи від одного фрагмента програми до іншого, або, що ще гірше, повернення від кінцевих операторів програми до її початкових операторів. Ситуація здавалася настільки драматичною, що в літературі зазвучали заклики виключити оператор goto з язиків програмування. Саме з того часу прийнято вважати хорошим стилем програмування – програмування без goto.
Розглянуті ідеї сприяли становленню деякої системи поглядів на процес розробки програм і написання програмних кодів, яка Одержала назву методології структурного програмування. Основою даної методології є процедурна декомпозиція програмної системи і організація окремих модулів у вигляді сукупності виконуваних процедур. В рамках даній методології одержало розвиток низхідне проектування програм або програмування «зверху‑ вниз». Період найбільшої популярності ідей структурного програмування доводиться на кінець 70‑ х‑ начало 80-х років.
Як допоміжний засіб структуризації програмного коду було рекомендовано використовування відступів на початку кожного рядка, які повинні виділяти вкладені цикли і умовні оператори. Все це покликане сприяти розумінню або читабельності самої програми. Дане правило з часом було реалізовано в сучасних інструментаріях розробки програм. Нижче наводиться приклад лістингу програми на язиці Pascal, який ілюструє цю особливість написання програм.
Лістинг 1.1 . Приклад фрагмента програми на Pascal, розробленої з використанням правил структурного програмування
Procedure FirstOpt;
Begin
FuncRaz(Free, Rn);
For i:=1 to N do
RvarRec[i]:=Rn[i];
FvarRec:=Freс;
NumIt:=0;
Repeat
NumIt:=NumIt+1;
V:=Freс;
for j:=1 to До do
for 1:=1 to M do
begin
S:=0.0;
T:=0.0;
for i:=1 to N do
begin
T:=T+sqr(W1[i,j])*Xpr[i,1];
S:=S+sqr(W1[i,j]);
end;
Zentr[j,1]:=T/S;
end;
for j:=1 to До do
for i:=1 to N do
begin
S:=0.0;
P:=0.0;
Q:=0.0;
for l:=1 to M do
S:=S+sqr(Xpr[i,l]‑ Zentr[j,l]);
P:=1.0/S;
end;
Q:=0.0;
D:=0;
for i:=1 to N do
for j:=1 to До do
if Abs(W1[i,j]‑ W2[i,j]) ‑ = Eps
then D:=1;
for i:=l to N do
for j:=1 to До do
W1[i,j]:=W2[i,j];
Until (D=0) or (NumIt=NumMax);
End;
В цей період основним показником складності розробки програм вважали її розмір. Цілком серйозно обговорювалися такі оцінки складності програм, як кількість рядків програмного коду. Правда, при цьому робилися деякі припущення щодо синтаксису самих рядків, які повинні були задовольняти певним правилам. Загальна трудомісткість розробки програм оцінювалася спеціальною одиницею вимірювання – «людино-місяць» або «людино ‑ рік». А професіоналізм програміста напряму зв'язувався з кількістю рядків програмного коду, який він міг написати і відладити протягом, скажімо, місяця.
Примітка
Зараз спроби оцінити професіоналізм програміста кількістю рядків програмного коду можуть викликати лише усмішку співбесідника. Дійсно, використовуючи вбудовані майстри сучасних інструментаріїв розробки (MS Visual C++ або Inprise/Borland Delphi), навіть новачок може за лічені секунди послідовним натисненням кнопок діалогових меню створити працездатний додаток, що містить сотні рядків програмного коду і що складається з десятка окремих файлів проекту.