Нысанды-бағдарланған программалаудың негізгі принциптері

Нысанды бағдарланған программалау – программалаудың құрылымдық программалаумен салыстырғанда, әлдеқайда жетілдірілген түрі. Программалау ғылымының дамуының белгілі кезеңінде күрделі есептің шешімін жеңілдету үшін оны қарапайым ішкі есептерге бөлу туралы ұғым қалыптасты.

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

Модуль – Turbo Pascal-дің тұрақтылар, мәліметтер типі, айнымалылар, сол сияқты процедуралар мен функциялар сипатталатын компиляцияланатын файлдары.

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

Ескерту! НБП қарапайым есептеулерді орындайтын программалар үшін арналмаған. Мұндай жағдайда НБП тәсілдерін қолдансақ, программа тілдік конструкциялармен артық жүктеледі.

НБП негізінде 3 негізгі принцип жатыр. Олар: инкапсуляция, мұрагерлеу(наследование) және полиморфизм.

ИНКАПСУЛЯЦИЯ

Нысанды сипаттау барлық басқа типтер сияқты сипаттау бөлімінде болу қажет. Нысан қамтитын мәліметтер нысан өрістері деп аталады. Қарапайым нысандық типтің сипаттамасы жазбалар сипаттамасына өте ұқсас, тек record резервтелген сөзінің орнына object сөзі қолданылады.

Type

Dot = object

a, b:integer;

end;

Бұл 2 өрістен тұратын нысандық тип, ол экранда a,b кординаталары бар нүкте болып табылады. Өріс түрінде берілген мәліметтерден басқа нысан осы өрістерге мүмкін әрекеттерді сипаттайтын ішкі программмалардан тұруы мүмкін. Мұндай ішкі программалар әдістер деп аталады. Әдіс нысан өрістеріне қатынас жасай отырып, оған параметр ретінде берілуді қажет етпейді. Өзінде тек қана өрістерді ғана емес, сонымен қатар осы өрістерге мүмкін әрекеттердің сипаттамасын қамтитын нысанның қасиетін инкапсуляция деп атайды. Мұнда нысанның сипатталуында тек ішкі программаның тақырыптары болады, ал әрбір ішкі программаның денесі жеке көрсетіледі. Алдыңғы мысалдағы Dot типін қажетті әдістермен толықтырайық.

Type

Dot = object

a, b:integer;

procedure Init(x,y:integer);

procedure Show;

procedure Hide;

procedure Move(Da, Db:integer);

end;

{- — — — — — — — — — — — -}

Procedure Dot.Init;

Begin

a:=x; b:=y;

end;

{- — — — — — — — — — — — -}

Procedure Dot.Show;

Begin

PutPixel (a,b,white);

end;

{- — — — — — — — — — — — -}

Procedure Dot.Hide;

Begin

PutPixel (a,b,black);

end;

{- — — — — — — — — — — — -}

Procedure Dot.Move;

Begin

Hide;

a:=a+Da; b:=b+Db;

Show;

End.

Бұл мысалда нысан 4 әдістен тұрады. Init әдісі объектіні инициализациялайды, яғни нүктеге бастапқы мән береді. Show және Hide әдістері экрандағы нүктені «жандырады» және «сөндіреді».Move әдісі экрандағы нүктенің орнын ауыстырады. Нысандық тип жарияланғаннан кейін осы типтік айнымалыларды жасауға болады немесе НБП терминологиясы бойынша нысан экземплярын жасаймыз. Олар айнымалыларды сипаттау бөлімінде жарияланатын статикалық айнымалылар, New стандартты процедура арқылы жасалған динамикалық айнымалылар болуы мүмкін.

Var

Dot1: Dot;

Мұнда Dot типіне жататын Dot1 айнымалысы жарияланған. Нысан экземпляры жасалынғаннан кейін оның өрістерінен әдістерге қатынас жасай аламыз. Нысан өрісіне қандай-да бір стандартты ішкі программаны қолдану үшін оның құрылымдық атауын қолдану жеткілікті – нысан идентификаторы мен нүкте арқылы ажыратылған өріс идентификаторын көрсету.

НБП-да нысан өрістерімен жұмыс істеу кезінде тек оның әдістері қолданылады.

Dot1.Init(100,100);

Dot1.Show;

Dot1.Move(50,50);

Жазбаларға қолданылатын сияқты, объектілерге де with операторын қолдануға болады.

With Dot1 do begin

Init (100,100);

Show;

Move (50,50);

End.

Жоғарыда көрсетілген операторлар тізбегі бірдей. Төменде жоғарыда қарастырылған мысалдардың толық программасы көрсетілген. Бұл программа экранда нүктені бейнелейді және де бейнеленген нүктені бағдарша-пернелердің көмегімен 4 бағытта жылжытуға болады.

