Кіріспе

Нысанға бағдарланған бағдарламалау стилі, мұрагерлік нысандарды қайта пайдалануға негізделген. Прототипке негізделген бағдарламалау – бұл мінез-құлықты қайта пайдалану (мұрагерлік деп аталады) прототип ретінде қызмет ететін қолданыстағы нысандарды қайта пайдалану арқылы жүзеге асырылатын нысанға бағдарланған бағдарламалау стилі. Бұл модель прототиптік, прототипке бағдарланған, сыныпсыз немесе инстанцияға негізделген бағдарламалау деп те аталады. Прототипке негізделген бағдарламалау жалпыланған нысандарды пайдаланады, оларды кейін клондап, кеңейтуге болады. Мысал ретінде жемісті алсақ, "жеміс" нысаны жалпы жемістің қасиеттері мен функционалдығын көрсетеді. "Банан" нысаны "жеміс" нысанынан клондалады, содан кейін бананға тән қасиеттер қосылады. Әрбір жеке "банан" нысаны жалпы "банан" нысанынан клондалады. Бұл сыныпқа негізделген парадигмадан өзгеше, онда "жеміс" класы "банан" класынан мұрагерлік алады. Алғашқы прототипке негізделген бағдарламалау тілдері Director a. k. a. Ani (MacLisp үстінде) (1976–1979) және бір уақытта, бірақ тәуелсіз емес, ThingLab (Smalltalk үстінде) (1977–1981) болды, бұл Кеннет Майкл Канның MIT және Алан Гамильтон Борнингтің Стэнфордтағы PhD жобалары еді (бірақ Алан Кеймен бірге жұмыс істеді). Борнинг "прототип" сөзін 1981 жылғы TOPLAS мақаласында енгізді. Бірден көп іске асырушысы немесе пайдаланушысы бар алғашқы прототипке негізделген бағдарламалау тілі, мүмкін, Yale T Scheme (1981–1984) болды, бірақ Director және ThingLab сияқты бастапқыда ол сыныптарсыз нысандар туралы ғана айтады. Прототиптер атауын және ұғымын танымал еткен тіл Self (1985–1995) болды, ол Дэвид Унгар мен Рэндалл Смит объектіге бағдарланған тіл дизайнындағы тақырыптарды зерттеу үшін әзірлеген. 1990 жылдардың соңынан бастап сыныпсыз парадигма кеңінен танымал болды. Қазіргі кездегі прототипке бағдарланған тілдерге JavaScript (және басқа ECMAScript ішкі жүйелері, мысалы JScript және Flash-тің ActionScript 1.0), Lua, Cecil, NewtonScript, Io, Ioke, MOO, REBOL және AHK жатады. 2010 жылдан бері таза функционалдық прототиптері бар жаңа буын тілдер пайда болды, олар OOP-ті өзінің негізгі бөлігіне дейін азайтады: Jsonnet – миксин мұрагерлігін қолданатын, ішкі прототиптік нысандар жүйесі бар динамикалық, жалқау таза функционалдық тіл; Nix – эквивалентті нысандар жүйесін (Nix "кеңейтулері") сөзбе-сөз екі қысқа функция анықтамасында (плюс көптеген қосымша ыңғайлы функциялар) құрайтын динамикалық, жалқау таза функционалдық тіл. Екі тіл де үлкен үлестірілген бағдарламалық жасақтама конфигурацияларын анықтау үшін қолданылады (Jsonnet тікелей GCL-ден, Google конфигурациялық тілінен шабыттанды, Google барлық орналасуларын осы тілде анықтайды және динамикалық айнымалыларды байланыстыру арқылы ұқсас семантикаға ие). Содан бері Gerbil Scheme сияқты басқа тілдер де ұқсас принциптерге негізделген таза функционалдық, жалқау прототиптік жүйелерді іске асырды.

Өкілеттік беру

