Кіріспе

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

Іс-әрекет

Нысанға бағдарланған бағдарламалауда (ООП) инстанция – кез келген объектінің нақты көрінісі, әдетте компьютерлік бағдарламаның жұмыс істеу кезінде пайда болады. Формальды түрде "инстанция" мен "объект" синонимдер, себебі олардың әрқайсысы белгілі бір мәнді (реализацияны) білдіреді, оларды инстанция-объект деп те атауға болады; "инстанция" объектінің ерекше идентификациясын күшейтіп көрсетеді. Инстанция құру процесі инстанцияландыру деп аталады. Объект түрліше өзгеруі мүмкін. Объектінің әрбір нақты көрінісі – оның класының инстанциясы болып табылады. Яғни, ол белгілі бір кластың мүшесі, айнымалылардың орнына нақты мәндерге ие. Бағдарламалаудан тыс контексте, мысалы, "ит" – бұл тип, ал сіздің итіңіз – сол типтің инстанциясы болып есептеледі. Сыныпқа негізделген бағдарламалауда объекттер конструкторлар деп аталатын кіші программалар арқылы сыныптардың инстанциялары ретінде жасалады және деструкторлар арқылы жойылады. Объект – кластың инстанциясы, өйткені ол кластың барлық дерек типтеріне (примитивтік және примитивтік емес), әдістеріне және т.б. қол жеткізе алады. Сондықтан, объекттерді сынып инстанциялары немесе сыныптық объектілер деп атауға болады. Объектіні инстанцияландыру құрылым деп аталады. Барлық сыныптарды инстанцияландыруға болмайды – абстрактілі сыныптар инстанцияланбайды, ал инстанцияландырыла алатын сыныптар нақты сыныптар деп аталады. Прототиптік бағдарламалауда инстанцияландыру прототип инстанциясын көшіру (клондау) арқылы жүзеге асырылады.

Сынып пен тип

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

Құрылыс және іске асыру

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

Құрылымы

Сыныпта деректер өрісінің сипаттамалары (немесе қасиеттері, өрістері, деректер мүшелері немесе атрибуттары) болады. Бұл әдетте бағдарлама орындалған кезде күй айнымалыларымен байланысты болатын өрістердің түрлері мен атаулары; бұл күй айнымалылары сыныпқа немесе сыныптың нақты мысалдарына жатады. Көптеген тілдерде сыныптың анықтамасы оның мысалдары қолданатын жадтың орналасуын анықтайды. Басқа да іске асырулар мүмкін: мысалы, Python-дағы объектілер ассоциативтік кілт-мәнді контейнерлерді пайдаланады. Кейбір бағдарламалау тілдері, мысалы Eiffel, сыныпты анықтаудың бір бөлігі ретінде инварианттарды көрсетуді қолдайды және оларды типтік жүйе арқылы сақтайды. Сыныптың инварианттарын сақтау үшін күйді инкапсуляциялау қажет.

Мінез-құлық

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

Кіші сыныптың анықтамасы

