Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПрограмЧ1-вторник.docx
Скачиваний:
2
Добавлен:
09.11.2019
Размер:
336.34 Кб
Скачать

3. Наследовние

Наследование (inheritance) - это процесс, посредством которого один объект может приобретать свойства другого. Точнее, объект может наследовать основные свойства другого объекта и добавлять к ним черты, характерные только для него. Наследование является важным, поскольку оно позволяет поддерживать концепцию иерархии классов (hierarchical classification). Применение иерархии классов делает управляемыми большие потоки информации. Например, подумайте об описании жилого дома. Дом - это часть общего класса, называемого строением. С другой стороны, строение - это часть более общего класса - конструкции, который является частью ещё более общего класса объектов, который можно назвать созданием рук человека. В каждом случае порождённый класс наследует все, связанные с родителем, качества и добавляет к ним свои собственные определяющие характеристики. Без использования иерархии классов, для каждого объекта пришлось бы задать все характеристики, которые бы исчерпывающи его определяли. Однако при использовании наследования можно описать объект путём определения того общего класса (или классов), к которому он относится, с теми специальными чертами, которые делают объект уникальным. Наследование играет очень важную роль в OOP.

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

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

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

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

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

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

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

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

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

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

Найбільш відомим прикладом об'єктно-орієнтованої мови програмування є мова 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));

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

Платформа .NET та її застосування для ООП

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

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

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

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

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