Делегацияны қолданатын прототипке негізделген тілдерде, тілдің орындалу ортасы сәйкестік табылғанға дейін, объекттен оның прототипіне дейінгі делегация сілтемелерінің тізбесін орындау арқылы дұрыс әдісті табуға немесе қажетті деректерді анықтауға қабілетті. Объектілер арасында осы мінез-құлықты бөлісу үшін тек делегация сілтемесі ғана жеткілікті. Сыныптарға негізделген объектілі бағдарламалау тілдеріндегі сынып пен инстанция арасындағы қатынастан өзгеше, прототип пен оның туындылары арасындағы қатынас бала объектісінің осы сілтемеден басқа прототипке жад немесе құрылымдық ұқсастығы болуын талап етпейді. Сондықтан, бала объектісі уақыт өте келе сыныптарға негізделген жүйелердегідей, байланысты прототипінің құрылымын өзгертусіз өзгертіліп, толықтырылуы мүмкін. Сондай-ақ, деректер ғана емес, әдістер де қосылып немесе өзгертілуі мүмкін екенін ескеру маңызды. Осы себепті кейбір прототиптік тілдер деректер мен әдістердің екеуін де "ұялар" немесе "мүшелер" деп атайды.

Бірге тірелу

Конкатентивті прототиптеуде, Kevo бағдарламалау тілінде іске асырылған тәсілде, объектінің клондалған түпнұсқа прототипіне ешқандай көрінетін сілтемелер немесе байланыстар жоқ. Прототиптік (бастапқы) объекті байланыстырудың орнына көшіріледі және делегация болмайды. Осының салдарынан, прототипке енгізілген өзгерістер клондалған объектілерге көрінбейді. Айта кетейік, Cosmos бағдарламалау тілі де осыған ұқсас нәтижеге тұрақты дерек құрылымдарын пайдалану арқылы жетеді. Мұндай жағдайдағы негізгі түсінік айырмашылығы – прототиптік объектіге енгізілген өзгерістер автоматты түрде клондарға таратылмайды. Бұл артықшылық немесе кемшілік ретінде қарастырылуы мүмкін. (Дегенмен, Kevo нысандардың ұқсастығына негізделген өзгерістерді таратуға арналған қосымша қарапайым құралдарды ұсынады – олар отбасылық ұқсастықтар немесе клондық отбасы механизмі деп аталады.) Керісінше, делегацияға негізделген прототиптеу жүйелері деректерді іздеу жылдамдығын арттыру үшін кэштеуді пайдалана алады.

Сын

Сыныпқа негізделген объект модельдерін жақтаушылар, прототипке негізделген жүйелерді сынағанда, көбінесе статикалық типтік жүйелерді жақтаушылардың динамикалық типтік жүйелерге қатысты алаңдаушылықтарына ұқсас алаңдаушылықтарды білдіреді (datatype-қа қараңыз). Әдетте, бұл алаңдаушылықтар дұрыстық, қауіпсіздік, болжамдылық, тиімділік және бағдарламашының бұл жүйемен таныс емеуіне байланысты болады. Алғашқы үш мәселе бойынша, сыныптар көбінесе типтерге ұқсас деп есептеледі (көптеген статикалық типтелген объектіге бағытталған тілдерде олар осы рөлді атқарады) және олардың инстанцияларына, сондай-ақ оларды пайдаланушыларға, олардың белгілі бір тәсілде жұмыс істейтініне кепілдік беру мақсатында ұсынылады. Тиімділік тұрғысынан, сыныптарды жариялау компилятордың көптеген оңтайландыруларын жеңілдетеді, бұл әдістер мен инстанция айнымалыларын тиімді іздеуге мүмкіндік береді. Self тілі үшін, прототипке негізделген жүйелердің кластық жүйелерге қарағанда өнімділігін арттыруға көптеген уақыт әзірлеу, компиляциялау және интерпретациялау техникалары жұмсалды. Прототипке негізделген тілдерге қатысты жиі айтылатын сын – бағдарламалық жасақтаманы әзірлеушілер қауымдастығы олармен таныс емес, тіпті JavaScript-тің танымалдығы мен нарыққа кеңінен енуіне қарамастан. Алайда, JavaScript фреймворктарының көбеюімен және World Wide Web (Желі) дамыған сайын JavaScript-тің күрделі қолданылуымен прототипке негізделген жүйелер туралы білім артып келеді. ECMAScript 6 кластарды JavaScript-тің қолданыстағы прототипке негізделген мұрагерлігінің үстіне синтаксистік қант ретінде енгізді, бұл нысандарды құрудың және мұрагерлікті басқарудың баламалы жолын ұсынады.