# Օբյեկտ կողմնորոշված ծրագրավորում

| Օբյեկտ կողմնորոշված ծրագրավորում |
| --- |
| Տեսակ | ծրագրավորման պարադիգմ և computer science term? |
| Դաս | կառուցվածքային ծրագրավորում |

**Օբյեկտ-կողմնորոշված ծրագրավորում (ՕԿԾ)** (անգլ.՝ object-oriented programming (OOP)), ծրագրավորման մոտեցում, որի գաղափարական հիմք են հանդիսանում Օբյեկտ և Դաս (class) հասկացությունները։

Օբյեկտի հատկանիշներից մեկն այն է, որ իր սեփական ընթացակարգերը հասանելիություն ունեն և հաճախ կարող են փոփոխել իր իսկ տվյալների դաշտերը (օբյեկտները ունեն ``this`` կամ ``self`` հասկացությունները)։ ՕԿԾ֊ում համակարգչային ծրագրերը կազմված են օբյեկտներից, որոնք գտնվում են իրար հետ փոխազդեցության մեջ։

Առավել լայնորեն օգագործվող ծրագրավորման լեզուներից շատերը (օր․՝ C++, Java, Python) բազմապարադիգմ են և այս կամ այն չափով ապահովում են օբյեկտ-կողմնորոշված ծրագրավորման հնարավորություն, սովորաբար իմպերատիվ և պրոցեդուրային ծրագրավորման համադրությամբ։ Կարևոր օբյեկտ-կողմնորոշված լեզուներից են
Ջավա,
C++,
C#,
Python,
R,
PHP,
Visual Basic .NET,
ՋավաՍկրիպտ,
Ruby,
Perl,
Object Pascal,
Objective-C,
Dart,
Swift,
Scala,
Kotlin,
Common Lisp,
MATLAB,
և
Smalltalk։

## Պատմություն

ՕԿԾ-ն առաջացել է պրոցեդուրային ծրագրավորման գաղափարախոսության զարգացման արդյունքում, որտեղ տվյալները, և դրանք մշակող ֆունկցիաները ձևականորեն կապված չեն։

Առաջին ծրագրավորման լեզուն, որտեղ ներկայացված են եղել օբյեկտ կողմնորոշված ծրագրավորման սկզբունքները՝ Սիմուլան(simula) էր։ Իր հայտնվելու պահին (1967 թ.) այն առաջարկում էր հեղափոխական գաղափարներ՝ օբյեկտ, դաս, վիրտուալ մեթոդ և այլն։ Սակայն այս ամենը այնքան էլ մեծ իրարանցմամբ չընդուվեց ժամանակին։ Ամեն դեպքում Սիմուլայի գաղափարների մեծ մասը զարգացվեցին Ալան Քեյի և Դեն Ինգալսի կողմից՝ Սմոլթոկ(Smalltalk) լեզվի մեջ։ Վերջինս էլ դարձավ առաջին լայն տարածում գտած օբյեկտ-կողմնորոշված ծրագրավորման լեզուն։

Ներկայումս օբյեկտ-կողմնորոշված ծրագրավորման լեզուները ամենատարածվածն են աշխարհում, սակայն, օրինակ՝ օպերացիոն համակարգերի ծրագրավորման ոլորտում մինչև հիմա օգտագործվում են պրոցեդուրային մոտեցման սկզբունքները, որոնց կրիչն է լայն տարածում գտած Սի լեզուն։

## Հիմնական սկզբունքներ

