
- •Конструювання програмного забезпечення
- •Конструювання програмного забезпечення
- •Семестровий модуль 1. Моделювання предметної області та створення діаграм взаємодії
- •Змістовий модуль 2. Моделювання предметної області
- •Змістовий модуль 3. Діаграми взаємодії. Діаграми послідовності та діаграми кооперації
- •Змістовий модуль 4. Шаблони конструювання (патерни)
- •Змістовий модуль. 5. Застосування діаграм взаємодії та основних шаблонів конструювання
- •Семестровий модуль 2 Створення та тестування програмних класів
- •Змістовий модуль 7. Створення коду програмного класу
- •Змістовий модуль 8. Тестування програмних модулів
- •Змістовий модуль 9. Введення до рефакторінгу
- •Література
Змістовий модуль 7. Створення коду програмного класу
Лекція 12. Створення коду програмного класу
Література:1 [101-106]; 2[307-323]
Загальні положення. Структури даних. Створення коду для класа Register.
Загальні положення
Для створення програмного коду класу використовуються діаграми даного класу й пов'язаних з ним класів. Часто також корисно розглянути відповідні фрагменти діаграм взаємодії.
Структури даних
Раніше було обговорено, що пасажир може купити квиток на поїзд прямого сполучення або з одним пересадженням.
Для представлення шляху пасажира потрібно створити структуру (ItinDA).
struct ItinDA {char s11[20], s12[20], s21[20], s22[20], sx[20], std[20], sta[20]; int k; };
Інформацію про місце можна представити структурою Seat05.
};
Struct Seat05
{int v, //номер вагона s, //номер місця
};
Інформацію про поїзди можна представити структурою Trn
struct Trn {int tr1, tr2, k;
};
Написання коду для класу Register
Для написання програмного коду мовою С++ скористаємося діаграмою класу Register (рис. 12.1) і діаграмами взаємодіючих з ним класів.
Рис. 12.1 Діаграма класу Register
Усі дані, що мають типи класів RTS-системи, повинні бути покажчиками, тому що вони створюються у різні моменти роботи системи відповідно до потреби.
class Register {protected:
Itinerary *pi; //Значення передаються з Booking_Office
Train *pt;
StationSpecification *pss;
Map_Seat *pms;
Tariff *pta;
Order *po; public:
Register(Itinerary *, Train *, StationSpecification *,Map_Seat *, Tariff *); //Прогр. ріш.
П0 – start_Up void newOrder( ); //Прогр. ріш. П1 – newOrder //Замість типу Text використовуємо тип char* //Замість типу Boolean використовуємо тип int int isItinerary(char *, char*);//Прогр. ріш. П2 – isItinerary int isTrain(char*,char*);
int isSeat(char*);//Прогр. ріш. П3 – isSeat
Money getPrice( );
Money makePayment(Money);
};
/*Конструктор класу Register викликає об’єкт Booking-Office, який передає йому адреси п’яти об’єктів*/
Register::Register (Itinerary *pi1, Train *ptr1,StationSpecification *pss1, Map_Seat *pms1, Tariff *pta1) {pi=pi1; pt=ptr1; pss=pss1; pms=pms1; pta=pta1; } void Register::newOrder()
{po=new Order; }/*
Для реалізації інших методів класу Register необхідно одержати інформацію про методи класу Order.
/* Наприклад, метод isItinerary класу Register викликає метод isItinerary класу
Order*/ int Register::isItinerary(char *std, char *sta) {int b=po->isItinerary(std, sta, pi, pss); return b;
}
Контрольні запитання
На підставі яких даних будується розділ даних програмного класу?
Як ураховуються асоціації діаграми програмних класів при створенні коду класів?
На підставі чого створюються методи програмного класу?
Лекція 13. Створення коду для класа Order
Література: 1 [101-106]; 2[307-323]
Створення коду для класа Order. Ітеративний процес та модифікація коду. Класиконтейнери.
Створення коду для класа Order
З урахуванням розглянутих раніше структур даних опис класу Order приймає наступний вид.
class Order {char stD[20], stA[20], date[8], clT[10], clS[10]; Seat05 s1;
Seat05 s2;
//Параметри рядків мають бути погодженими з уведеними структурами
Money price;
//Доступ до усіх об’єктів має відбуватися через покажчики Trn * tr;
Itinerary *pi;
Train *pt;
StationSpecification *pss;
Map_Seat *pms;
Tariff *pta;
Payment *ppay; Way *pway; public: Order( );
int isItinerary(char*,char*,Itinerary*,StationSpecification*); int isTrain(char*,char*,Train*); int isSeat(char*,Map_Seat*); Money getPrice(Tariff*);
Money makePayment(Money);
};
Ітеративний процес і модифікація коду
Перевага ітераційного та інкрементального процесу розробки полягає в тому, що результати попередньої ітерації можуть служити початковими даними наступної (рис.
13.1).
Рис. 13.1 Ітеративний процес розробки ПЗ
Якщо код, створений на ітерації N після тестування й доробки, відрізняється від результатів проектування цієї ітерації, то проектні рішення, засновані на цій реалізації, повинні бути відображені для наступних реалізацій. Виникає проблема синхронізації артефактів. Відновлення діаграм бажано по можливості автоматизувати, використовуючи технологію зворотного проектування Case-засобів (генерування діаграм пакетів, класів і послідовностей шляхом аналізу коду).
Класи – контейнери в програмному коді
Часто для об'єкта необхідно забезпечити видимість групи інших об'єктів. Звичайно це випливає безпосередньо зі значення кратності, зазначеного на діаграмі класів. В об’єктно-орієнтованих мовах такі зв'язки в основному реалізуються за допомогою проміжного контейнера або колекції об'єктів. У класі, з яким пов'язане одиничне значення кратності, визначається атрибут-посилання, що містить покажчик на екземпляр контейнера/колекції. А в самому контейнері містяться екземпляри класу, для якого значення кратності перевищує одиницю.
У бібліотеці Java є такі контейнерні класи, як ArrayList і HashMap, у мові Visual C++ – класи СAarray і CList (шаблонові типи) і інші.
Контрольні запитання
Які проблеми з документуванням коду виникають при ітеративній розробці системи?
Чим обумовлюється порядок реалізації програмних класів?
Які засоби використаються при програмуванні колекцій?
Приклад застосування колекції
Наприклад, для об'єкта Way необхідно забезпечити видимість групи екземплярів класу Train (рис. 13.2).
Рис. 13.2 Фрагмент діаграми програмних класів, що використовує колекцію
Нижче показаний фрагмент коду класу Way, де для реалізації контейнера, що містить об'єкти класу Train, використаний шаблоновий клас CArray мови C++. Class Way
{ . . .
CArray<Train, Train&> ListOfTrain;
ListOfTrain.SetSize(2);
. . .
};