Îñíîâû îáúåêòíî-îðèåíòèðîâàííîãî ïðîãðàììèðîâàíèÿ
27 ôåâðàëÿ 2012 ã.
Îãëàâëåíèå
1 Êà÷åñòâî ÏÎ
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
1.1
Âíåøíèå è âíóòðåííèå ôàêòîðû
1.2
Îáçîð âíåøíèõ ôàêòîðîâ
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
1.3
Î ïðîãðàììíîì ñîïðîâîæäåíèè . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
2 Ïðîåêòèðîâàíèå ïî êîíòðàêòó: ïîñòðîåíèå íàäåæíîãî ÏÎ
2
12
2.1
Áàçèñíûå ìåõàíèçìû íàäåæíîñòè . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2
Î êîððåêòíîñòè ÏÎ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
2.3
Âûðàæåíèå ñïåöèôèêàöèé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
2.4
Ââåäåíèå óòâåðæäåíèé â ïðîãðàììíûå òåêñòû
15
2.5
ïðèìåð Êëàññ ñòåê
2.6
Êîíòðàêòû è íàäåæíîñòü ÏÎ
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
12
16
17
Âîïðîñ 1
Êà÷åñòâî ÏÎ
Êà÷åñòâî - ýòî öåëü èíæåíåðíîé äåÿòåëüíîñòè; ïîñòðîåíèå êà÷åñòâåííîãî ïðîãðàììíîãî îáåñïå÷åíèÿ (ÏÎ)
(software) - öåëü ïðîãðàììíîé èíæåíåðèè (software engineering).
Îïðåäåëåíèå 1.
ÏÎ ýòî íàáîð ïðîãðàìì è ñîîòâåòñòâóþùàÿ èì äîêóìåíòàöèÿ.
 äàííîì ïîñîáèè ðàññìàòðèâàþòñÿ ñðåäñòâà è òåõíè÷åñêèå ïðèåìû, ïîçâîëÿþùèå çíà÷èòåëüíî óëó÷øèòü êà÷åñòâî ÏÎ. Ïðåæäå ÷åì ïðèñòóïèòü ê èçó÷åíèþ ýòèõ ñðåäñòâ è ïðèåìîâ, ñëåäóåò õîðîøî ïðåäñòàâëÿòü íàøó öåëü. Êà÷åñòâî ÏÎ ëó÷øå âñåãî îïèñûâàåòñÿ êîìáèíàöèåé ðÿäà ôàêòîðîâ.  ýòîé ëåêöèè
ìû ïîñòàðàåìñÿ ïðîàíàëèçèðîâàòü íåêîòîðûå èç íèõ, è ïîêàæåì, ãäå íåîáõîäèìû óëó÷øåíèÿ.
1.1
Âíåøíèå è âíóòðåííèå ôàêòîðû
Âñå ìû õîòèì, ÷òîáû íàøå ÏÎ áûëî áûñòðîäåéñòâóþùèì, íàäåæíûì, ëåãêèì â èñïîëüçîâàíèè, ÷èòàåìûì, ìîäóëüíûì, ñòðóêòóðíûì è ò.ä. Íî ýòè îïðåäåëåíèÿ îïèñûâàþò äâà ðàçíûõ òèïà êà÷åñòâà. Íàëè÷èå
èëè îòñóòñòâèå òàêèõ êà÷åñòâ, êàê ñêîðîñòü è ïðîñòîòà èñïîëüçîâàíèÿ ÏÎ, ìîæåò áûòü îáíàðóæåíî åãî
ïîëüçîâàòåëÿìè. Ýòè êà÷åñòâà ìîæíî íàçâàòü âíåøíèìè ôàêòîðàìè êà÷åñòâà.
Ïîä ñëîâîì ïîëüçîâàòåëè íóæíî ïîíèìàòü íå òîëüêî ëþäåé, âçàèìîäåéñòâóþùèõ ñ êîíå÷íûì ïðîäóêòîì, íî è òåõ, êòî èõ çàêóïàåò, çàíèìàåòñÿ àäìèíèñòðèðîâàíèåì. Òàêîå ñâîéñòâî, íàïðèìåð, êàê ëåãêîñòü
àäàïòàöèè ïðîäóêòîâ ê èçìåíåíèÿì ñïåöèôèêàöèé - äàëåå îïðåäåëåííàÿ â íàøåé äèñêóññèè êàê ðàñøèðÿåìîñòü - ïîïàäàåò â êàòåãîðèþ âíåøíèõ ôàêòîðîâ, ïîñêîëüêó îíà ìîæåò ïðåäñòàâëÿòü èíòåðåñ äëÿ
àäìèíèñòðàòîðîâ, çàêóïàþùèõ ïðîäóêò, õîòÿ è íå âàæíà äëÿ êîíå÷íûõ ïîëüçîâàòåëåé, íåïîñðåäñòâåííî
ðàáîòàþùèõ ñ ïðîäóêòîì.
Òàêèå õàðàêòåðèñòèêè ÏÎ, êàê ìîäóëüíîñòü èëè ÷èòàåìîñòü, ÿâëÿþòñÿ âíóòðåííèìè ôàêòîðàìè, ïîíÿòíûìè òîëüêî äëÿ ïðîôåññèîíàëîâ, èìåþùèõ äîñòóï ê òåêñòó ÏÎ.
 êîíå÷íîì ñ÷åòå, òîëüêî âíåøíèå ôàêòîðû èìåþò çíà÷åíèå. Íî êëþ÷ ê äîñòèæåíèþ âíåøíèõ ôàêòîðîâ ñïðÿòàí âî âíóòðåííèõ ôàêòîðàõ: äëÿ òîãî, ÷òîáû äîñòè÷ü âèäèìîãî êà÷åñòâà, ïðîåêòèðîâùèêè