Աբստրակցիա (Վերացարկում) ։ Աբստրակցիա - Սա օբյեկտի կարևոր հատկությունների առանձնացումն է, հաշվի չառնելով երկրորդականները։
Ինկապսուլյացիա։ Սա համակարգի հատկություն է, որը թույլ է տալիս միավորել դասի տվյալները և դրանց հետ աշխատող մեթոդները՝ միաժամանակ անտեսանելի պահելով իրականացման առանձնահատկությունները։
Ժառանգում ։ Սա համակարգի հատկություն է, որը թույլ է տալիս նկարագրել նոր դաս՝ մեկ այլ դասի հիմքի վրա, ֆունկցիոնալության մասնակի կամ լրիվ փոխառնմամբ։ Այն դասը, որից կատարվում է ժառանգում կոչվում է բազային կամ ծնող դաս։ Իսկ նոր դասը կոչվում է ածանցյալ կամ ժառանգ դաս։
Պոլիմորֆիզմ (Բազմաձևություն)։ Սա համակարգի հատկություն է, որը թույլ է տալիս միանման ինտերֆեյսով օբյեկտներ ՝ առանց ներքին կառուցվածքի ու տիպի մասին պատկերացում ունենալու։
Դաս ։ Դասը հանդիսանում է ելակետային կոդի տերմինալոգիայով նկարագրված, դեռ գոյություն չունեցող օբյեկտի մոդել։ Փաստացի այն նկարագրում է օբյեկտի կառուցվածքը, հանդիսանալով օբյեկտի ՛՛գծագիր՛՛։
Օբյեկտ ։ Հաշվողական համակարգի հասցեային տիրույթի իմաստային հատված է, որը առաջանում է դասի օրինակ(օբյեկտ) ստեղծելիս։
Նախատիպ ։ Նախատիպը օբյեկտ-օրինակ է, որի օրինակով ու նմանությամբ ստեղծվում են ուրիշ օբյեկտներ։
## ՕԿԾ սահմանումը և հիմնական հայեցակարգերը

### ՕԿԾ սահմանումը

ՕԿԾ-ի հիմքում ընկած է օբյեկտ հասկացությունը։ Օբյեկտը դա մի ՛՛սև արկղ՛՛ է, որին կարելի է ուղարկել հաղորդագրություններ և որը կարող է այդ հաղորդագրություններն արձագանքել՝ օգտագործելով իր տվյալները։ Օբյեկտի տվյալները ծածկված(փակված) են մնացած ծրագրի համար, սա կոչվում է Ինկապսուլյացիա։
Ինկապսուլյացիայի առկայությունը բավարար է լեզուն օբյեկտային անվանելու համար, բայց օբյեկտ-կողմնորոշված ծրագրավորման առավելությունները զգալու համար անհրաժեշտ է, որ լեզուն ապահովի նաև ժառանգում և պոլիմորֆիզմ։
Չնայած ՕԿԾ-ի ավելի քան քառասունամյա պատմությանը, մինչ այսօր չկա ՕԿԾ-ի կոնկրետ սահմանում, և տարբեր գրքերում կարելի է հանդիպել տարբեր սահմանումների։

### Հիմնական հայեցակարգերը

ՕԿԾ-ում դաս հասկացության առաջացումը պայմանավորված է նման վարքագծով բազմաթիվ օբյեկտներ ունենալու ցանկությամբ։ Այստեղ դասը տվյալների աբստրակտ տիպ է, որը ստեղծվում է ծրագրավորողի կողմից։ Այս տեսանկյունից դիտելիս՝ օբյեկտները այդ աբստրակտ տիպի արժեքներ են, իսկ դասի սահմանումը տալիս է դրանց տվյալների ներքին կառուցվածքը և այդ տվյալների հետ կատարվելիք գործողությունները։ Եթե մի քանի դաս ունեն համանման վարքագիծ, ապա տրամաբանական է կոդ չկրկնելու ցանկությունը՝ ինչը իրականցվում է ժառանգման միջոցով։ Ժառանգման սկզբունքն այն է, որ կարիք չկա սահմանել մի քանի միանման դաս, երբ ուղղակի կարելի է խմբավորել այդ դասերի ընդհանուր մասերը մի ծնող դասի մեջ և այնուհետև ժառանգել մնացածը այդ դասից՝ դրանց սահմանման մեջ նշելով միայն ծնողի նկատմամբ տարբերությունները։

