лекции (2008) (by Kravets) (1160829), страница 15
Текст из файла (страница 15)
 Ìîäóëà 2 - DEFINITION, IMPLEMENTATION.  Àäà - ñïåöèôèêàöèÿ ïàêåòà èîïðåäåëåíèå ïàêåòà, ïðè÷åì îíè ìîãóò òðàíñëèðîâàòüñÿ îòäåëüíî.  Ìîäóëà - 2 òàê æå ìîäóëè îïðåäåëåíèÿ è îïèñàíèÿ ìîãóò òðàíñëèðîâàòüñÿîòäåëüíî.Ñ òî÷êè çðåíèÿ ðàçäåëüíîé òðàíñëÿöèè, êîìïèëÿòîðó íåîáõîäèìîçíàòü òîëüêî òó ÷àñòü, êîòîðàÿ îòíîñèòñÿ ê îïðåäåëåíèþ, ïîýòîìó ýòà÷àñòü âûíåñåíà â îòäåëüíóþ ÿçûêîâóþ êîíñòðóêöèþ.Äëÿ òîãî ÷òîáû îòêîìïèëèðîâàòü êëèåíòñêèé ìîäóëü, êîìïèëÿòîðó íåîáõîäèì òîëüêî DEFINITION ìîäóëü ñåðâèñà, êîòîðûé èñïîëüçóåòêëèåíò. Òî åñòü åñëè ïîìåíÿëñÿ ìîäóëü îïðåäåëåíèÿ, òî òðåáóåòñÿ ïåðåêîìïèëèðîâàòü âñå ìîäóëè, êîòîðûå åãî èñïîëüçóþò.Àíàëîãè÷íî ñäåëàíî â è ßÏ Àäà è Delphi.uses Service; Ñ/C++ ðîëü ìîäóëåé îïðåäåëåíèÿ èãðàþò çàãîëîâî÷íûå ôàéëû,íî ïðè íåçíà÷èòåëüíîì èçìåíåíèè îäíîãî çàãîëîâî÷íîãî ôàéëà òðåáóåòñÿ ïåðåòðàíñëèðîâàòü âñå ôàéëû, êîòîðûå èñïîëüçóþò äàííûé çàãîëîâî÷íûé ôàéë.Ïðè ýòîì â Delphi èãðàþò ðîëü òîëüêî ñåðüåçíûå èçìåíåíèÿ â èíòåðôåéñíîé ÷àñòü ìîäóëÿ.Òî åñòü åñëè èçìåíèòü ìîäóëü òî îí áóäåò ïåðåòðàíñëèðîâàí, à îñòàëüíûå òîëüêî â òîì ñëó÷àå åñëè áûë èçìåíåí èíòåðôåéñ ìîäóëÿ.Âåðíåìñÿ ê ðåàëèçàöèè ÀÒÄ ñ ïîìîùüþ ñêðûòîãî òèïà.
Äîïóñòèìêîìïèëÿòîð âñòðå÷àåòimport serviceè ïîäãðóæàåò òàáëèöó èìåí, è òóò âûÿñíÿåòñÿ ÷òî åñòüTYPE HANDLER;ïîñëå ÷åãî êîìïèëÿòîð âèäèòVAR H:HANDLER;Äðóãîé èíôîðìàöèè ó íåãî íåò, òî åñòü îí íå ìîæåò ïðîèçâåñòè ðàñïðåäåëåíèÿ ïàìÿòè. Ïîýòîìó áûëî ââåäåíî îãðàíè÷åíèå, ÷òî ýòî ìîæåò áûòüëèáî öåëûé òèï, ëèáî óêàçàòåëü, òî åñòü èìååò ìåñòî èñêëþ÷èòåëüíî ðåôåðåíöèàëüíàÿ ñòðóêòóðà.86Ñîçäàòåëè ÿçûêà Àäà ïîíèìàëè ýòó ïðîáëåìó.
 Àäå àáñòðàêòíûéòèï äàííûõ - äåéñòâèòåëüíî àáñòðàêòíûé òèï. Ñóùåñòâóåò 2 êîíöåïöèè- ïðèâàòíûå òèï äàííûõ è îãðàíè÷åííûå ïðèâàòíûé òèï äàííûõ.Îñíîâíîé íåäîñòàòîê ñ òî÷êè çðåíèÿ èíêàïñóëÿöèè - òðåáîâàíèå óïîòðåáëÿòü èñêëþ÷èòåëüíî ðåôåðåíöèàëüíóþ ìîäåëü äàííûõ.Ðàññìîòðèì ïðèìåð íà ÿçûêå Àäàpublic Stacks istype Stack is private;-- îïåðàöèè íàä ñòåêîìprocedure push (S:inout stack, X:integer);procedure pop (S:inout stack, X:out integer);private:type stack is recordtop:integer := 0;body: array (0..N) of integer;end record;end Stacks ßçûêå Àäà ïîáî÷íûé ýôôåêò îò ôóíêöèé çàïðåùåí, òî åñòü íåëüçÿ îôîðìèòü POP êàê ôóíêöèþ.