Program ObjDot;

Uses crt, graph;

Type

Dot=object

a,b:integer;

procedure Init(x,y:integer);

procedure Show;

procedure Hide;

procedure Move(Da, Db:integer);

end;

{————————————-}

Procedure Dot.Init;

Begin

a:=x; b:=y;

end;

{————————————-}

Procedure Dot.Show;

Begin

PutPixel (a,b,white);

End;

{—————————————}

Procedure Dot.Hide;

Begin

PutPixel(a,b,0);

End;

{—————————————}

Procedure Dot.Move;

Begin

Hide;

a:=a+Da; b:=b+Db;

Show;

End;

{—————————————}

Var

i,j,k,Err:integer;

a:char;

Dot1:Dot;

{————————————-}

Begin

i:=detect;

InitGraph(i,j,’ ‘);

Err:=GraphResult;

If Err<>grOK then

Writeln(GraphErrorMsg(Err))

Else

begin

Dot1.Init(GetMaxX div 2, GetMaxY div 2);

Dot1.Show;

While KeyPressed do a:=ReadKey;

Repeat

Begin

a:=ReadKey;

case ord(a) of

72:Dot1.Move(0,-5);

80:Dot1.Move(0,5);

77:Dot1.Move(5,0);

75:Dot1.Move(-5,0)

End

End;

Until a=chr(27)

End

End.

Программада Dot нысаны жарияланды. Оның 2 өрісі, 4 әдісі бар. Ары қарай Dot1 нысан экземпляры басқа айнымалылар сияқты жарияланды. Программа денесі графикалық режимге өтуді жүзеге асыратын оператордан басталады. Содан кейін Repeat операторы белгілі пернені басуды анықтайды.Case операторы 4 нұсқаудан тұрады, олар 4 бағдарша пернелеріне сәйкес келеді. Нұсқалардың әрбіреуі нақты параметрлері бар Move әдісін шақырады, бұл әдіс нүктені қажетті бағытта 5 пиксельге жылжытады. Repeat операторы арқылы ұйымдастырылған циклдың тоқтау шарты 27 Scan кодын беретін пернесінің басылуы болып табылады.

МҰРАГЕРЛЕУ

Айталық, нүкте объектісінен басқа шеңбер объектісі қатысатын программа құрайық. Әрине бұл жаңа типтің сипатталуын Dot типі сияқты басынан бастауға болады. Дегенмен, бұл жаңа шеңбер – типтің Dot типімен ортақ өрістері және әдістері бар. Яғни, шеңбер де нүкте сияқты оның центрін анықтайтын a,b координатасымен сипатталады. Дегенмен, құрылатын нысанға шеңбердің радиусын беретін өріс қосу керек. Ал әдістерге келетін болсақ, жаңа Ring типіне Move әдісі қолданылады, нүктенің орнын ауыстыруы мен экранда шеңбердің ауысуы бірдей жүзеге асады. Ал Init, Show және Hide әдістерін жаңадан жасауға тура келеді. Сонымен, жаңа Ring типі Dot типінің кейбір әдістерін қайталайды. Ендеше бар типтің негізінде оған жаңа өрістер мен әдістерді қоса отырып, жаңа тип жасауға бола ма? Бұл мұрагерлеу деп аталатын объектілік типтердің қасиеттерінің арқасында жүзеге асады. Мәселе мұрагерлеу туралы болғандықтан генеологиялық терминологияға сәйкес жаңа нысанды жасауға негіз болатын бар типті ата-бабасы немесе ата-аналық тип деп атайды. Ал құрылатын объектіні ұрпағы деп атайды. Ұрпақ автоматты түрде өзінің ата-бабасының барлық өрістері мен әдістерін мұраға алады. Мұрагерлеу қасиеті НБП-да қолданылады. Оның арқасында бар нысанның негізінде көптеген жаңа нысандар құруға болады. Осы нысандарға негіздей отырып, нысандарды көптеп кұра беруге болады және де әрбір нысанның көп ұрпағы болуы мүмкін, бірақ оның ата-бабасы біреу ғана болады. Ал енді Dot және Ring типтеріне оралайық. Ұрпақ типінің сипаттауында ата-аналық типтің атауы көрсетілуі керек.

Type

Ring=object(Dot);

Rad=integer;

End;

Ring типінің сипатталуында шеңбердің радиусын анықтайтын Rad өрісі бар. Бұл өріс dot типінде болмаған және де Ring типі өзінің ата-бабасының өрістерін мұраға алады (нүкте координаталары a,b). Егер Ring типінің сипаттамасын сәйкес әдістермен толықтырсақ, төмендегідей болады:

