лекции (2008) (by Kravets) (укороченное) (1160827), страница 10
Текст из файла (страница 10)
Òàêîé ïîäõîä ðåàëèçîâàíâ Ñ# è Java.Äëÿ ýêçåìïëÿðà äëèíà êâàçèñòàòè÷åñêèé àòðèáóò, òî åñòü çàäàåòñÿ âî âðåìÿ âûïîëíåíèÿ, íî íåò âîçìîæíîñòè ìåíÿòü åå âî âðåìÿ âûïîëíåíèÿ. Àíàëîãè÷íàÿ ñèòóàöèÿ ñî ñòðîêàìè.  Ñ# è Java åñòü ñïåöèàëüíûåêëàññû äëÿ ñîçäàíèå ñòðîê StringBuilder. Âî âðåìÿ ðàáîòû ñî ñòðîêàìè, íàïðèìåð âî âðåìÿ ñîçäàíèÿ íîâîéñòðîêè, òðåáóåòñÿ ÷àñòîå èçìåíåíèå ðàçìåðà âûäåëåííîé ïàìÿòè, ÷òî ïðèâîäèò ê îãðîìíîé ôðàãìåíòàöèèïàìÿòè.StringBuilder áîëåå îïòèìàëüíûì îáðàçîì ðàñïðåäåëÿåò ïàìÿòü ïîä ñòðîêè, ïîëüçóÿñü òåì, ÷òî âîâðåìÿ åãî ðàáîòû êîëè÷åñòâî òðåáóåìîé ïàìÿòè ìîæåò òîëüêî óâåëè÷èâàòüñÿ.
Òî åñòü òàêèå ìàññèâû ðåàëüíîÿâëÿþòñÿ êâàçèñòàòè÷åñêèìè. Àäå åñòü ïîíÿòèå äèíàìè÷åñêîãî ìàññèâà, ôàêòè÷åñêè íå ïîõîæåãî íà ñâîé àíàëîã â C# èëè Java.procedure P(N:integer) isA:array (1..N) of real;begin...end; äàííîì ïðèìåðå ïðîèñõîäèò íåêîòîðîå îòñòóïëåíèå îò ïðàâèë ÿçûêà Àäà, òàê êàê ãðàíèöû ìàññèâàíå çàäàíû ñòàòè÷åñêè. Ïðè ýòîì ãðàíèöû ìàññèâà ÿâëÿþòñÿ àòðèáóòàìè èìåííî êîíêðåòíîãî îáúåêòà, à íå27âñåãî òèïà.Òåïåðü íåìíîãî ïðî ìíîãîìåðíûå ìàññèâû è îïåðàöèþ âûðåçêè (slice).Ñðåç ìàññèâà íåêîòîðûé äèàïàçîí åãî ýëåìåíòîâ. Òàêàÿ îïåðàöèÿ åñòü â PL/I, Fortran 90, Ada.A:Array (1..10) of T;A(2..5); Âûðåçêè îäíîé äëèíû ìîãóò áûòü ñîâìåñòèìû ìåæäó ñîáîé.
 ñîâðåìåííûõ ÿçûêàõ ïðîãðàììèðîâàíèÿ îïåðàöèÿ copy(i,j) àíàëîã âûðåçêè.A(2..5,1..3) òàêèì îáðàçîì âûðåçêè óæå íå âñåãäà ìîãóò ðàñïîëàãàòüñÿ â ïàìÿòè íåïðåðûâíî.Äëÿ ðåàëèçàöèè ìíîãîìåðíûõ ìàññèâîâ ÷àùå âñåãî ïðèìåíÿåòñÿ ñëåäóþùèé ñïîñîá. Ìíîãîìåðíûé ìàññèâ ýòî ïðîñòî íåïðåðûâíàÿ ïîñëåäîâàòåëüíîñòü ìàññèâîâ ìåíüøåé ðàçìåðíîñòè.Type T2 = array [1..N] of T1;T1 = array [1..M] of T;X[i][j] X[i,j];Àíàëîãè÷íîType T2 = array [1..N,1..M] of T;ßçûê Ñ/Ñ++;int i[3][3];//i ≡ int**Åäèíñòâåííîå èñêëþ÷åíèå ÿçûê ôîðòðàí òàì ìàññèâ ðàñïîëàãàåòñÿ íå ïî ñòðîêàì, à ïî ñòîëáöàì.Ïðè ýòîì âî âñåõ îñòàëüíûõ ÿçûêàõ ïî ñòðîêàì.Ñòóïåí÷àòûå ìàññèâû åñòü â Java, ìîãóò ìîäåëèðîâàòüñÿ â Ñ (ññûëêàìè).Äâóìåðíûé ìàññèâ ÿçûêà Java òðàêòóåòñÿ êàê ìàññèâ ìàññèâîâ èëè êàê ìàññèâ óêàçàòåëåé/ññûëîê. Ñ# åñòü 2 âàðèàíòà îáúÿâëåíèÿ.int [,] = new int [3,5];È êëàññè÷åñêîå îáúÿâëåíèå (ìàññèâ ìàññèâîâ).
