Ця стаття не містить . (лютий 2016) |
Прототипне програмування — стиль об'єктно-орієнтованого програмування, при якому відсутнє поняття класу, а повторне використання (успадкування) проводиться шляхом клонування наявного примірника об'єкта — прототипу.
Канонічним прикладом прототип-орієнтованої мови є мова Self. Надалі цей стиль програмування почав набувати популярності й був покладений в основу таких мов програмування, як JavaScript, , , , , , REBOL, та інших.
Порівняння з клас-орієнтованим підходом
У мовах, що базуються на понятті «клас», всі об'єкти розділені на два основних типи — класи та екземпляри. Клас визначає структуру і функціональність (поведінку), однакову для всіх екземплярів даного класу. Екземпляр є носієм даних — тобто володіє станом, що міняється відповідно до поведінки, заданої класом.
Прихильники прототипного програмування часто стверджують, що мови, засновані на класах, призводять до надмірної концентрації на таксономії класів і на відносинах між ними. На противагу цьому, прототипування загострює увагу на поведінці певної (невеликої) кількості «зразків», які потім класифікуються як «базові» об'єкти й використовуються для створення інших об'єктів. Багато прототип-орієнтованих систем підтримують зміну прототипів під час виконання програми, тоді як лише невелика частина клас-орієнтованих систем (наприклад, Smalltalk) дозволяють динамічно змінювати класи.
Хоча переважна більшість прототип-орієнтованих систем це інтерпретовані мови з динамічною типізацією, технічно можливо додати прототипування і в мови зі статичною перевіркою типів. Мова є одним із прикладів такої системи.
Конструювання об'єктів
В клас-орієнтованих мовах новий екземпляр створюється через виклик конструктора класу (можливо, з набором параметрів). Отриманий екземпляр має структуру і поведінку, жорстко задані його класом.
У прототип-орієнтованих системах надається два методи створення нового об'єкта: клонування наявного об'єкта, або створення об'єкта «з нуля». Для створення об'єкта з нуля програмісту надаються синтаксичні засоби додавання властивостей і методів в об'єкт. Надалі, з отриманого об'єкта може бути отримана повна копія, клон. У процесі клонування копія успадковує всі характеристики свого прототипу, але з цього моменту вона стає самостійною і може бути змінена. У деяких реалізаціях копії зберігають посилання на об'єкти-прототипи, делегуючи їм частину своєї функціональності, при цьому зміна прототипу може торкнутися всіх його копій. В інших реалізаціях нові об'єкти повністю незалежні від своїх прототипів. Розглянемо кожну з цих реалізацій.
Делегування
У прототип-орієнтованих мовах, що використовують делегування, середовище виконання здатне виконувати диспетчеризацію викликів методів (або пошук потрібних даних) просто подорожуючи ланцюжком делегування вказівників (від об'єкта до його прототипу), до збігу. На відміну від відношення «клас — примірник», відношення «прототип — нащадки» не вимагає, щоб об'єкти-нащадки зберігали структурну подібність зі своїм прототипом. З часом вони можуть адаптуватися і поліпшуватися, але при цьому немає потреби переробляти прототип. Важливо, що додавати/видаляти/модифікувати можна не тільки дані, а й функції, при цьому функції теж виявляються об'єктами першого рівня. Внаслідок цього більшість прототип-орієнтованих мов називають дані та методи об'єкта «слотами» (комірками).
Каскадування
При «чистому» прототипуванні — його називають також каскадним та подання в — клоновані об'єкти не зберігають посилань на свої прототипи. Прототип копіюється один в один, зі всіма методами та атрибутами, і копії присвоюється нове ім'я (посилання). Це нагадує мітоз біологічних клітин.
До числа переваг даного підходу входить той факт, що творець копії може змінювати її, не побоюючись побічних ефектів серед інших нащадків свого предка. Також радикально знижуються обчислювальні витрати на диспетчеризацію, тому що нема потреби обходити весь ланцюжок можливих делегатів у пошуках відповідного слота (методу або атрибута).
До числа недоліків можна включити труднощі з поширенням змін у системі: модифікація прототипу не тягне за собою негайну й автоматичну зміну всіх його нащадків. Тим не менше, Kevo надає додаткові засоби для публікації змін серед множини об'єктів, причому на підставі їхньої подібності («сімейної схожості»), а не за наявністю загального предка, що типово для моделей з делегуванням.
Інший недолік в тому, що найпростіші реалізації цієї моделі призводять до збільшеної (в порівнянні з моделлю делегування) витрати пам'яті, тому що кожен клон, поки він не змінений, буде містити копію даних свого прототипу. Однак ця проблема розв'язана оптимальним поділом незмінених даних і застосуванням «ледачого копіювання» — що й було використано в Kevo.
Приклад
// Приклад прототипного стилю успадкування в JavaScript // «з нуля» об'єкт створюється із застосуванням буквеної нотації JSON {}. const foo = {one: 1, two: 2}; // інший об'єкт «з нуля» const bar = {three: 3}; // Деякі рушії JavaScript, такі як Gecko і Webkit, можуть прямо маніпулювати прототипними зв'язками. // Для простоти, припустимо, що наступний рядок працює незалежно від використаного рушія: bar.__proto__ = foo; // bar наразі є нащадком foo. // тепер ми можемо із bar доступитися до властивостей foo bar.one // це дає 1. // об'єкт-нащадок, звісно, зберігає і свої властивості bar.three // тут лишається 3.
Критика
Прихильників клас-орієнтованих об'єктних моделей, що критикують прототипний підхід, часто турбують ті самі проблеми, якими стурбовані прихильники статичної типізації у відношенні до мов з динамічною типізацією. Зокрема, обговорення обертаються навколо таких тем, як правильність, безпека, передбачуваність та ефективність програми.
Що стосується перших трьох пунктів, то класи часто розглядаються як типи (і справді, в більшості об'єктноорієнтованих мов зі статичною типізацією так воно і є), і передбачається, що класи надають певні домовленості й гарантують, що екземпляри будуть поводитися цілком певним чином.
У частині ефективності, оголошення класів значно спрощує компілятору завдання оптимізації, роблячи ефективнішими як методи, так і пошук атрибутів у примірниках. У випадку мови Self чимала частина часу була витрачена на розробку таких технік компіляції та інтерпретації, які дозволили б наблизити продуктивність прототип-орієнтованих систем до їхніх клас-орієнтованих конкурентів.
Нарешті, можливо найзагальнішим місцем критики проти прототипного програмування є те, що спільнота розробників ПЗ недостатньо добре знайоме з ним, незважаючи на популярність і поширеність JavaScript. До того ж оскільки прототип-орієнтовані системи є порівняно новими й все ще нечисленними та рідкісними, прийоми розробки з їхнім використанням досі не отримали великого поширення.
Мови
- Actor-Based Concurrent Language, ABCL: , , ,
- [en]
- ECMAScript, ActionScript, DMDScript, JavaScript, JScript
- [en]
- Lua
- REBOL
- Self
Джерела
- Иан Грэхем. Объектно-ориентированные методы. Принципы и практика = Object-Oriented Methods: Principles & Practice. — 3-е изд. — Москва : «Вильямс», 2004. — С. 880. — .
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cya stattya ne mistit posilan na dzherela Vi mozhete dopomogti polipshiti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Material bez dzherel mozhe buti piddano sumnivu ta vilucheno lyutij 2016 Prototipne programuvannya stil ob yektno oriyentovanogo programuvannya pri yakomu vidsutnye ponyattya klasu a povtorne vikoristannya uspadkuvannya provoditsya shlyahom klonuvannya nayavnogo primirnika ob yekta prototipu Kanonichnim prikladom prototip oriyentovanoyi movi ye mova Self Nadali cej stil programuvannya pochav nabuvati populyarnosti j buv pokladenij v osnovu takih mov programuvannya yak JavaScript REBOL ta inshih Porivnyannya z klas oriyentovanim pidhodomU movah sho bazuyutsya na ponyatti klas vsi ob yekti rozdileni na dva osnovnih tipi klasi ta ekzemplyari Klas viznachaye strukturu i funkcionalnist povedinku odnakovu dlya vsih ekzemplyariv danogo klasu Ekzemplyar ye nosiyem danih tobto volodiye stanom sho minyayetsya vidpovidno do povedinki zadanoyi klasom Prihilniki prototipnogo programuvannya chasto stverdzhuyut sho movi zasnovani na klasah prizvodyat do nadmirnoyi koncentraciyi na taksonomiyi klasiv i na vidnosinah mizh nimi Na protivagu comu prototipuvannya zagostryuye uvagu na povedinci pevnoyi nevelikoyi kilkosti zrazkiv yaki potim klasifikuyutsya yak bazovi ob yekti j vikoristovuyutsya dlya stvorennya inshih ob yektiv Bagato prototip oriyentovanih sistem pidtrimuyut zminu prototipiv pid chas vikonannya programi todi yak lishe nevelika chastina klas oriyentovanih sistem napriklad Smalltalk dozvolyayut dinamichno zminyuvati klasi Hocha perevazhna bilshist prototip oriyentovanih sistem ce interpretovani movi z dinamichnoyu tipizaciyeyu tehnichno mozhlivo dodati prototipuvannya i v movi zi statichnoyu perevirkoyu tipiv Mova ye odnim iz prikladiv takoyi sistemi Konstruyuvannya ob yektivV klas oriyentovanih movah novij ekzemplyar stvoryuyetsya cherez viklik konstruktora klasu mozhlivo z naborom parametriv Otrimanij ekzemplyar maye strukturu i povedinku zhorstko zadani jogo klasom U prototip oriyentovanih sistemah nadayetsya dva metodi stvorennya novogo ob yekta klonuvannya nayavnogo ob yekta abo stvorennya ob yekta z nulya Dlya stvorennya ob yekta z nulya programistu nadayutsya sintaksichni zasobi dodavannya vlastivostej i metodiv v ob yekt Nadali z otrimanogo ob yekta mozhe buti otrimana povna kopiya klon U procesi klonuvannya kopiya uspadkovuye vsi harakteristiki svogo prototipu ale z cogo momentu vona staye samostijnoyu i mozhe buti zminena U deyakih realizaciyah kopiyi zberigayut posilannya na ob yekti prototipi deleguyuchi yim chastinu svoyeyi funkcionalnosti pri comu zmina prototipu mozhe torknutisya vsih jogo kopij V inshih realizaciyah novi ob yekti povnistyu nezalezhni vid svoyih prototipiv Rozglyanemo kozhnu z cih realizacij Deleguvannya U prototip oriyentovanih movah sho vikoristovuyut deleguvannya seredovishe vikonannya zdatne vikonuvati dispetcherizaciyu viklikiv metodiv abo poshuk potribnih danih prosto podorozhuyuchi lancyuzhkom deleguvannya vkazivnikiv vid ob yekta do jogo prototipu do zbigu Na vidminu vid vidnoshennya klas primirnik vidnoshennya prototip nashadki ne vimagaye shob ob yekti nashadki zberigali strukturnu podibnist zi svoyim prototipom Z chasom voni mozhut adaptuvatisya i polipshuvatisya ale pri comu nemaye potrebi pereroblyati prototip Vazhlivo sho dodavati vidalyati modifikuvati mozhna ne tilki dani a j funkciyi pri comu funkciyi tezh viyavlyayutsya ob yektami pershogo rivnya Vnaslidok cogo bilshist prototip oriyentovanih mov nazivayut dani ta metodi ob yekta slotami komirkami Kaskaduvannya Pri chistomu prototipuvanni jogo nazivayut takozh kaskadnim ta podannya v klonovani ob yekti ne zberigayut posilan na svoyi prototipi Prototip kopiyuyetsya odin v odin zi vsima metodami ta atributami i kopiyi prisvoyuyetsya nove im ya posilannya Ce nagaduye mitoz biologichnih klitin Do chisla perevag danogo pidhodu vhodit toj fakt sho tvorec kopiyi mozhe zminyuvati yiyi ne poboyuyuchis pobichnih efektiv sered inshih nashadkiv svogo predka Takozh radikalno znizhuyutsya obchislyuvalni vitrati na dispetcherizaciyu tomu sho nema potrebi obhoditi ves lancyuzhok mozhlivih delegativ u poshukah vidpovidnogo slota metodu abo atributa Do chisla nedolikiv mozhna vklyuchiti trudnoshi z poshirennyam zmin u sistemi modifikaciya prototipu ne tyagne za soboyu negajnu j avtomatichnu zminu vsih jogo nashadkiv Tim ne menshe Kevo nadaye dodatkovi zasobi dlya publikaciyi zmin sered mnozhini ob yektiv prichomu na pidstavi yihnoyi podibnosti simejnoyi shozhosti a ne za nayavnistyu zagalnogo predka sho tipovo dlya modelej z deleguvannyam Inshij nedolik v tomu sho najprostishi realizaciyi ciyeyi modeli prizvodyat do zbilshenoyi v porivnyanni z modellyu deleguvannya vitrati pam yati tomu sho kozhen klon poki vin ne zminenij bude mistiti kopiyu danih svogo prototipu Odnak cya problema rozv yazana optimalnim podilom nezminenih danih i zastosuvannyam ledachogo kopiyuvannya sho j bulo vikoristano v Kevo Priklad Priklad prototipnogo stilyu uspadkuvannya v JavaScript z nulya ob yekt stvoryuyetsya iz zastosuvannyam bukvenoyi notaciyi JSON const foo one 1 two 2 inshij ob yekt z nulya const bar three 3 Deyaki rushiyi JavaScript taki yak Gecko i Webkit mozhut pryamo manipulyuvati prototipnimi zv yazkami Dlya prostoti pripustimo sho nastupnij ryadok pracyuye nezalezhno vid vikoristanogo rushiya bar proto foo bar narazi ye nashadkom foo teper mi mozhemo iz bar dostupitisya do vlastivostej foo bar one ce daye 1 ob yekt nashadok zvisno zberigaye i svoyi vlastivosti bar three tut lishayetsya 3 KritikaPrihilnikiv klas oriyentovanih ob yektnih modelej sho kritikuyut prototipnij pidhid chasto turbuyut ti sami problemi yakimi sturbovani prihilniki statichnoyi tipizaciyi u vidnoshenni do mov z dinamichnoyu tipizaciyeyu Zokrema obgovorennya obertayutsya navkolo takih tem yak pravilnist bezpeka peredbachuvanist ta efektivnist programi Sho stosuyetsya pershih troh punktiv to klasi chasto rozglyadayutsya yak tipi i spravdi v bilshosti ob yektnooriyentovanih mov zi statichnoyu tipizaciyeyu tak vono i ye i peredbachayetsya sho klasi nadayut pevni domovlenosti j garantuyut sho ekzemplyari budut povoditisya cilkom pevnim chinom U chastini efektivnosti ogoloshennya klasiv znachno sproshuye kompilyatoru zavdannya optimizaciyi roblyachi efektivnishimi yak metodi tak i poshuk atributiv u primirnikah U vipadku movi Self chimala chastina chasu bula vitrachena na rozrobku takih tehnik kompilyaciyi ta interpretaciyi yaki dozvolili b nabliziti produktivnist prototip oriyentovanih sistem do yihnih klas oriyentovanih konkurentiv Nareshti mozhlivo najzagalnishim miscem kritiki proti prototipnogo programuvannya ye te sho spilnota rozrobnikiv PZ nedostatno dobre znajome z nim nezvazhayuchi na populyarnist i poshirenist JavaScript Do togo zh oskilki prototip oriyentovani sistemi ye porivnyano novimi j vse she nechislennimi ta ridkisnimi prijomi rozrobki z yihnim vikoristannyam dosi ne otrimali velikogo poshirennya MoviActor Based Concurrent Language ABCL en ECMAScript ActionScript DMDScript JavaScript JScript en Lua REBOL SelfDzherelaIan Grehem Obektno orientirovannye metody Principy i praktika Object Oriented Methods Principles amp Practice 3 e izd Moskva Vilyams 2004 S 880 ISBN 0 201 61913 X Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi