Аб’е́ктна-арыентава́нае праграмава́ньне (ААП) — парадыгма праграмаваньня, дзе ў якасьці асноўных элемэнтаў для стварэньня праграмаў выкарыстоўваюцца асобныя «аб’екты», якія ўтрымліваюць дадзеныя й код для іхнай апрацоўкі. У ёй выкарыстоўваюцца тэхналёгіі папярэдніх парадыгмаў, уключаючы спадкаваньне, модульнасьць, палімарфізм і інкапсуляцыю. Нягледзячы на тое, што гэтая парадыгма зьявілася ў 1960-х, яна ня мела шырокага ўжываньня да 1990-х. На сёньняшні дзень існуе вялікая колькасьць моваў праграмаваньня, якія падтрымліваюць гэтую парадыгму.
Аб’ектна-арыентаванае праграмаваньне сягае сваімі каранямі ў 1960-я — час, на які прыйшоўся крызіс праграмнага забесьпячэньня, які заключаўся ў тым, што ў той час паўстала пытаньне: апаратнае й праграмнае забесьпячэньне робіцца ўсё больш складаным, як пры гэтым можна захаваць якасьць праграмаў? Гэтая праблема разьвязваецца пры дапамозе аб’ектна-арыентаванага праграмаваньня ўвядзеньнем модульнасьці ў праграмнае забесьпячэньне[1].
Першай мовай праграмаваньня, дзе зьявіліся канцэпцыі, на якіх грунтуецца аб’ектна-арыентаванае праграмаваньне (аб’екты, клясы, падклясы, віртуальныя мэтады, сапраграмы, прыбіраньне сьмецьця й мадэляваньне асобных падзеяў), была Simula як пашырэньне мовы Algol. Першай мовай праграмаваньня, якая атрымала назву «аб’ектна-арыентаваная», была Smalltalk.
Аб’ектна-арыентаванае праграмаваньне можна таксама разглядаць як набор аб’ектаў, якія ўзаемадзейнічаюць між сабой, што пярэчыць традыцыйным поглядам, калі праграма разглядаецца як сьпіс інструкцыяў для кампутара. У аб’ектна-арыентаваным праграмаваньні любы аб’ект здольны прымаць паведамленьні, апрацоўваць дадзеныя й адпраўляць паведамленьні іншым аб’ектам. Кожны аб’ект можа разглядацца як незалежная маленькая машына з пэўнай роляй або абавязкамі[2].
Тым ня менш, на сёньняшні дзень няма дасьледваньняў, якія б даказвалі, што аб’ектна-арыентаванае праграмаваньне аб’ектыўна лепшае, чым іншыя падыходы.
Дэбара Армстранґ (анг. Deborah J. Armstrong) правяла дасьледваньне кампутарнай літаратуры[3], якая выдавалася цягам апошніх 40 гадоў. У выніку гэтага дасьледваньня атрымалася вылучыць фундамэнтальныя паняткі, якія выкарыстоўваюцца ў пераважнай большасьці азначэньняў аб’ектна-арыентаванага праграмаваньня. Да іх належаць:
Сабака
можа характарызавацца рысамі, якімі валодаюць усе сабакі: парода, колер футра, здольнасьць гаўкаць. Клясы дадаюць модульнасьць і структураванасьць у аб’ектна-арыентаваную праграму. Як правіла, кляса мусіць быць зразумелый для непраграмістаў, якія маюць пэўнае ўяўленьне пра прадметную вобласьць, што ў сваю чаргу азначае, што кляса мусіць мець значэньне ў кантэксьце. Але таксама код рэалізацыі клясы мусіць быць у пэўнай ступені самадастатковым. Уласьцівасьці і мэтады клясы разам называюцца ейнымі членамі.Сабака
адпавядае ўсім сабакам шляхам апісаньня іх супольных рысаў; аб’ект Лэсьсі
— гэта пэўны сабака, з пэўным варыянтам значэньняў характарыстык. Сабака
мае футра; Лэсьсі
мае карычнева-белае футра. На жаргоне праграмістаў аб’ект Лэсьсі
зьяўляецца экзэмплярам клясы Сабака
. Мноства значэньняў атрыбутаў пэўнай клясы называецца станам клясы.Лэсьсі
— сабака, яна мае здольнасьць гаўкаць. Таму гаўкаць() зьяўляецца адным з мэтадаў аб’екту Лэсьсі
. Ён можа мець і іншыя мэтады, напрыклад сядзець()
або есьці()
. У праграме выкарыстаньне мэтада павінна ўплываць толькі на адзін аб’ект; усе Сабака
могуць гаўкаць, але трэба, каб гаўкаў толькі адзін пэўны сабака.Сабака
можа мець падклясы Кольлі
, Чыхуахуа
й ЁркшырскіТэр'ер
. У гэтым выпадку Лэсьсі
будзе экзэмплярам падклясы Кольлі
. Падклясы спадкуюць атрыбуты й паводзіны сваіх бацькоўскіх клясаў, а таксама могуць мець свае ўласныя. Няхай кляса Сабака
мае мэтад гаўкаць()
і ўласьцівасьць колерФутра
. Кожная з гэтых падклясаў (Кольлі
, Чыхуахуа
й ЁркшырскіТэр'ер
) будзе спадкаваць гэтыя члены, а гэта азначае, што код для іх праграмісту трэба напісаць толькі адзін раз. Кожная падкляса можа зьмяніць свае спадкаваныя прыкметы. Напрыклад, кляса Кольлі
можа вызначыць, што значэньнем па змоўчаньні ўласьцівасьці колерФутра
будзе карычнева-белы. Чыхуахуа
можа вызначыць мэтад гаўкаць()
як пранізьлівы па змоўчаньні. Падклясы могуць таксама дадаваць новых членаў. Напрыклад, падкляса Чыхуахуа
можа дадаць мэтад дрыжэць()
. Такім чынам, асобны экзэмпляр чыхуахуа можа выкарыстоўваць гаўкаць()
прынізьліва ад падклясы Чыхуахуа
, які ў сваю чаргу спадкуе звычайнае гаўкаць()
ад Сабака
. Аб’ект Чыхуахуа
таксама будзе мець мэтад дрыжэць()
, але ў Лэсьсі
такога мэтада ня будзе, бо Лэсьсі
— гэта Кольлі
, а не Чыхуахуа
. Спадкаваньне ўводзіць адносіны «ёсьць»: Лэсьсі
ёсьць Кольлі
, Кольлі
ёсьць Сабака
. Таму Лэсьсі
спадкуе ўласьцівасьці абедзьвюх клясаў: Кольлі
й Сабака
. Калі аб’ект ці кляса спадкуе ўласьцівасьці ад больш чым адной продкавай клясы, і ніводны з гэтых продкаў не зьяўляецца продкам іншага, тады гэта называецца множным спадкаваньнем. Напрыклад, могуць быць вызначаныя незалежныя клясы Сабака
й Кот
, але зь іх будзе створаны аб’ект Хімэра
, які спадкуе паводзіны й сабакі, і ката. Але гэтая магчымасьць падтрымліваецца не заўсёды, бо можа быць дастаткова цяжка рэалізаваць і пасьля выкарыстоўваць тое, што атрымаецца.Сабака
мае мэтад гаўкаць()
. Рэалізацыя гэтага мэтада апісвае, як мусіць адбывацца гаўканьне (напрыклад, спачатку удыхнуць()
, а пасьля выдыхнуць()
на выбранай частаце й гучнасьці). Пятро, гаспадар Лэсьсі
, не павінен ведаць, як яна гаўкае. Інкапсуляцыя дасягаецца шляхам пазначэньня, як клясы могуць зьвяртацца да членаў аб’екта. Як вынік, кожны аб’ект прадастаўляе любой клясе пэўны інтэрфэйс — члены клясы даступныя іншым клясам. Інкапсуляцыя патрэбная для таго, каб прадухіліць выкарыстаньне кліентамі інтэрфэйсу тых частак, якія, хутчэй за ўсё, будуць зьмененыя. Гэта дазволіць палегчыць унясеньне зьменаў, бо для гэтага ня будзе патрэбы зьмяняць карыстальнікаў інтэрфэйсу. Напрыклад, інтэрфэйс можа гарантаваць, што шчаняты могуць дадавацца да аб’ектаў клясы Сабака
толькі кодам самой клясы. Часта члены клясы пазначаюцца як агульны (анг. public), абаронены (анг. protected) й асабісты (анг. private), вызначаючы, даступныя яны ўсім клясам, падклясам ці толькі клясе, у якой яны вызначаныя адпаведна. Пэўныя мовы праграмаваньня ідуць яшчэ далей: Java выкарыстоўвае ключавое слова protected для абмежаваньне доступу, які будзе дазволены таксама з клясаў з таго ж пакета, C# і VB.NET абмяжоўваюць выкарыстаньне пэўных членаў толькі клясамі з той жа зборкі выкарыстоўваючы ключавыя словы internal (C#) або Friend (VB.NET), а Eiffel і C++ увогуле дазваляюць пазначаць, якія клясы могуць атрымаць доступ да любога члена.Сабака
Лэсьсі
большую частку часу можа разглядацца як Сабака
, калі патрэбна атрымаць інфармацыю, спэцыфічную для сабак пароды кольлі, — як Кольлі
і як Жывёла
(магчыма, бацькоўская кляса для клясы Сабака
) для пераліку хатніх жывёлаў Пятра.Сабака
атрымлівае каманду голас()
, то ў адказ можна атрымаць Гаў
; а калі Сьвіньня
атрымлівае каманду голас()
, то ў адказ можна атрымаць Рох
. Гэтыя паводзіны й чакаюцца, таму што Сьвіньня
мае канкрэтную рэалізацыю мэтада голас()
. Тое самае адбываецца з клясай Сабака
. Улічваючы, што абодва зь іх спадкуюць голас()
ад Жывёла
, гэта прыклад перавызначальнага палімарфізму.Ня ўсе з вышэй пералічаных канцэпцыяў прысутнічаюць ва ўсіх аб’ектна-арыентаваных мовах праграмаваньня. Напрыклад, у прататыпна-арыентаваным праграмаваньні не выкарыстоўваюцца клясы. Як вынік, для вызначэньня паняткаў аб’ект і экзэмпляр выкарыстоўваецца значна адрозная, але падобная тэрміналёгія, хаця ў гэтых мовах і адсутнічаюць аб’екты.
Рэалізацыйны падыход заключаецца ў тым, што кожны аб’ект у аб’ектыўна-арыентаваным праграмаваньні мае свой тып (клясу). Кляса ў сваю чаргу зьяўляецца пэўным тыпам дадзеных, які ўтрымлівае ў сабе:
Кожны аб’ект зьяўляецца экзэмплярам пэўнай клясы. Адна кляса адрозьніваецца ад іншай імем і, звычайна, наборам інтэрфэйсаў, якія падтрымліваюцца. Інтэрфэйсы, у сваю чаргу, зьяўляюцца наборам паведамленьняў, якія можна адпраўляць аб’екту.