è êîíñòðóêòîðû äîëæíû èìåòü âíóòðåííèå ïðèåìû, ïîçâîëÿþùèå óëó÷øàòü ñêðûòûå îò ïîëüçîâàòåëÿ
êà÷åñòâà.
1.2
Îáçîð âíåøíèõ ôàêòîðîâ
Ðàññìîòðèì ñàìûå âàæíûå âíåøíèå ôàêòîðû êà÷åñòâà, ñòðåìëåíèå ê êîòîðûì åñòü öåíòðàëüíàÿ çàäà÷à
ÎÎ-ïîñòðîåíèÿ ÏÎ.
Êîððåêòíîñòü (Correctness)
Îïðåäåëåíèå 2.
Êîððåêòíîñòü - ýòî ñïîñîáíîñòü ÏÎ âûïîëíÿòü òî÷íûå çàäà÷è òàê, êàê îíè îïðåäåëåíû
èõ ñïåöèôèêàöèåé.
2
Ðèñ. 1.1: Ñëîè â ðàçðàáîòêå ÏÎ
Ðèñ. 1.2: Óðîâíè â ïðîöåññå ðàçðàáîòêè, âêëþ÷àþùåì ïîâòîðíîå èñïîëüçîâàíèå
Êîððåêòíîñòü ÿâëÿåòñÿ âàæíåéøèì êà÷åñòâîì. Åñëè ñèñòåìà íå äåëàåò òîãî, ÷òî îíà äîëæíà äåëàòü,
òî âñå îñòàëüíîå - åå áûñòðîäåéñòâèå, õîðîøèé ïîëüçîâàòåëüñêèé èíòåðôåéñ - íå èìååò îñîáîãî çíà÷åíèÿ.
Ìåòîäû îáåñïå÷åíèÿ êîððåêòíîñòè îáû÷íî óñëîâíû. Ñåðüåçíàÿ ñèñòåìà ÏÎ, äàæå íåáîëüøàÿ ïî íûíåøíèì ìåðêàì, èñïîëüçóåò ñòîëü ìíîãîå, ÷òî íåâîçìîæíî ãàðàíòèðîâàòü åå êîððåêòíîñòü, ðàáîòàÿ ñî
âñåìè êîìïîíåíòàìè íà îäíîì óðîâíå. Íåîáõîäèì ìíîãîóðîâíåâûé ïîäõîä:  óñëîâíîì ïîäõîäå ê êîððåêòíîñòè ìû çàáîòèìñÿ òîëüêî î òîì, ÷òîáû îáåñïå÷èòü êîððåêòíîñòü êàæäîãî óðîâíÿ, îñíîâûâàÿñü íà
ïðåäïîëîæåíèè, ÷òî íèæåëåæàùèå óðîâíè êîððåêòíû. Ýòî åäèíñòâåííî ðåàëèñòè÷íûé ïîäõîä, ïîñêîëüêó
îí ïîçâîëÿåò ðàçäåëèòü ïðîáëåìó è íà êàæäîé ñòóïåíè ñêîíöåíòðèðîâàòüñÿ íà îãðàíè÷åííîì êðóãå çàäà÷. Íåëüçÿ ïðîâåðèòü, ÷òî ïðîãðàììà íà ÿçûêå âûñîêîãî óðîâíÿ êîððåêòíà, åñëè íå ïðåäïîëîæèòü, ÷òî
èñïîëüçóåìûé êîìïèëÿòîð êîððåêòíî ðåàëèçóåò ÿçûê. Ýòî íå ñëåïîå äîâåðèå êîìïèëÿòîðó, à ðàçäåëåíèå
ïðîáëåìû íà äâå: ïðîâåðêà êîððåêòíîñòè êîìïèëÿòîðà è ïðîâåðêà êîððåêòíîñòè ïðîãðàììû îòíîñèòåëüíî
ñåìàíòèêè ÿçûêà.
Çäåñü òàêæå ïðèìåíèì óñëîâíûé ïîäõîä: ñëåäóåò îáåñïå÷èòü êîððåêòíîñòü áèáëèîòåê è êîððåêòíîñòü
ïðèëîæåíèÿ ïðè óñëîâèè, ÷òî áèáëèîòåêè êîððåêòíû.
Ìíîãèå ïðàêòèêè ïîëàãàþò, ÷òî äîñòèæåíèå êîððåêòíîñòè ÏÎ ñâÿçàíî ñ òåñòèðîâàíèåì è èñïðàâëåíèåì îøèáîê.  äàëüíåéøèõ ëåêöèÿõ èññëåäóåòñÿ ðÿä òåõíè÷åñêèõ ïðèåìîâ, â ÷àñòíîñòè òèïèçàöèÿ è ìåòîä
óòâåðæäåíèé, íàïðàâëåííûõ íà ïîñòðîåíèå ÏÎ, êîððåêòíîãî ñ ñàìîãî íà÷àëà. Èñïðàâëåíèå îøèáîê è òåñòèðîâàíèå, êîíå÷íî, îñòàþòñÿ íåîáõîäèìûìè êàê ñðåäñòâà äîïîëíèòåëüíîé ïðîâåðêè ðåçóëüòàòà. Ìîæíî
áûëî áû ïîéòè äàëüøå è ïðèíÿòü ñîâñåì ôîðìàëüíûé ïîäõîä ê ïîñòðîåíèþ ÏÎ. Ýòî íå ÿâëÿåòñÿ öåëüþ
íàøèõ ëåêöèé, êàê ÿñíî èç íåñêîëüêî ðîáêèõ òåðìèíîâ - ïðîâåðÿòü, ãàðàíòèðîâàòü, îáåñïå÷èâàòü,
èñïîëüçóåìûõ âûøå âìåñòî ñëîâà äîêàçûâàòü. Âñå æå ìíîãèå èç îïèñàííûõ íèæå òåõíè÷åñêèõ ïðèåìîâ ïðîèñõîäÿò íåïîñðåäñòâåííî îò ìàòåìàòè÷åñêèõ ìåòîäîâ ôîðìàëüíîé ñïåöèôèêàöèè è âåðèôèêàöèè
ïðîãðàìì, ïðîõîäÿ äëèííûé ïóòü ê îáåñïå÷åíèþ èäåàëà êîððåêòíîñòè.
Óñòîé÷èâîñòü (Robustness)
Îïðåäåëåíèå 3.
Óñòîé÷èâîñòü - ýòî ñïîñîáíîñòü ÏÎ ñîîòâåòñòâóþùèì îáðàçîì ðåàãèðîâàòü íà àâà-
ðèéíûå ñèòóàöèè.
3
Ðèñ. 1.3: Óñòîé÷èâîñòü ïðîòèâ êîððåêòíîñòè
Óñòîé÷èâîñòü äîïîëíÿåò êîððåêòíîñòü. Êîððåêòíîñòü îòíîñèòñÿ ê ïîâåäåíèþ ñèñòåìû â ñëó÷àÿõ, îïðåäåëåííûõ ñïåöèôèêàöèåé; óñòîé÷èâîñòü õàðàêòåðèçóåò òî, ÷òî ïðîèñõîäèò çà ïðåäåëàìè ýòîé ñïåöèôèêàöèè. Êàê âèäíî èç îïðåäåëåíèÿ, óñòîé÷èâîñòü ïî ñâîåé ïðèðîäå áîëåå íå÷åòêîå ïîíÿòèå, ÷åì êîððåêòíîñòü. Íåâîçìîæíî ñêàçàòü, êàê â ñëó÷àå ñ êîððåêòíîñòüþ, ÷òî â àâàðèéíûõ ñèòóàöèÿõ ñèñòåìà äîëæíà
âûïîëíÿòü ñâîè çàäà÷è, ïîñêîëüêó ñèòóàöèè âûõîäÿò çà ïðåäåëû ñïåöèôèêàöèè. Åñëè áû ýòè çàäà÷è
áûëè èçâåñòíû, àâàðèéíûé ñëó÷àé ñòàë áû ÷àñòüþ ñïåöèôèêàöèè, è ìû áû ñíîâà âåðíóëèñü â îáëàñòü
êîððåêòíîñòè.
Ýòî îïðåäåëåíèå àâàðèéíîé ñèòóàöèè íàì åùå ïîíàäîáèòñÿ ïðè èçó÷åíèè îáðàáîòêè èñêëþ÷åíèé.
Îíî ïîäðàçóìåâàåò, ÷òî ïîíÿòèÿ íîðìàëüíîé è àâàðèéíîé ñèòóàöèè âñåãäà îòíîñèòåëüíû ïî îòíîøåíèþ
ê çàäàííîé ñïåöèôèêàöèè; ñèòóàöèÿ àâàðèéíà, åñëè îíà âûõîäèò çà ðàìêè ñïåöèôèêàöèè. Åñëè ðàñøèðèòü ñïåöèôèêàöèþ, àâàðèéíûå ñëó÷àè ñòàíîâÿòñÿ íîðìàëüíûìè - äàæå åñëè îíè ñîîòâåòñòâóþò òàêèì
íåæåëàòåëüíûì ñîáûòèÿì, êàê, íàïðèìåð, îøèáî÷íûé ââîä ïîëüçîâàòåëÿ.
Âñåãäà áóäóò ñóùåñòâîâàòü ñëó÷àè, íà êîòîðûå ñïåöèôèêàöèÿ ÿâíî íå ðàñïðîñòðàíÿåòñÿ. Ðîëü òðåáîâàíèÿ óñòîé÷èâîñòè - óäîñòîâåðèòüñÿ, ÷òî è â òàêèõ ñëó÷àÿõ ñèñòåìà íå ïðèâîäèò ê íåïîïðàâèìîé ñèòóàöèè;
îíà äîëæíà âûäàòü ñîîòâåòñòâóþùåå ñîîáùåíèå îá îøèáêå, ãëàäêî çàâåðøèòü ðàáîòó èëè âîéòè â òàê
íàçûâàåìûé ðåæèì ïîñòåïåííîãî âûâîäà èç ðàáîòû.
Ðàñøèðÿåìîñòü (Extendibility)
Îïðåäåëåíèå 4.
Ðàñøèðÿåìîñòü - ýòî ëåãêîñòü àäàïòàöèè ÏÎ ê èçìåíåíèÿì ñïåöèôèêàöèè.
Ïðîáëåìà ðàñøèðÿåìîñòè ýòî ïðîáëåìà ìàñøòàáà. Äëÿ ìàëåíüêèõ ïðîãðàìì èçìåíåíèå íå ÿâëÿåòñÿ
îáû÷íî áîëüøîé ïðîáëåìîé, íî ïî ìåðå óâåëè÷åíèÿ ÏÎ àäàïòàöèÿ ñòàíîâèòñÿ âñå òðóäíåå. Áîëüøàÿ ïðîãðàììíàÿ ñèñòåìà ÷àñòî âèäèòñÿ êàê îãðîìíûé êàðòî÷íûé äîì, óäàëåíèå îäíîãî ýëåìåíòà ìîæåò ïðèâåñòè
ê ðàçðóøåíèþ âñåãî ïîñòðîåíèÿ.
Òðàäèöèîííûå ïîäõîäû ê ïîñòðîåíèþ ÏÎ íå óäåëÿëè äîëæíîãî âíèìàíèÿ èçìåíåíèÿì. Îíè ñêîðåå
èñõîäèëè èç èäåàëüíîãî âçãëÿäà íà æèçíåííûé öèêë ÏÎ, ãäå òðåáîâàíèÿ çàìîðàæèâàþòñÿ ïîñëå çàâåðøåíèÿ ïåðâîíà÷àëüíîé ñòóïåíè àíàëèçà. Ïîñëåäóþùèé ïðîöåññ ïîñâÿùàëñÿ ïðîåêòèðîâàíèþ è ïîñòðîåíèþ
ðåøåíèÿ ïðè ôèêñèðîâàííûõ òðåáîâàíèÿõ. Ýòî âïîëíå ïîíÿòíî: íà òîì ýòàïå ðàçâèòèÿ äèñöèïëèíû çàäà÷à ñîñòîÿëà â ðàçðàáîòêå íàäåæíûõ òåõíè÷åñêèõ ïðèåìîâ äëÿ ïîñòàíîâêè è ðåøåíèÿ ôèêñèðîâàííûõ
ïðîáëåì. Íî ñåé÷àñ ñòàëî âîçìîæíûì ïðèçíàòü è ðàññìîòðåòü öåíòðàëüíûé âîïðîñ - ÷òî äåëàòü, åñëè
ïðîáëåìà èçìåíÿåòñÿ â õîäå åå ðåøåíèÿ. Èçìåíåíèÿ õàðàêòåðíû äëÿ ïðîöåññà ðàçðàáîòêè ÏÎ: ìåíÿþòñÿ
òðåáîâàíèÿ, íàøå ïîíèìàíèå òðåáîâàíèé, àëãîðèòìû, ïðåäñòàâëåíèå äàííûõ, ïðèåìû ðåàëèçàöèè. Ïîääåðæêà èçìåíåíèé ÿâëÿåòñÿ îñíîâíîé öåëüþ îáúåêòíîé òåõíîëîãèè è ïîñòîÿííîé òåìîé íàøèõ ëåêöèé.
Õîòÿ ìíîãèå èç òåõíè÷åñêèõ ïðèåìîâ, óëó÷øàþùèõ ðàñøèðÿåìîñòü, ìîæíî îáúÿñíèòü âî ââîäíûõ
êóðñàõ è íà íåáîëüøèõ ïðèìåðàõ, èõ çíà÷èìîñòü ñòàíîâèòñÿ ÿâíîé òîëüêî äëÿ áîëüøèõ ïðîåêòîâ. Äëÿ
óëó÷øåíèÿ ðàñøèðÿåìîñòè âàæíû äâà ïðèíöèïà:
• Ïðîñòîòà ïîñòðîåíèÿ : ïðîñòàÿ àðõèòåêòóðà ëåã÷å àäàïòèðóåòñÿ ê èçìåíåíèÿì, ÷åì ñëîæíàÿ.
• Äåöåíòðàëèçàöèÿ : ÷åì áîëåå àâòîíîìíû ìîäóëè, òåì âûøå âåðîÿòíîñòü òîãî, ÷òî ïðîñòîå èçìåíåíèå
çàòðîíåò òîëüêî îäèí èëè íåáîëüøîå êîëè÷åñòâî ìîäóëåé è íå âûçîâåò öåïíóþ ðåàêöèþ èçìåíåíèé
âî âñåé ñèñòåìå.
4
Ïîâòîðíîå èñïîëüçîâàíèå (Reusability)
Îïðåäåëåíèå 5.
Ïîâòîðíîå èñïîëüçîâàíèå åñòü ñïîñîáíîñòü ýëåìåíòîâ ÏÎ ñëóæèòü äëÿ ïîñòðîåíèÿ
ìíîãèõ ðàçëè÷íûõ ïðèëîæåíèé.
Íåîáõîäèìîñòü è âîçìîæíîñòü ïîâòîðíîãî èñïîëüçîâàíèÿ âîçíèêàåò èç íàáëþäåíèé ñõîäñòâà ñèñòåì ñèñòåìû ÏÎ ÷àñòî èìåþò ïîõîæóþ ñõåìó. Ñëåäóåò èñïîëüçîâàòü ýòî ñõîäñòâî è íå èçîáðåòàòü âåëîñèïåä
çàíîâî. Ïîíèìàíèå ýòîé ñõåìû äàñò âîçìîæíîñòü ïîâòîðíî ïðèìåíÿòü ñîçäàííûé ýëåìåíò ÏÎ âî ìíîãèõ
äðóãèõ ðàçðàáîòêàõ.
Ïîâòîðíîå èñïîëüçîâàíèå âëèÿåò íà âñå îñòàëüíûå àñïåêòû êà÷åñòâà ÏÎ. Ïîñêîëüêó ðåøåíèå ïðîáëåìû ïîâòîðíîãî èñïîëüçîâàíèÿ â ñóùíîñòè îçíà÷àåò, ÷òî íóæíî ïèñàòü ìåíüøå ïðîãðàìì, ñëåäîâàòåëüíî,
ìîæíî ïðèëàãàòü áîëüøå óñèëèé (ïðè òîé æå îáùåé ñòîèìîñòè) ê óëó÷øåíèþ äðóãèõ ôàêòîðîâ, òàêèõ
êàê, íàïðèìåð, êîððåêòíîñòü è óñòîé÷èâîñòü.
Ñîâìåñòèìîñòü (Compatibility)
Îïðåäåëåíèå 6.
Ñîâìåñòèìîñòü - ýòî ëåãêîñòü ñî÷åòàíèÿ îäíèõ ýëåìåíòîâ ÏÎ ñ äðóãèìè.
Ñîâìåñòèìîñòü âàæíà, ïîñêîëüêó ìû íå ðàçðàáàòûâàåì ýëåìåíòû ÏÎ â âàêóóìå: èì íåîáõîäèìî âçàèìîäåéñòâîâàòü äðóã ñ äðóãîì. Íî ïðè ýòîì ñëèøêîì ÷àñòî âîçíèêàþò ïðîáëåìû, ïîñêîëüêó ñóæäåíèÿ
ðàçíûõ ýëåìåíòîâ îá îñòàëüíîì ìèðå ïðîòèâîðå÷èâû. Ïðîñòåéøèì ïðèìåðîì ìîæåò ñëóæèòü øèðîêîå
ðàçíîîáðàçèå íåñîâìåñòèìûõ ôàéëîâûõ ôîðìàòîâ, èç-çà ÷åãî, íàïðèìåð, îäíà ïðîãðàììà íå ìîæåò íåïîñðåäñòâåííî èñïîëüçîâàòü ðåçóëüòàò ðàáîòû äðóãîé ïðîãðàììû.
Êëþ÷ ê ñîâìåñòèìîñòè íàõîäèòñÿ â îäíîðîäíîñòè ïîñòðîåíèÿ è â ñòàíäàðòíûõ ñîãëàøåíèÿõ íà êîììóíèêàöèè ìåæäó ïðîãðàììàìè. Ýòè ïîäõîäû âêëþ÷àþò:
• Ñòàíäàðòíûå ôîðìàòû ôàéëîâ, êàê â ñèñòåìå Unix, ãäå êàæäûé òåêñòîâûé ôàéë - ýòî ïðîñòî ïîñëåäîâàòåëüíîñòü ñèìâîëîâ.
• Ñòàíäàðòíûå ñòðóêòóðû äàííûõ, êàê â ñèñòåìå Lisp, ãäå âñå äàííûå, à òàêæå ïðîãðàììû, ïðåäñòàâëåíû áèíàðíûìè äåðåâüÿìè (íàçûâàåìûìè ñïèñêàìè).
• Ñòàíäàðòíûå ïîëüçîâàòåëüñêèå èíòåðôåéñû, êàê â ðàçëè÷íûõ âåðñèÿõ Windows, Unix/Linux è MacOS,
ãäå âñå èíñòðóìåíòû îïèðàþòñÿ íà åäèíóþ ïàðàäèãìó äëÿ êîììóíèêàöèè ñ ïîëüçîâàòåëåì, îñíîâàííóþ íà ñòàíäàðòíûõ êîìïîíåíòàõ, òàêèõ êàê îêíà, çíà÷êè, ìåíþ è ò. ä.
Áîëüøàÿ îáùíîñòü äîñòèãàåòñÿ ïðè îïðåäåëåíèè ñòàíäàðòíûõ ïðîòîêîëîâ äîñòóïà êî âñåì âàæíûì ýëåìåíòàì, óïðàâëÿåìûì ïðîãðàììàìè. Òàêîâà èäåÿ, ëåæàùàÿ â îñíîâå àáñòðàêòíûõ òèïîâ äàííûõ è ÎÎïîäõîäà, à òàêæå òàê íàçûâàåìîãî ñâÿçóþùåãî ïðîãðàììíîãî îáåñïå÷åíèÿ (middleware), íàïðèìåð CORBA
è Microsoft's OLE-COM (ActiveX).
Ýôôåêòèâíîñòü (Eciency)
Îïðåäåëåíèå 7.
Ýôôåêòèâíîñòü - ýòî ñïîñîáíîñòü ÏÎ êàê ìîæíî ìåíüøå çàâèñåòü îò ðåñóðñîâ îáîðóäî-
âàíèÿ: ïðîöåññîðíîãî âðåìåíè, ïðîñòðàíñòâà, çàíèìàåìîãî âî âíóòðåííåé è âíåøíåé ïàìÿòè, ïðîïóñêíîé
ñïîñîáíîñòè, èñïîëüçóåìîé â óñòðîéñòâàõ ñâÿçè.
Ïî÷òè ñèíîíèìîì ýôôåêòèâíîñòè ÿâëÿåòñÿ ñëîâî ïðîèçâîäèòåëüíîñòü (performance).  ïðîãðàììèñòñêîì ñîîáùåñòâå åñòü äâà òèïè÷íûõ îòíîøåíèÿ ê ýôôåêòèâíîñòè:
• Íåêîòîðûå ðàçðàáîò÷èêè îäåðæèìû ïðîáëåìàìè ïðîèçâîäèòåëüíîñòè, ÷òî çàñòàâëÿåò èõ ïðèëàãàòü
ìíîãî óñèëèé ê ïðåäïîëàãàåìîé îïòèìèçàöèè.
• Ñóùåñòâóåò îáùàÿ òåíäåíöèÿ íåäîîöåíêè âîïðîñîâ ýôôåêòèâíîñòè, âûòåêàþùàÿ èç ñïðàâåäëèâûõ
óáåæäåíèé, ñóùåñòâóþùèõ â ïðîìûøëåííîñòè:ñäåëàé ïðàâèëüíî, ïðåæäå ÷åì ñäåëàòü áûñòðî è
ìîäåëü êîìïüþòåðà áóäóùåãî ãîäà âñå ðàâíî áóäåò íà 50% áûñòðåå.
Ïîñòîÿííîå óâåëè÷åíèå êîìïüþòåðíîé ìîùè, êàêèì áû îíî íè áûëî âïå÷àòëÿþùèì, íå ìîæåò çàìåíèòü
ýôôåêòèâíîñòü, ïî êðàéíåé ìåðå, ïî òðåì ïðè÷èíàì:
5
• Òîò, êòî ïîêóïàåò áîëüøèé è áîëåå áûñòðûé êîìïüþòåð, õî÷åò âèäåòü äåéñòâèòåëüíûå âûãîäû îò
äîïîëíèòåëüíîé ìîùíîñòè - ðåøàòü íîâûå çàäà÷è, áîëåå áûñòðî ðàáîòàòü ñî ñòàðûìè çàäà÷àìè,
ðåøàòü áîëåå âàæíûå âåðñèè ñòàðûõ çàäà÷ çà òî æå âðåìÿ. Åñëè íîâûé êîìïüþòåð ðåøàåò ñòàðûå
çàäà÷è çà òî æå ñàìîå âðåìÿ - ýòî íåõîðîøî!
• ßâíûé ýôôåêò ïîâûøåíèÿ ìîùíîñòè êîìïüþòåðà ñêàçûâàåòñÿ òîãäà, êîãäà âåëèêà äîëÿ õîðîøèõ
àëãîðèòìîâ ïî îòíîøåíèþ ê ïëîõèì. Ïðåäïîëîæèì, ÷òî íîâàÿ ìàøèíà ðàáîòàåò â äâà ðàçà áûñòðåå,
÷åì ñòàðàÿ. Ïóñòü n - ðàçìåð ðåøàåìîé çàäà÷è, à N - ìàêñèìàëüíûé ðàçìåð, ïðè êîòîðîì óäàåòñÿ
ðåøèòü çàäà÷ó íà ñòàðîì êîìïüþòåðå çà ïðèåìëåìîå âðåìÿ. Åñëè èñïîëüçóåòñÿ ëèíåéíûé àëãîðèòì,
âðåìåííàÿ ñëîæíîñòü êîòîðîãî O(n) , òî íîâûé êîìïüþòåð äàñò âîçìîæíîñòü ðåøèòü çàäà÷ó âäâîå
2
áîëüøåãî ðàçìåðà - 2∗N . Äëÿ êâàäðàòè÷íîãî àëãîðèòìà ñî ñëîæíîñòüþ O(n ) óâåëè÷åíèå N ñîñòàâèò
n
òîëüêî 41%. Ïåðåáîðíûé àëãîðèòì ñî ñëîæíîñòüþ O(2
) äîáàâèò ê N òîëüêî åäèíèöó - íåáîëüøîå
óëó÷øåíèå çà òàêèå äåíüãè.
•  íåêîòîðûõ ñëó÷àÿõ ýôôåêòèâíîñòü ìîæåò âëèÿòü íà êîððåêòíîñòü. Ñïåöèôèêàöèÿ ìîæåò óñòàíàâëèâàòü, ÷òî îòâåò êîìïüþòåðà íà îïðåäåëåííîå ñîáûòèå äîëæåí ïðîèçîéòè íå ïîçæå, ÷åì çà
îïðåäåëåííîå âðåìÿ, íàïðèìåð, áîðòîâîé êîìïüþòåð äîëæåí áûòü ãîòîâ îïðåäåëèòü è îáðàáîòàòü
ñîîáùåíèå ñ ñåíñîðà ðû÷àãà óïðàâëåíèÿ äâèãàòåëÿ äîñòàòî÷íî áûñòðî, ÷òîáû ñðàáîòàëî êîððåêòèðóþùåå äåéñòâèå. Ýòà ñâÿçü ìåæäó ýôôåêòèâíîñòüþ è êîððåêòíîñòüþ íå îãðàíè÷èâàåòñÿ ïðèëîæåíèÿìè, ðàáîòàþùèìè â ðåàëüíîì âðåìåíè; íåìíîãèå ëþäè çàèíòåðåñóþòñÿ ìîäåëüþ ïðåäñêàçàíèÿ
ïîãîäû, êîòîðîé òðåáóåòñÿ 24 ÷àñà, ÷òîáû ïðåäñêàçàòü ïîãîäó íà çàâòðà.
Ïåðåíîñèìîñòü (Portability)
Îïðåäåëåíèå 8.
Ïåðåíîñèìîñòü - ýòî ëåãêîñòü ïåðåíîñà ÏÎ â ðàçëè÷íûå ïðîãðàììíûå è àïïàðàòíûå
ñðåäû.
Ïåðåíîñèìîñòü èìååò äåëî ñ ðàçíîîáðàçèåì íå òîëüêî ôèçè÷åñêîãî îáîðóäîâàíèÿ, íî ÷àùå àïïàðàòíîïðîãðàììíîãî ìåõàíèçìà, òîãî, êîòîðûé ìû äåéñòâèòåëüíî ïðîãðàììèðóåì, âêëþ÷àþùåãî îïåðàöèîííóþ
ñèñòåìó, ñèñòåìó îêîí, åñëè îíà ïðèìåíÿåòñÿ, è äðóãèå îñíîâíûå èíñòðóìåíòû.
Ïðîñòîòà èñïîëüçîâàíèÿ (Easy of Use)
Îïðåäåëåíèå 9.
Ïðîñòîòà èñïîëüçîâàíèÿ - ýòî ëåãêîñòü, ñ êîòîðîé ëþäè ñ ðàçëè÷íûìè çíàíèÿìè è
êâàëèôèêàöèåé ìîãóò íàó÷èòüñÿ èñïîëüçîâàòü ÏÎ è ïðèìåíÿòü åãî äëÿ ðåøåíèÿ çàäà÷. Ñþäà òàêæå
îòíîñèòñÿ ïðîñòîòà óñòàíîâêè, ðàáîòû è òåêóùåãî êîíòðîëÿ.
Îïðåäåëåíèå ïîä÷åðêèâàåò íàëè÷èå ðàçëè÷íûõ óðîâíåé îïûòíîñòè ïîòåíöèàëüíûõ ïîëüçîâàòåëåé. Ýòî
òðåáîâàíèå ñòàâèò îäíó èç âàæíûõ ïðîáëåì ïåðåä ïðîåêòèðîâùèêàìè ÏÎ, çàíèìàþùèìèñÿ ïðîñòîòîé èñïîëüçîâàíèÿ: êàê îáåñïå÷èòü ïîäðîáíîå ðóêîâîäñòâî è îáúÿñíåíèÿ íà÷èíàþùèì ïîëüçîâàòåëÿì, íå ìåøàÿ
óìåëûì ïîëüçîâàòåëÿì, êîòîðûå ñðàçó õîòÿò ïðèíÿòüñÿ çà ðàáîòó?
Æåëàòåëüíî, ÷òîáû ïðîåêòèðîâùèêè ÏÎ, îçàáî÷åííûå ïðîñòîòîé èñïîëüçîâàíèÿ, ñ íåêîòîðûì íåäîâåðèåì ðàññìàòðèâàëè ïðèíöèï çíàé ïîëüçîâàòåëÿ. Ïîäðàçóìåâàåòñÿ, ÷òî õîðîøèé ïðîåêòèðîâùèê äîëæåí
ïðèëîæèòü óñèëèå äëÿ ïîíèìàíèÿ òîãî, äëÿ êàêèõ ïîëüçîâàòåëåé ïðåäíàçíà÷åíà ñèñòåìà. Ýòîò âçãëÿä
èãíîðèðóåò îäíî èç ñâîéñòâ óñïåøíîé ñèñòåìû: îíà âñåãäà âûõîäèò çà ïðåäåëû ïðåäïîëàãàåìîãî êðóãà
ïîëüçîâàòåëåé. Íàïîìíþ äâà ñòàðûõ èçâåñòíûõ ïðèìåðà - ÿçûê Fortran ðàçðàáàòûâàëñÿ êàê èíñòðóìåíò
äëÿ ðåøåíèÿ çàäà÷è íåáîëüøîãî ñîîáùåñòâà èíæåíåðîâ è ó÷åíûõ, ïðîãðàììèðóþùèõ íà IBM 704, îïåðàöèîííàÿ ñèñòåìà Unix ïðåäíàçíà÷àëàñü äëÿ âíóòðåííåãî èñïîëüçîâàíèÿ â Bell Laboratories. Ñèñòåìà,
èçíà÷àëüíî ñïðîåêòèðîâàííàÿ äëÿ îñîáîé ãðóïïû ëþäåé, èñõîäèò èç ïðåäïîëîæåíèé, êîòîðûå ïðîñòî íå
áóäóò ðàáîòàòü äëÿ áîëåå øèðîêîé ãðóïïû.
Õîðîøèå ïðîåêòèðîâùèêè ïîëüçîâàòåëüñêîãî èíòåðôåéñà ïðèäåðæèâàþòñÿ áîëåå îñìîòðèòåëüíîé ïîëèòèêè. Îíè äåëàþò êàê ìîæíî ìåíüøå ïðåäïîëîæåíèé îòíîñèòåëüíî ñâîèõ ïîëüçîâàòåëåé. Ïðè ïðîåêòèðîâàíèè èíòåðàêòèâíîé ñèñòåìû ìîæíî ñ÷èòàòü, ÷òî ïîëüçîâàòåëè ïðîñòî ëþäè è ÷òî îíè óìåþò ÷èòàòü,
äâèãàòü ìûøüþ, íàæèìàòü êíîïêè è íàáèðàòü òåêñò (ìåäëåííî), è íå áîëåå. Åñëè ÏÎ ñîçäàåòñÿ äëÿ ñïåöèàëèçèðîâàííîé îáëàñòè ïðèëîæåíèÿ, âåðîÿòíî, ìîæíî, ïðåäïîëîæèòü, ÷òî ïîëüçîâàòåëè çíàêîìû ñ åå
îñíîâíûìè êîíöåïöèÿìè. Íî äàæå ýòî ðèñêîâàííî.
Ïðèíöèï ïîñòðîåíèÿ ïîëüçîâàòåëüñêîãî èíòåðôåéñà Íå äåëàéòå âèä, ÷òî âû çíàåòå ïîëüçîâàòåëÿ -
ýòî íå òàê.
6
Ðèñ. 1.4: Êðèâûå Îñìîíäà
Ôóíêöèîíàëüíîñòü (Functionality)
Îïðåäåëåíèå 10.
Ôóíêöèîíàëüíîñòü - ýòî ñòåïåíü âîçìîæíîñòåé, îáåñïå÷èâàåìûõ ñèñòåìîé.
Îäíà èç ñàìûõ òðóäíûõ ïðîáëåì, ñ êîòîðîé ñòàëêèâàåòñÿ ðóêîâîäèòåëü ïðîåêòà, - îïðåäåëåíèå äîñòàòî÷íîé ôóíêöèîíàëüíîñòè. Âñåãäà ñóùåñòâóåò æåëàíèå äîáàâëÿòü â ñèñòåìó âñå íîâûå è íîâûå ñâîéñòâà.
Æåëàíèå, èçâåñòíîå íà ÿçûêå èíäóñòðèè êàê ôè÷åðèçì (featurism) , ÷àñòî ïîëçó÷èé ôè÷åðèçì (creeping
featurism) . Åãî ïîñëåäñòâèÿ ïëà÷åâíû äëÿ âíóòðåííèõ ïðîåêòîâ, ãäå äàâëåíèå èñõîäèò îò ðàçíûõ ãðóïï
ïîëüçîâàòåëåé âíóòðè îäíîé è òîé æå êîìïàíèè. Îíè åùå õóæå äëÿ êîììåð÷åñêèõ ïðîäóêòîâ, èñïûòûâàþùèõ äàâëåíèå, íàïðèìåð îò æóðíàëèñòñêèõ ñðàâíèòåëüíûõ îáçîðîâ, ïðåäñòàâëÿþùèõ ÷àùå âñåãî òàáëèöó,
âêëþ÷àþùóþ îäíîâðåìåííî ñâîéñòâà ðàçíûõ êîíêóðèðóþùèõ ïðîäóêòîâ.
Ðàñøèðåíèå ñâîéñòâ ñèñòåìû ïðèâîäèò ê äâóì ïðîáëåìàì, îäíà ñëîæíåå äðóãîé. Áîëåå ïðîñòàÿ ïðîáëåìà - ïîòåðÿ íåïðîòèâîðå÷èâîñòè, êîòîðàÿ ìîæåò âîçíèêíóòü ïðè äîáàâëåíèè íîâûõ ñâîéñòâ, çàòðàãèâàþùèõ ïðîñòîòó èñïîëüçîâàíèÿ. Èçâåñòíî, ÷òî ïîëüçîâàòåëè æàëóþòñÿ, ÷òî âñå óêðàøåíèÿ íîâîé âåðñèè
ïðîäóêòà äåëàþò åãî óæàñíî ñëîæíûì. Îäíàêî òàêèì êîììåíòàðèÿì íå ñòîèò ñëèøêîì äîâåðÿòü. Íîâûå
ñâîéñòâà íå âîçíèêàþò èç íè÷åãî - â îñíîâíîì îíè âîçíèêàþò èç ñïðîñà ïîëüçîâàòåëåé, äðóãèõ ïîëüçîâàòåëåé. ×òî äëÿ ìåíÿ âûãëÿäèò íåíóæíîé áåçäåëóøêîé, ìîæåò äëÿ âàñ áûòü íåîáõîäèìûì ñâîéñòâîì.
Êàêîâî æå ðåøåíèå ïðîáëåìû? Íåîáõîäèìî ñíîâà è ñíîâà ðàáîòàòü íàä ñîñòîÿíèåì âñåãî ïðîäóêòà,
ïûòàÿñü ïðèâåñòè åãî â ñîîòâåòñòâèå ñ îáùèì çàìûñëîì. Õîðîøåå ÏÎ îñíîâûâàåòñÿ íà íåáîëüøîì êîëè÷åñòâå ñèëüíûõ èäåé. Ó íåãî ìîæåò áûòü ìíîãî ñïåöèàëüíûõ ñâîéñòâ - âñå îíè äîëæíû áûòü ñëåäñòâèÿìè
îñíîâíûõ ïîëîæåíèé. Âåëèêèé ïëàí äîëæåí áûòü âèäåí, è â íåì âñåìó äîëæíî îòâîäèòüñÿ ñâîå ìåñòî.
Áîëåå ñëîæíàÿ ïðîáëåìà - ñëèøêîì áîëüøîå âíèìàíèå ê îäíèì ñâîéñòâàì â óùåðá äðóãèì êà÷åñòâàì
ñèñòåìû.  ïðîåêòàõ ÷àñòî âñòðå÷àåòñÿ îøèáêà, ñèòóàöèÿ, êîòîðóþ îïèñàë Ðîäæåð Îñìîíä â âèäå äâóõ
âîçìîæíûõ ïóòåé ðàáîòû íàä ïðîåêòîì: Íèæíÿÿ êðèâàÿ îïèñûâàåò ôè÷åðèçì: â ëèõîðàäî÷íîé ïîãîíå çà
äîïîëíèòåëüíûìè ñâîéñòâàìè òåðÿåòñÿ íèòü îáùåãî êà÷åñòâà. Çàâåðøàþùàÿ ôàçà òàêîãî ïðîåêòà, ïðåäïîëàãàþùàÿ îáùóþ êîððåêòèðîâêó âñåõ ñâîéñòâ, ìîæåò áûòü äîëãîé è íàïðÿæåííîé. Åñëè ïîä äàâëåíèåì
ïîëüçîâàòåëåé èëè êîíêóðåíòîâ âû âûíóæäåíû âûïóñòèòü ïðîäóêò äîñòàòî÷íî áûñòðî - íà ñòàäèÿõ, îòìå÷åííûõ íà ðèñóíêå êâàäðàòàìè, - ðåçóëüòàò ìîæåò ïîâðåäèòü âàøåé ðåïóòàöèè.
Îñìîíä ïðåäëàãàåò (âåðõíÿÿ êðèâàÿ) âî âðåìÿ ñîçäàíèÿ ïðîåêòà ïîääåðæèâàòü íà âûñîêîì ïîñòîÿííîì óðîâíå êà÷åñòâî âñåõ ôàêòîðîâ, êðîìå ôóíêöèîíàëüíîñòè. Íèêàêèõ êîìïðîìèññîâ ïî íàäåæíîñòè,
ðàñøèðÿåìîñòè è ïðî÷èì ôàêòîðàì: âû ïðîñòî îòêàçûâàåòåñü îò äîáàâëåíèÿ íîâûõ ñâîéñòâ äî òåõ ïîð,
ïîêà âàñ óäîâëåòâîðÿþò ñóùåñòâóþùèå.
7
Ñâîåâðåìåííîñòü (Timeliness)
Îïðåäåëåíèå 11.
Ñâîåâðåìåííîñòü - ýòî âûïóñê ÏÎ â íóæíûé ìîìåíò, òî åñòü òîãäà èëè íåçàäîëãî äî
òîãî, êàê ó ïîëüçîâàòåëåé ïîÿâèëàñü ñîîòâåòñòâóþùàÿ ïîòðåáíîñòü â ïîäîáíîé ñèñòåìå.
Íåñâîåâðåìåííîñòü - îäíî èç áîëüøèõ ðàçî÷àðîâàíèé íàøåé ïðîìûøëåííîñòè. Ïðåêðàñíîå ÏÎ, ïîÿâëÿþùååñÿ ñëèøêîì ïîçäíî, ìîæåò ñîâñåì íå äîñòè÷ü ñâîåé öåëè. Òàê îáñòîèò äåëî è â äðóãèõ îòðàñëÿõ
ïðîìûøëåííîñòè, ðàçíèöà â òîì, ÷òî íåìíîãèå ïðîäóêòû ïîÿâëÿþòñÿ òàê æå áûñòðî êàê ïðîãðàììíûå.
Äðóãèå êà÷åñòâà
Äðóãèå êà÷åñòâà, êðîìå òåõ, êîòîðûå äî ñèõ ïîð îáñóæäàëèñü, çàòðàãèâàþò ïîëüçîâàòåëåé ñèñòåì ÏÎ è
ëþäåé, ïîêóïàþùèõ ýòè ñèñòåìû èëè çàêàçûâàþùèõ èõ ðàçðàáîòêè.  ÷àñòíîñòè:
• Âåðèôèöèðóåìîñòü (Veriability) - ýòî ëåãêîñòü ïîäãîòîâêè ïðîöåäóð ïðèåìêè, îñîáåííî òåñòîâûõ
äàííûõ, ïðîöåäóð îáíàðóæåíèÿ íåïîëàäîê è òðàññèðîâêè îøèáîê íà ýòàïàõ çàêëþ÷èòåëüíîé ïðîâåðêè è ââåäåíèÿ ïðîåêòà â äåéñòâèå.
• Öåëîñòíîñòü (Integrity) - ýòî ñïîñîáíîñòü ÏÎ çàùèùàòü ñâîè ðàçëè÷íûå êîìïîíåíòû (ïðîãðàììû,
äàííûå) îò íåñàíêöèîíèðîâàííîãî äîñòóïà è ìîäèôèêàöèè.
• Âîññòàíàâëèâàåìîñòü (Repairability) - ýòî ñïîñîáíîñòü îáëåã÷àòü óñòðàíåíèå äåôåêòîâ.
• Ýêîíîìè÷íîñòü (Economy) ñî÷åòàåòñÿ c ñâîåâðåìåííîñòüþ - ýòî ñïîñîáíîñòü ñèñòåìû çàâåðøèòüñÿ,
íå ïðåâûñèâ âûäåëåííîãî áþäæåòà èëè äàæå íå èñòðàòèâ åãî.
Î äîêóìåíòàöèè
Êàçàëîñü áû, íàëè÷èå õîðîøåé äîêóìåíòàöèè ýòî òîæå îäèí èç ôàêòîðîâ êà÷åñòâà ÏÎ. Íî ýòî íå òàê íàïðîòèâ, íåîáõîäèìîñòü äîêóìåíòàöèè ÿâëÿåòñÿ ñëåäñòâèåì äðóãèõ ôàêòîðîâ êà÷åñòâà, ðàññìîòðåííûõ
âûøå. Âûäåëèì òðè âèäà äîêóìåíòàöèè:
• Âíåøíþþ, äàþùóþ ïîëüçîâàòåëÿì âîçìîæíîñòü ïîíÿòü ñèëüíûå ñòîðîíû ñèñòåìû è óäîáñòâî èõ
èñïîëüçîâàíèÿ. Íåîáõîäèìîñòü â íåé ÿâëÿåòñÿ ñëåäñòâèåì ïðîñòîòû èñïîëüçîâàíèÿ ñèñòåìû.
• Âíóòðåííþþ, äàþùóþ ðàçðàáîò÷èêàì ÏÎ âîçìîæíîñòü ïîíÿòü ñòðóêòóðó è ðåàëèçàöèþ ñèñòåìû, ñëåäñòâèå òðåáîâàíèÿ ðàñøèðÿåìîñòè.
• Îïèñûâàþùóþ èíòåðôåéñ ìîäóëåé. Îíà äàåò âîçìîæíîñòü ðàçðàáîò÷èêàì ïîíÿòü ôóíêöèè, ðåàëèçîâàííûå ìîäóëåì, áåç èçó÷åíèÿ åãî ðåàëèçàöèè. Ýòîò âèä äîêóìåíòàöèè ÿâëÿåòñÿ ñëåäñòâèåì
òðåáîâàíèÿ ïîâòîðíîãî èñïîëüçîâàíèÿ è ðàñøèðÿåìîñòè, ïîñêîëüêó äîêóìåíòàöèÿ ïîçâîëÿåò îïðåäåëèòü, áóäåò ëè äàííîå èçìåíåíèå âëèÿòü íà îïðåäåëåííûé ìîäóëü.
Äîêóìåíòàöèþ íå ñëåäóåò ñ÷èòàòü íåçàâèñèìîé ÷àñòüþ ïðîåêòà. Ïðåäïî÷òèòåëüíåå â ìàêñèìàëüíî
âîçìîæíîé ñòåïåíè ñîçäàâàòü ñàìîäîêóìåíòèðóåìîå ÏÎ. Ýòî ñïðàâåäëèâî äëÿ âñåõ òðåõ âèäîâ äîêóìåíòàöèè:
• Âêëþ÷åíèå âîçìîæíîñòè ïîëó÷åíèÿ ñïðàâêè ïðîÿñíÿåò ñîãëàøåíèÿ ïîëüçîâàòåëüñêîãî èíòåðôåéñà.
Òåì ñàìûì îáëåã÷àåòñÿ çàäà÷à àâòîðîâ ðóêîâîäñòâ ïîëüçîâàòåëåé è äðóãèõ ôîðì âíåøíåé äîêóìåíòàöèè.
• Õîðîøèé ÿçûê ðåàëèçàöèè óñòðàíÿåò íåîáõîäèìîñòü áîëüøîé ÷àñòè âíåøíåé äîêóìåíòàöèè. Ýòî
áóäåò îäíèì èç ãëàâíûõ òðåáîâàíèé ÎÎ-íîòàöèè, ðàçðàáîòàííîé â ýòîé êíèãå.
• Íîòàöèÿ áóäåò ïîääåðæèâàòü ñîêðûòèå èíôîðìàöèè è äðóãèå òåõíè÷åñêèå ïðèåìû (òàêèå êàê óòâåðæäåíèÿ), ïîçâîëÿþùèå îòäåëèòü èíòåðôåéñ ìîäóëÿ îò åãî ðåàëèçàöèè. Ïðè ýòîì ñòàíîâèòñÿ âîçìîæíûì èç òåêñòîâ àâòîìàòè÷åñêè èçâëåêàòü äîêóìåíòàöèþ èíòåðôåéñà ìîäóëåé. Ýòà òåìà ïîäðîáíî
èçó÷àåòñÿ â ëåêöèÿõ êíèãè. Âñå ýòè ïðèåìû óìåíüøàþò ðîëü òðàäèöèîííîé äîêóìåíòàöèè, õîòÿ,
êîíå÷íî, íå ñëåäóåò îæèäàòü, ÷òî îíè ïîëíîñòüþ åå çàìåíÿò.
8
Êîìïðîìèññû
 äàííîì îáçîðå âíåøíèõ ôàêòîðîâ êà÷åñòâà ÏÎ ìû âñòðåòèëèñü ñ òðåáîâàíèÿìè, êîòîðûå ìîãóò êîíôëèêòîâàòü äðóã ñ äðóãîì.