Ring=object(Dot);

Rad:integer;

Procedure Init(x,y,r:integer );

Procedure Show;

Procedure Hide;

End;

{————————}

Procedure Ring.Init;

Begin

a:=x; b:=y; Rad:=r;

end;

{————————}

Procedure Ring.Show;

Begin

SetColor (white);

Circle (a,b,Rad);

End;

{————————}

Procedure Ring.Hide;

Begin

SetColor (black);

Circle(a,b,Rad);

End;

Осы жерден ұрпақ-нысанның әдістері ата-ана объектісінің бірдей атаулы әдістермен алмастырылатынын көруге болады. Басқа сөзбен айтқанда, егер Ring.Move әдісіне қатынас жасалса, жүйе алдымен Ring объектісінің сипаттамасында осындай атаудың бар-жоқтығын анықтайды. Егер бар болса, осы жаңа әдіс қолданылады. Егер жоқ болса, ата-бабасынан мұраға алған әдісті қолданылады.

Ескерту! Тек әдістерді ғана қайта анықтауға болады. Ал ұрпақ-нысанындағы өріс атаулары ата-анасының нысанындағы өріс атауларымен сәйкес келмеуі тиіс.

Ұрпақ объектісі жарияланғаннан кейін оның өрістерімен жұмыс істеу үшін оның экземплярын жасауға болады.

Var Ring1: Ring.

ВИРТУАЛДЫ ӘДІСТЕР МЕН ПОЛИМОРФИЗМ 

Алдыңғы программадағы Move әдісіне оралайық. Оның сипаттамасы төмендегідей.

Procedure Dot.Move;

Begin

Hide;

a:=a+Da; b:=b+Db;

Show

End;

Осы жерден Move әдісінің Hide және Show әдістеріне қатынас жасайтынын көреміз. Егер Move әдісін осы түрде dot және ring2 объектісі бар программада қолдансақ не болады?

Бұл жағдайда нүкте үшін ешқандай қиындық туындамайды. Себебі, нүкте dot объектісінің «туған» объектісі болғандықтан, нүкте еш қиындықсыз өшіп, координатасын ауыстырып, қайта жаңарады. Ал шеңберге келетін болсақ, Ring.Move объектілік жүйе, алдымен Ring объектілік типінің сипаттамасынан осындай әдісті іздейді, таба алмағаннан кейін іздеуді ата-баба объектісінде жалғастырады. Нәтижесінде Dot.Move әдісіне қатынас жасалады. Осыдан кейін Move әдісінен Ring.Hide және Ring.Show әдістері шақырылу керек, бірақ бұл орындалмайды: Ring1 нысан экземпляры мұраға алынған Dot.Move әдісіне Ring.Hide және Ring.Show әдістерінің орнына Dot нысанының әдістерін шақырады. Мұның себебі Dot.Hide, Dot.Show қатаң байланысқан, себебі олар Dot объектілік типінің бірдей контексінде компиляцияланған. Басқа сөзбен айтқанда, бұл әдістер арасындағы байланыс статикалық сипатқа ие. Бұл жағдайда щеңбер емес, нүкте орын ауыстырады. Hide және Show әдістері қай объект экземплярының Move әдісіне қатынас жасауына байланысты шақырылу үшін не істеу керек? Бұл жерде статикалық байланысудан ерекшеленетін динамикалық байланысу деп аталатын механизм көмеккке келеді. Бұл механизм виртуалды әдістердің көмегімен жүзеге асады. Нысандық типтердің сипаттамасында виртуалды әдістердің тақырыбы VIRTUAL резервтелген сөзімен толықтырылады. Егер нысандық типтің ұрпақтарында қайта анықталған әдістер бар болса, олар да виртуалды ретінде жариялануы қажет және де ата-баба объектісінің әдістері сияқты формальді параметр жиынтығына ие болуы қажет.

Виртуалды әдістері бар Dot және Ring нысандық типтердің сипаттамасы төмендегідей:

Dot = object

a, b:integer;

Constructor Init(x,y:integer);

procedure Show; virtual;

procedure Hide; virtual;

procedure Move(Da,Db:integer);

end;

{————————————}

Ring=object(Dot);

Rad:integer;

Constructor Init(x,y,r:integer );

Procedure Show; virtual;

Procedure Hide; virtual;

End;