Åñëè õîòÿ áû îäèí èç òèïîâ äàííûõîáúÿâëåí êàê ïðèâàòíûé, òî â ñïåöèôèêàöèè ïàêåòà ïîÿâëÿåòñÿ äîïîëíèòåëüíàÿ ïðèâàòíàÿ ÷àñòü, ãäå äîëæíà áûòü ðàñïèñàíà ñòðóêòóðà òèïà.Òåïåðü âîçìîæíî èñïîëüçîâàòü ìåòîäû ïðèâàòíîãî òèïà, íî äîñòóï êåãî çàêðûòûì ñòðóêòóðàì çàïðåùåí.Push (S,1);Pop (S,X);S.top := 1; Îøèáêàtype PLINK is access;type link is recordnext: PLINK;X: integer;end record;type PLINK is access link; ïðèâàòíîé ÷àñòè îïèñûâàþòñÿ âñå ñòðóêòóðû, íóæíûå äàííîìóîáúåêòû.
Åå ïîëíîñòüþ âèäèò êîìïèëÿòîð, íî îíà íå äîñòóïíà ïðîãðàììèñòó. Òî åñòü, ÷òîáû çàìåíèòü ðåàëèçàöèþ ñòåêà ñ ìàññèâà íà ñïèñîê,òî ñëåäóåò äîáàâèòü â òåêñò87type Stack is access PLINK;Òåïåðü íåîáõîäèìî ïåðåòðàíñëèðîâàòü âñå ìîäóëè, êîòîðûå èñïîëüçóþò ýòîò òèï äàííûõ. Òàêîé òèï äàííûõ íå ÿâëÿåòñÿ ïîëíîñòüþ àáñòðàêòíûì. Ïî ñðàâíåíèþ ñ Ìîäóëà - 2 ê äàííîìó òèïó ïðèìåíèìû îïåðàöèèïðèñâàèâàíèÿ è ñðàâíåíèÿ.Êàê âèäíî, â ñëó÷àå ïåðâîé ðåàëèçàöèè ñòåêà ñòàíäàðòíîå ïðèñâàèâàíèå è ñðàâíåíèå íà ðàâåíñòâî (ïîâåðõíîñòíûå îïåðàöèè) ðàáîòàþòêîððåêòíî, êîãäà êàê â âòîðîì ñëó÷àå ýòè îïåðàöèè ìîãó áûòü íåêîððåêòíûìè.Äëÿ ðåøåíèÿ ýòîé ïðîáëåìû áûëè ââåäåíû îãðàíè÷åííûå ïðèâàòíûåòèïû äàííûõ.type T is limited privateÒåïåðü ê ýòîìó òèïó ïðèìåíèìû òîëüêî òå îïåðàöèè, êîòîðûå îïèñàíû â ñàìîì ïàêåòå.ÎáåðîíRecordtop:Integer;body:ARRAY N OF INTEGER;END;TYPE Stack=RECORDEND;Ðåàëèçàöèÿ â Îáåðîíå íå óñòóïàåò â òî÷êè çðåíèÿ ñêîðîñòè ðåàëèçàöèè Ìîäóëà - 2, íî óëó÷øàåò ãèáêîñòü ÿçûêà.
Íî Âèðò îòîøåë îò ïðèíöèïà ÐÎÐÈ, òî åñòü ñîâìåùåíû îïðåäåëåíèÿ è ðåàëèçàöèÿ.Ïðè÷èíîé ýòîãîñòàëà óâåðåííîñòü âèðòà â òîì, ÷òî ïðîãðàììèðîâàíèÿ íà Îáåðîíå âñåãäàáóäåò ïðîèñõîäèòü â íåêîòîðîé ñðåäå ïðîãðàììèðîâàíèÿ.Òî åñòü ïðèíöèï ðàçäåëåíèÿ îïðåäåëåíèÿ è ðåàëèçàöèè áûë ïåðåëîæåí íà äîêóìåíòèðóþùèå ñèñòåìû.  C# è Java òà æå ñõåìà.Èòàê ðàçäåë ïðî èíêàïñóëÿöèþ çàêîí÷åí.Ãëàâà 6Êëàññ. Îïðåäåëåíèå íîâîãî òèïà äàííûõ ñ ïîìîùüþ êëàññîâ.Êëàññ - ýòî âñåãäà íîâûé òèï äàííûõ.
Êëàññ ìîæåò áûòü ðåàëèçîâàí âñòàíäàðòíîé áèáëèîòåêå èëè âñòðîåí â êîìïèëÿòîð. Íàïðèìåð â .NETêëàññû Object è String âñòðîåíû â êîìïèëÿòîð.88Ìîäóëü ÿâëÿåòñÿ áîëåå óíèâåðñàëüíûì ïîíÿòèåì ÷åì êëàññ. Íàïðèìåð â Ñ++ âñå ÷òî ïðèíàäëåæèò êëàññó, ñîäåðæèòñÿ â this.  Ñ# ìîæíî ââîäèòü îïåðàòîðû ïðåîáðàçîâàíèÿ äëÿ ñîîòâåòñòâóþùåãî êëàññà.
ÂÑ++ ýòî ðåøàëîñü ñ ïîìîùüþ îïåðàöèè ïðåîáðàçîâàíèÿ, êîòîðàÿ ÿâëÿëàñü ÷ëåíîì êëàññà Ò1 è ïðèâîäèëà ê êëàññó Ò2. Ñ# ýòî ðåàëèçîâàíî ñ ïîìîùüþ ñòàòè÷åñêèõ ôóíêöèé ÷ëåíîâ ëèáîÒ1 ëèáî Ò2. Ñ# è Java îòñóòñòâóþò ãëîáàëüíûå ôóíêöèè. Èõ çàìåíÿþò ñòàòè÷åñêèõ ôóíêöèè çàêðûòûõ êëàññîâ. Åãî íåëüçÿ íàñëåäîâàòü è îáúåêòòàêîãî êëàññà íåëüçÿ ïîðîäèòü. Òî åñòü ýòî ÿâëÿåòñÿ íå êëàññîì, à ñêîðåå ìîäóëåì.  Ñ# åñòü ïîíÿòèå ñòàòè÷åñêîãî êëàññà - ïîëíûé àíàëîãìîäóëÿ.
Òàêèì îáðàçîì, ìîäóëü áîëåå óíèâåðñàëåí, íî ìåíåå óäîáåí.Ïóíêò 1. ×ëåíû êëàññà.class name: íàñëåäîâàíèå{ñïèñîê ÷ëåíîâ};Òàêîé ñèíòàêñèñ ïðèñóòñòâóåò â Java, C#, C++.  Ñ#, Java, Delphi åñëèðîäèòåëü íå óêàçàí, òî ðîäèòåëåì ñ÷èòàåòñÿ êëàññ Object. Delphi:type name = class (íàñëåäîâàíèå)ñïèñîê ÷ëåíîâ-äàííèõend;C++ è Delphi ïîääåðæèâàþò ïðèíöèï ÐÎÐÈ.  Ñ++ ìû ìîæåò îïèñûâàòü òåëî ôóíêöèè âíóòðè òåëà êëàññà, ÷òî ïîçâîëÿåò êîìïèëÿòîðóñäåëàòü ôóíêöèþ âñòðàèâàåìîé.  Delphi çàïðåùåíî îïèñûâàòü òåëîôóíêöèè â îïèñàíèè è èíòåðôåéñà êëàññà.class X{int i;void f(int);};void X::f(int){..}Delphi:type T = classprocedure P;89end;procedure T.P;beginend;Ïóíêò 1. ×ëåíû êëàññîâ.-÷ëåíû-äàííûå-÷ëåíû-ôóíêöèè-÷ëåíû-òèïûÂñå ÷ëåíû êëàññà ìîæíî ðàçäåëèòü íà ñòàòè÷åñêèå è íå ñòàòè÷åñêèå.Íå ñòàòè÷åñêèå ÷ëåíû - äàííûå îáîáùåíèå ïîíÿòèå ÷ëåíà çàïèñè.Îáðàùåíèå ê íèì èäåò <èìÿ îáúåêòà>.<èìÿ ÷ëåíà>.
 Ñ++ òàê æååñòü îïåðàöèÿ ->.Ñòàòè÷åñêèå ÷ëåíû - äàííûå ñ òî÷êè çðåíèÿ ðàñïðåäåëåíèÿ ïàìÿòè ãëîáàëüíûå ïåðåìåííûå.  Ñ++ Äîñòóï ê íèì ïî èìåíè êëàññà C::i. ÂC# è Java, C.i.  Ñ++ ìîæíî îáðàùàòüñÿ ê ñòàòè÷åñêèì ÷ëåíàì è ÷åðåçîáúåêò êëàññà.90Ëåêöèÿ 2218.11.2008Äëÿ ñòàòè÷åñêèõ ÷ëåíîâ êëàññà èìÿ êëàññà âûñòóïàåò êàê èìÿ ìîäóëÿ. Îáðàùåíèå ê ÷ëåíó ïðîñòðàíñòâà èìåí ÷åðåõ èìÿ ïðîñòðàíñòâà èìåíè ê ñòàòè÷åñêîìó ÷ëåíó êëàññà ÷åðåç èìÿ êëàññà ñèíòàêñè÷åñêè ýêâèâàëåíòíû.Ðàññìîòðèì ðàñïðåäåëåíèå ïàìÿòè. Äëÿ íåñòàòè÷åñêèõ ÷ëåíîâ ïîìÿòü îòâîäèòñÿ òàì æå, ãäå è è ïàìÿòü äëÿ îáúåêòà êëàññà.