Êàê ìîæíî äîñòè÷ü öåëîñòíîñòè, åñëè íå ââîäèòü çàùèòû ðàçëè÷íîãî ðîäà, ÷òî íåèçáåæíî çàòðóäíèò
ïðîñòîòó èñïîëüçîâàíèÿ ? Ýêîíîìè÷íîñòü ÷àñòî êîíôëèêòóåò ñ ôóíêöèîíàëüíîñòüþ.
Îïòèìàëüíàÿ ýôôåêòèâíîñòü òðåáóåò ïîëíîé àäàïòàöèè ê îïðåäåëåííîìó îáîðóäîâàíèþ è ïðîãðàììíîé ñðåäå, ÷òî ÿâëÿåòñÿ ïðîòèâîïîëîæíîñòüþ ïåðåíîñèìîñòè. Ïîâòîðíîå èñïîëüçîâàíèå òðåáóåò ðåøåíèÿ
îáùèõ çàäà÷, ÷òî ðàñøèðÿåò ãðàíèöû, çàäàííûå ñïåöèôèêàöèåé. Äàâëåíèå ñâîåâðåìåííîñòè ìîæåò ñêëîíèòü íàñ ê òåõíèêå RAD - áûñòðîé ðàçðàáîòêè ïðèëîæåíèÿ (Rapid Application Development), ÷òî ìîæåò
ïîâðåäèòü ðàñøèðÿåìîñòè. Õîòÿ âî ìíîãèõ ñëó÷àÿõ óäàåòñÿ íàéòè ðåøåíèå, ïðèìèðÿþùåå ÿâíî êîíôëèêòóþùèå ôàêòîðû, èíîãäà ïðèõîäèòñÿ èäòè íà êîìïðîìèññ.
Ðàçðàáîò÷èêè ñëèøêîì ÷àñòî è áåç êîëåáàíèé èäóò íà êîìïðîìèññ, íå äàâàÿ ñåáå òðóäà ðàññìîòðåòü
ñîîòâåòñòâóþùèå âîïðîñû è èìåþùèåñÿ âàðèàíòû.  òàêèõ ìîë÷àëèâûõ ðåøåíèÿõ äîìèíèðóþùèì ôàêòîðîì îáû÷íî ÿâëÿåòñÿ ýôôåêòèâíîñòü. Ïî-íàñòîÿùåìó èíæåíåðíûé ïîäõîä ê ñîçäàíèþ ÏÎ ïîäðàçóìåâàåò
ðàáîòó ïî ÿñíîé ôîðìóëèðîâêå êðèòåðèåâ è îñîçíàííîãî âûáîðà âàðèàíòîâ.
Êàê áû íè áûëè íåîáõîäèìû êîìïðîìèññû ìåæäó ôàêòîðàìè êà÷åñòâà, îäèí èç ôàêòîðîâ ñòîèò â
ñòîðîíå îò îñòàëüíûõ - êîððåêòíîñòü. Íåò íèêàêîãî îïðàâäàíèÿ òîìó, ÷òî êîððåêòíîñòü ïîäâåðãàåòñÿ
îïàñíîñòè ðàäè äðóãèõ ôàêòîðîâ, òàêèõ êàê ýôôåêòèâíîñòü. Åñëè ÏÎ íå âûïîëíÿåò ñâîþ ôóíêöèþ, âñå
îñòàëüíîå íå èìååò ñìûñëà.
Êëþ÷åâûå âîïðîñû
Âñå îïèñàííûå âûøå ôàêòîðû âàæíû. Íî ïðè ñîâðåìåííîì ñîñòîÿíèè èíäóñòðèè ÏÎ ÷åòûðå ôàêòîðà
èìåþò îñîáóþ âàæíîñòü:
• Êîððåêòíîñòü è óñòîé÷èâîñòü : âñå åùå ñëèøêîì òðóäíî ñîçäàâàòü ÏÎ áåç îøèáîê (bugs), è ñëèøêîì ñëîæíî èñïðàâëÿòü îøèáêè, êîãäà îíè ïîÿâëÿþòñÿ. Ðàçíîâèäíîñòè òåõíè÷åñêèõ ïðèåìîâ äëÿ
óëó÷øåíèÿ êîððåêòíîñòè è óñòîé÷èâîñòè îäíè è òå æå: áîëåå ñèñòåìàòè÷åñêèå ïîäõîäû ê ïîñòðîåíèþ
ÏÎ; áîëåå ôîðìàëüíûå ñïåöèôèêàöèè; âñòðîåííûé êîíòðîëü â òå÷åíèå âñåãî ïðîöåññà ïîñòðîåíèÿ
ÏÎ (íå ïðîñòî èñïûòàíèÿ è îòëàäêà ïîñëå ñîçäàíèÿ); áîëåå ñîâåðøåííûå ÿçûêîâûå ìåõàíèçìû, òàêèå êàê ñòàòè÷åñêàÿ òèïèçàöèÿ, óòâåðæäåíèÿ, àâòîìàòè÷åñêîå óïðàâëåíèå ïàìÿòüþ è óïîðÿäî÷åííîå
óïðàâëåíèå èñêëþ÷èòåëüíûìè ñèòóàöèÿìè, îáåñïå÷åíèå âîçìîæíîñòè ðàçðàáîò÷èêàì óñòàíàâëèâàòü
òðåáîâàíèÿ êîððåêòíîñòè è óñòîé÷èâîñòè â ñî÷åòàíèè ñ âîçìîæíîñòüþ èíñòðóìåíòîâ îáíàðóæèâàòü
ñëó÷àè íåñîñòîÿòåëüíîñòè äî òîãî, êàê îíè ïðèâåäóò ê îøèáêàì. Áëèçîñòü âîïðîñîâ êîððåêòíîñòè è
óñòîé÷èâîñòè äåëàåò óäîáíûì ââåäåíèå îáùåãî òåðìèíà äëÿ îáîçíà÷åíèÿ îáîèõ ôàêòîðîâ - íàäåæíîñòü (reliability).
• Ðàñøèðÿåìîñòü è ïîâòîðíîå èñïîëüçîâàíèå : ÏÎ äîëæíî áûòü ëåãêî èçìåíÿåìûì; êîìïîíåíòû ñîçäàâàåìîãî ÏÎ äîëæíû áûòü øèðîêî ïðèìåíèìû, è äîëæåí ñóùåñòâîâàòü áîëüøèé ïåðå÷åíü îáùåöåëåâûõ êîìïîíåíòîâ, êîòîðûå ìîæíî ïîâòîðíî èñïîëüçîâàòü ïðè ðàçðàáîòêå íîâîé ñèñòåìû.
Çäåñü òàêæå îäíè è òå æå èäåè ïîëåçíû äëÿ óëó÷øåíèÿ îáîèõ êà÷åñòâ: ëþáàÿ èäåÿ, ïîìîãàþùàÿ
ïðîèçâîäèòü ïðîäóêò ñ áîëåå äåöåíòðàëèçîâàííîé àðõèòåêòóðîé, êîìïîíåíòû êîòîðîé àâòîíîìíû è
âçàèìîäåéñòâóþò òîëüêî ÷åðåç îãðàíè÷åííûå è ÿñíî îïðåäåëåííûå êàíàëû, áóäåò ïîëåçíîé. Òåðìèí
ìîäóëüíîñòü (modularity) âêëþ÷àåò ïîâòîðíîå èñïîëüçîâàíèå è ðàñøèðÿåìîñòü.
ÎÎ-ìåòîä ìîæåò çíà÷èòåëüíî óëó÷øèòü ÷åòûðå îñíîâíûõ ôàêòîðà êà÷åñòâà, âîò ïî÷åìó îí òàê ïðèâëåêàòåëåí. Îí òàêæå ìîæåò âíåñòè çíà÷èòåëüíûé âêëàä â äðóãèå àñïåêòû, â ÷àñòíîñòè:
• Ñîâìåñòèìîñòü : ìåòîä îáåñïå÷èâàåò îáùèé ñòèëü ïðîåêòèðîâàíèÿ è ñòàíäàðòèçàöèþ èíòåðôåéñîâ
ìîäóëåé è ñèñòåì, ÷òî ïîìîãàåò ñîâìåñòíî ðàáîòàòü ðàçíûì ñèñòåìàì.
• Ïåðåíîñèìîñòü : óäåëÿÿ îñîáîå âíèìàíèå àáñòðàêöèè è ñêðûòèþ èíôîðìàöèè, îáúåêòíàÿ òåõíîëîãèÿ ñïîñîáñòâóåò òîìó, ÷òî ïðîåêòèðîâùèêè íà÷èíàþò îòäåëÿòü ñïåöèôèêàöèþ îò îñîáåííîñòåé ðåàëèçàöèè, ÷òî è îáëåã÷àåò ïåðåíîñ. Ïîëèìîðôèçì è äèíàìè÷åñêîå ñâÿçûâàíèå äåëàåò âîçìîæíûì
ñîçäàíèå ñèñòåìû, àâòîìàòè÷åñêè àäàïòèðóåìîé ê àïïàðàòíî-ïðîãðàììíîìó ìåõàíèçìó, íàïðèìåð,
ðàçëè÷íûì ñèñòåìàì îêîí èëè ðàçëè÷íûì ñèñòåìàì óïðàâëåíèÿ áàçàìè äàííûõ.
9
Ðèñ. 1.5: Ðàñïðåäåëåíèå ðàñõîäîâ íà ñîïðîâîæäåíèå
• Ïðîñòîòà èñïîëüçîâàíèÿ : âêëàä ÎÎ-èíñòðóìåíòîâ â ñîâðåìåííûå èíòåðàêòèâíûå ñèñòåìû, è îñîáåííî èõ ïîëüçîâàòåëüñêèå èíòåðôåéñû, òàê õîðîøî èçâåñòåí, ÷òî èíîãäà îí çàòìåâàåò äðóãèå àñïåêòû (ëþäè, ñîçäàþùèå ðåêëàìó - íå åäèíñòâåííûå, êòî íàçûâàåò îáúåêòíî-îðèåíòèðîâàííîé ëþáóþ
ñèñòåìó, èñïîëüçóþùóþ çíà÷êè, îêíà è ââîä ñ ïîìîùüþ ìûøè).
• Ýôôåêòèâíîñòü : êàê îòìå÷àëîñü âûøå, ïîâòîðíîå èñïîëüçîâàíèå êîìïîíåíòîâ ïðîôåññèîíàëüíîãî
êà÷åñòâà ÷àñòî ìîæåò çíà÷èòåëüíî óëó÷øèòü ïðîèçâîäèòåëüíîñòü.
• Ñâîåâðåìåííîñòü, ýêîíîìè÷íîñòü è ôóíêöèîíàëüíîñòü : ÎÎ-òåõíèêà äàåò âîçìîæíîñòü òåì, êòî åå
îñâîèë, ïðîèçâîäèòü ÏÎ áûñòðåå è ïî áîëåå íèçêîé ñòîèìîñòè; îíà îáëåã÷àåò äîáàâëåíèå ôóíêöèé
è äàæå ñàìà ìîæåò ïðåäëîæèòü íîâûå ôóíêöèè.
Íåñìîòðÿ íà âñå ýòè óñïåõè, ìû äîëæíû ïîìíèòü, ÷òî ÎÎ-ìåòîä - ýòî íå ïàíàöåÿ, è ÷òî ìíîãèå îáû÷íûå
âîïðîñû ïðîåêòèðîâàíèÿ ÏÎ îñòàþòñÿ íåðåøåííûìè. Ïîìîùü â ðåøåíèè ïðîáëåìû - ýòî íå òî æå ñàìîå,
÷òî åå ðåøåíèå.
1.3
Î ïðîãðàììíîì ñîïðîâîæäåíèè
Ïðèâåäåííûé ñïèñîê ôàêòîðîâ íå âêëþ÷èë îáû÷íî ïðèâîäèìîå êà÷åñòâî: âîçìîæíîñòü ñîïðîâîæäåíèÿ
(maintainability). ×òîáû ïîíÿòü ïî÷åìó, ìû äîëæíû ïîáëèæå âçãëÿíóòü íà ëåæàùåå â åãî îñíîâå ïîíÿòèå:
ñîïðîâîæäåíèå (maintenance) . Ñîïðîâîæäåíèå íà÷èíàåòñÿ ñ ìîìåíòà ïîñòàâêè ÏÎ ïîëüçîâàòåëÿì.
Îáñóæäåíèÿ ìåòîäîëîãèè ñîçäàíèÿ ÏÎ îáû÷íî ñîñðåäîòî÷èâàåòñÿ íà ôàçå ðàçðàáîòêè; òî æå íàõîäèì
è âî ââîäíûõ êóðñàõ ïî ïðîãðàììèðîâàíèþ. Íî øèðîêî èçâåñòíî, ÷òî 70% ñòîèìîñòè ÏÎ ïðèõîäèòñÿ íà
åãî ñîïðîâîæäåíèå. Íèêàêîå èçó÷åíèå êà÷åñòâà ÏÎ íå ìîæåò áûòü óäîâëåòâîðèòåëüíûì, åñëè îíî èãíîðèðóåò ýòîò àñïåêò. Âûøåïðèâåäåííàÿ äèàãðàììà, âçÿòàÿ èç êëþ÷åâîãî èññëåäîâàíèÿ Ëèåíöà è Ñâîíñîíà,
ïðîëèâàåò íåêîòîðûé ñâåò íà òî, ÷òî íà ñàìîì äåëå çíà÷èò âêëþ÷àþùèé ðàçíîîáðàçíûå ïîíÿòèÿ òåðìèí
ñîïðîâîæäåíèå. Èññëåäîâàíèå ðàññìîòðåëî 487 ñèñòåì, ðàçðàáàòûâàþùèõ ÏÎ ðàçíîãî ðîäà; âîçìîæíî, îíî íåìíîãî óñòàðåëî, íî áîëåå ïîçäíèå ïóáëèêàöèè ïîäòâåðæäàþò òå æå îáùèå ðåçóëüòàòû. Îíî
ïîêàçûâàåò äîëþ ñòîèìîñòè, ïðèõîäÿùóþñÿ íà êàæäûé èäåíòèôèöèðîâàííûé àâòîðàìè âèä ðàáîò ïî
ñîïðîâîæäåíèþ.
Êëþ÷åâûå êîíöåïöèè
• Öåëüþ ïðîãðàììíîé èíæåíåðèè ÿâëÿåòñÿ íàõîæäåíèå ïóòåé ïîñòðîåíèÿ ÏÎ âûñîêîãî êà÷åñòâà.
10
• Êà÷åñòâî ÏÎ ëó÷øå âñåãî âèäèòñÿ êàê êîìïðîìèññ ìåæäó öåëûì ðÿäîì ðàçëè÷íûõ öåëåé, à íå êàê
åäèíûé ôàêòîð.
• Âíåøíèå ôàêòîðû, ïîíÿòíûå ïîëüçîâàòåëÿì è êëèåíòàì, ñëåäóåò îòëè÷àòü îò âíóòðåííèõ ôàêòîðîâ,
ïîíÿòíûõ ïðîåêòèðîâùèêàì è êîíñòðóêòîðàì.
• Äåéñòâèòåëüíîå çíà÷åíèå èìåþò âíåøíèå ôàêòîðû, íî óïðàâëåíèå ñèñòåìîé âîçìîæíî òîëüêî ÷åðåç
âíóòðåííèå ôàêòîðû, áëàãîäàðÿ êîòîðûì äîñòèãàåòñÿ íóæíûé ýôôåêò.
• Ñïèñîê îñíîâíûõ âíåøíèõ ôàêòîðîâ êà÷åñòâà ïðèâåäåí âûøå. ÎÎ-ìåòîä íàïðàâëåí íà óëó÷øåíèå
êà÷åñòâà òåõ ôàêòîðîâ, êîòîðûå ïðåæäå âñåãî íóæäàþòñÿ â ëó÷øèõ ïîäõîäàõ. Ê íèì îòíîñÿòñÿ
ôàêòîðû êîððåêòíîñòè è óñòîé÷èâîñòè, ñâÿçàííûå ñ áåçîïàñíîñòüþ, âìåñòå èçâåñòíûå êàê íàäåæíîñòü, è ôàêòîðû, òðåáóþùèå äåöåíòðàëèçîâàííîé àðõèòåêòóðû ÏÎ, - ïîâòîðíîå èñïîëüçîâàíèå è
ðàñøèðÿåìîñòü, âìåñòå èçâåñòíûå êàê ìîäóëüíîñòü.
• Ñîïðîâîæäåíèå ÏÎ, ïîòðåáëÿþùåå áîëüøóþ äîëþ åãî ñòîèìîñòè, íàõîäèòñÿ â íåâûãîäíîì ïîëîæåíèè èç-çà òðóäíîñòè ðåàëèçàöèè èçìåíåíèé â ÏÎ è èç-çà ñëèøêîì áîëüøîé çàâèñèìîñòè ïðîãðàìì
îò ôèçè÷åñêîé ñòðóêòóðû äàííûõ, êîòîðûìè îíè ìàíèïóëèðóþò.
11
Âîïðîñ 2
Ïðîåêòèðîâàíèå ïî êîíòðàêòó:
ïîñòðîåíèå íàäåæíîãî ÏÎ
2.1
Áàçèñíûå ìåõàíèçìû íàäåæíîñòè
Òåõíè÷åñêèå ïðèåìû, ââåäåííûå â ïðåäûäóùèõ ëåêöèÿõ, áûëè íàïðàâëåíû íà ñîçäàíèå íàäåæíîãî ÏÎ.
Äàäèì èõ êðàòêèé îáçîð - áûëî áû áåñïîëåçíî ðàññìàòðèâàòü áîëåå ïðîäâèíóòûå êîíöåïöèè äî ïðèâåäåíèÿ
â ïîðÿäîê îñíîâíûõ ìåõàíèçìîâ íàäåæíîñòè. Ïåðâûì è îïðåäåëÿþùèì ñâîéñòâîì îáúåêòíîé òåõíîëîãèè
ÿâëÿåòñÿ ïî÷òè íàâÿçûâàåìàÿ ñòðóêòóðà ïðîãðàììíîé ñèñòåìû - ïðîñòàÿ, ìîäóëüíàÿ, ðàñøèðÿåìàÿ, - ïðîùå ãàðàíòèðóþùàÿ íàäåæíîñòü, ÷åì â ñëó÷àå "êðèâûõ"ñòðóêòóð, âîçíèêàþùèõ ïðè ïðèìåíåíèè ðàííèõ
ìåòîäîâ ðàçðàáîòêè.  ÷àñòíîñòè, óñèëèÿ ïî îãðàíè÷åíèþ ìåæìîäóëüíîãî âçàèìîäåéñòâèÿ, ñâåäåíèÿ åãî ê
ìèíèìóìó, áûëè â öåíòðå äèñêóññèè î ìîäóëüíîñòè. Ðåçóëüòàòîì ñòàë çàïðåò îáùèõ ðèñêîâ, ñíèæàþùèõ
íàäåæíîñòü, - îòêàç îò ãëîáàëüíûõ ïåðåìåííûõ, ìåõàíèçì îãðàíè÷åííîãî âçàèìîäåéñòâèÿ ìîäóëåé, îòíîøåíèÿ íàñëåäîâàíèÿ è âëîæåííîñòè. Îáùåå íàáëþäåíèå: ñàìûé áîëüøîé âðàã íàäåæíîñòè (è êà÷åñòâà
ÏÎ â öåëîì) - ýòî ñëîæíîñòü. Ñîçäàâàÿ íàøè ñòðóêòóðû íàñòîëüêî ïðîñòûìè, ñêîëü ýòî âîçìîæíî, ìû
äîñòèãàåì íåîáõîäèìîãî, íî íå äîñòàòî÷íîãî óñëîâèÿ, ãàðàíòèðóþùåãî íàäåæíîñòü. Ïðåæíåå îáñóæäåíèå
ñëóæèò ëèøü âåðíîé îòïðàâíîé òî÷êîé â ïîñëåäóþùèõ ñèñòåìàòè÷åñêèõ óñèëèÿõ.
Çàìåòüòå, íåîáõîäèì, íî òàêæå íåäîñòàòî÷åí, ïîñòîÿííûé àêöåíò íà ñîçäàíèå ýëåãàíòíîãî è ÷èòàáåëüíîãî ÏÎ. Ïðîãðàììíûå òåêñòû íå òîëüêî ïèøóòñÿ, îíè åùå ÷èòàþòñÿ è ïåðåïèñûâàþòñÿ ïî ìíîãî ðàç.
ßñíîñòü è ïðîñòîòà íîòàöèè ÿçûêîâûõ êîíñòðóêöèé - îñíîâà ëþáîãî èçîùðåííîãî ïîäõîäà ê íàäåæíîñòè.
Åùå îäíî íåîáõîäèìîå îðóæèå - àâòîìàòè÷åñêîå óïðàâëåíèå ïàìÿòüþ, â îñîáåííîñòè ñáîðêà ìóñîðà. Â
ëåêöèè, ïîñâÿùåííîé ýòîé òåìå, â äåòàëÿõ ïîÿñíåíî, ïî÷åìó äëÿ ëþáîé ñèñòåìû, îïåðèðóþùåé äèíàìè÷åñêèìè ñòðóêòóðàìè äàííûõ, ñòîëü îïàñíî îïèðàòüñÿ íà óïðàâëåíèå ýòèì ïðîöåññîì âðó÷íóþ. Ñáîðêà
ìóñîðà íå ðîñêîøü - ýòî êëþ÷åâîé êîìïîíåíò ÎÎ-ñðåäû, îáåñïå÷èâàþùèé íàäåæíîñòü.
Òîæå ìîæíî ñêàçàòü îá åùå îäíîì, ñî÷åòàþùåìñÿ ñ ïàðàìåòðèçàöèåé ìåõàíèçìå, - ñòàòè÷åñêîé òèïèçàöèè. Áåç ïðàâèë ñòðîãîé ñòàòè÷åñêîé òèïèçàöèè ïðèøëîñü áû ëèøü íàäåÿòüñÿ íà ñíèñõîæäåíèå ìíîãî÷èñëåííûõ îøèáîê, âîçíèêàþùèõ â ïåðèîä âûïîëíåíèÿ.
2.2
Î êîððåêòíîñòè ÏÎ
Çàäàäèìñÿ âîïðîñîì, ÷òî îçíà÷àåò óòâåðæäåíèå - ïðîãðàììíûé ýëåìåíò êîððåêòåí? Íàáëþäåíèÿ è ðàññóæäåíèÿ, îòâå÷àþùèå íà ýòî âîïðîñ, ìîãóò ïîêàçàòüñÿ òðèâèàëüíûìè. Íî, êàê çàìåòèë îäèí èçâåñòíûé
ó÷åíûé, òàêîâû âñå íàó÷íûå ðåçóëüòàòû, - îíè íà÷èíàþòñÿ ñ îáû÷íûõ íàáëþäåíèé è ïðîäîëæàþòñÿ ïóòåì
ïðîñòûõ ðàññóæäåíèé, íî âñå ýòî íóæíî äåëàòü óïîðíî è íàñòîé÷èâî.
Ïðåäïîëîæèì, íåêòî ïðèøåë ê âàì ñ ïðîãðàììîé èç 300 000 ñòðîê íà Ñ è ñïðàøèâàåò, êîððåêòíà ëè
îíà? Åñëè âû êîíñóëüòàíò, òî âçûùèòå âûñîêóþ ïëàòó è îòâåòüòå - "íåò". Âû, âåðîÿòíî, îêàæåòåñü ïðàâû.
Äëÿ òîãî ÷òîáû ìîæíî áûëî äàòü ðàçóìíûé îòâåò íà ïîäîáíûé âîïðîñ, îäíîé ïðîãðàììû íåäîñòàòî÷íî,
íåîáõîäèìà åùå è åå ñïåöèôèêàöèÿ, òî÷íî îïèñûâàþùàÿ, ÷òî äîëæíà äåëàòü ïðîãðàììà. Îïåðàòîð
x:= y+1
12
ñàì ïî ñåáå íå ÿâëÿåòñÿ íè êîððåêòíûì, íè íå êîððåêòíûì. Ýòè ïîíÿòèÿ ïðèîáðåòàþò ñìûñë ëèøü ïî
îòíîøåíèþ ê îæèäàåìîìó ýôôåêòó ïðèñâàèâàíèÿ. Íàïðèìåð, ïðèñâàèâàíèå êîððåêòíî ïî îòíîøåíèþ ê
óòâåðæäåíèþ: "Ïåðåìåííûå x è y èìåþò ðàçëè÷íûå çíà÷åíèÿ". Íî íå ãàðàíòèðóåòñÿ åãî êîððåêòíîñòü ïî
îòíîøåíèþ ê âûñêàçûâàíèþ: "ïåðåìåííàÿ x îòðèöàòåëüíà ïîñêîëüêó ðåçóëüòàò ïðèñâàèâàíèÿ çàâèñèò îò
çíà÷åíèÿ y, êîòîðîå ìîæåò áûòü ïîëîæèòåëüíûì.
Ýòè ïðèìåðû èëëþñòðèðóþò ñâîéñòâî, ñëóæàùåå îòïðàâíîé òî÷êîé â îáñóæäåíèè ïðîáëåìû êîððåêòíîñòè: ïðîãðàììíàÿ ñèñòåìà èëè åå ýëåìåíò ñàìè ïî ñåáå íè êîððåêòíû, íè íå êîððåêòíû. Êîððåêòíîñòü
ïîäðàçóìåâàåòñÿ ëèøü ïî îòíîøåíèþ ê íåêîòîðîé ñïåöèôèêàöèè. Ñòðîãî ãîâîðÿ, ìû è íå áóäåì îáñóæäàòü ïðîáëåìó êîððåêòíîñòè ïðîãðàììíûõ ýëåìåíòîâ, à ëèøü èõ ñîãëàñîâàííîñòü (consistent) ñ çàäàííîé
ñïåöèôèêàöèåé. Â íàøèõ îáñóæäåíèÿõ ìû áóäåì ïðîäîëæàòü èñïîëüçîâàòü õîðîøî ïîíèìàåìûé òåðìèí
"êîððåêòíîñòü íî âñåãäà ïðè ýòîì ïîìíèòü, ÷òî ýòîò òåðìèí íå ïðèìåíèì ê ïðîãðàììíîìó ýëåìåíòó, îí
èìååò ñìûñë ëèøü äëÿ ïàðû - "ïðîãðàììíûé ýëåìåíò è åãî ñïåöèôèêàöèÿ".
Ñâîéñòâî êîððåêòíîñòè ÏÎ
Êîððåêòíîñòü - ïîíÿòèå îòíîñèòåëüíîå.
 ýòîé ëåêöèè ìû íàó÷èìñÿ âûðàæàòü ñïåöèôèêàöèè ÷åðåç óòâåðæäåíèÿ (assertions), ÷òî ïîìîæåò îöåíèòü êîððåêòíîñòü ðàçðàáîòàííîãî ÏÎ. Íî ïîéäåì äàëüøå è ïåðåâåðíåì ïðîáëåìó, - ðàçðàáîòêà ñïåöèôèêàöèè ÿâëÿåòñÿ ïåðâûì, âàæíåéøèì øàãîì íà ïóòè, ãàðàíòèðóþùåì, ÷òî ÏÎ äåéñòâèòåëüíî ñîîòâåòñòâóåò ñïåöèôèêàöèè. Ñóùåñòâåííóþ âûãîäó ìîæíî ïîëó÷èòü, êîãäà ñïåöèôèêàöèè ïèøóòñÿ îäíîâðåìåííî
