→ Пошук по сайту       Увійти / Зареєструватися
Знання Мова програмування C#

Об'єктно-орієнтований підхід до програмування

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

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

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

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

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

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

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

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

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

Найбільш відомим прикладом об'єктно-орієнтованої мови програмування є мова C + +, яка розвинулася з імперативної мови С. Його прямим нащадком і логічним продовженням є мова С #, яка вивчається в даному курсі. Інші приклади об'єктно-орієнтованих мов програмування: Visual Basic, Java, Eiffel, Oberon.

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

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

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

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

Розглянемо більш детально такий фундаментальний принцип об'єктно-орієнтованого підходу до програмування як абстракція.

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

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

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

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

Іншою фундаментально складовою концепцією об'єктно-орієнтованого програмування є інтуїтивно ясне поняття наслідування. У неформальній постановці під наслідуванням розуміється властивість того чи іншого об'єкта, який є похідним від якогось базового, зберігати поведінка (а саме, атрибути та операції над ними), характерне для батьківського об'єкта. З точки зору мов програмування поняття спадкування означає застосовність всіх або лише деяких властивостей або методів базового (або батьківського) класу для всіх класів, похідних від нього. Крім того, збереження властивостей та / або методів базового класу має забезпечуватися і для всіх конкретизацій (тобто конкретних об'єктів) будь-якого похідного класу. У математиці концепцію успадкування прийнято моделювати, наприклад, ставленням часткового порядку (яке представляє собою вид ієрархії). Концепція наслідування адекватно формалізується математично за допомогою однієї з наступних нотацій:  

  1. фреймової нотації Руссопулоса (названої так по імені свого творця, N.D. Roussopulos);  
  2. діаграм Гассе (що отримали назву по імені вченого, який вперше запропонував цей спосіб наочного подання спадкування, H. Hasse).

Розглянемо приклад програми мовою програмування C #, що ілюструє концепцію наслідування:

class A
{
               int a;
               public A() {...}
               public void F() {...}
}

class B:
{
               int b;
               public B() {...}
               public void G() {...}
}

Приклад являє собою опис базового класу A і похідного від нього класу B.

Клас A містить цілочисельний атрибут (тобто змінну) a, а також два методу (тобто функції), A () і F (). Клас B містить цілочисельний атрибут (тобто змінну) b, а також два методу (тобто функції) B () і G ().

Двокрапка B: A в описі класу B означає наслідування.

Відзначимо, що вище було розглянуто найпростіший випадок наслідування, а саме, одиничне наслідування. Мова програмування C # дозволяє реалізувати механізми, що підтримують і більш складний випадок наслідування - множинне спадкування.

Розглянемо більш детально особливості успадкування, які реалізує даний приклад програми мовою C #.

Похідний клас B наслідує від базового класу А властивість a і метод F (). При цьому до класу В додаються власні властивість b і метод G ().

Зауважимо, що стосовно операції успадкування справедливі наступні обмеження: 

  1.  конструктори (тобто функції створення і ініціалізації класів) не успадковуються;
  2.  в мові C # існує можливість заміщення наслідуваних методів (цей мовний аспект буде розглянутий більш докладно в ході подальших лекцій).

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

Один клас мови програмування C # може успадковувати лише властивості іншого класу (але не структури - типу даних, аналогічного кортежу мови програмування SML).

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

Підклас з неявним базовим класом успадковує властивості найбільш абстрактного класу, відомого під назвою "об'єкт" (object).

Ще одним фундаментальним компонентом концепції об'єктно-орієнтованого програмування є поняття інкапсуляції.

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

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

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

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

До основних властивостей інкапсуляції відносяться наступні можливості:

  1.    спільне зберігання даних і функцій (тобто властивостей і методів) всередині об'єкта;
  2.    приховування внутрішньої інформації від користувача (що забезпечує більшу безпеку додатка);
  3.    ізоляція користувача від особливостей реалізації (що забезпечує незалежність від машини і потенційно дружній інтерфейс додатків).

Як нам вже відомо, важлива позитивна особливість мови програмування SML полягає в тому, що в ньому підтримується так звана поліморфна типізація.

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

Розглянемо приклад найпростішої поліморфної функції:

void Poly(object o) 
{
     Console.WriteLine(o.ToString());
}

Ця функція реалізує відображення на екрані об'єкта (метод Console.WriteLine) з попереднім перетворенням його до строковому типу (метод ToString ()).

Всі наведені нижче варіанти виклику функції:

Poly (25);
Poly ("John Smith");
Poly (3.141592536m);
Poly (new Point (12,45)); 

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

загрузка...
Сторінки, близькі за змістом