Говорячи про. NET як про технологічній платформі, не можна не відзначити той факт, що вона забезпечує одночасну підтримку проектування та реалізації програмного забезпечення з використанням різних мов програмування. При цьому підтримуються десятки мов програмування, починаючи від найперших (зокрема, COBOL і FORTRAN) і закінчуючи сучасними (наприклад, C # і Visual Basic). Ранні мови програмування до цих пір активно використовуються, зокрема, для забезпечення сумісності з раніше створеними додатками, критичними для бізнесу (скажімо, COBOL дуже широко застосовувався для створення прикладних програм, що підтримують фінансову діяльність).

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

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

Слід відзначити і ту обставину, що нова технологія. NET не тільки затребувана світовою громадськістю, а й офіційно визнана, що відображено у відповідних стандартах ECMA (European Computer Manufacturers Association).

Тепер розглянемо інструментальні можливості. NET як засоби проектування та реалізації програмного забезпечення, тобто, власне, програмування в широкому сенсі цього слова.

Перш за все, необхідно відзначити підтримку багатомовної середовища розробки додатків CLR (Common Language Runtime).

Ця можливість з'явилася завдяки різноманітності міжмовної інтерфейсу Common Language Infrastructure, або CLI, який підтримує розробку програмних компонентів на різних мовах програмування.

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

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

Коротко розглянемо основні аспекти архітектурного рішення Microsoft. NET Framework, зазначивши насамперед та обставина, що важливу роль відіграє середовище розробки Microsoft Visual Studio.NET, а першорядне значення має середовище виконання програм - Common Language Runtime (CLR). Середовище виконання CLR реалізує управління пам'яттю, типами даних, міжмовних взаємодією, розгортанням (deployment) додатків.

  Рис. 14.1. Архітектурна схема. NET Framework і Visual Studio.NET. 

Істотною перевагою конструктивного рішення. NET є компонентно-орієнтований підхід до проектування та реалізації програмного забезпечення. Суть підходу полягає у принциповій можливості створення незалежних складових програмного забезпечення з уніфікованою інтерфейсної частиною для багаторазового повторного і розподіленого використання. При цьому продуктивність рішення обумовлена багатомовністю інтегровних програмних проектів (концепція. NET потенційно підтримує довільний мова програмування, в числі найбільш відомих мов - C #, Visual Basic, C та ін.)

У ході компіляції програма на. NET-сумісному мовою програмування трансформується відповідно до заздалегідь заданої узагальненої специфікацією мови Common Type System (CTS). Система типів CTS повністю описує всі типи даних, які підтримує середовищем виконання, визначає їх взаємозв'язку і зберігає їх відображення в системі типів. NET.

Під Common Language Specification (або CLS) розуміється набір правил, що визначають підмножина узагальнених типів даних, щодо яких гарантується, що вони безпечні при використанні у всіх мовах. NET.

Інтерфейси реалізуються за допомогою форм Windows і ASP.NET для веб-додатків.

У ході виконання процедури трансляції вихідний текст програми (написаний на SML, C #, Visual Basic, C або будь-якому іншому мовою програмування, який підтримується. NET) перетворюється компілятором в так звану збірку (assembly) і зберігається у вигляді файлу динамічно приєднуваної бібліотеки (Dynamically Linked Library, DLL) або виконуваного файлу (Executable, EXE).

  Рис. 14.2. Схема компіляції Common Language Runtime. 

Природно, що для кожного компілятора (будь то компілятор мови C #, csc.exe або Visual Basic, vbc.exe) середовищем часу виконання проводиться необхідне відображення використовуваних типів у типи CTS, а програмного коду - в код "абстрактної машини". NET - MSIL (Microsoft Intermediate Language).

У результаті програмний проект формується у вигляді збірки - самодостатнього компонента для розгортання, тиражування і повторного використання. Збірка ідентифікується цифровим підписом автора і унікальним номером версії. Розглянемо досить узагальнений приклад трансляції багатокомпонентного гетерогенного програмного проекту під управлінням Microsoft. NET (див. рис. 14.3).

Припустимо, що компоненти проекту написані на трьох мовах програмування: вже знайомому нам мовою SML, досліджуваній мові C #, а також мовою С + +, який характеризується можливістю створення потенційно небезпечного коду (зокрема, динамічного розподілу пам'яті).

Вихідні тексти компонент проекту транслюються, відповідно, компіляторами з мов SML, C # і C + + в уніфікований MSIL-код і зберігаються у файлах у вигляді збірок.

У ході перегляду та виконання програмного проекту Just-In-Time (JIT) компілятор середовища CLR виробляє виконання проекту з "ледачим" (по мірі необхідності) позначенням відтранслюваного проміжного коду збірок.

  Рис. 14.3. Схема виконання CLR.

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

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

У ході компіляції програма на. NET-сумісному мовою програмування трансформується відповідно до заздалегідь заданої Common Type System (CTS) узагальненої специфікацією мови. Система типів CTS повністю описує всі типи даних, які підтримує середовищем виконання, визначає їх взаємозв'язку і зберігає їх відображення в систему типів. NET.

Рис. 14.4. Універсальна система типізації (UTS).

Система типізації Microsoft. NET є частково впорядкована множина, яке на якісному рівні може розумітися як ISA-ієрархія (абревіатура ISA походить від англійських слів "is a", які означають "є одним з").

Так, наприклад, висловлювання STUDENT ISA PERSON означає, що тип STUDENT є підтип типу PERSON (тут цілком доречна аналогія з множинами і цілком точна аналогія з доменами).

Таким чином, система типів Microsoft. NET утворює ієрархію зі зростанням спільності знизу вгору (див. рис. 14.4), в якій явно виділяються дві великі групи типів, а саме, типи-посилання і типами-значеннями. Різниця між останніми визначається особливостями виклику в процедурах: по імені або за значенням (call-by-name, CBN) і по посиланню (call-by-reference, CBR).

Зауважимо також, що система типізації Microsoft. NET крім розвинутої ієрархії визначених типів дозволяє користувачеві створювати власні типи (як типи-посилання, так і типи-значення) на основі вже існуючих.

Виклад найважливіших аспектів Microsoft. NET було б неповним, якби ми не згадали про такому суттєвому архітектурному принципі як веб-сервіси.

Значення веб-сервісів полягає у розподілі можливостей розроблених прикладних систем по каналах Internet.

  Рис. 14.5. Веб-сервери в. NET. 

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

В якості середовища розробки прикладних систем доцільно використовувати Microsoft Visual Studio. NET, надає цілий комплекс розвинених засобів створення, редагування та налагодження програмного коду на різних мовах програмування. У разі нескладних завдань можна обмежитися примітивними редакторами тексту програм, подібних Notepad.

Інтерфейсна частина прикладної програмної системи в Internet-архітектурі представлена так званими веб-формами, призначеними для введення і виведення даних в уніфікованому форматі.

В якості мови реалізації може використовуватися мова гіпертекстової розмітки HTML (HyperText Markup Language). Взаємодія між клієнтом і додатком у найпростішому випадку здійснюється з використанням традиційного Internet-протоколу передачі даних HTTP (HyperText Transfer Protocol).

Структуровані дані зберігаються у форматі XML (варіант HTML з більш суворим синтаксисом).

Зауважимо, що технологія веб-сервісів, реалізована Microsoft, припускає інтеграцію з компонентами незалежних виробників.

Спробуємо сформулювати визначення поняття "веб-сервіс" (або, інакше, "веб-служба").

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

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

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

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

  1. HTTP - стандартний протокол обміну гіпертекстовими документами в Internet з можливістю передачі даних за допомогою веб-форм;

  2. XML - формат зберігання структурованих даних з можливістю обміну ними по Internet-каналах;

  3. SOAP - стандартний протокол взаємодії компонент (глобально) розподіленого додатка (Simple Object Access Protocol);

  4. UDDI - стандарт інтеграції додатків (Universal Description, Discovery and Integration);

  5. WSDL - універсальна мова опису веб-сервісів (Web Service Description Language);

а також цілий ряд інших менш уживаних протоколів.

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

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

Центральної концепцією підходу (і це очевидно вже з назви) є поняття компонента.

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

На відміну від "традиційних" об'єктів ООП компоненти володіють наступними характеристичними властивостями:

  • В цілому компонент має більш високим рівнем абстракції в порівнянні з об'єктом (під останнім розуміється конструкція рівня мови програмування);

  • Компоненти можуть містити в своєму складі множинні класи;

  • Компоненти з точки зору користувача є інваріантами по відношенню до тієї мови програмування, на якому вони реалізовані.

Таким чином, виявляється, що в загальному випадку розробник і користувач компонента можуть бути територіально розділені і мають можливість використовувати різні мови програмування в рамках єдиного середовища розробки додатків Microsoft. NET.

Зауважимо, що спроби побудови компонентних програмних систем робилися і рядом інших розробників програмного забезпечення (зокрема, технологія JavaBeans виробництва Sun Microsystems), а також міжнародних асоціацій, які об'єднують зусилля дослідників і практиків у галузі об'єктного програмування (наприклад, стандарт брокерів об'єктних запитів CORBA організації Object Management Group).

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

Перш за все, розглянемо компонентну модель Microsoft, яка зазвичай позначається в літературі абревіатурою COM (Component Object Model).

Компонентна об'єктна модель COM є основним стандартом Microsoft для компонентного проектування та реалізації програмного забезпечення. На сьогодні це найбільш розвинена, і, мабуть, найбільш вдала в практичному плані модель, яка забезпечує можливість ініціалізації та використання компонентів як усередині одного процесу, так і між процесами або між комп'ютерами незалежно від мови реалізації. COM-модель підтримується в ідеології. NET для цілого ряду мов програмування (C #, SML, Visual Basic, C + + та ін), є основою для ActiveX, OLE, а також для багатьох інших технологій Microsoft.

На відміну від СОМ, модель Java Beans, базовий стандарт Sun Microsystems для компонент, виявляється залежною від мови реалізації.

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

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

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

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

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

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

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

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

По-перше, розробники відзначають достатньо високі вимоги до апаратного забезпечення (зокрема, обсяг оперативної пам'яті повинен бути не менше 256 мегабайт, вільний обсяг жорсткого диска для роботи з Microsoft Visual Studio. NET - не менше 10 гігабайт).

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

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

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

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

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

  • Інтероперабельність і міжмовна взаємодія;

  • Багаторівнева, гнучка і надійна політика безпеки;

  • Інтеграція з технологією веб-сервісів;

  • Спрощення процедури розгортання і використання створюваного програмного забезпечення;

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