Знайомство з прототипна об'єктно-орієнтованим програмуванням

світ об'єктів

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

Зазвичай першим об'єктно-орієнтованою мовою називають мова моделювання Simula. Потім з'явилися Smalltalk, C ++, Java і C #. У той час в більшості об'єктно-орієнтованих мов об'єкти визначалися за допомогою класів. Згодом розробники Smalltalk-подібного мови програмування Self створили альтернативний, більш простий метод визначення об'єктів, названий об'єктно-орієнтованим програмуванням на основі прототипів, або прототипна об'єктно-орієнтованим програмуванням.

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

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

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

Що таке прототип? Класи і прототипи

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

Класичним прикладом є використання класу Point і його нащадка Point3D для визначення двомірних і тривимірних точок відповідно. Лістинг 1 показує, як могли б виглядати зазначені класи в коді Java.

Лістинг 1. Клас Point в Java

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

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

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

"У LT ноги, як у Еммітт".
"Він може прориватися за лінію зовсім як Еммітт".
"Так він пробігає милю рівно за п'ять хвилин!".

Ви можете порівняти наведений приклад з випадком класичного моделювання, де ви могли б визначити клас RunningBack (гравець задньої лінії), що успадковує атрибути з класу FootballPlayer (гравець в американський футбол). «LT» і «emmitt» були б екземплярами класу RunningBack. Ці класи могли б виглядати в коді Java так, як показано в лістингу 4.

Лістинг 4. Три класи Java

Класична модель пов'язана зі значно більшими концептуальними «накладними витратами», але при цьому не надає можливості детального контролю над екземплярами класів emmitt і lt - тієї можливості, яку ви отримуєте при використанні прототипної моделі. (Справедливості заради, слід зазначити, що клас FootballPlayer не є на 100% за необхідне, він використовується тут для порівняння з наступним прикладом.) Часом подібні «накладні витрати» можуть виявитися корисними, але часто вони є просто тягарем.

Ви також могли б створити ще один об'єкт lineBacker. успадковує атрибути з footballPlayer. як показано в лістингу 6.

Лістинг 6. Спадкування об'єктів

Як показано в лістингу 7, ви можете додати поведінку в об'єкти lineBacker і runningBack шляхом додавання в об'єкт footballPlayer.

Лістинг 7. Додавання поведінки

У цьому прикладі ви працюєте з footballPlayer як з класом. Ви також можете створити об'єкти для Еммітт і LT, як показано в лістингу 8.

Лістинг 8. Створення об'єктів

Оскільки об'єкт lt успадковує атрибути з об'єкта emmitt. ви навіть можете працювати з emmitt як з класом, як показано в лістингу 9.

Лістинг 9. Спадкування і класи

Потім ви можете створювати даний об'єкт з використанням ключового слова new подібно до того, як це робиться в коді Java (див. Лістинг 11).

Лістинг 11. Створення об'єкта
Лістинг 12. Додавання методу

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

Лістинг 13. Псевдокласичні модель успадкування
Лістинг 14. Визначення об'єкта

Потім, як показано в лістингу 15, ви реалізуєте успадкування з використанням Object.create.

Лістинг 15. Спадкування з використанням Object.create
Лістинг 16. Модель функціонального успадкування

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

Лістинг 17. Створення примірників

висновок

У цій статті дано лише поверхневе уявлення про прототипна об'єктно-орієнтованому програмуванні. Прототипну модель реалізують багато інших мов, наприклад Self, Lua, Io і REBOL. Прототипна модель може бути реалізована на будь-якій мові, включаючи статично типізовані. Вона також може виявитися корисною при розробці будь-що вимагає гнучкості і простоти системи.

Ресурси для скачування

Схожі теми

Схожі статті