Концептуалды тұрғыдан алғанда, суперкласс – өзінің субкластарының супержиыны. Мысалы, жалпы сыныптық иерархияда суперкласс пен және болады, ал – бұл олардың субкласы болар еді. Бұл жиынтық теориясындағы барлық қосалқы жиынтық қатынастар, яғни барлық квадраттар тіктөртбұрыштар, бірақ барлық тіктөртбұрыштар квадраттар емес. Жалпы қателік – қатынастың бір бөлігін субкласпен шатастыру. Мысалы, автомобиль мен жүк көлігі екеуі де көлік құралдарының түрлері, сондықтан оларды көлік құралдары класының кіші кластары ретінде модельдеу дұрыс болар еді. Дегенмен, машинаның бөліктерін субклас ретінде модельдеу қате болар еді. Мысалы, автомобильде қозғалтқыш пен кузов болады, бірақ қозғалтқышты немесе кузовды автомобильдің кіші класы ретінде модельдеу орынсыз. Объектіге бағытталған модельдеуде мұндай қатынастар әдетте объектінің қасиеттері ретінде көрсетіледі. Бұл мысалда кластың деп аталатын қасиеті болады, ол мысалы, , , және т.б. сияқты объектілердің жиынтығын сақтау үшін типтелген болады. UML сияқты объектіні модельдеу тілдері «бөлігінің» әртүрлі аспектілерін және объектілердің кардиналдығын, кіріс және шығыс мәндеріне қойылатын шектеулер сияқты басқа да қатынастарды модельдеу мүмкіндіктерін қамтиды. Бұл ақпаратты әзірлеушілер құралдар объектінің негізгі деректерінің анықтамасынан басқа, мысалы, get және set әдістерінде қателерді тексеру сияқты қосымша кодты жасау үшін пайдалана алады. Объектілер кластарының жүйесін модельдеу және іске асыру кезінде маңызды сұрақ – кластың бір немесе бірнеше суперкластары болуы мүмкін бе. Нақты жиынтықтары бар нақты әлемде бірнеше жиынтықпен қиылыспайтын жиынтықты табу сирек. Алайда, Flavors және CLOS сияқты кейбір жүйелер бірнеше ата-ананы қолдауға мүмкіндік берсе де, орындалу уақытында оны іске асыру күрделілікті тудырады, ол көптеген объектіге бағытталған қауымдастықтар объектілер кластарын пайдалану мақсатына қайшы деп санайды. Бірнеше суперкласты қарастырғанда, хабарды өңдеуге қай сынып жауапты екенін түсіну қиын болуы мүмкін. Егер бұл мүмкіндікті салмақсыз қолданса, жүйелік күрделілік пен түсініксіздік туындауы мүмкін, одан құтылу үшін сыныптар жасалған. Smalltalk және Java сияқты қазіргі заманғы объектіге бағытталған тілдердің көпшілігі орындалу уақытында бір мұрагерлікті талап етеді. Бұл тілдер үшін бірнеше мұрагерлік модельдеу үшін пайдалы болуы мүмкін, бірақ іске асыру үшін емес. Алайда, семантикалық веб-қосымшаларының объектілерінде бірнеше суперкластар бар. Интернеттің өзгермелілігі осы деңгейдегі икемділікті талап етеді және оны қолдау үшін Web Ontology Language (OWL) сияқты технологиялық стандарттар жасалған. Осыған ұқсас мәселе – сыныптық иерархияны орындалу уақытында өзгертуге бола ма, жоқ па. Flavors, CLOS және Smalltalk сияқты тілдер бұл мүмкіндікті мета-объектілер протоколының бір бөлігі ретінде қолдайды. Сыныптардың өзі бірінші сыныптық объектілер болғандықтан, оларға тиісті хабарламаларды жіберіп, олардың құрылымын динамикалық түрде өзгертуге болады. Java және C++ сияқты күшті типтеуге көбірек назар аударатын басқа тілдер сыныптық иерархияны орындалу уақытында өзгертуге мүмкіндік бермейді. Семантикалық веб-объектілері сыныптарды орындалу уақытында өзгертуге қабілетті. Бұл негіздеме бірнеше суперкластарға рұқсат беруді негіздеуге ұқсас, өйткені Интернет өте динамикалық және икемді, сондықтан иерархияға динамикалық өзгерістер енгізу осы тұрақсыздықты басқару үшін қажет.

Сынып ұғымының ортогоналдығы және мұрагерлік

Сыныптарға негізделген тілдер мұрагерлікті қолдайтыны жиі болжалады, бірақ мұрагерлік – сыныптар ұғымының бөлшегі емес. Кейбір тілдер, көбінесе "объектіге бағытталған тілдер" деп аталады, сыныптарды қолдайды, бірақ мұрагерлікті қолдамайды. Объектіге бағытталған тілдердің мысалдарына Visual Basic-тің алдыңғы нұсқалары жатады.

Нысанға бағдарланған талдау шеңберінде