Мұндағы Constructor — процедурасының ерекше түрін бейнелейтін резервтелген сөз. Енді Move әдісіндегі Ring1 нысан экземплярын шақыруға, ал одан Hide және Show әдістерін шақыруға оралайық. Мұнда жүйе алдымен Dot.Move әдісіне қатынас жасайды, мұндай атаулы әдіс алдымен Ring нысанынан ізделінеді де, таба алмағаннан кейін сәйкес ата-баба нысанының әдісіне қатынас жасайды. Осыдан кейін шеңбердің орнын ауыстыру үшін алдымен оны көрінбейтіндей ету қажет (Ring.Hide әдісін шақыру).Содан кейін оның центрінің координатасын өзгертіп, шеңберді экрандағы жаңа орында бейнелеу қажет (Ring.Show әдісін шақыру). ТР программасын орындау кезінде Dot.Move әдісіне шақырылатын объект үшін анықталған әдіске қатынас жасау қамтамасыз етіледі. Бұл жерде Ring.Show және Ring.Hide әдістеріне қатынас жасалады. Қорытындысында сәйкес пернелердің көмегімен жылжытуға болатын экрандағы нүкте мен шеңберді бейнелейтін программаның толық мәтінін көрсетейік:

Program ObjDotСirc;

Uses crt, graph;

Type

Dot=Object;

a,b:integer;

constructor Init(x,y:integer);

procedure Show; virtual;

procedure Hide; virtual;

procedure Move(Da,Db:integer);

end;

{———————————-}

Ring=object (Dot);

Rad:integer;

constructor Init(x,y=integer);

procedure Show; virtual;

procedure Hide; virtual;

end;

{———————————-}

Constructor Dot.Init;

Begin

a:=x; b:=y;

end;

{———————————-}

Procedure Dot.Show;

Begin

PutPixel(a,b:White);

End;

{———————————}

Procedure Dot.Hide;

Begin

PutPixel(a,b:Black);

End;

{———————————}

Procedure Dot.Move;

Begin

Hide;

a:=a+Da; b:=b+Db;

Show;

End;

{———————————-}

Constructor Ring.Init;

Begin

a:=x; b:=y;

Rad:=r;

End;

{———————————-}

Procedure Ring.Show;

Begin

SetColor(white);

Circle(a,b,Rad);

End;

{———————————-}

Procedure Ring.Hide;

Begin

SetColor(black);

Circle(a,b,Rad);

End;

{———————————-}

Var i,j,k,Err:integer;

a:char; Dot1:Dot; Ring1:Ring;

begin

i:=detect;

InitGraph(i,j,’ ‘);

Err:=GraphResult;

If <>grok then

Writeln(GraphErreor Msg (Err))

Else

Begin

Dot1.Init (GetMaxX div 2, GetMaxY div 2);

Dot.Show;

Ring1.Init (GetMaxX div 2, GetMaxY div 2, GetMaxY div 6);

Ring.Show;

While KeyPressed do a:=ReadKey ;

Repeat

begin

a:=ReadKey;

case ord(a) of

72: Dot1.Move(0,-5);

80: Dot1.Move(0,5);

77: Dot1.Move(5,0);

75: Dot1.Move(-5,0);

73: Ring1.Move(0,-5);

81: Ring1.Move(0,5);

79: Ring1.Move(5,0);

71: Ring1.Move(-5,0);

End

End;

Until a=chr(27)

End;

End.

Бұл программаның алдыңғы мысалдардан айырмашылығы – мұнда қосымша ұрпақ-тип Ring жарияланған және Show және Hide әдістері 2 нысан да виртуалды жарияланған. Ал Init әдісі конструкторға түрлендірілген. Сол сияқты Case операторы жаңа варианттармен толықтырылды. Көрсетілген варианттар шеңбердің экранда 4 бағытта жылжуын қамтамасыз етеді:
(жоғары), PgDown>(төмен), (оңға),(солға) пернелерін басу кезінде генереацияланатын 73,81,79,71 ScanCod-тары жылжуды жүзеге асырады. Бұл программада Case операторының денесіндегі Move әдісін шақыруға ерекше көңіл бөлу қажет. Бірнші төрт жағдайда (72,80,77,75) Dot1.Move әдісіне қатынас жасауға арналған, ал қалғанында Ring1.Move әдісіне қатынас жасалған. Дегенмен Move әдісінің жалғыз екенін білеміз, ол Dot объектісінде жарияланып, Ring нысанына мұраға қалған. Басқа сөзбен айтқанда, 1 ғана Move әдісі әртүрлі жұмыс істейді (нүктені немесе шеңберді жылжытады). Бұл оны қандай нысанның шақырғанына байланысты. нысандардың мұндай қасиеті полиморфизм деп аталады.

 

Загрузка...
Загрузка...
Загрузка...
Бөлісу