Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Зубенко, Омельчук - Програмування. Поглиблений курс

.pdf
Скачиваний:
49
Добавлен:
07.03.2016
Размер:
4.72 Mб
Скачать

Розділ ІІ. ЕЛЕМЕНТИ ІНФОРМАТИКИ

При генерації коду для залежних класів до них не додаються нові атрибути, але створюються необхідні команди (у код вставляється директива препроцесору #include).

Відношення асоціації між класами це семантичний зв'язок між ними:

NewClass3

 

NewClass4

 

 

 

 

 

 

 

 

 

Асоціація може бути однонапрямленою й двонапрямленою. Напрямок асоціації можна визначити за діаграмами послідовності й кооперації.

Відношення агрегації спеціальна форма асоціації, яка використовується для зображення відношення "частина-ціле" між агрегатом "ціле" і його складовою "частина":

Group

 

Student

 

 

 

1 0..n

При генерації коду відношення агрегації додає відповідний атрибут у код класу "ціле".

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

 

 

 

CCoord

CTriangle

 

 

 

 

 

m_iX : int

 

1

0..n

m_iY : int

 

 

 

 

 

 

 

 

 

 

 

 

Діаграми поведінки (Behavior diagrams). Поділяються на діаграми станів і діаграми діяльності.

Діаграма станів (Statechart diagram). Визначає всі можливі стани, в яких може перебувати конкретний об'єкт, а також процес зміни станів об'єкта внаслідок деяких подій.

Діаграма станів складається з таких елементів:

стан (дозволяє відобразити стан чи ситуацію протягом життя

NewState

об'єкта): ;

початковий стан: ;

фінальний стан: .

Зі станом асоціюється деяка діяльність, що позначається міткою й зображується як <виконати>/<дія>. Стани можуть утворювати групи, як у наведеному прикладі діаграми станів:

251

ПРОГРАМУВАННЯ

NewState4

NewState5 NewState6

Між станами можливі такі відношення:

перехід (дозволяє здійснити перехід з одного стану в інший у випадку настання певної події чи зміни умов) – ;

перехід на себе (рефлексивний) –

.

Перехід може мати мітку, синтаксис якої складається із трьох необов'язкових частин: <Подія>[<Умова переходу>]/<Дія>. Якщо мітка переходу не містить жодної події, то це означає, що перехід відбудеться, як тільки завершиться діяльність, асоційована з даним станом. Дія це набір простих операцій, які можуть відбуватися:

а) при вході в стан на схемі позначається написом entry/<дія>; б) при виході зі стану на схемі позначається написом exit/<дія>; в) при переході дія, яка відбувається при здійсненні переходу (тобто після дії при виході з вихідного стану перед дією при вході у

вхідний стан); на схемі позначається міткою переходу /<дія>. Діаграми діяльності (Activity diagram). Відображають динаміку

системи, подаючи схеми потоків керування (від однієї діяльності до іншої). Можуть зображувати паралельні потоки, альтернативні потоки (розгалуження). Діяльність (активність) на діаграмі діяльності зображується так:

NewActivity

entry/

.

Між діяльностями можливі відношення переходу . Умовна поведінка зображується таким чином:

розгалуження (початок умовної поведінки) –

;

252

Розділ ІІ. ЕЛЕМЕНТИ ІНФОРМАТИКИ

з'єднання (завершення умовної поведінки) – .

Паралельна поведінка (синхронізація паралельної поведінки) зо-

бражується так:

 

розділення (початок паралельного виконання) –

;

злиття (завершення паралельного виконання) –

Діяльність може складатися з піддіяльностей. Приклад діаграми діяльності:

253

ПРОГРАМУВАННЯ

Діаграми взаємодії (Interaction diagrams) поділяються на діаграми послідовності (Sequence diagram) і кооперації (Collaboration diagram).

Кожен сценарій реалізується сукупністю об'єктів, що взаємодіють між собою. Така сукупність називається кооперацією.

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

об'єкт

;

повідомлення