Òîãäà ïîëó÷àåì ñòóïåí÷àòûé ìàññèâ. Java:int [][]X = new int[][3];Äàëåå èíèöèàëèçàöèÿ êàæäîãî èç 3-õ ýëåìåíòîâ ìàññèâà.for (int i=0; i < 3; i++)x[i] = new int [i+1];int [N]x = {{1,2,3}, new int [5],{0}};ßâíàÿ èíèöèàëèçàöèÿ.Ïóíêò 2. Çàïèñè.Ñîâðåìåííîå ïîíÿòèå çàïèñè ïðàêòè÷åñêè íå èçìåíåííàÿ çàïèñü ÿçûêà Pascal.type R = recordx,y:T;i,j: real;end;Òî åñòü åñëè ìàññèâ DxDxDx..xD; òî çàïèñü ýòî äåêàðòîâî ïðîèçâåäåíèå ðàçíîòèïíûõ ýëåìåíòîâ.Îñíîâíàÿ îïåðàöèÿ äîñòóï ïî èìåíè ïîëÿ.ßçûê Ñ: struct tags{int i,j;};Àäà:record//ïîëÿ çàïèñè.end record;28 ñîâðåìåííûõ ÿçûêàõ ïðîãðàììèðîâàíèÿ ïîíÿòèå çàïèñè ïðåâðàòèëîñü â ïîíÿòèå êëàññà.Oberon:RECORDïîñëåäîâàòåëüíîñòü ïîëåéEND;Çàïèñü ñ âàðèàíòàìè <=> union //Ñ.
≡ îáúåäèíåíèå Ñ/Ñ++ ≡ ïàðàìåòðèçîâàííûå çàïèñè (Àäà).Îáúåäèíåíèå òèïîâ.Òðàäèöèîííûå ßÏ êàæäîìó îáúåêòó äàííûõ ñîîòâåòñòâóåò åäèíñòâåííûé òèï äàííûõ. ÎÎßÏ âñåîáúåêòû îòíîñÿòñÿ ê íåêîòîðîìó êëàññó îáúåêòîâ.int i = 0;object o = i;//êîððåêòíî â Ñ#ßíóñ ïðîáëåìà ðàçëè÷íûå îáúåêòû ìîãóò âûñòóïàòü â ðàçíûõ ðîëÿõ, òî åñòü êàæäûé îáúåêò ìîæåòèìåòü íåñêîëüêî ðîëåé / òèïîâ. ßð÷å âñåãî ýòà ïðîáëåìà ïðîÿâèëà ñåáÿ ïðè ïðîåêòèðîâàíèè ïîëüçîâàòåëüñêèõ èíòåðôåéñîâ.
Íàïðèìåð îêíî ìîæåò ñîäåðæàòü â ñåáå íåêîòîðûé íàáîð ýëåìåíòîâ, çàâèñÿùèé îò êîíêðåòíîãî îêíà.recordïîñòîÿííàÿ ÷àñòü.âàðèàíòíàÿ ÷àñòü.end;ïîñòîÿííàÿ ÷àñòü ïîñëåäîâàòåëüíîñòü îáúÿâëåíèÿ ïåðåìåííûõ.âàðèàíòíàÿ ÷àñòü-ðàçìå÷åííîå ðàñïðåäåëåíèå.ïîëå, ãäå åñòü äèñêðèìèíàíò, îïðåäåëÿþùèé âèä ïîëÿ.-íå ðàçìå÷åííîå ðàñïðåäåëåíèå.type event = recordT:time;case Evtype:ETEventKBEvent: (scancode : integer,up:Boolean);MouseEvent :(....); end:Âàðèàíòíàÿ ÷àñòü âñå ïåðåìåííûå ðàñïîëàãàþòñÿ ñ îäíîãî è òîãî æå àäðåñà. Íå ðàçìå÷åííîå ðàñïðåäåëåíèå îòñóòñòâóåò ïîëÿ äèñêðèìèíàíòà.type BitCell = recordcase Boolean oftrue:(i:integer)false:(bits:packed array [1..48] of Boolean)end;X:BitCell;X.i= 249;X.bits [48] := 1;union íå èíêðèìèíèðîâàííîå îáúåäèíåíèå áåç ïîñòîÿííîé ÷àñòè.29Ëåêöèÿ 13.Èòàê, îáúåäèíåíèå òèïà ñèíòàêñè÷åñêè îáîáùåíèå ïîíÿòèå çàïèñè èëè ñòðóêòóðû. Íàëè÷èå îáúåäèíåíèé ãîâîðèò ÷òî òðàäèöèîííàÿ ñèñòåìà òèïîâ èìååò íåêîòîðóþ ¾óùåðáíîñòü¿.
Ñóùåñòâóåò èíêðèìèíèðîâàííûå îáúåäèíåíèÿ â íèõ ó êàæäîãî ïîëÿ åñòü îïðåäåëåííîå çíà÷åíèå äèñêðèìèíàíò, ïî êîòîðîìóîïðåäåëÿåòñÿ òèï ïîëÿ. Îáúåäèíåíèå òèïîâ ðåàëèçîâàíî òàê, ÷òî âñå ýëåìåíòû íà÷èíàþòñÿ ñ îäíîãî è òîãîæå àäðåñà â ïàìÿòè.Ïàñêàëü, Modula-2 èìåþò ïî÷òè ýêâèâàëåíòíûå îáúåäèíåíèÿ òèïîâ. ÀÄÀ âñå îáúåäèíåíèÿ ðàçëè÷íû.Ñ òîëüêî ÷èñòûå íå ðàçìå÷åííûå îáúåäèíåíèÿ.Îïèñàíèå îáúåäèíåíèé ïðåäûäóùàÿ ëåêöèÿ.Ðàçëè÷èÿ â îáúÿâëåíèå ìàëû. Ïðè ýòîì ðàçëè÷èÿ â îáúÿâëåíèè âûçâàíû ðàçëè÷èÿìè â îïåðàòîðå âûáîðà(switch) â ñîîòâåòñòâóþùèõ ßÏ.Äèñêðèìèíàíò ìîæåò áûòü 2-õ âèäîâ:1.èìÿ: òèï.2.òèï.Ïðè ýòîì ïåðâûé ñïîñîá â ðàçìå÷åííûõ è âòîðîé â íå ðàçìå÷åííûõ.  ÿçûêå Ñ ðàçìåð îáúåäèíåíèÿ ðàçìåðìàêñèìàëüíîãî ýëåìåíòà.  Ïàñêàëå ñóùåñòâóåò è äðóãîé ñèíòàêñèñ.NEW (P, t1, t2, t3 ...);Ðàñïðåäåëåíèå ïàìÿòü ïîä çàïèñü ñ âàðèàíòàìè, ïðè÷åì âûäåëåíèå ïàìÿòè èäåò ïî òèïó äàííîãî âàðèàíòàt1. Ïðè ýòîì ïîñëåäîâàòåëüíîñòü tn èäåò êîãäà åñòü n âëîæåííûõ ïîä-çàïèñåé.
Ïðè ýòîì îáúåäèíåíèå òèïîâ íåñåò â ñåáå ïðîáëåìû ñâÿçàííûå ñ íåíàäåæíîñòüþ. Åñëè çàïèñü íå ðàçìå÷åííàÿ, òî íàäåæíîñòü êðàéíåìàëà, åñëè æå çàïèñü ðàçìå÷åíà, òî èçìåíèâ äèñêðèìèíàíò ìû ìîæåì ñäåëàòü äàëüíåéøèé êîä ïîëíîñòüþíåðàáî÷èì.ßçûê Àäà.type varrec (D:DT) is recordïîñòîÿííàÿ ÷àñòü.case D:DT ofwhen v1 => âàðèàíò 1;when v2|v3 => âàðèàíò 2;when others => âàðèàíò6;end record;type stack (N:integer) isrecordtop : Integer range 1..N = 1;body : array (Integer range 1..N) of real;end record;X:stack (50);type PVARREC isaccess VARREC;p:PVARREC;p= new VARREC (v1); //îáÿçàòåëüíî ÿâíî óêàçàòü ïàðàìåòð. ÎÎÏ è ÷èñòûõ ÎÎßÏ íóæäà â çàïèñè ñ âàðèàíòàìè îòïàäàåò.
Îíè îñòàþòñÿ òîëüêî äëÿ ñîâìåñòèìîñòèñî ñòàðûì êîäîì. Òî åñòü ïîñòîÿííàÿ ÷àñòü base êëàññ. Âàðèàíòíàÿ ÷àñòü êëàññû ïîòîìêè. Ñóùåñòâóåòâàðèàíò íàñëåäîâàíèå ñ ïîëåì òèïà, íî ïðèâîäèò ê âñåì ïðîáëåìàì ñ íåíàäåæíîñòüþ, êîòîðûå åñòü ïðèèñïîëüçîâàíèè îáúåäèíåíèé.Âàæíà äèíàìè÷åñêàÿ îáðàáîòêà ìåòîäîâ.  èäåàëå äëÿ ìîäèôèêàöèè íåêîòîðîãî êëàññà ïðè èñïîëüçîâàíèè äèíàìè÷åñêîãî ñâÿçûâàíèÿ òðåáóåòñÿ òîëüêî èñõîäíèêè ñàìîãî êëàññà.Èòàê çàïèñü ñ âàðèàíòàìè ñåé÷àñ (èç - çà ÎÎÏ) ìîæíî ñ÷èòàòü óñòàðåâøåé. Ïîíÿòèå çàïèñè îáîáùàåòñÿïîíÿòèåì êëàññà. Òî åñòü äîáàâëÿþòñÿ ôóíêöèè ÷ëåíû, êîòîðûì íåÿâíî ïåðåäàåòñÿ àäðåñ çàïèñè.  Ñ++ñòðóêòóðà ñòàëà êëàññîì.
Îòëè÷èå ìåæäó ñòðóêòóðîé è êëàññîì â äîñòóïå ïî óìîë÷àíèþ. ÑîâìåñòèìîñòüÑ++ è Ñ îáðàçåö õîðîøåé ñîâìåñòèìîñòè ñ ïðîøëûìè âåðñèÿìè. Ïðè ýòîì áûëî ðåøåíî ìíîæåñòâîïðîáëåì (íàïðèìåð ïðîáëåìà ñ èìåíîâàíèåì ñòðóêòóð â Ñ). Ïðè ýòîì Ñ++ ñèëüíî óñëîæíèëñÿ. Ó òåãîâñòðóêòóð â Ñ èìååòñÿ îñîáîå ïðîñòðàíñòâî èìåí, ïðè ýòîì Ñ++ íå ìîã ýòîãî äîïóñòèòü.Îñíîâíàÿ ïðîáëåìà ñî ñòðóêòóðàìè çàãîëîâî÷íûå ôàéëû UNIX íàïèñàííûå íà Ñ, â êîòîðûõ àêòèâíîèñïîëüçóþòñÿ ñòðóêòóðû.30Ïðèìåðstruct C{struct B{}b;}struct B b;C::b == b;Ñòðàóñòðóï óòâåðäèë ÷òî ñòðóêòóðû â Ñ++ ïî÷òè ïîëíîñòüþ àíàëîãè÷åí êëàññàì, ïðè ýòîì åñëè åñòüêîíôëèêò ñ ñóùåñòâóþùèìè èìåíàìè, òî îí äîïóñòèì, ïðè ýòîì äîñòóï ê ñòðóêòóðå äàëåå âîçìîæåí òîëüêî÷åðåç ìîäèôèêàòîð struct. Delphi âîïðîñ áûë ðåøåí ïðîùå åñòürecord...end;Êîòîðûå ÿâëÿþòñÿ àíàëîãàìè çàïèñåé ÿçûêà ïàñêàëü.
È åñòüobject...end;Àíàëîãè êëàññîâ.Äëÿ java.  íåì íåò çàïèñåé â èõ îáû÷íîì ñìûñëå, íî åñòü êëàññû.Îòäåëüíî ðàññìîòðèì ÿçûê Ñ#. Struct â Ñ# ýòî íå ñîâñåì òî, ÷òî åñòü â Java. Èì òðåáîâàëàñü ñòðóêòóðà,êàê ïðîñòî ïîñëåäîâàòåëüíîñòü îáúåêòîâ ïîñëåäîâàòåëüíî ðàçìåùåííûõ â ïàìÿòè. Íàïðèìåð:class Point{public int x;public int y;};void DrawLine (Point[] points);Òî åñòü ïåðåäàåòñÿ ìàññèâ óêàçàòåëåé íà îáúåêòû êëàññà. Äëÿ ïåðåäà÷è òðåáóåòñÿ ñîçäàòü ìàññèâ, ïîòîìóíè÷òîæèòü ìàññèâ, ÷òî òðåáóåò îãðîìíûõ çàòðàò ïàìÿòè.
Ïðè ýòîì ýòîò ìàññèâ òðåáóåòñÿ òîëüêî äëÿ õðàíåíèÿ òî÷åê, òî åñòü íå îïòèìàëüíî èñïîëüçîâàòü êëàññû ïðîñòî êàê êîíòåéíåðû äëÿ îáúåêòîâ. Ïîýòîìó áûëîââåäåíî ïîíÿòèå ñòðóêòóðû, ñèíòàêñèñ îáúÿâëåíèÿ ñòðóêòóðû è êëàññà àíàëîãè÷åí, ïðè ýòîì íåò íèêàêèõîòëè÷èè îò êëàññ (â òîì ÷èñëå è ïðàâà äîñòóïà), êðîìå òîãî ÷òî ñòðóêòóðà íå èìååò ðåôåðåíöèàëüíîñòè, òîåñòü îòíîñèòñÿ ê òèïàì çíà÷åíèé è ðàçìåùàåòñÿ íå â äèíàìè÷åñêîé ïàìÿòè. Òî åñòüpoint[] points = new point[1000]; Òî â ñëó÷àå ñòðóêòóðû ýòî áóäåò èìåííî ìàññèâ îáúåêòîâ íî íå óêàçàòåëåé.Ïðè ýòîì ðàñïðåäåëåíèå ïàìÿòè èäåò îäíèì êóñêîì. Ñ# íå ñóùåñòâóåò ãëîáàëüíîé ïåðåìåííûõ, çà èñêëþ÷åíèåì èõ íåêîòîðûõ àíàëîãîâ ñòàòè÷åñêèõ÷ëåíîâ êëàññà.
Òàê æå íåò ãëîáàëüíûõ ôóíêöèé. Äëÿ òàêèõ ñòðóêòóð îïðåäåëåíû îïåðàöèè ðàçâåðòêè / çàâåðòûâàíèÿ â êëàññû, ÷òî ïîçâîëÿåò ðàáîòàòü ñ íèìè êàê ñ îáû÷íûìè êëàññàìè.Point p1 = o[1];//íåëüçÿPoint p1 = point(o[1]);// íîðìàëüíîÏðè ýòîì äëÿ ñòðóêòóð íåëüçÿ ïåðåãðóæàòü êîíñòðóêòîð óìîë÷àíèÿ.
Ïðè ñîçäàíèè ìàññèâà âñåãäà çàïóñêàåòñÿ êîíñòðóêòîð ïî óìîë÷àíèþ äëÿ ñòðóêòóð. Äëÿ îáúåêòîâ êëàññà òàêîé ïðîáëåìû íåò, òàê êàê òàììîæíî ÿâíî âûçâàòü êîíñòðóêòîð.Äðóãèå òèïû äàííûõ.Ïî èäåå èõ íåò. Åäèíñòâåííûé ßÏ êîòîðûé èìååò äîï òèïû Ïàñêàëü, â êîòîðîì åñòü âñòðîåííûå òèïûè îïåðàöèè ââîäà âûâîäà.