Объектіге бағытталған талдауда және Бірыңғай модельдеу тілінде (UML) екі сынып арасындағы қатынас сыныптардың немесе олардың сәйкес мысалдарының арасындағы өзара іс-қимылды білдіреді. Қатынастар бағытталған; мысалы, екі сынып арасындағы екі бағытты қатынас екі сыныптың да өзара қарым-қатынасын білетінін көрсетеді. Қатынастар олардың атауына немесе мақсатына сәйкес таңбалануы мүмкін. Қатынас рөлі – қатынастың соңы және тиісті сыныптың рөлін сипаттайды. Мысалы, "жазылушы" рөлі "Адам" сыныбының мысалдарының "Журнал" сыныбымен "жазылады" қатынасына қалай қатысатынын сипаттайды. Сондай-ақ, "Журнал" осы қатынаста "жазылған журнал" рөлін атқарады. Қатынас рөлінің көптігі қатынастың екінші сыныбының әрбір мысалына қанша мысал сәйкес келетінін сипаттайды. Көп қолданылатын көптіктер: "0 1", "1 1", "1 *" және "0 *", мұнда "*" – кез келген санды білдіреді. Көптеген объектіге бағытталған бағдарламалау тілдері бағдарламашыға қай сыныптар абстрактілі есептелетінін анықтауға мүмкіндік береді және оларды құруға рұқсат етпейді. Мысалы, Java, C# және PHP-де "abstract" түйін сөзі қолданылады. C++ тілінде абстрактілі сынып – бұл осы тілдің тиісті синтаксисімен берілген кем дегенде бір абстрактілі әдісі бар сынып (C++ терминологиясында таза виртуалды функция).

Жергілікті және ішкі

Кейбір тілдерде кластарды жаһандық ауқымнан басқа ауқымдарда жариялауға болады. Мұндай кластардың түрлі түрлері бар. Ішкі класс – басқа кластың ішінде анықталған класс. Ішкі класс пен оны қамтитын класс арасындағы қатынасты да класс қауымдастығының бір түрі ретінде қарастыруға болады. Ішкі класс әдетте қоршап тұрған кластың мысалдарымен байланыстырылмайды және оның қоршап тұрған класымен бірге құрылмайды. Тілге байланысты, классға оны қоршап тұрған кластың сыртынан сілтеме жасауға рұқсат етілуі мүмкін немесе рұқсат етілмеуі мүмкін. Бұған байланысты түсінік – ішкі типтер, сондай-ақ ішкі дерек типі немесе ұялас тип деп аталады, бұл ішкі кластар түсінігінің жалпылауы болып табылады. C++ – ішкі кластар мен ішкі типтерді (typedef жарияланымдары арқылы) қолдайтын тілдің мысалы. Тағы бір түрі – жергілікті класс, ол процедура немесе функция ішінде анықталған класс. Бұл класс атауына сілтемелерді класс жарияланған ауқыммен шектейді. Тілдің семантикалық ережелеріне байланысты, жергілікті классқа жергілікті емес классқа қарағанда қосымша шектеулер қойылуы мүмкін. Көпте қолданылатын шектеу – жергілікті класс әдістерінің қоршап тұрған функцияның жергілікті айнымалыларына қол жеткізуіне тыйым салу. Мысалы, C++ тілінде жергілікті класс өзінің қоршап тұрған функциясының ішінде жарияланған статикалық айнымалыларға сілтеме жасай алады, бірақ функцияның автоматты айнымалыларына қол жеткізе алмайды.

Метакластар

Метасыныптар – инстанциялары сыныптар болатын кластар. Метасынып кластар жиынтығының ортақ құрылымын сипаттайды және ерекше дизайн үлгісін іске асыруға немесе кластардың нақты түрлерін анықтауға мүмкіндік береді. Метасыныптар көбінесе құрылымдық шешімдерді сипаттау үшін қолданылады. Кейбір тілдерде, мысалы Python, Ruby немесе Smalltalk, кластар да объектілер болып табылады; демек, әрбір класс тілге енгізілген бірегей метасыныптың инстанциясы болып табылады. Common Lisp Object System (CLOS) осы кластар мен метасыныптарды іске асыру үшін метаобъектілік протоколдарды (MOP) ұсынады.

Кіші сыныптарға жатпайтын (немесе пломбаланған)

