Кіріспе

Нысанға бағытталған бағдарламалау жүйесінің мәселесі – архитектуралық мәселе.

Нысанға бағытталған бағдарламалау жүйелеріндегі маңызды архитектуралық мәселе – бұл «нашар базалық класс» мәселесі. Бұл жағдайда базалық класс (суперкласс) «нашар» болып саналады, себебі базалық классқа енгізілген көріне берілген қауіпсіз өзгерістер, туынды классқа мұрагерлік еткен кезде, туынды кластың жұмысын бұзуы мүмкін. Бағдарламашы базалық кластың әдістерін жеке қарап ғана оның өзгертудің қауіпсіздігін анықтай алмайды. Мүмкін болатын шешімдердің бірі – инстанция айнымалыларын оларды анықтаған классқа жеке қылып, кіші кластарды суперкластың күйін өзгерту үшін тек аксессорларды пайдалануға мәжбүрлеу. Сонымен қатар, тіл кіші кластарға мұрагерлікке алынған әдістердің қайсысын көпшілікке ашуға болатынын бақылау мүмкіндігін беруі мүмкін. Бұл өзгерістер кіші кластардың суперкластың іске асылу егжей-тегжейлеріне сүйенуіне жол бермейді және кіші кластарға тек оларға қатысты суперкластың әдістерін көрсетуге мүмкіндік береді. Балама шешім – суперкластың орнына интерфейс қолдану. «Нашар базалық класс» мәселесі ашық рекурсияға (әдістерді динамикалық шақыру, `this` арқылы) байланысты деп есептеледі. Осыған байланысты, әдістерді шақыру кезінде ашық рекурсияны (динамикалық шақыру, кешіктірілген байланыс) емес, жабық рекурсияны (статикалық шақыру, ерте байланыс) пайдалану ұсынылады, ашық рекурсия тек қана қажет болған жағдайда қолданылуы керек; сыртқы шақырулар (`this` қолданбай) әдеттегідей динамикалық шақырылады.

Шешімдер

Objective C-де категориялармен қатар, сындырылмайтын экземпляр айнымалылары да бар. Component Pascal суперкласс шақыруларын қолдамайды. Java, C++ (C++11 нұсқасынан бастап) және D кластың әдісін мұраға алу немесе қайта жазу мүмкіндігін кластың немесе әдістің декларациясын "final" кілт сөзімен белгілеп, тыйым салу арқылы шектеуге болады. Effective Java кітабының авторы Джошуа Блох (17-тарауда) бағдарламашылардың "мұраға алуға мүмкіндік беру үшін жобалау және құжаттау керек, әйтпесе оған тыйым салу керек" деп жазады. C# және VB. NET, Java сияқты, мұраға алуға тыйым салу үшін "sealed" және "Not Inheritable" сынып декларация кілт сөздерін пайдаланады және қайта жазылатын әдістерде "override" кілт сөзін қолдануды талап етеді, бұл шешім кейіннен Scala-да қабылданды. Scala кіші сыныптың ата-ана сынып әдісін қайта жазу үшін "override" кілт сөзін міндетті түрде пайдалануын қажет етеді. "Programming in Scala, 2nd Edition" кітабында автор былай деп жазады (өзгерістермен): Егер f әдісі болмаса, клиенттің f әдісінің бастапқы реализациясында қайта жазу модификаторы болмауы мүмкін еді. Кітапхана класының екінші нұсқасына f әдісін қосқаннан кейін, клиенттік кодты қайта компиляциялау дұрыс емес мінез-құлық орнына компиляция қатесін тудырады. Kotlin-де кластар мен әдістер әдепкі бойынша final болып табылады. Кластың мұраға алуын қосу үшін, кластың "open" модификаторымен белгіленуі керек. Сол сияқты, әдістің қайта жазылуын рұқсат ету үшін әдіс "open" деп белгіленуі керек. Julia абстракті типтерді ғана субтиплеуге рұқсат береді және мұрагерлікке балама ретінде композицияны пайдаланады. Дегенмен, оның көптеген жіберу механизмі бар.