Ñî ñòàòè÷åñêèìè ÷ëåíàìè ñîâñåì äðóãàÿ ñèòóàöèÿ.  C# è Java ïàìÿòü îòâîäèòñÿñèñòåìîé â ñåãìåíòå äàííûõ.  Ñ++ ñàì ïðîãðàììèñò äîëæåí óêàçàòü âêàêîé ôàéëå áóäåò ðàçìåùåí ÷ëåí äàííûõ./*X.h*/class X{static int a;};/*X.cpp*/int X::a; *.h ëó÷øå íå âêëþ÷àòü, òàê êàê âîçìîæíî ïåðåîïðåäåëåíèå èìåíè.Ïîãîâîðèì î ñòàòè÷åñêèõ è íå ñòàòè÷åñêèå ÷ëåíû - ôóíêöèè. Íå ñòàòè÷åñêàÿ ôóíêöèÿ - îñîáàÿ ôóíêöèÿ, êîòîðàÿ îòëè÷àåòñÿ ñëåäóþùèìè âåùàìè:1.
Êëàññ - îáëàñòü äåéñòâèÿ.(òî åñòü ôóíêöèè ÷ëåíû òðàíñëèðóþòñÿ âêîíòåêñòå ñâîåãî êëàññà)2. Íåÿâíûé ïàðàìåòð (àäðåñ îáúåêòà).  Ñ++ - ýòî this (óêàçàòåëü).ÂC# è Java - this (ññûëêà).  D è Smalltalk - self.Òî åñòüclass X{int i;void f(){this -> i = 0;i = 2;}};Ó êàæäîé ôóíêöèè åñòü íåñêîëüêî îáëàñòåé äåéñòâèÿ. Òî åñòü òåëîôóíêöèè ÿâëÿåòñÿ âëîæåííûì ïî îòíîøåíèþ ê òåëó êëàññà. Íàëåäîâàíèåòàê æå äàåò âëîæåííîñòü (ïîòîìêè âëîæåííû â ïðåäêîâ).91Îòäåëüíî ðàññìîòðèì ôîðìàëüíûå ïàðàìåòðû.  Delphi ïàðàìåòðûèìåþò îáëàñòü äåéñòâèÿ êëàññà (òî åñòü èõ èìåíà íå ìîãóò ñîâïàäàòü ñèìåíàìè êëàññà).  C/C++ îíè ïðèíàäëåæàò òåëó ôóíêöèè.Äëÿ äîñòóïà ê çàêðûòûì ïîëÿì êëàññà ñëåäóåò èñïîëüçîâàòü óêàçàòåëü this->. Âàðèàíò ðàçðåøåíèÿ êîíôëèêòà èìåí - íàêëàäûâàòü îãðàíè÷åíèÿ íà èìåíà. ñòàòè÷åñêèõ ôóíêöèÿ - ÷ëåíàõ íåëüçÿ îáðàùàòüñÿ ê íåñòàòè÷åñêèì÷ëåíàì êëàññà ÷åðåç this.
Îáðàùåíèå âîçìîæíî òîëüêî ÷åðåç ÿâíîå óêàçàíèå èìåíè îáúåêòà.Âñå ôóíêöèè-÷ëåíû èìåþò ìàêñèìàëüíûå ïðàâà äîñòóïà ê ÷ëåíàìêëàññà.Äëÿ ñòàòè÷åñêèõ ÷ëåíîâ äàííûõ íåò íèêàêîé ðàçíèöû ìåæäó óêàçàòåëåì íà ãëîáàëüíûå äàííûå è óêàçàòåëåí íà ñòàòè÷åñêèé ÷ëåí êëàññà.int * pi;int a;pi = &a;int X::stat = -1;pi = &X::stat;Àíàëîãè÷íî ñ èìåíàìè ôóíêöèévoid (*pf)(void);pf = X::f;Åñëè ðå÷ü èäåò î óêàçàòåëÿõ íà ÷ëåíû äàííûå, òî âñå íå òàê. int X::*p; - óêàçàòåëü íà ÷ëåí êëàññà X.class X{int i;int y;void f();void g();};p = &X::i; Òîãäà çäåñü õðàíèòñÿ ñìåùåíèå ïîëÿ i â êëàññå X.p = &X::y; Òîãäà çäåñü õðàíèòñÿ ñìåùåíèå ïîëÿ y â êëàññå X.void (X::*)(void) PFX;PFX = & X::f;PFX = & X::g;X anx;92anx.*p;anx.*PFX();px -> p;px -> * PFX ();Âî âñåõ ÿçûêàõ äîïóñêåàòñÿ ðàçìåùàòü êîíñòàíòíûå è íå êîíñòàíòíûå îáúåêòû.const int i;Ýòîò ÷ëåí ÿâëÿåòñÿ êîíòàíòîé è ìîæåò áûòü èíèöèàëèçèðîâàí ïðÿìîâ îïðåäåëåíèè (òàê êàê îáúåêò öåëîãî òèïà).
Íî òàêèå ÷ëåíû ìîãóò áûòüòîëüêî static. Èíà÷å ïðèøëîñü áû õðàíèòü íà êàæäûé îáúåêò êëàññàìíîãî ëèøíèõ äàííûõ. C# åñëè ðå÷ü èäåò î êîíñòàíòå, òî ñëîâî const ãîâîðèò î òîì, ÷òîâûðàæåíèå ìîæåò áûòü âû÷èñëåííî ñòàòè÷åñêè è ÷òî îáúåêò ÿâëÿåòñÿñòàòè÷åñêèì. Òàê æå â C# åñòü ìîäèôèêàòîð readonly.
Îí ñïåöèôèöèðóåò òî, ÷òî ïîñëå èíèöèàëèçàöèè îáúåêòà îí íå ìîæåò ïîòåðÿòü ñâîåçíà÷åíèå, íî îí íå îáÿçàí áûòü ñòàòè÷åñêèì è ìîæåò áûòü èíèöèàëèçèðîâàí ëþáûì âûðàæåíèåì âî âðåìÿ âûïîëíåíèÿ.Ïåðåéäåì ê òðåòüåìó âàðèàíòó äàííûõ - òèïàì.class X{class Y{};};Íàïðèìåð:STLvector{iterator{};}; Java âíóòðåííèé êëàññ - íåñòàòè÷åñêèé âëîæåííûé êëàññ. Ñòàòè÷åñêèé âëîæåííûé êëàññ - îáû÷íûé âëîæåííûé êëàññ.