Кіріспе

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

Капсулалау

Инкапсуляция пайдаланушыларға кластың өзгермейтін шарттарын бұзуға мүмкіндік бермейді, бұл пайдалы, себебі интерфейсте көрсетілмеген аспектілерге байланысты объектілер класының іске асырылуын пайдаланушы кодын өзгертпестен өзгертуге болады. Инкапсуляцияның анықтамалары қауіпсіздік мәселелерінен гөрі байланысты ақпаратты біріктіруге және жинақтауға (бірлікке) баса назар аударады.

Мұрагерлік

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

Сын-пікір

Сыныпқа негізделген тілдер, немесе, дәлірек айтқанда, субклассификация субтипикалаудың жалғыз тәсілі болатын тілдер, іске асырулар мен интерфейстерді шатастырады деп сынға ұшырады – бұл объектіге бағытталған бағдарламалаудың негізгі принципі. Сыншылар мынаны айтады: объекттер жиынтығын сақтайтын қап класын жасап, кейін оны кеңейтіп, объектілердің қайталануын жоятын жиын класын жасауға болады. Егер функция қап класының объектісін қабылдаса, екі объектіні қосу қаптың көлемін екіге арттырады деп күтуі мүмкін. Бірақ егер жиын класының объектісі берілсе, екі объектіні қосу қаптың көлемін екіге арттыруы мүмкін, ал мүмкін болмайды. Мұндай мәселе субклассификация, тіпті Лисковтың орнын алмастыру принципі деп аталатын субтипикалау принципі қолданылмайтын жағдайларда да субтипикалауды білдіретіндіктен туындайды. Барбара Лисков және Жаннет Винг 1994 жылғы мақаласында осы принципти былайша тұжырымдады:

Субтип талабы: \phi(x) – T типіндегі x объектілері үшін дәлелденетін қасиет болсын. Онда \phi(y) – S типіндегі y объектілері үшін де дұрыс болуы керек, мұнда S – T-нің субтипі.

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

Үлгі тілдер

Simula кластық абстракцияны енгізгенімен, кластық тілдің классикалық мысалы Smalltalk болып табылады. Басқаларына PHP, C++, Java, C# және Objective C жатады.