Տարբեր դասերի օյեկտների համատեղ օգտագործման անհրաժեշտությունը բերում է պոլիմորֆիզմ գաղափարի ներդրմանը։ Սա հնարավորություն է տալիս տարբեր դասերի օբյեկտները գրանցել նույն տիպի փոփոխականների մեջ։ Այս պայմաններում, հաղորդագրություն ուղարկող օբյեկտը իրականում կարող է ինֆորմացիա չունենալ ընդունողի դասի մասին, այսինքն նույն տիպի փոփոխականներին (որոնք պարունակում են տարբեր դասերի օբյեկտներ) ուղարկված հաղորդագրությունը կառաջացնի տարբեր ռեակցիաներ։

Շատ ժամանակակից լեզուներում հաղորդագություն ուղակելու տակ նկատի ունենք մեթոդի կանչը՝ օբյեկտները ունեն դրսից հասանելի մեթոդներ և դրանց կանչերով ապահովվում են օբյեկտների փոխազդեցությունները։ Այս լեզուներից են C++, Java, Oberon-2...

## Ծրագրերի նախագծման օբյեկտ-կողմնորոշված մոտեցում

ՕԿԾ-ն կողմնորոշված է՝ ծրագրավորողների թիմերի կողմից, խոշոր ծրագրային համակարգեր նախագծելու վրա։ Այս դեպքում ընդհանուր համակարգի և առանձին կոմպոնենտների ստեղծումը, այնուհետև դրանց միավորումը կարող է կատարվել տարբեր մարդկանց կողմից։ Շատ հաճախ պրոյեկտի մասին ամեն ինչ ոչ-ոք չի իմանում։

Օբյեկտ-կողմնորոշված նախագծման էությունն է երկու հիմնական հարցի պատասխանելու մեջ՝

* Ի՞նչ մասերից է բաղկացած համակարգը։
* Ինչի՞ համար է պատասխանատու այդ մասերից յուրաքանչյուրը։

Մասերի բաժանումը կատարվում է այնպես, որ այդ մասերից յուրաքանչյուրը ունենա մինիմալ չափ, ճշգրիտ սահմանված պարտականություններ և հնարավորինս քիչ փոխազդի մնացած ծրագրի հետ։

Կոմպոնենտների առանձնացումից և դրանց միջև փոխահարաբերությունների (ինտերֆեյս) սահմանումից հետո, դրանցից յուրաքանչյուրը կարելի է ծրագրավորել մնացածից գրեթե անկախ (պահպանելով որոշակի տեխնոլոգիական կարգապահություն)։

Մեծ կարևորություն ունի դասերի հիերարխիայի ճիշտ կառուցումը։ ՕԿԾ-մոտեցումներով ստեղծված մեծ համակարգերի հայտնի խնդիրներից մեկը՝ դա այսպես կոչված բազային դասի փխրունության խնդիրն է։ Խնդիրն այն է, որ նախագծման հետագա փուլերում՝ երբ դասերի հիերարխիան արդեն կառուցված է և դրա հիմքի վրա արդեն գրվել է բավականին մեծ քանակությամբ կոդ, բազային դասի մեջ փոփոխություն մտցնելը դառնում է գրեթե անհնար։ Քանի որ բազային դասը նախագծողին հայտնի չէ, թէ իր նախագծած դասի ժառանգներում այդ դասի պահվածքի փոփոխությունը ինչի է կարող հանգեցնել։

## Նախագծման ձևանմուշներ

Օբյեկտ-կողմնորոշված նախագծման խնդիրների լուծման բազմաթիվ մոտեցումներ կան։ Դրանցից ամենատարածվածը հայտնի է նախագծման ձևանմուշներ անունով։ Լայն կիրառության մեջ «նախագծման ձևանմուշներ» տերմինը կարող է վերաբերվել ծրագրային ապահովման նախագծման ժամանակ սովորաբար առաջացող, ընդհանուր, կրկնվող ցանկացած խնդիրների լուծման ձևանմուշներին։ Այս սովորաբար առաջացող խնդիրներից որոշները ունեն մասնավորապես օբյեկտ-կողմնորոշված մշակմանը հատուկ ենթատեքստ և լուծումներ։