(передається від одного об'єкта іншому) –

;

рефлексивне повідомлення .

Кожне повідомлення містить мітку (обов'язково зазначається ім'я повідомлення, до того ж можна вказати аргументи й деяку керуючу інформацію).

Вертикальною лінією під позначенням об'єкта на діаграмі послідовності відображена його лінія життя ЖЦ об'єкта в процесі взаємодії. Для відображення періоду активності об'єкта викори- стовується прямокутник активності.

Діаграма послідовності для адресної книги: операція видалення інформації про особу, ім'я якої є в базі даних:

254

Розділ ІІ. ЕЛЕМЕНТИ ІНФОРМАТИКИ

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

Діаграма кооперації для адресної книги: операція видалення інфо- рмації про особу, ім'я якої є в базі даних:

 

 

 

3: Is("Ivanov") (Yes)

 

 

 

5: ArePeopleAddress? (No)

1: Delete("Ivanov")

 

2: Delete("Ivanov")

: User

frm : CForm

7: RefreshForm()

addrb : CAddressBook

 

 

 

 

 

 

6: Delete()

 

 

4: Delete("Ivanov")

addrper : addr : CAddress CAddressPerson

Діаграми реалізації (Implementation diagrams). Поділяються на діаграми компонентів і розгортання.

Діаграми компонентів (Component diagram). Зображують компоненти системи та зв'язки між ними. Застосовуються тими учасниками проекту, які відповідають за компіляцію системи. Із цих діаграм видно, в якому порядку потрібно компілювати компоненти, а також які виконувані компоненти будуть при цьому створені.

Діаграми компонентів складаються з таких елементів. Складні пакети:

NewPackage

групи логічно пов'язаних компонентів, дозволяють

структурувати модель системи.

255

ПРОГРАМУВАННЯ

 

NewComponent

Компонента

модуль програмної

системи (виконуваний, DLL, вихідний код тощо) з можливим зазначенням інтерфейсу.

Залежно від типу програмного модуля виділяють такі види компонентів:

 

NewPackageSpec

головна програма (main program):

 

;

 

 

 

 

 

підпрограма (subprogram) – використовується для підпрограм, а також для необ'єктно-орієнтованих компонент;

NewSubprogBody

тіло підпрограми (subprogram body):

 

;

 

 

 

 

NewSubprogSpec

специфікація підпрограми (subprogram specification):

 

 

 

 

;

 

 

 

 

родова специфікація підпрограми (generic subprogram specification):

NewSubprogSpec

.

256

Розділ ІІ. ЕЛЕМЕНТИ ІНФОРМАТИКИ

Для подання .exe- та .dll-файлів використовуються компонент типу

NewCom

EXE й компоненти типу DLL: ponent

Для подання баз даних використовують компоненту

NewComponent2

Компоненти Task specification і Task body для специфікації відповідно задач і тіла задач дозволяють відобразити незалежні потоки в багатопотоковій системі:

NewTaskSpec1 NewTaskBody1

Компоненти Package specification і Package body для специфікації відповідно пакетів і тіл пакетів:

NewPackageSpec1 NewPackageBody

У мовах С, C++ дані компоненти використовуються таким чином: Package specification – для .h-файлів, а Package body – для файлів із розширеннями .c та .cpp.

Діаграма розгортання (Deployment diagram). Використовується менеджером проекту, користувачами, архітектором системи для розуміння фізичного розміщення системи та її окремих підсистем.

Processor – компонента апаратних засобів ЕОМ, що можуть

NewProcessor

виконувати програми:

257

ПРОГРАМУВАННЯ

Device – компонента апаратних засобів ЕОМ, що не можуть виконувати програми (модем, принтер, монітор тощо):

NewDevice

Відношення між сутностями: .

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

Наступним етапом є розробка діаграм класів і взаємодії. Діаграми класів можуть використовуватися для автоматичної генерації каркасного програмного коду. Для визначення поведінки класів зі складною динамікою реагування на події можуть бути задіяні діаграми станів і діяльності.

Розміщення об'єктів за програмними модулями фіксується компонентними діаграмами, а розташування програмних модулів стосовно вузлів (комп'ютерів) мережі діаграмами розгортання.

Приклади застосування наведених засобів ООП див. у підрозд.

3.11та 4.6.

2.7.4.РЕФАКТОРИНГ

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

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

258

Розділ ІІ. ЕЛЕМЕНТИ ІНФОРМАТИКИ

Рефакторинг це процес змінювання програмної системи, при якому не змінюється зовнішня поведінка програми, але поліпшуються її внутрішня структура та стиль уже написаного коду.

Рефакторинг здійснює зміни, пов'язані з методами, переміщеннями функцій між об'єктами, організацією даних, спрощенням умовних виразів і викликів методів, задачами узагальнення (виділення інтерфейсу, підкласу, батьківського класу тощо).

Перелічимо коротко деякі з елементів рефакторингу.

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

Інкапсуляція поля якщо в класі є відкрите поле, то необхідно зробити його закритим і забезпечити методи доступу.

Виділення класу іноді клас реалізує функцію, яку слід розподілити між кількома класами. Тоді рефакторинг дозволяє створити новий клас, перемістити відповідні атрибути й методи зі старого класу в новий.

Виділення підкласу якщо клас виконує різні види робіт, то доцільно створити підкласи, які йому спадкують і виконують кожен свій вид роботи.

Виділення надкласу якщо маємо кілька класів зі схожими методами й полями, то можна перемістити їх у надклас (батьківський для всіх даних підкласів).

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

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

func(a+b, (a+b) / 2, a+b–c);

слід рефакторизувати в

t=a+b;

func(t, t/2, t–c);

попередньо оголосивши t локальною змінною відповідного типу.

259

ПРОГРАМУВАННЯ

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

double y=f(x); if (y<0) {…}

слід рефакторизувати в

if (f(x)<0) {…}

Виділення методу полягає у виділенні з довгого чи важкого для сприйняття коду окремих його фрагментів і перетворенні їх в окремі методи (функції).

Вбудовування методу протилежне виділенню методу. Коли тіло методу (функції) так само зрозуміле, як і його (її) назва, тоді виклик методу замінюють на код. Крім того, такий рефакторинг застосовують при невдалому розбитті на методи тоді кілька методів об'єднують, а потім знову виділяють окремі методи.

Підйом поля (методу) – якщо у двох підкласах є однакове поле чи метод, то їх слід підняти в батьківський клас.

Спуск поля (методу) – якщо в батьківському класі є поля чи методи, що належать лише до деяких його підкласів, то їх потрібно перемістити в ці підкласи.

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

Переміщення методу застосовується для методу, що частіше звертається до іншого класу, ніж до того, у якому він розташований. Наприклад:

class library { book[1000] books;

}

class book { int id;

int InLibrary(library Lib) { for(int i=0; i<1000; i++)

if (id==Lib.books[i].id) return 1; return 0;

}

}

260