ñ íàïèñàíèåì ïðîãðàììû, à ëó÷øå, äî åå íàïèñàíèÿ. Ñðåäè ñëåäñòâèé òàêîãî ïîäõîäà ìîæíî îòìåòèòü
ñëåäóþùåå.
• Ðàçðàáîòêà ÏÎ êîððåêòíîãî ñ ñàìîãî íà÷àëà, ïðîåêòèðóåìîãî òàê, ÷òîáû áûòü êîððåêòíûì. Îäèí èç
ñîçäàòåëåé ñòðóêòóðíîãî ïðîãðàììèðîâàíèÿ Õàðëàí Ä. Ìèëëñ â ñåìèäåñÿòûå ãîäû íàïèñàë ñòàòüþ
ñî çíàìåíàòåëüíûì íàçâàíèåì "Êàê ïèñàòü êîððåêòíûå ïðîãðàììû è çíàòü ýòî". Ñëîâî "çíàòü"â
äàííîì êîíòåêñòå îçíà÷àåò ñíàáæàòü ïðîãðàììó â ìîìåíò åå íàïèñàíèÿ àðãóìåíòàìè, õàðàêòåðèçóþùèìè êîððåêòíîñòü.
• Çíà÷èòåëüíî ëó÷øåå ïîíèìàíèå ïðîáëåìû è äîñòèæåíèå åå ðåøåíèÿ.
• Óïðîùåíèå çàäà÷è ñîçäàíèÿ ïðîãðàììíîé äîêóìåíòàöèè. Êàê áóäåò ïîçæå ïîêàçàíî, óòâåðæäåíèÿ
áóäóò èãðàòü âàæíóþ ðîëü â ÎÎ-ïîäõîäå ê äîêóìåíòàöèè.
• Îáåñïå÷åíèå îñíîâ äëÿ ñèñòåìàòè÷åñêîãî òåñòèðîâàíèÿ è îòëàäêè.
Îñòàâøàÿñÿ ÷àñòü ëåêöèè ïîñâÿùåíà èññëåäîâàíèþ ýòèõ âîïðîñîâ. Îäíî ïðåäóïðåæäåíèå: ÿçûêè ïðîãðàììèðîâàíèÿ Ñ, Ñ++, Python è äðóãèå èìåþò îïåðàòîð óòâåðæäåíèÿ assert, äèíàìè÷åñêè ïðîâåðÿþùèé
èñòèííîñòü çàäàííîãî óòâåðæäåíèÿ â ìîìåíò âûïîëíåíèÿ ïðîãðàììû è îñòàíàâëèâàþùèé âû÷èñëåíèå, åñëè óòâåðæäåíèå ÿâëÿåòñÿ ëîæíûì. Ýòà êîíöåïöèÿ, õîòÿ è èìååò îòíîøåíèå ê ïðåäìåòó îáñóæäåíèÿ, íî
ÿâëÿåòñÿ ëèøü ìàëîé ÷àñòüþ èñïîëüçîâàíèÿ óòâåðæäåíèé â ÎÎ-ìåòîäå. Ïîòîìó, åñëè ïîäîáíî ìíîãèì
ðàçðàáîò÷èêàì âû çíàêîìû ñ ýòèì îïåðàòîðîì, íå îáîáùàéòå âàøå çíàíèå íà âñþ êàðòèíó, ïî÷òè âñå
êîíöåïöèè ýòîé ëåêöèè, âîçìîæíî, áóäóò íîâûìè.
2.3
Âûðàæåíèå ñïåöèôèêàöèé
Îò íåôîðìàëüíûõ âûñêàçûâàíèé ïåðåéäåì ê ïðîñòîé ìàòåìàòè÷åñêîé íîòàöèè, ïðèíÿòîé â òåîðèè ôîðìàëüíîé ïðîâåðêè ïðàâèëüíîñòè ïðîãðàìì è èìåþùåé öåííîñòü ïðè äîêàçàòåëüñòâå êîððåêòíîñòè ïðîãðàììíûõ ýëåìåíòîâ.
Ôîðìóëà êîððåêòíîñòè
Ïóñòü À - ýòî íåêîòîðàÿ îïåðàöèÿ (îïåðàòîð èëè òåëî ïðîãðàììû). Ôîðìóëà êîððåêòíîñòè (correctness
formula) - ýòî âûðàæåíèå â ôîðìå:
{P} A {Q}
13
Ôîðìóëà âûðàæàåò ñâîéñòâî, êîòîðîå ìîæåò áûòü èëè íå áûòü èñòèííûì:
Ñìûñë ôîðìóëû êîððåêòíîñòè {P} A {Q}
Ëþáîå âûïîëíåíèå À, íà÷èíàþùååñÿ â ñîñòîÿíèè, ãäå
P èñòèííî, çàâåðøèòñÿ è â çàêëþ÷èòåëüíîì ñîñòîÿíèè áóäåò èñòèííî Q.
Ôîðìóëà êîððåêòíîñòè, íàçûâàåìàÿ òàêæå òðèàäîé Õîàðà, - ìàòåìàòè÷åñêîå ïîíÿòèå, à íå ïðîãðàììèñòñêàÿ êîíñòðóêöèÿ. Îíà íå ÿâëÿåòñÿ ÷àñòüþ ÿçûêà ïðîãðàììèðîâàíèÿ è ââåäåíà äëÿ òîãî, ÷òîáû
âûðàæàòü ñâîéñòâà ïðîãðàììíûõ ýëåìåíòîâ.  ýòîé ôîðìóëå À, êàê áûëî ñêàçàíî, îáîçíà÷àåò îïåðàöèþ,
P è Q - ñâîéñòâà âîâëåêàåìûõ â ðàññìîòðåíèå ñóùíîñòåé, íàçûâàåìûå óòâåðæäåíèÿìè (òî÷íûé ñìûñë
ýòîãî òåðìèíà áóäåò îïðåäåëåí íèæå). Óòâåðæäåíèå P íàçûâàåòñÿ ïðåäóñëîâèåì, à Q - ïîñòóñëîâèåì.
Ñ ýòîãî ìîìåíòà îáñóæäåíèå êîððåêòíîñòè ÏÎ áóäåò ñâÿçûâàòüñÿ íå ñ ïðîãðàììíûì ýëåìåíòîì À, à
ñ òðèàäîé, ñîäåðæàùåé ýòîò ýëåìåíò À, ïðåäóñëîâèå P è ïîñòóñëîâèå Q. Åäèíñòâåííîé öåëüþ ñòàíîâèòñÿ
óñòàíîâëåíèå òîãî, ÷òî òðèàäà Õîàðà {P} A {Q} âûïîëíÿåòñÿ (èñòèííà).
Âîò ïðèìåð âûïîëíÿåìîé òðèâèàëüíîé ôîðìóëû, â êîòîðîé ïîëàãàåòñÿ, ÷òî x èìååò òèï integer:
{x>=9} x:= x+5 {x>=13}
×èñëî 13 â ïîñòóñëîâèè íå îïå÷àòêà. Ïðåäïîëàãàÿ êîððåêòíóþ ðåàëèçàöèþ öåëî÷èñëåííîé àðèôìåòèêè,
äàííàÿ ôîðìóëà äåéñòâèòåëüíî âûïîëíÿåòñÿ. Åñëè ïðåäóñëîâèå x>=9 âûïîëíÿåòñÿ ïåðåä ïðèñâàèâàíèåì, òî x>=13 áóäåò èñòèííûì ïî çàâåðøåíèè îïåðàòîðà ïðèñâàèâàíèÿ. Êîíå÷íî, ìîæíî óòâåðæäàòü áîëåå
èíòåðåñíóþ âåùü: ïðè çàäàííîì ïðåäóñëîâèè ñèëüíåéøèì, íàñêîëüêî ýòî âîçìîæíî, áóäåò ïîñòóñëîâèå
x>=14.  ñâîþ î÷åðåäü, ïðè çàäàííîì ïîñòóñëîâèè x>=13 ñëàáåéøèì ïðåäóñëîâèåì áóäåò x>=8. Èç
âûïîëíÿåìîé ôîðìóëû êîððåêòíîñòè âñåãäà ìîæíî ïîðîäèòü íîâûå âûïîëíÿåìûå ôîðìóëû, îñëàáëÿÿ
ïîñòóñëîâèå èëè óñèëèâàÿ ïðåäóñëîâèå. Çàéìåìñÿ òåïåðü âûÿñíåíèåì òîãî, ÷òî îçíà÷àþò òåðìèíû "ñèëüíåå"è "ñëàáåå"â ïðåä- è ïîñòóñëîâèÿõ.
Ñèëüíûå è ñëàáûå óñëîâèÿ
Ïîíÿòèÿ "ñèëüíåå"è "ñëàáåå"ïðèøëè èç ëîãèêè. Ãîâîðÿò, ÷òî P1 ñèëüíåå, ÷åì P2, à P2 ñëàáåå, ÷åì P1, åñëè
P1 âëå÷åò P2 è îíè íå ýêâèâàëåíòíû. Êàæäîå óòâåðæäåíèå âëå÷åò True, è èç False ñëåäóåò âñå ÷òî óãîäíî.
Ìîæíî ãîâîðèòü, ÷òî True ÿâëÿåòñÿ ñëàáåéøèì, à False ñèëüíåéøèì èç âñåõ âîçìîæíûõ óòâåðæäåíèé.
Äàâàéòå âçãëÿíåì íà ôîðìóëó êîððåêòíîñòè ñ ïîçèöèé ÷åëîâåêà, ñîáèðàþùåãîñÿ íàíÿòüñÿ íà ðàáîòó
ïî âûïîëíåíèþ îïåðàöèè À. Êàêîâû ñ åãî òî÷êè çðåíèÿ íàèëó÷øèå ïðåäóñëîâèå P è ïîñòóñëîâèå Q, åñëè
ó íåãî åñòü âîçìîæíîñòü âûáîðà? Âîçìîæíîñòü óñèëåíèÿ ïðåäóñëîâèÿ îçíà÷àåò, ÷òî ìîæíî ïðåäúÿâëÿòü
áîëåå æåñòêèå òðåáîâàíèÿ ê ðàáîòîäàòåëþ, ÷òî ìîæíî óìåíüøèòü ÷èñëî ñèòóàöèé, â êîòîðûõ ñëåäóåò
ïðèñòóïàòü ê âûïîëíåíèþ ðàáîòû. Òàê ÷òî ñèëüíîå ïðåäóñëîâèå ýòî "õîðîøèå íîâîñòè"äëÿ ðàáîòíèêà.
Íàèëó÷øåé äëÿ íåãî ðàáîòîé - ñèíåêóðîé ÿâëÿåòñÿ ðàáîòà, ÷üÿ ñïåöèôèêàöèÿ âûðàæàåòñÿ ôîðìóëîé:
Ñèíåêóðà 1
{False} A {...}
Ïîñòóñëîâèå çäåñü íå ñïåöèôèöèðîâàíî, ïîñêîëüêó íå èìååò çíà÷åíèÿ êàêîâî îíî. Ê âûïîëíåíèþ ðàáîòû ìîæíî âîîáùå íå ïðèñòóïàòü, ïîñêîëüêó íåò íè îäíîãî íà÷àëüíîãî ñîñòîÿíèÿ, â êîòîðîì ïðåäóñëîâèå
áûëî áû èñòèííûì. Òàê ÷òî åñëè âàì ïðåäëîæàò òàêóþ ñèíåêóðó, íåìåäëåííî ñîãëàøàéòåñü, íå ãëÿäÿ íà
ïîñòóñëîâèå - òðåáîâàíèÿ, ïðåäúÿâëÿåìûå ê âûïîëíåííîé ðàáîòå.
Èìåííî òàêóþ ñïåöèôèêàöèþ ðàáîò èìåë â âèäó íà÷àëüíèê ïîëèöèè îäíîãî èç àìåðèêàíñêèõ ãîðîäîâ.
Êîãäà åãî ñïðîñèëè â èíòåðâüþ, ïî÷åìó îí âûáðàë èìåííî ýòó ðàáîòó, îí îòâåòèë: "Ýòî åäèíñòâåííàÿ
ðàáîòà, ãäå çàêàç÷èê âñåãäà íåïðàâ!"
Äëÿ ïîñòóñëîâèÿ ñèòóàöèÿ ìåíÿåòñÿ íà ïðîòèâîïîëîæíóþ. Ëó÷øèìè äëÿ ðàáîòíèêà ÿâëÿþòñÿ áîëåå
ñëàáûå óñëîâèÿ - ýòî "õîðîøèå íîâîñòè"; â ýòîì ñëó÷àå õîðîøî íóæíî óìåòü äåëàòü î÷åíü íåìíîãîå.
Íàèëó÷øåé ðàáîòîé - âòîðîé ñèíåêóðîé ÿâëÿåòñÿ ðàáîòà, çàäàííàÿ ñïåöèôèêàöèåé:
Ñèíåêóðà 2
{...} A {True}
Êàê áû íå áûëà âûïîëíåíà ðàáîòà, ïîñòóñëîâèå â ýòîì ñëó÷àå áóäåò èñòèííûì ïî îïðåäåëåíèþ. Êñòàòè, ïî÷åìó ýòà ðàáîòà ÿâëÿåòñÿ âñå-òàêè âòîðîé ïî ïðåäïî÷òèòåëüíîñòè? Ïðè÷èíà, êàê ìîæíî âèäåòü èç
îïðåäåëåíèÿ òðèàäû Õîàðà, â çàâåðøàåìîñòè (terminate). Îïðåäåëåíèå óñòàíàâëèâàåò, ÷òî âûïîëíåíèå
äîëæíî çàâåðøèòüñÿ â ñîñòîÿíèè, óäîâëåòâîðÿþùåì Q, âñÿêèé ðàç, êîãäà îíî íà÷èíàåòñÿ â ñîñòîÿíèè,
14
óäîâëåòâîðÿþùåì P. Äëÿ ñèíåêóðû 1, ãäå íåò ñîñòîÿíèé, óäîâëåòâîðÿþùèõ P, íå èìååò çíà÷åíèÿ, ÷òî
äåëàåò À äàæå åñëè ïðîãðàììíûé òåêñò ïðèâîäèò ê âûïîëíåíèþ áåñêîíå÷íîãî öèêëà, èëè ëîìàåò êîìïüþòåð. Ëþáîå À áóäåò êîððåêòíûì ïî îòíîøåíèþ ê äàííîé ñïåöèôèêàöèè. Äëÿ ñèíåêóðû 2, îäíàêî,
òðåáóåòñÿ çàâåðøåíèå ðàáîòû, äîëæíî ñóùåñòâîâàòü çàêëþ÷èòåëüíîå ñîñòîÿíèå, íå âàæíî, ÷òî äåëàåò À,
íî òî, ÷òî äåëàåòñÿ, äîëæíî áûòü âûïîëíåíî çà êîíå÷íîå âðåìÿ.
×èòàòåëè, çíàêîìûå ñ òåîðèåé, ìîãëè çàìåòèòü, ÷òî ôîðìóëà {P} A {Q} îïðåäåëÿåò òîòàëüíóþ (total
correctness) èëè ïîëíóþ êîððåêòíîñòü, âêëþ÷àþùóþ çàâåðøàåìîñòü íàðÿäó ñ ñîîòâåòñòâèåì ñïåöèôèêàöèè. Ñâîéñòâî, óñòàíàâëèâàþùåå, ÷òî ïðîãðàììà óäîâëåòâîðÿåò ñïåöèôèêàöèè ïðè óñëîâèè åå çàâåðøåíèÿ, èçâåñòíî, êàê ÷àñòè÷íàÿ êîððåêòíîñòü.
Îáñóæäåíèå òîãî, áóäåò ëè óñèëåíèå èëè îñëàáëåíèå óòâåðæäåíèé "õîðîøåé"èëè "ïëîõîé"íîâîñòüþ,
øëî ñ ïîçèöèé ðàáîòíèêà, íàíèìàþùåãîñÿ äëÿ âûïîëíåíèÿ ðàáîòû. Îáðàòèì ñèòóàöèþ, è ðàññìîòðèì åå ñ
ïîçèöèé ðàáîòîäàòåëÿ.  ýòîì ñëó÷àå ñëàáîå ïðåäóñëîâèå ñòàíåò "õîðîøåé"íîâîñòüþ, ïîñêîëüêó îçíà÷àåò
âûïîëíåíèå ðàáîòû äëÿ áîëüøåãî ìíîæåñòâà âõîäíûõ ñëó÷àåâ; áîëåå ïðåäïî÷òèòåëüíûì òåïåðü ÿâëÿåòñÿ
ñèëüíîå ïîñòóñëîâèå, ïîñêîëüêó îíî ðàñøèðÿåò ïîëó÷åíèå âàæíûõ ðåçóëüòàòîâ. Ýòà äâîéñòâåííîñòü êðèòåðèåâ òèïè÷íà â ðàññìîòðåíèè êîððåêòíîñòè ÏÎ. Îíà âíîâü ïîÿâèòñÿ â êà÷åñòâå öåíòðàëüíîãî ïîíÿòèÿ
ýòîé ëåêöèè ïðè îáñóæäåíèè òåìû: êîíòðàêòû ìåæäó ìîäóëÿìè - êëèåíòàìè è ïîñòàâùèêàìè, â óñòàíîâëåíèè êîòîðûõ ïðåèìóùåñòâà, ïðèîáðåòàåìûå îäíèì ó÷àñòíèêîì, ñòàíîâÿòñÿ îáÿçàòåëüñòâàìè äëÿ äðóãîãî.
Ïðîèçâîäñòâî ýôôåêòèâíîãî è íàäåæíîãî ÏÎ ïðîõîäèò ÷åðåç ñîñòàâëåíèå êîíòðàêòîâ, ïðåäñòàâëÿþùèõ
âîçìîæíûå íàèëó÷øèå êîìïðîìèññû âî âñåõ ìåæìîäóëüíûõ êîììóíèêàöèÿõ êëèåíòîâ è ïîñòàâùèêîâ.
2.4
Ââåäåíèå óòâåðæäåíèé â ïðîãðàììíûå òåêñòû
Êàê òîëüêî êîððåêòíîñòü ÏÎ îïðåäåëåíà êàê ñîãëàñîâàííîñòü ðåàëèçàöèè ñ åå ñïåöèôèêàöèåé, ñëåäóåò
ïðåäïðèíÿòü øàãè ïî âêëþ÷åíèþ ñïåöèôèêàöèè â ñàì ïðîãðàììíûé ïðîäóêò. Äëÿ áîëüøèíñòâà â ïðîãðàììèñòñêîì ñîîáùåñòâå ýòî âñå åùå íîâàÿ èäåÿ. Ïðèâû÷íî ïèñàòü ïðîãðàììû, óñòàíàâëèâàÿ òåì ñàìûì,
- êàê äåëàòü (the how); ìåíåå ïðèâû÷íî ðàññìàòðèâàòü îïèñàíèå öåëåé - ÷òî äåëàòü (the what) - êàê ÷àñòü
ïðîãðàììíîãî ïðîäóêòà.
Ñïåöèôèêàöèè áóäóò îñíîâûâàòüñÿ íà óòâåðæäåíèÿõ - âûðàæåíèÿõ, âêëþ÷àþùèõ ñóùíîñòè íàøåãî
ÏÎ. Âûðàæåíèå çàäàåò ñâîéñòâî, êîòîðîìó ýòè ñóùíîñòè ìîãóò óäîâëåòâîðÿòü íà íåêîòîðûõ ýòàïàõ âûïîëíåíèÿ ïðîãðàììû. Òèïè÷íîå óòâåðæäåíèå ìîæåò âûðàæàòü òîò ôàêò, ÷òî îïðåäåëåííîå öåëîå èìååò
ïîëîæèòåëüíîå çíà÷åíèå, èëè ÷òî íåêîòîðàÿ ññûëêà íå îïðåäåëåíà.
Áëèæàéøèì ê óòâåðæäåíèþ ìàòåìàòè÷åñêèì ïîíÿòèåì ÿâëÿåòñÿ ïðåäèêàò, õîòÿ èñïîëüçóåìûé ÿçûê
óòâåðæäåíèé îáëàäàåò ëèøü ÷àñòüþ âûðàçèòåëüíîé ñèëû ïîëíîãî èñ÷èñëåíèÿ ïðåäèêàòîâ.
Ïðåäóñëîâèÿ è ïîñòóñëîâèÿ
Ïåðâîå èñïîëüçîâàíèå óòâåðæäåíèé - ñåìàíòè÷åñêàÿ ñïåöèôèêàöèÿ ïðîãðàìì. Ïðîãðàììà - ýòî íå ïðîñòî ÷àñòü êîäà, îíà çàäàåò ðåàëèçàöèþ ôóíêöèè, âõîäÿùåé â ñïåöèôèêàöèþ ÀÒÄ. Çàäà÷ó, âûïîëíÿåìóþ
ôóíêöèåé, íåîáõîäèìî âûðàçèòü òî÷íî, êàê â èíòåðåñàõ ïðîåêòèðîâàíèÿ, òàê è êàê öåëü ïîñëåäóþùåé
ðåàëèçàöèè è ïîíèìàíèÿ ïðîãðàììíîãî òåêñòà. Äâà óòâåðæäåíèÿ ñâÿçûâàþòñÿ ñ ïðîãðàììîé - ïðåäóñëîâèå è ïîñòóñëîâèå. Ïðåäóñëîâèå óñòàíàâëèâàåò ñâîéñòâà, êîòîðûå äîëæíû âûïîëíÿòüñÿ âñÿêèé ðàç, êîãäà
ïðîãðàììà âûçûâàåòñÿ; ïîñòóñëîâèå îïðåäåëÿåò ñâîéñòâà, ãàðàíòèðóåìûå ïðîãðàììîé ïî åå çàâåðøåíèþ.
#! /usr/bin/env python
# -*- coding: utf-8 -*"""
Áèíàðíûé àëãîðèòì âîçâåäåíèÿ â ñòåïåíü
"""
def power0(a, n):
"""
ïðîñòàÿ ðåàëèçàöèÿ, èñïîëüçóåòñÿ òîëüêî äëÿ ïðîâåðêè
"""
assert n >= 0
15
r = 1
for i in range(n):
r *= a
return r
def power1(a, n):
"""
ïåðâîíà÷àëüíûé âàðèàíò ñî âñåìè ïðîâåðêàìè
"""
assert n >= 0
r, a0, n0 = 1, a, n
# èíâàðèàíò öèêëà
assert r*power0(a, n) == power0(a0, n0)
while n > 0:
if n & 1:
r *= a
n >>= 1
a *= a
# èíâàðèàíò öèêëà
assert r*power0(a, n) == power0(a0, n0)
assert r == power0(a0, n0)
return r
def power(a, n):
"""
îêîí÷àòåëüíûé âàðèàíò
"""
assert n >= 0
r = 1
while n > 0:
if n & 1:
r *= a
n >>= 1
a *= a
return r
if __name__ == '__main__':
for i in range(14):
print "2**%d" % i ,"=", power1(2, i)
for i in range(14):
print "2**%d" % i ,"=", power(-2, i)
2.5
ïðèìåð Êëàññ ñòåê
Ïðåäóñëîâèÿ
Ïðåäóñëîâèÿ âûðàæàþò îãðàíè÷åíèÿ, âûïîëíåíèå êîòîðûõ íåîáõîäèìî äëÿ êîððåêòíîé ðàáîòû ôóíêöèè.
Çäåñü:
• put íå ìîæåò áûòü âûçâàíà, åñëè ñòåê çàïîëíåí;
• remove è item íå ìîãóò áûòü ïðèìåíåíû ê ïóñòîìó ñòåêó.
Ïðåäóñëîâèÿ ïðèìåíÿþòñÿ êî âñåì âûçîâàì ïðîãðàììû, êàê âíóòðè êëàññà, òàê è ó êëèåíòà. Êîððåêòíàÿ ñèñòåìà íèêîãäà íå âûçîâåò ïðîãðàììó â ñîñòîÿíèè, â êîòîðîì íå âûïîëíÿåòñÿ åå ïðåäóñëîâèå.
16
Ïîñòóñëîâèÿ
Ïîñòóñëîâèå âûðàæàåò ñâîéñòâî ñîñòîÿíèÿ, çàâåðøàþùåãî âûïîëíåíèå ïðîãðàììû. Çäåñü:
• Ïîñëå çàâåðøåíèÿ put ñòåê íå ìîæåò áûòü ïóñò; íà åãî âåðøèíå íàõîäèòñÿ òîëüêî ÷òî âòîëêíóòûé
ýëåìåíò, ÷èñëî åãî ýëåìåíòîâ óâåëè÷èëîñü íà åäèíèöó.
• Ïîñëå remove ñòåê íå ìîæåò áûòü ïîëîí, ÷èñëî åãî ýëåìåíòîâ íà åäèíèöó óìåíüøèëîñü.
Ïîñòóñëîâèå â ïðîãðàììå âûðàæàåò ãàðàíòèþ, ïðåäñòàâëåííóþ ñîçäàòåëåì ïðîãðàììû, ÷òî âûïîëíåíèå ïðîãðàììû çàâåðøàåòñÿ è ïðèâîäèò ê ñîñòîÿíèþ ñ çàäàííûìè ñâîéñòâàìè, â ïðåäïîëîæåíèè, ÷òî
ïðîãðàììà áûëà çàïóùåíà â ñîñòîÿíèè, óäîâëåòâîðÿþùåì ïðåäóñëîâèþ.
2.6
Êîíòðàêòû è íàäåæíîñòü ÏÎ
Ïðåäóñëîâèå è ïîñòóñëîâèå ïðîãðàììû îïðåäåëÿþò êîíòðàêò ñî âñåìè åå êëèåíòàìè.
Ïðàâà è îáÿçàòåëüñòâà
Ñâÿçûâàÿ ñ ïðîãðàììîé r ïðåäëîæåíèÿ require pre è ensure post, êëàññ ãîâîðèò ñâîèì êëèåíòàì:
"Åñëè âû îáåùàåòå âûçâàòü r â ñîñòîÿíèè, óäîâëåòâîðÿþùåì pre, òî ÿ îáåùàþ â çàêëþ÷èòåëüíîì
ñîñòîÿíèè âûïîëíèòü post".
 îòíîøåíèÿõ ìåæäó ëþäüìè è êîìïàíèÿìè êîíòðàêò - ýòî ïèñüìåííûé äîêóìåíò, ôèêñèðóþùèé
îòíîøåíèÿ. Óäèâèòåëüíî, ÷òî â ïðîãðàììíîé èíäóñòðèè, ãäå òî÷íîñòü òàê âàæíà è äâóñìûñëåííîñòü
òàê ðèñêîâàííà, ýòà èäåÿ òàê äîëãî íå ïîÿâëÿëàñü. Ëþáîé õîðîøèé êîíòðàêò óñòàíàâëèâàåò äëÿ îáîèõ
ó÷àñòíèêîâ êàê îáÿçàòåëüñòâà, òàê è ïðèîáðåòàåìóþ âûãîäó; îáû÷íî îáÿçàòåëüñòâà îäíîãî îáîðà÷èâàþòñÿ
âûãîäîé äëÿ äðóãîãî ó÷àñòíèêà, è ýòî âçàèìíî. Âñå ýòî âåðíî è äëÿ êîíòðàêòîâ ìåæäó êëàññàìè.
• Ïðåäóñëîâèå ñâÿçûâàåò êëèåíòà: îïðåäåëÿþòñÿ óñëîâèÿ, ïðè êîòîðûõ âûçîâ ïðîãðàììû êëèåíòîì
ëåãèòèìåí. Îáÿçàòåëüñòâà êëèåíòà ïðèíîñÿò ïîëüçó ïîñòàâùèêó.
• Ïîñòóñëîâèå ñâÿçûâàåò êëàññ: ïðîãðàììà îáÿçàíà îáåñïå÷èòü óñëîâèÿ ïî åå çàâåðøåíèþ. Çäåñü ïîëüçà êëèåíòà îáîðà÷èâàåòñÿ îáÿçàòåëüñòâàìè ïîñòàâùèêà êëàññà.
Âîçìîæíî, âû íå çàìåòèëè, ÷òî êîíòðàêò ïðîòèâîðå÷èò ìóäðîñòè, áûòóþùåé â ïðîãðàììíîé èíæåíåðèè. Ïîíà÷àëó ýòî øîêèðóåò, íî êîíòðàêò - îäèí èç ãëàâíûõ âêëàäîâ â íàäåæíîñòü ÏÎ.
Ïðàâèëî êîíòðàêòà ãîâîðèò, ÷òî ïðåäóñëîâèå äàåò ïðåèìóùåñòâî ïîñòàâùèêó, åñëè êëèåíòñêàÿ ÷àñòü
êîíòðàêòà íå âûïîëíÿåòñÿ, òî êëàññ ïåðåñòàåò áûòü ñâÿçàí ïîñòóñëîâèåì.  ýòîì ñëó÷àå ïðîãðàììà ìîæåò
äåëàòü âñå ÷òî óãîäíî, íàïðèìåð çàöèêëèòüñÿ, íå íàðóøàÿ ïðè ýòîì êîíòðàêò. Ýòî òîò ñàìûé ñëó÷àé, êîãäà
"çàêàç÷èê âèíîâàò".
Ïåðâîå ïðåèìóùåñòâî îò òàêîãî ñîãëàøåíèÿ â òîì, ÷òî ñòèëü ïðîãðàììèðîâàíèÿ ñóùåñòâåííî óïðîùàåòñÿ. Ðàçðàáîò÷èê êëàññà ïðè íàïèñàíèè òåëà ïðîãðàììû ñìåëî ìîæåò ïðåäïîëàãàòü, ÷òî âñå îãðàíè÷åíèÿ,
çàäàííûå ïðåäóñëîâèåì, âûïîëíÿþòñÿ; åìó íåò íóæäû ïðîâåðÿòü èõ â òåëå ïðîãðàììû. Òàê äëÿ ôóíêöèè,
âû÷èñëÿþùåé êâàäðàòíûé êîðåíü:
def sqrt(x):
assert x >= 0
.....
ìîæíî ñìåëî ïðèìåíÿòü àëãîðèòì, íå ó÷èòûâàþùèé ñëó÷àé îòðèöàòåëüíîãî x, ïîñêîëüêó ýòî ïðåäóñìîòðåíî ïðåäóñëîâèåì, è îòâåòñòâåííîñòü çà åãî âûïîëíåíèå íåñóò êëèåíòû ïðîãðàììû. Ñ ïåðâîãî âçãëÿäà
ýòî ìîæåò ïîêàçàòüñÿ îïàñíûì, íî ÷èòàéòå äàëüøå. Ôàêòè÷åñêè ìåòîä Ïðîåêòèðîâàíèÿ ïî Êîíòðàêòó
èäåò äàëüøå. Ïðåäïîëîæèì, ÷òî ìû íàïèñàëè â ïðåäëîæåíèè do ïðåäûäóùåé ïðîãðàììû ñëåäóþùèé
òåêñò:
17
...
if x < 0:
print "Îáðàáîòàòü îøèáêó êàê-íèáóäü"
else:
print "Âûïîëíèòü íîðìàëüíîå âû÷èñëåíèå êâàäðàòíîãî êîðíÿ"
....
Çàìåòüòå, â ýòîì íå òîëüêî íåò íèêàêîé íåîáõîäèìîñòè, íî ýòî è íåïðèåìëåìî! Ýòîò ôàêò ìîæíî
îòðàçèòü â ñëåäóþùåì ìåòîäîëîãè÷åñêîì ïðàâèëå:
Ïðèíöèï Íåò-Èçáûòî÷íîñòè
Íè ïðè êàêèõ îáñòîÿòåëüñòâàõ â òåëå ïðîãðàììû íå äîëæíî ïðîâåðÿòüñÿ åå ïðåäóñëîâèå
Ýòî ïðàâèëî ïðîòèâîðå÷èò òîìó, ÷åìó ó÷àò âî ìíîãèõ ó÷åáíèêàõ ïî ïðîãðàììèðîâàíèÿ, ãäå íåîáõîäèìîñòü ïðîâåðîê ÷àñòî âûñòóïàåò ïîä çíàìåíàìè "çàùèòíîãî ïðîãðàììèðîâàíèÿ"(defensive programming).
Åãî èäåÿ â òîì, ÷òî äëÿ ïîëó÷åíèÿ íàäåæíîãî ÏÎ êàæäàÿ ïðîãðàììà äîëæíà çàùèùàòü ñåáÿ íàñòîëüêî,
íàñêîëüêî ýòî âîçìîæíî. Ëó÷øå áîëüøå ïðîâåðîê, ÷åì íåäîñòàòî÷íî; íåëüçÿ äîâåðÿòü íåçíàêîìöàì; åùå
îäíà ïðîâåðêà ìîæåò è íå ïîìîæåò, íî è íå íàâðåäèò äåëó.
Ïðîåêòèðîâàíèå ïî êîíòðàêòó óòâåðæäàåò ïðîòèâíîå: èçáûòî÷íûå ïðîâåðêè ìîãóò íàíåñòè âðåä. Êîíå÷íî, ýòî êàæåòñÿ ñòðàííûì, íà ïåðâûé âçãëÿä. Ýòî åñòåñòâåííàÿ ðåàêöèÿ, ïîëàãàòü, ÷òî äîïîëíèòåëüíàÿ ïðîâåðêà â õóäøåì ñëó÷àå ìîæåò áûòü áåñïîëåçíîé, íî íå ìîæåò áûòü ïðè÷èíîé íåïîëàäîê. Âîçüìåì,
íàïðèìåð, ïðîãðàììó sqrt, âêëþ÷èâøóþ ïðîâåðêó x<0, õîòÿ åå êëèåíòû áûëè ïðîèíñòðóêòèðîâàíû î
íåîáõîäèìîñòè îáåñïå÷åíèÿ x>=0. ×òî â ýòîì ïëîõîãî? Ñ ìèêðîñêîïè÷åñêîé òî÷êè çðåíèÿ, îãðàíè÷èâ
íàøå âèäåíèå óçêèì ìèðêîì sqrt, êàæåòñÿ, ÷òî âêëþ÷åíèå ïðîâåðêè äåëàåò ïðîãðàììó áîëåå óñòîé÷èâîé.
Íî ìèð ñèñòåìû íå îãðàíè÷èâàåòñÿ îäíîé ïðîãðàììîé - îí ñîäåðæèò ìíîæåñòâî ïðîãðàìì â ìíîæåñòâå
êëàññîâ. Äëÿ ïîëó÷åíèÿ íàäåæíîé ñèñòåìû íåîáõîäèìî ïåðåéòè ê ìàêðîñêîïè÷åñêîìó âèäåíèþ ïðîáëåìû,
îáîáùàþùåìó âñþ àðõèòåêòóðó.
Ñ ýòîé ãëîáàëüíîé òî÷êè çðåíèÿ ïðîñòîòà ñòàíîâèòñÿ êðèòè÷åñêèì ôàêòîðîì. Ñëîæíîñòü - ãëàâíûé
âðàã êà÷åñòâà. Êîãäà â ýòîò êîíöåðí ïðèâíîñÿòñÿ èçëèøíèå ïðîâåðêè, òî ýòî óæå íå ïîêàæåòñÿ ñòîëü
áåçîáèäíûì äåëîì. Ýêñòðàïîëèðóéòå íà òûñÿ÷è ïðîãðàìì â ñèñòåìå ñðåäíåãî ðàçìåðà (èëè íà äåñÿòêè è
ñîòíè òûñÿ÷ â áîëüøîé ñèñòåìå) ïðîâåðêó (if x<0 then ...), ñòîëü áåçîáèäíóþ ñ ïåðâîãî âçãëÿäà, - âñå ýòî
íà÷íåò âûãëÿäåòü ïîäîáíî ìîíñòðó áåñïîëåçíîé ñëîæíîñòè. Äîáàâëÿÿ èçáûòî÷íûå ïðîâåðêè, äîáàâëÿåòå
áîëüøå êîäà. Áîëüøå êîäà - áîëüøå ñëîæíîñòè, îòñþäà è áîëüøå èñòî÷íèêîâ óñëîâèé, ïðèâîäÿùèõ ê òîìó,
÷òî âñå ïîéäåò íå òàê, ýòî ïðèâåäåò ê äàëüíåéøåìó ðàçðàñòàíèþ êîäà è òàê äî áåñêîíå÷íîñòè. Åñëè ïîéòè
ïî ýòîé äîðîãå, òî îïðåäåëåííî ìîæíî ñêàçàòü îäíî - ìû íèêîãäà íå äîñòèãíåì íàäåæíîñòè. ×åì áîëüøå
ïèøåì, òåì áîëüøå ïðèäåòñÿ ïèñàòü.
Ýòîò áåã ñ ïðåïÿòñòâèÿìè íå äëÿ íàñ, íàñ æäåò äðóãàÿ äîðîãà. Ïðîåêòèðîâàíèå ïî Êîíòðàêòó ïðèãëàøàåò èäåíòèôèöèðîâàòü ñîãëàñîâàííûå óñëîâèÿ, íåîáõîäèìûå äëÿ ïðàâèëüíîãî ôóíêöèîíèðîâàíèÿ
êàæäîãî êîíòðàêòà â êîîïåðàöèè êëèåíòû - ïîñòàâùèêè. Ìåòîä âûíóæäàåò äëÿ êàæäîãî ñîãëàøåíèÿ
óñòàíîâèòü, êòî íåñåò îòâåòñòâåííîñòü - êëèåíò èëè ïîñòàâùèê. Îòâåò ìîæåò áûòü ðàçíûé, ÷àñòè÷íî îí
îïðåäåëÿåòñÿ ñòèëåì ïðîåêòèðîâàíèÿ; ïîçæå áóäåò äàí îòâåò, êàê ýòî äåëàòü ëó÷øèì îáðàçîì. Íî êîãäà
ðåøåíèå ïðèíÿòî, íóæíî åãî ïðèäåðæèâàòüñÿ. Åñëè òðåáîâàíèÿ êîððåêòíîñòè ïîÿâëÿþòñÿ â ïðåäóñëîâèè, îïðåäåëÿÿ òåì ñàìûì îòâåòñòâåííîñòü êëèåíòà, òî â ïðîãðàììå íå äîëæíî áûòü ñîîòâåòñòâóþùèõ
ïðîâåðîê. Òðåáîâàíèÿ, íå óêàçàííûå â ïðåäóñëîâèè, äîëæíû ïðîâåðÿòüñÿ è âûïîëíÿòüñÿ â ïðîãðàììå.
Ñëåäóåò îòìåòèòü, ÷òî èçáûòî÷íûå ïðîâåðêè øèðîêî ïðèìåíÿþòñÿ â ïðîöåññå ôóíêöèîíèðîâàíèÿ êîìïüþòåðîâ è äðóãîé ýëåêòðîííîé àïïàðàòóðû. Ôèçè÷åñêàÿ ñèñòåìà, íîðìàëüíî ôóíêöèîíèðóþùàÿ, ñî âðåìåíåì ìîæåò òåðÿòü öåëîñòíîñòü; ïðè÷èíû ðàçíûå - èçíîñ, ðàçðûâ, âíåøíèå âîçäåéñòâèÿ. Ïîýòîìó íîðìàëüíîé ïðàêòèêîé ÿâëÿåòñÿ, êîãäà ïîëó÷àòåëü è îòïðàâèòåëü ñèãíàëà îáà ïðîâåðÿþò åãî öåëîñòíîñòü.
Äëÿ ïðîãðàììíûõ ñèñòåì ôåíîìåíà èçíîñà íå íàáëþäàåòñÿ, íåò è íåîáõîäèìîñòè â èçáûòî÷íûõ ïðîâåðêàõ.
Ìîæíî òàêæå çàìåòèòü, ÷òî òàê íàçûâàåìàÿ èçáûòî÷íàÿ ïðîâåðêà àïïàðàòóðû, íà ñàìîì äåëå òàêîâîé
íå ÿâëÿåòñÿ: ýòî ìîãóò áûòü ðàçëè÷íûå äîïîëíèòåëüíûå òåñòû, íàïðèìåð, ïðîâåðêà íà ÷åòíîñòü, ïðîâåðêà
ðàçíûõ óñòðîéñòâ è ò.ä.
Åùå îäíèì íåäîñòàòêîì çàùèòíîãî ïðîãðàììèðîâàíèÿ ÿâëÿåòñÿ åãî ñòîèìîñòü. Ïîòåðÿ ïðîèçâîäèòåëüíîñòè - íàêàçàíèå çà èçáûòî÷íûå ïðîâåðêè. Èíîãäà ýòîãî âïîëíå äîñòàòî÷íàÿ ïðè÷èíà äëÿ îòêàçà
îò çàùèòíîãî ïðîãðàììèðîâàíèÿ, ÷òîáû íå ïèñàëîñü â ó÷åáíèêàõ. Ðàáîòà ïî óäàëåíèþ òàêèõ ïðîâåðîê
ìîæåò áûòü äîâîëüíî óòîìèòåëüíîé. Ïðèåìû, ðàññìàòðèâàåìûå â ýòîé ëåêöèè, îñòàâëÿþò ìåñòî äîïîëíèòåëüíûì ïðîâåðêàì, íî îíè áóäóò îñíîâûâàòüñÿ íà ðàçðàáîòêå òàêîãî îêðóæåíèÿ, êîòîðîå âîçüìåò íà ñåáÿ
18
çàáîòó î ïîäîáíûõ ïðîâåðêàõ. Ïîñëå çàâåðøåíèÿ îòëàäêè äîñòàòî÷íî áóäåò îòêëþ÷èòü ñîîòâåòñòâóþùèé
ïàðàìåòð êîìïèëÿöèè, ÷òîáû ïðîâåðêè èñ÷åçëè; â ñàìîì ïðîãðàììíîì ïðîäóêòå îíè íå ñîäåðæàòñÿ.
Íå ãîâîðÿ óæå î ïîòåðå ïðîèçâîäèòåëüíîñòè, ïðèíöèïèàëüíîé ïðè÷èíîé îòêàçà îò çàùèòíîãî ïðîãðàììèðîâàíèÿ ÿâëÿåòñÿ íàøà öåëü - ïîëó÷åíèå ìàêñèìàëüíîé íàäåæíîñòè. Äëÿ ñèñòåì ñêîëü ëèáî ñóùåñòâåííûõ ðàçìåðîâ íåäîñòàòî÷íî îáåñïå÷åíèå êà÷åñòâà îòäåëüíûõ ýëåìåíòîâ, - áîëåå âàæíî ãàðàíòèðîâàòü, ÷òî
äëÿ êàæäîãî âçàèìîäåéñòâèÿ äâóõ ýëåìåíòîâ çàäàí ÿâíûé ñïèñîê âçàèìíûõ îáÿçàòåëüñòâ è ïðåèìóùåñòâ
- êîíòðàêò.  çàêëþ÷åíèå ñôîðìóëèðóåì ïàðàäîêñ Äçåí-ñòèëÿ: ìåíüøå ïðîâåðîê - áîëüøå íàäåæíîñòè.
19
Ëèòåðàòóðà
[1] Ìåéåð Á. Îáúåêòíî-îðèåíòèðîâàííîå êîíñòðóèðîâàíèå ïðîãðàììíûõ ñèñòåì + CD. Ðóññêàÿ Ðåäàêöèÿ, Èíòåðíåò-óíèâåðñèòåò èíôîðìàöèîííûõ òåõíîëîãèé - ÈÍÒÓÈÒ.ðó, 2005. Ñ. 1232.
[2] Àíèñèìîâ À. Å., Ïóïûøåâ Â. Â. Ñáîðíèê çàäàíèé ïî îñíîâàíèÿì ïðîãðàììèðîâàíèÿ. Èíòåðíåòóíèâåðñèòåò èíôîðìàöèîííûõ òåõíîëîãèé - ÈÍÒÓÈÒ.ðó, ÁÈÍÎÌ. Ëàáîðàòîðèÿ çíàíèé, 2006. Ñ. 352.
[3] Ñóçè Ð. À. ßçûê ïðîãðàììèðîâàíèÿ Python. Èíòåðíåò-óíèâåðñèòåò èíôîðìàöèîííûõ òåõíîëîãèé ÈÍÒÓÈÒ.ðó, ÁÈÍÎÌ. Ëàáîðàòîðèÿ çíàíèé, 2006. Ñ. 328.
20
0
You can add this document to your study collection(s)
Sign in Available only to authorized usersYou can add this document to your saved list
Sign in Available only to authorized users(For complaints, use another form )