### Չորսի ավազակախմբի նախագծման ձևանմուշներ

*Նախագծման մոդելներ. Օբեյկտ կողմնորոշված ծրագրավորման մեջ բազմակի օգտագործման տարրեր*
֊ը 1994թ.-ին լույս տեսած ազդեցիկ գիրք է գրված Էրիխ Գամմայի, Ռիչարդ Հելմի, Ռալֆ Ջոնսոնի և Ջոն Վլիսիդեսի կողմից, որոնց հաճախակի կոչում են "Gang of Four" (հայերեն՝ Չորսի ավազակախմումբ)։ Գրքում նկարագրված են ծրագրավորման հաճախ հանդիպող 23 խնդիրներ և դրանց լուծման ձևանմուշները։
Գիրքը նկարագրում է հետևյալ ձևանմուշները․

* *Ստեղծող ձևանմուշներ* (5)․ Ֆաբրիկային մեթոդ, Աբստրակտ ֆաբրիկա, Եզակի օգտագործման, Կառուցող, Նախատիպ
* *Կառուցվածքային ձևանմուշներ* (7)․ Ադապտեր, Կամուրջ, Կազմող, Դեկորատոր, Ճակատ, Հարմարեցնող, Պրոքսի
* *Վարքագծային ձևանմուշներ* (11). Պարտականությունների շղթա, Հրաման, Թարգմանիչ, Իտերատոր, Միջնորդ, Պահպանող, Դիտորդ, Վիճակ, Մարտավարություն, Կաղապարային մեթոդ, Այցելող

### SOLID և GRASP ուղեցույցներ

SOLID֊ը ծրագրավորման 5 գործելակերպերի մնեմոնիկ հապավում է․

* *Միակ պատասխանատվության սկզբունք*․ Յուրաքանչյուր դաս պետք է լուծի միայն մեկ խնդիր։ Դասը պետք է պատասխանատու լինի միայն մեկ խնդրի լուծման համար։
* *Բաց-փակ սկզբունք*. Ծրագրային սուբյեկտները (դասեր, մոդուլներ, ֆունկցիաներ) պետք է բաց լինեն ընդլայնման համար, փակ լինեն փոփոխությունների համար։
* *Լիսկովի փոխարինման սկզբունք*. Անհրաժեշտ է, որ ժառանգ դասերը կարողանան փոխարինել ծնող դասերին։ Այս սկզբունքի նպատակը կայանում է նրանում, որ ժառանգ դասերը կարող են օգտագործվել ծնող դասերի փոխարեն, որոնցից նրանք ձևավորվում են՝ առանց խափանելու ծրագիրը։
* *Ինտերֆեյսի առանձնացման սկզբունք*. Ծրագրային ապահովման սուբյեկտները չպետք է կախված լինեն այն մեթոդներից, որոնք նրանք չեն օգտագործում։
* *Կախվածության ինվերսիայի սկզբունք*. Կախվածության առարկան պետք է լինի աբստրակցիա, այլ ոչ թե կոնկրետ ինչ-որ բան.

1. Վերին մակարդակի մոդուլները չպետք է կախված լինեն ցածր մակարդակի մոդուլներից։ Երկուսն էլ պետք է կախված լինեն աբստրակցիաներից։
2. Աբստրակցիաները չպետք է կախված լինեն դետալներից։ Դետալները պետք է կախված լինեն աբստրակցիաներից։

## Ծանոթագրություններ

## Տես նաև

* Քրիսթեն Նյուգոր
* Օլե-Յոհան Դալ

## Արտաքին հղումներ

* Օբյեկտ կողմնորոշված ծրագրավորման դասընթաց