Вступ
Курсова робота - це перша самостійна наукова праця майбутнього програмного інженера. При її виконанні студент поглиблює знання з фундаментальних та професійно-орієнтованих дисциплін, засвоює методику експериментальних досліджень, оволодіває навичками співставлення результатів своїх досліджень із літературними даними, аналізу, узагальнення і літературного оформлення одержаних результатів з теми дослідження, набуває вміння вести науковий пошук, що розвиває в молодого інженера творчий підхід до роботи.
Курсова робота з об'єктно-орієнтованого програмування передбачає знання студентами об’єктно-орієнтованого проектування та програмування і є завершальним етапом вивчення у рамках курсу об'єктно-орієнтованє програмування підготовки студентів.
Метою курсової роботи є закріплення, поглиблення та узагальнення знань, якими студент оволодів під час вивчення курсу, в набутті навичок використання основ алгоритмізації та програмування на алгоритмічних мовах високого рівня з використанням принципів об’єктно-орієнтованого проектування та програмування, методики розробки програмних модулів та програмного забезпечення комп’ютерних систем управління, набуття студентами теоретичних знань та практичних навичок в області використання сучасних систем візуального проектування програмних засобів комп’ютерних систем управління та освоєння принципів та методів сучасних технологій програмування, набуття навичок професійних та практики наукових досліджень з оформленням відповідного текстового, програмного та ілюстративного матеріалу у формі наукового звіту.
Виконання курсової роботи (КР) направлено на закріплення знань, отриманих при вивченні теоретичної частини курсу, і набуття практичних навичок розробки об'єктно-орієнтованих програм. В результаті виконання курсової роботи студент повинен освоїти:
концепції об'єктно-орієнтованого програмування;
спеціалізовані засоби розробки програмного забезпечення мовою Java;
спеціалізовані засоби розробки програмного забезпечення мовою С ++;
знати: загальні питання побудови та використання сучасних систем об’єктно-орієнтованного та візуального проектування програмних засобів комп’ютерних систем управління; основні поняття та методи об’єктно-орієнтованного проектування та програмування, основні засоби розробки програм з використанням багато ієрархічних структур об’єктів та класів об’єктів;
вміти: самостійно вибирати середовище проектування програмних засобів, проектувати, розробляти, налагоджувати та супроводжувати сучасне програмне забезпечення комп’ютерних систем управління.
Під час виконання курсової роботи студент повинен продемонструвати:
- вміння збирати і аналізувати відповідні матеріали про об’єкт дослідження, використовуючи сучасні джерела інформації, включаючи Інтернет -ресурси;
- спроможність проводити необхідні обґрунтування для розробки програмних засобів систем управління різного призначення тощо;
- здатність доводити розв'язання поставленої задачі до логічного кінця;
вміння аналізувати отримані результати і робити з них висновки.
КР складається з двох взаємопов'язаних частин. Для виконання першої частини КР потрібно побудувати детальну об'єктну модель запропонованої предметної області. Друга частина КР передбачає безпосередню розробку об'єктно-орієнтованого програмного забезпечення, реалізує розроблену об'єктну модель.
.1 Основи ООП
програмування інтерфейс конструктор деструктор
Об'є́ктно-орієнто́ване програмува́ння (ООП) - одна з парадигм програмування, яка розглядає програму як множину «об'єктів», що взаємодіють між собою. Основу ООП складають три основні концепції: інкапсуляція, успадкування та поліморфізм. Одною з переваг ООП є краща модульність програмного забезпечення (тисячу функцій процедурної мови, в ООП можна замінити кількома десятками класів із своїми методами). Попри те, що ця парадигма з'явилась в 1960-тих роках, вона не мала широкого застосування до 1990-тих, коли розвиток комп'ютерів та комп'ютерних мереж дозволив писати надзвичайно об'ємне і складне програмне забезпечення, що змусило переглянути підходи до написання програм. Сьогодні багато мов програмування або підтримують ООП (Lua) або ж є цілком об'єктно-орієнтованими (зокрема, Java, C#, C++, Python, PHP, Ruby та Objective-C, ActionScript 3, Swift, Vala).
Об'єктно-орієнтоване програмування сягає своїм корінням до створення мови програмування Симула в 1960-тих роках, одночасно з посиленням дискусій про кризу програмного забезпечення. Разом із тим, як ускладнювало апаратне та програмне забезпечення, було дуже важко зберегти якість програм. Об'єктно-орієнтоване програмування частково розв'язує цю проблему шляхом наголошення на модульності програми[1].
На відміну від традиційних поглядів, коли програму розглядали як набір підпрограм, або як перелік інструкцій комп'ютеру, ООП програми можна вважати сукупністю об'єктів. Відповідно до парадигми об'єктно-орієнтованого програмування, кожний об'єкт здатний отримувати повідомлення, обробляти дані, та надсилати повідомлення іншим об'єктам. Кожен об'єкт - своєрідний незалежний автомат з окремим призначенням та відповідальністю [2].
Об'єктно-орієнтоване програмування - це метод програмування, заснований на поданні програми у вигляді сукупності взаємодіючих об'єктів, кожен з яких є екземпляром певного класу, а класи є членами певної ієрархії наслідування. Програмісти спочатку пишуть клас, а на його основі при виконанні програми створюються конкретні об'єкти (екземпляри класів). На основі класів можна створювати нові, які розширюють базовий клас і таким чином створюється ієрархія класів.
На думку Алана Кея, розробника мови Smalltalk, якого вважають одним з «батьків-засновників» ООП, об'єктно-орієнтований підхід полягає в наступному наборі основних принципів:
· Все є об'єктами.
· Всі дії та розрахунки виконуються шляхом взаємодії (обміну даними) між об'єктами, при якій один об'єкт потребує, щоб інший об'єкт виконав деяку дію. Об'єкти взаємодіють, надсилаючи і отримуючи повідомлення. Повідомлення - це запит на виконання дії, доповнений набором аргументів, які можуть знадобитися при виконанні дії.
· Кожен об'єкт має незалежну пам'ять, яка складається з інших об'єктів.
· Кожен об'єкт є представником (екземпляром, примірником) класу, який виражає загальні властивості об'єктів.
· У класі задається поведінка (функціональність) об'єкта. Таким чином усі об'єкти, які є екземплярами одного класу, можуть виконувати одні й ті ж самі дії.
· Класи організовані у єдину деревоподібну структуру з загальним корінням, яка називається ієрархією успадкування. Пам'ять та поведінка, зв'язані з екземплярами деякого класу, автоматично доступні будь-якому класу, розташованому нижче в ієрархічному дереві.
.2 Класи та об’єкти
Поняття класу є фундаментальним в ООП і служить основою для створення об'єктів. В описі класу визначаються дані (тобто змінні) і код (тобто методи), який маніпулює цими даними. Об'єкти є екземплярами класу.
Методи і змінні, складові клас, називаються членами класу. При визначенні класу оголошуються дані, які він містить, і код, який маніпулює цими даними. Дані містяться в змінних екземпляра, які визначені класом, а код міститься в методах. У мові С # визначені кілька специфічних різновидів членів класу. До них відносяться: змінні екземпляра, статичні змінні, константи, методи, конструктори, деструктори, індексатори, події, оператори і властивості.
Ініціалізація змінних в об'єкті (як у примірнику класу)
проводиться безпосередньо в конструкторі класу. У складі класу може бути
визначено декілька конструкторів.
Класи
Синтаксис визначення класу:імя_класу
{
тип_доступу тип імя_змінної1;
тип_доступу тип імя_змінної2;
тип_доступу повертаємий_тип
імя_методу1 (список_параметрів)
{Тіло_методу}
}
де тип_доступу може приймати одне з наступних значень:
public, private, protected, internal. Члени класу з типом доступу public є
загальнодоступними (тобто доступні з будь-якої точки програми за межами даного
класу), з типом доступу protected - всередині членів даного класу і його
похідних, з типом доступу private - тільки для інших членів даного класу. Тип
доступу internal застосовується для типів, доступних у межах однієї збірки.
Наведемо приклад:Animal
{string Name;int Weight;int Type;int Animal (int W, int T, string N)
{= W;= T;= N;
}int GetWeight ()
{Weight;
}
}
Обєкт
Для створення об'єкта необхідно використовувати наступний синтаксис:
імя_класу імя_обєкту = new імя_класу ();
При створенні об'єкта (тобто екземпляра класу) відбувається виклик відповідного конструктора класу.
Поняття конструктора і деструктора.
Під конструктором класу будемо розуміти метод для ініціалізації об'єкту при його створенні. Конструктор має те ж ім'я, що і його клас. У конструкторах тип значення не вказується явно. Конструктори використовуються для присвоювання початкових значень змінним примірника, певним класом, і для виконання будь-яких інших процедур ініціалізації, необхідних для створення об'єкта.
Конструктор існує для будь-якого класу, незалежно від того, визначено він в явному вигляді чи ні. Замовчування мова С # передбачено наявність конструктора, який присвоює нульові значення всім змінним примірники (для змінних типів-значень) та значення null (для змінних посилального типу). У випадку явного визначення конструктора класу конструктор за умовчанням не використовується.
Синтаксис опису конструктора:
імя_класу (список_параметрів)
{Тіло_конструктора}
Під деструкцією будемо розуміти метод, який автоматично викликається при знищенні об'єкта класу (безпосередньо перед початком процедури "складання сміття"). Деструктори не мають параметрів і не повертають значень.
Синтаксис опису деструктора:
~ Імя_класу () {тіло_деструктора}
Наслідування
Під Наслідування будемо мати на увазі властивість, за допомогою якого один об'єкт може набувати властивостей іншого. При цьому підтримується концепція ієрархічної класифікації, що має напрям зверху вниз. При прийнятті концепції наслідування, для новостворюваних об'єктів необхідно визначати тільки ті властивості, які роблять його унікальним у межах свого класу. Об'єкт може успадковувати загальні атрибути від батьківських по відношенню до нього класів.
Синтаксис опису об'єкту:
імя_классу: імя_батьківського_класу
{
тіло_класу
}
Приклад опису об'єкту:Predator: Animal
{
private int Speed;
}
.3 Конструктори та деструктори. Успадкування класів
Конструктори. Одне з основних завдань об’єктно-орієнтованого програмування полягає у тому, щоб об’єкти описаного раз і назавжди класу працювали «правильно» - тобто так, як це визначає модель. Кожний об’єкт перед тим як почати роботу, потрібно створити, тобто перевести в якийсь початковий стан. Отже, треба якимось чином описати можливі механізми створення об’єктів даного класу. Для цього в мові C++ існують конструктори. Це особливі методи класу, які й повинні перевести об’єкт у той самий початковий стан. Конструктор описується як метод, ім’я якого збігається з іменем класу, а тип поверненого значення опущений.
Приклад:
Point
{
public:
Point(int x0, int y0);
private:
int x, y;
};::Point(int x0, int y0)
{
x=x0;
y=y0;
}
Тепер для створення об’єкта класу Point потрібно після імені змінної вказати параметри, як для виклику функції:A(1, 1), B(2, 0);
Типи конструкторів. Існують деякі типи конструкторів, які, крім безпосереднього використання, автоматично викликаються у деяких особливих ситуаціях.
Конструктор за замовчуванням. Це конструктор, що викликається без параметрів:
();(int a=5);
Його використовують для створення масиву об’єктів, оскільки не зрозуміло, які конструктори і з якими параметрами треба викликати для кожного елемента масиву. Наприклад:
A[10];* B=new Point[10];
Конструктор за замовчуванням викликається також тоді, якщо не вказано параметри для ініціалізації об’єкта, як у цьому випадку:p;
Конструктор копіювання. Цей конструктор викликається тоді, коли потрібно створити копію об’єкта. Аргументом цього конструктора має бути посилання на об’єкт цього самого класу:(Point& p);
Важливим випадком, коли викликається конструктор копіювання, є передавання об’єкта у функцію як параметра за значенням. Тоді створюється новий об’єкт і для нього автоматично викликається конструктор копіювання. Створення конструкторів копіювання потрібне у випадку, якщо об’єкт потребує якихось спеціальних операцій при копіюванні, оскільки під час стандартного копіювання вміст одного об’єкта просто побайтно переноситься в інший.
Приклад:
String
{:
String(); // конструктор за замовчуванням
String(const String& s); // конструктор копіювання
String(const char* s); // конструктор з параметром
// const char*, який являє собою
// стандартний рядок s
~String(); // деструктор:
char* array; // масив символів
int size; // розмір масиву
};
Приклад виклику конструкторів:main()
{ String a, b; // конструктор за замовчуваннямc(a); // конструктор копіювання(a); // конструктор копіювання, оскільки
// аргумент передається у функцію за значеннямd(“One”); // конструктор з параметром
//...
}
Деструктори. Конструктори ініціалізують об’єкт, тобто вони створюють середовище, у якому "працюють" функції-члени. Іноді створення такого середовища зумовлює "захоплення" якихось ресурсів: пам’яті, файлу, процесорного часу, які повинні бути "звільнені" після їх використання. Тобто класам потрібна функція, яка б знищувала об’єкт аналогічно тому, як його створює конструктор. Такі функції називають деструкторами.
Приклад:
Name
{char* s;
//...
};Table
{* p;_t sz;: (size_t s=15) {p=new Name[sz=s];} //конструктор
~Table() {delete[] p;} //деструктор
//...
}
Успадкування класів. Об’єкти різних класів і самі класи можуть перебувати у відношенні успадкування, за якого формується ієрархія об’єктів, що відповідає заздалегідь передбаченій ієрархії класів.
Ієрархія класів дозволяє визначати нові класи на основі вже існуючих. Існуючі класи зазвичай називають базовими (інколи породжувальними), а нові класи, що формуються на основі базових, - похідними (породженими), інколи класами-нащадками або спадкоємцями. Похідні класи “отримують спадок” - дані і методи своїх базових класів - і, крім того, можуть поповнюватись власними компонентами (даними і власними методами). Елементи, які успадковуються, не переміщуються в похідний клас, а залишаються в базових класах. Повідомлення, обробку якого не можуть виконати методи похідного класу, автоматично передається в базовий клас.