Прототипне програмування 1

Порівняння з клас-орієнтованим підходом

У мовах, заснованих на понятті «клас», всі об'єкти розділені на два основних типи - класи і екземпляри. Клас визначає структуру і функціональність (поведінку), однакову для всіх екземплярів даного класу. Примірник є носієм даних - тобто має статки. мінливих відповідно до поведінкою, заданим класом.

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

Хоча переважна більшість прототип-орієнтованих систем засновані на інтерпретованих мовах з динамічною типізацією, технічно можливо додати прототипирование і в мови зі статичної перевіркою типів. Мова Omega є одним із прикладів такої системи.

конструювання об'єктів

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

В прототип-орієнтованих системах надається два методи створення нового об'єкта: клонування існуючого об'єкта, або створення об'єкта «з нуля». Для створення об'єкта з нуля програмісту надаються синтаксичні засоби додавання властивостей і методів в об'єкт. Надалі, з отриманого об'єкта може бути отримана повна копія, клон. У процесі клонування копія успадковує всі характеристики свого прототипу, але з цього моменту вона стає самостійною і може бути змінена. У деяких реалізаціях копії зберігають посилання на об'єкти-прототипи, делегуючи їм частину своєї функціональності; при цьому зміна прототипу може торкнутися всіх його копії. В інших реалізаціях нові об'єкти повністю незалежні від своїх прототипів. Розглянемо обидва ці випадки.

делегування

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

каскадування

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

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

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

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

література

Схожі статті