Кіші сыныптарға мұрагерлік етпейтін немесе жабық сыныптар бағдарламашыларға сыныптар мен сыныптардың иерархиясын жобалауға мүмкіндік береді, онда иерархияның белгілі бір деңгейінде одан әрі мұрагерлікке тыйым салынады (жеке сыныпты да кіші сыныптарға мұрагерлік етпейтін деп белгілеуге болады, бұл кез келген иерархияның құрылуына жол бермейді). Бұл абстрактты сыныптардан өзгеше, олар мұрагерлікке қатысты талап қояды, ынталандырады және оны қажет етеді. Кіші сыныптарға мұрагерлік етпейтін сыныптар автоматты түрде нақты болып табылады. Мұндай сыныптар C# немесе Java немесе PHP-де тиісті кілт сөздер арқылы жарияланады. Мысалы, Java-дағы `final` класы мұрагерлікке жатпайтын болып белгіленеді. Кіші сыныптарға мұрагерлік етпейтін сыныптар компиляторға (компиляцияланатын тілдерде) мұрагерлікке болатын сыныптарға қол жетімсіз оптимизацияларды жасауға мүмкіндік береді.

Ашық сынып

Ашық класс өзгертілуі мүмкін. Әдетте, атқарылатын бағдарламаны клиенттер өзгерте алмайды. Бағдарламашылар кейбір класс(тар)ды өзгерте алады, бірақ әдетте стандартты немесе кіріктірілген класс(тар)ды өзгерте алмайды. Ruby-де барлық класс(тар) ашық. Python-да класс(тар)ды орындау барысында жасауға болады, және барлығы кейіннен өзгертілуі мүмкін. Objective-C санаттары бағдарламашыға кез келген классқа әдістерді қосуға мүмкіндік береді, осы классды қайта компиляциялаудың қажеті болмайды, тіпті оның бастапқы кодына қол жеткізудің де қажеті жоқ.

Миксиндер

Кейбір тілдерде миксиндерге арнайы қолдау бар, бірақ көп мұрагерлік мүмкіндігі бар кез келген тілде миксин – бұл "бір түрдің бөлігі" қарым-қатынасын білдірмейтін класс. Миксиндер әдетте бірнеше классқа бірдей әдістерді қосу үшін қолданылады; мысалы, бір класс ортақ ата-анасы жоқ классқа енгізілген кезде белгілі бір әдісті қамтамасыз ете алады.

Ішінара

Тілдерде бұл мүмкіндік қолдау көрсетілсе, ішінара сынып – бірнеше бөлікке бөліне алатын сынып, бұл бөліктер бір ғана бастапқы код файлында немесе бірнеше файлда орналасуы мүмкін. Бұл бөліктер компиляция кезінде біріктіріледі, нәтижесінде компилятор шығысы толыққанды сыныпқа қарағанда ешқандай айырмашылықты көрсетпейді. Ішінара сыныптарды енгізудің басты себебі – визуалды дизайнерлер сияқты кодты автоматты түрде құратын бағдарламаларды жасауды жеңілдету болып табылады.

Атауы жоқ

Аталмаған сынып немесе анонимді сынып – анықталғанда есім немесе идентификатормен байланыстырылмаған сынып. Бұл атаулы және аталмаған функцияларға ұқсас.

Орындау уақытында бейнелеу

Деректер түрі ретінде сынып көбінесе компиляция уақытында құрылатын нәрсе деп есептеледі. Тіл немесе кітапхана сыныптар туралы орындалу уақытындағы ақпаратты ұсынатын прототиптік немесе фабрикалық метаобъектілерді де қолдауы мүмкін, тіпті рефлексивті бағдарламалау (рефлексия) мүмкіндіктеріне қол жеткізуді және орындалу уақытында деректер құрылымы форматтарын манипуляциялауға мүмкіндік беретін метадеректерді де ұсынуы мүмкін. Көптеген тілдер сыныптар туралы осындай орындалу уақыты ақпаратын сыныптан ажыратады, себебі бұл ақпарат орындалу кезінде қажет болмайды. Кейбір динамикалық тілдер орындалу уақыты мен компиляция уақыты конструкциялары арасында қатаң айырма жасамайды, сондықтан метаобъектілер мен сыныптарды ажырата алмайды. Мысалы, егер Адам Person класын көрсететін метаобъект болса, онда Person класының инстанцияларын Адам метаобъектісінің мүмкіндіктерін пайдалану арқылы жасауға болады.