Ñàðàòîâñêèé ãîñóíèâåðñèòåò
Ìåõàíèêî-ìàòåìàòè÷åñêèé ôàêóëüòåò
Îñíîâû îáúåêòíî-îðèåíòèðîâàííîãî
ïðîãðàììèðîâàíèÿ
Ñîñòàâèë: Áëèíêîâ Þ. À.
II
Ëåêöèè
73
1
Êà÷åñòâî ÏÎ
74
1.1
Âíåøíèå è âíóòðåííèå ôàêòîðû . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
74
1.2
Îáçîð âíåøíèõ ôàêòîðîâ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
75
1.3
Î ïðîãðàììíîì ñîïðîâîæäåíèè
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
92
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
94
Êîíòðîëüíûå âîïðîñû
2
Êðèòåðèè îáúåêòíîé îðèåíòàöèè
100
2.1
Î êðèòåðèÿõ
2.2
Ìåòîä è ÿçûê . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
2.3
Ðåàëèçàöèÿ è ñðåäà
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Êîíòðîëüíûå âîïðîñû
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
3
Ìîäóëüíîñòü
119
3.1
Ïÿòü êðèòåðèåâ
3.2
Ïÿòü ïðàâèë
3.3
Ïÿòü ïðèíöèïîâ
3.4
Êëþ÷åâûå êîíöåïöèè
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Êîíòðîëüíûå âîïðîñû
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
4
Ïîäõîäû ê ïîâòîðíîìó èñïîëüçîâàíèþ
4.1
Öåëè ïîâòîðíîãî èñïîëüçîâàíèÿ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
144
4.2
×òî ñëåäóåò ïîâòîðíî èñïîëüçîâàòü?
4.3
Ïîâòîðÿåìîñòü ïðè ðàçðàáîòêå ÏÎ
4.4
Ïÿòü òðåáîâàíèé ê ìîäóëüíûì ñòðóêòóðàì
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
. . . . . . . . . . . . . . . . . . . . . . . . . . 153
4.5
Òðàäèöèîííûå ìîäóëüíûå ñòðóêòóðû . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
4.6
Ïåðåãðóçêà è óíèâåðñàëüíîñòü . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
4.7
Êëþ÷åâûå êîíöåïöèè
Êîíòðîëüíûå âîïðîñû
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
5
Ê îáúåêòíîé òåõíîëîãèè
5.1
Ôóíêöèîíàëüíàÿ äåêîìïîçèöèÿ
5.2
Äåêîìïîçèöèÿ, îñíîâàííàÿ íà îáúåêòàõ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
5.3
Êëþ÷åâûå êîíöåïöèè
Êîíòðîëüíûå âîïðîñû
170
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
6
Àáñòðàêòíûå òèïû äàííûõ (ÀÒÄ)
6.1
Êðèòåðèè . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
6.2
Ê àáñòðàêòíîìó âçãëÿäó íà îáúåêòû
6.3
Îò àáñòðàêòíûõ òèïîâ äàííûõ ê êëàññàì
6.4
Êëþ÷åâûå êîíöåïöèè
Êîíòðîëüíûå âîïðîñû
186
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
. . . . . . . . . . . . . . . . . . . . . . . . . . . 207
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
7
Ñòàòè÷åñêèå ñòðóêòóðû
7.1
Êëàññû, à íå îáúåêòû - ïðåäìåò îáñóæäåíèÿ . . . . . . . . . . . . . . . . . . . . . . . . . . 220
7.2
Ðîëü êëàññîâ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
7.3
Óíèôèöèðîâàííàÿ ñèñòåìà òèïîâ
7.4
Ïðîñòîé êëàññ
7.5
Êëþ÷åâûå êîíöåïöèè
Êîíòðîëüíûå âîïðîñû
220
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
8
Äèíàìè÷åñêèå ñòðóêòóðû: îáúåêòû
8.1
Îáúåêòû
232
8.2
Îáúåêòû êàê ñðåäñòâî ìîäåëèðîâàíèÿ
8.3
Ðàáîòà ñ îáúåêòàìè è ññûëêàìè . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
8.4
Êëþ÷åâûå êîíöåïöèè
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
Êîíòðîëüíûå âîïðîñû
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
9
Ïðîåêòèðîâàíèå ïî êîíòðàêòó: ïîñòðîåíèå íàäåæíîãî ÏÎ
9.1
Áàçèñíûå ìåõàíèçìû íàäåæíîñòè . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
9.2
Î êîððåêòíîñòè ÏÎ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
9.3
Âûðàæåíèå ñïåöèôèêàöèé
9.4
Ââåäåíèå óòâåðæäåíèé â ïðîãðàììíûå òåêñòû . . . . . . . . . . . . . . . . . . . . . . . . . 253
9.5
ïðèìåð Êëàññ ñòåê . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
9.6
Êîíòðàêòû è íàäåæíîñòü ÏÎ
Êîíòðîëüíûå âîïðîñû
246
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
10
Êîãäà êîíòðàêò íàðóøàåòñÿ: îáðàáîòêà èñêëþ÷åíèé
10.1
Áàçèñíûå êîíöåïöèè îáðàáîòêè èñêëþ÷åíèé . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Êîíòðîëüíûå âîïðîñû
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
11
Ââåäåíèå â íàñëåäîâàíèå
11.1
Îñíîâíûå ñîãëàøåíèÿ è òåðìèíîëîãèÿ
11.2
Êëþ÷åâûå êîíöåïöèè
Êîíòðîëüíûå âîïðîñû
12
267
279
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Ìíîæåñòâåííîå íàñëåäîâàíèå
291
12.1
Ïðèìåðû ìíîæåñòâåííîãî íàñëåäîâàíèÿ
12.2
Ñòðóêòóðíîå íàñëåäîâàíèå . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
12.3
Íàñëåäîâàíèå ôóíêöèîíàëüíûõ âîçìîæíîñòåé . . . . . . . . . . . . . . . . . . . . . . . . . 301
12.4
Êëþ÷åâûå êîíöåïöèè
Êîíòðîëüíûå âîïðîñû
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
13
Òåõíèêà íàñëåäîâàíèÿ
13.1
Íàñëåäîâàíèå è óòâåðæäåíèÿ
13.2
Íàñëåäîâàíèå è ñêðûòèå èíôîðìàöèè . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Êîíòðîëüíûå âîïðîñû
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
14
Òèïèçàöèÿ
14.1
Ïðîáëåìà òèïèçàöèè
Êîíòðîëüíûå âîïðîñû
307
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
321
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
15
Ãëîáàëüíûå îáúåêòû è êîíñòàíòû
15.1
Êîíñòàíòû áàçîâûõ òèïîâ
Êîíòðîëüíûå âîïðîñû
333
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Ëèòåðàòóðà
339
Ñïèñîê èëëþñòðàöèé
341
Ñïèñîê òàáëèö
343
Ïðåäìåòíûé óêàçàòåëü
344
×àñòü II
Ëåêöèè
1 Êà÷åñòâî ÏÎ
Êà÷åñòâî - ýòî öåëü èíæåíåðíîé äåÿòåëüíîñòè; ïîñòðîåíèå êà÷åñòâåííîãî ïðîãðàììíîãî îáåñïå÷åíèÿ (ÏÎ) (software) - öåëü ïðîãðàììíîé èíæåíåðèè (software engineering).
Îïðåäåëåíèå 1. ÏÎ ýòî íàáîð ïðîãðàìì è ñîîòâåòñòâóþùàÿ èì äîêóìåíòàöèÿ.
 äàííîì ïîñîáèè ðàññìàòðèâàþòñÿ ñðåäñòâà è òåõíè÷åñêèå ïðèåìû, ïîçâîëÿþùèå çíà÷èòåëüíî
óëó÷øèòü êà÷åñòâî ÏÎ. Ïðåæäå ÷åì ïðèñòóïèòü ê èçó÷åíèþ ýòèõ ñðåäñòâ è ïðèåìîâ, ñëåäóåò õîðîøî
ïðåäñòàâëÿòü íàøó öåëü. Êà÷åñòâî ÏÎ ëó÷øå âñåãî îïèñûâàåòñÿ êîìáèíàöèåé ðÿäà ôàêòîðîâ.  ýòîé
ëåêöèè ìû ïîñòàðàåìñÿ ïðîàíàëèçèðîâàòü íåêîòîðûå èç íèõ, è ïîêàæåì, ãäå íåîáõîäèìû óëó÷øåíèÿ.
1.1 Âíåøíèå è âíóòðåííèå ôàêòîðû
Âñå ìû õîòèì, ÷òîáû íàøå ÏÎ áûëî áûñòðîäåéñòâóþùèì, íàäåæíûì, ëåãêèì â èñïîëüçîâàíèè, ÷èòàåìûì, ìîäóëüíûì, ñòðóêòóðíûì è ò.ä. Íî ýòè îïðåäåëåíèÿ îïèñûâàþò äâà ðàçíûõ òèïà êà÷åñòâà.
Íàëè÷èå èëè îòñóòñòâèå òàêèõ êà÷åñòâ, êàê ñêîðîñòü è ïðîñòîòà èñïîëüçîâàíèÿ ÏÎ, ìîæåò áûòü
îáíàðóæåíî åãî ïîëüçîâàòåëÿìè. Ýòè êà÷åñòâà ìîæíî íàçâàòü
âíåøíèìè ôàêòîðàìè êà÷åñòâà.
Ïîä ñëîâîì ïîëüçîâàòåëè íóæíî ïîíèìàòü íå òîëüêî ëþäåé, âçàèìîäåéñòâóþùèõ ñ êîíå÷íûì ïðîäóêòîì, íî è òåõ, êòî èõ çàêóïàåò, çàíèìàåòñÿ àäìèíèñòðèðîâàíèåì. Òàêîå ñâîéñòâî, íàïðèìåð, êàê
ëåãêîñòü àäàïòàöèè ïðîäóêòîâ ê èçìåíåíèÿì ñïåöèôèêàöèé - äàëåå îïðåäåëåííàÿ â íàøåé äèñêóññèè
êàê ðàñøèðÿåìîñòü - ïîïàäàåò â êàòåãîðèþ âíåøíèõ ôàêòîðîâ, ïîñêîëüêó îíà ìîæåò ïðåäñòàâëÿòü
èíòåðåñ äëÿ àäìèíèñòðàòîðîâ, çàêóïàþùèõ ïðîäóêò, õîòÿ è íå âàæíà äëÿ êîíå÷íûõ ïîëüçîâàòåëåé,
íåïîñðåäñòâåííî ðàáîòàþùèõ ñ ïðîäóêòîì.
Òàêèå õàðàêòåðèñòèêè ÏÎ, êàê ìîäóëüíîñòü èëè ÷èòàåìîñòü, ÿâëÿþòñÿ
âíóòðåííèìè ôàêòîðàìè,
ïîíÿòíûìè òîëüêî äëÿ ïðîôåññèîíàëîâ, èìåþùèõ äîñòóï ê òåêñòó ÏÎ.
 êîíå÷íîì ñ÷åòå, òîëüêî âíåøíèå ôàêòîðû èìåþò çíà÷åíèå. Íî êëþ÷ ê äîñòèæåíèþ âíåøíèõ
ôàêòîðîâ ñïðÿòàí âî âíóòðåííèõ ôàêòîðàõ: äëÿ òîãî, ÷òîáû äîñòè÷ü âèäèìîãî êà÷åñòâà, ïðîåêòèðîâùèêè è êîíñòðóêòîðû äîëæíû èìåòü âíóòðåííèå ïðèåìû, ïîçâîëÿþùèå óëó÷øàòü ñêðûòûå îò
ïîëüçîâàòåëÿ êà÷åñòâà.
1.2 Îáçîð âíåøíèõ ôàêòîðîâ
Ðàññìîòðèì ñàìûå âàæíûå âíåøíèå ôàêòîðû êà÷åñòâà, ñòðåìëåíèå ê êîòîðûì åñòü öåíòðàëüíàÿ
çàäà÷à ÎÎ-ïîñòðîåíèÿ ÏÎ.
Êîððåêòíîñòü (Correctness)
Îïðåäåëåíèå 2. Êîððåêòíîñòü - ýòî ñïîñîáíîñòü ÏÎ âûïîëíÿòü òî÷íûå çàäà÷è òàê, êàê îíè îïðåäåëåíû èõ ñïåöèôèêàöèåé.
Êîððåêòíîñòü ÿâëÿåòñÿ âàæíåéøèì êà÷åñòâîì. Åñëè ñèñòåìà íå äåëàåò òîãî, ÷òî îíà äîëæíà äåëàòü, òî âñå îñòàëüíîå - åå áûñòðîäåéñòâèå, õîðîøèé ïîëüçîâàòåëüñêèé èíòåðôåéñ - íå èìååò îñîáîãî
çíà÷åíèÿ.
Ðèñ. 1.1: Ñëîè â ðàçðàáîòêå ÏÎ
Ìåòîäû îáåñïå÷åíèÿ êîððåêòíîñòè îáû÷íî óñëîâíû. Ñåðüåçíàÿ ñèñòåìà ÏÎ, äàæå íåáîëüøàÿ ïî
íûíåøíèì ìåðêàì, èñïîëüçóåò ñòîëü ìíîãîå, ÷òî íåâîçìîæíî ãàðàíòèðîâàòü åå êîððåêòíîñòü, ðàáîòàÿ ñî âñåìè êîìïîíåíòàìè íà îäíîì óðîâíå. Íåîáõîäèì ìíîãîóðîâíåâûé ïîäõîä: Â óñëîâíîì ïîäõîäå
ê êîððåêòíîñòè ìû çàáîòèìñÿ òîëüêî î òîì, ÷òîáû îáåñïå÷èòü êîððåêòíîñòü êàæäîãî óðîâíÿ, îñíîâûâàÿñü íà ïðåäïîëîæåíèè, ÷òî íèæåëåæàùèå óðîâíè êîððåêòíû. Ýòî åäèíñòâåííî ðåàëèñòè÷íûé
ïîäõîä, ïîñêîëüêó îí ïîçâîëÿåò ðàçäåëèòü ïðîáëåìó è íà êàæäîé ñòóïåíè ñêîíöåíòðèðîâàòüñÿ íà
îãðàíè÷åííîì êðóãå çàäà÷. Íåëüçÿ ïðîâåðèòü, ÷òî ïðîãðàììà íà ÿçûêå âûñîêîãî óðîâíÿ êîððåêòíà,
åñëè íå ïðåäïîëîæèòü, ÷òî èñïîëüçóåìûé êîìïèëÿòîð êîððåêòíî ðåàëèçóåò ÿçûê. Ýòî íå ñëåïîå äîâåðèå êîìïèëÿòîðó, à ðàçäåëåíèå ïðîáëåìû íà äâå: ïðîâåðêà êîððåêòíîñòè êîìïèëÿòîðà è ïðîâåðêà
êîððåêòíîñòè ïðîãðàììû îòíîñèòåëüíî ñåìàíòèêè ÿçûêà.
Çäåñü òàêæå ïðèìåíèì óñëîâíûé ïîäõîä: ñëåäóåò îáåñïå÷èòü êîððåêòíîñòü áèáëèîòåê è êîððåêòíîñòü ïðèëîæåíèÿ ïðè óñëîâèè, ÷òî áèáëèîòåêè êîððåêòíû.
Ìíîãèå ïðàêòèêè ïîëàãàþò, ÷òî äîñòèæåíèå êîððåêòíîñòè ÏÎ ñâÿçàíî ñ òåñòèðîâàíèåì è èñïðàâëåíèåì îøèáîê.  äàëüíåéøèõ ëåêöèÿõ èññëåäóåòñÿ ðÿä òåõíè÷åñêèõ ïðèåìîâ, â ÷àñòíîñòè òèïèçàöèÿ
è ìåòîä óòâåðæäåíèé, íàïðàâëåííûõ íà ïîñòðîåíèå ÏÎ, êîððåêòíîãî ñ ñàìîãî íà÷àëà. Èñïðàâëåíèå
îøèáîê è òåñòèðîâàíèå, êîíå÷íî, îñòàþòñÿ íåîáõîäèìûìè êàê ñðåäñòâà äîïîëíèòåëüíîé ïðîâåðêè
Ðèñ. 1.2: Óðîâíè â ïðîöåññå ðàçðàáîòêè, âêëþ÷àþùåì ïîâòîðíîå èñïîëüçîâàíèå
Ðèñ. 1.3: Óñòîé÷èâîñòü ïðîòèâ êîððåêòíîñòè
ðåçóëüòàòà. Ìîæíî áûëî áû ïîéòè äàëüøå è ïðèíÿòü ñîâñåì ôîðìàëüíûé ïîäõîä ê ïîñòðîåíèþ
ÏÎ. Ýòî íå ÿâëÿåòñÿ öåëüþ íàøèõ ëåêöèé, êàê ÿñíî èç íåñêîëüêî ðîáêèõ òåðìèíîâ - ïðîâåðÿòü,
ãàðàíòèðîâàòü, îáåñïå÷èâàòü, èñïîëüçóåìûõ âûøå âìåñòî ñëîâà äîêàçûâàòü. Âñå æå ìíîãèå èç
îïèñàííûõ íèæå òåõíè÷åñêèõ ïðèåìîâ ïðîèñõîäÿò íåïîñðåäñòâåííî îò ìàòåìàòè÷åñêèõ ìåòîäîâ ôîðìàëüíîé ñïåöèôèêàöèè è âåðèôèêàöèè ïðîãðàìì, ïðîõîäÿ äëèííûé ïóòü ê îáåñïå÷åíèþ èäåàëà êîððåêòíîñòè.
Óñòîé÷èâîñòü (Robustness)
Îïðåäåëåíèå 3. Óñòîé÷èâîñòü - ýòî ñïîñîáíîñòü ÏÎ ñîîòâåòñòâóþùèì îáðàçîì ðåàãèðîâàòü íà
àâàðèéíûå ñèòóàöèè.
Óñòîé÷èâîñòü äîïîëíÿåò êîððåêòíîñòü. Êîððåêòíîñòü îòíîñèòñÿ ê ïîâåäåíèþ ñèñòåìû â ñëó÷àÿõ,
îïðåäåëåííûõ ñïåöèôèêàöèåé; óñòîé÷èâîñòü õàðàêòåðèçóåò òî, ÷òî ïðîèñõîäèò çà ïðåäåëàìè ýòîé
ñïåöèôèêàöèè. Êàê âèäíî èç îïðåäåëåíèÿ, óñòîé÷èâîñòü ïî ñâîåé ïðèðîäå áîëåå íå÷åòêîå ïîíÿòèå,
÷åì êîððåêòíîñòü. Íåâîçìîæíî ñêàçàòü, êàê â ñëó÷àå ñ êîððåêòíîñòüþ, ÷òî â àâàðèéíûõ ñèòóàöèÿõ
ñèñòåìà äîëæíà âûïîëíÿòü ñâîè çàäà÷è, ïîñêîëüêó ñèòóàöèè âûõîäÿò çà ïðåäåëû ñïåöèôèêàöèè.
Åñëè áû ýòè çàäà÷è áûëè èçâåñòíû, àâàðèéíûé ñëó÷àé ñòàë áû ÷àñòüþ ñïåöèôèêàöèè, è ìû áû ñíîâà
âåðíóëèñü â îáëàñòü êîððåêòíîñòè.
Ýòî îïðåäåëåíèå àâàðèéíîé ñèòóàöèè íàì åùå ïîíàäîáèòñÿ ïðè èçó÷åíèè îáðàáîòêè èñêëþ÷åíèé. Îíî ïîäðàçóìåâàåò, ÷òî ïîíÿòèÿ íîðìàëüíîé è àâàðèéíîé ñèòóàöèè âñåãäà îòíîñèòåëüíû ïî
îòíîøåíèþ ê çàäàííîé ñïåöèôèêàöèè; ñèòóàöèÿ àâàðèéíà, åñëè îíà âûõîäèò çà ðàìêè ñïåöèôèêàöèè. Åñëè ðàñøèðèòü ñïåöèôèêàöèþ, àâàðèéíûå ñëó÷àè ñòàíîâÿòñÿ íîðìàëüíûìè - äàæå åñëè îíè
ñîîòâåòñòâóþò òàêèì íåæåëàòåëüíûì ñîáûòèÿì, êàê, íàïðèìåð, îøèáî÷íûé ââîä ïîëüçîâàòåëÿ.
Âñåãäà áóäóò ñóùåñòâîâàòü ñëó÷àè, íà êîòîðûå ñïåöèôèêàöèÿ ÿâíî íå ðàñïðîñòðàíÿåòñÿ. Ðîëü òðåáîâàíèÿ óñòîé÷èâîñòè - óäîñòîâåðèòüñÿ, ÷òî è â òàêèõ ñëó÷àÿõ ñèñòåìà íå ïðèâîäèò ê íåïîïðàâèìîé
ñèòóàöèè; îíà äîëæíà âûäàòü ñîîòâåòñòâóþùåå ñîîáùåíèå îá îøèáêå, ãëàäêî çàâåðøèòü ðàáîòó èëè
âîéòè â òàê íàçûâàåìûé ðåæèì ïîñòåïåííîãî âûâîäà èç ðàáîòû.
Ðàñøèðÿåìîñòü (Extendibility)
Îïðåäåëåíèå 4. Ðàñøèðÿåìîñòü - ýòî ëåãêîñòü àäàïòàöèè ÏÎ ê èçìåíåíèÿì ñïåöèôèêàöèè.
Ïðîáëåìà ðàñøèðÿåìîñòè ýòî ïðîáëåìà ìàñøòàáà. Äëÿ ìàëåíüêèõ ïðîãðàìì èçìåíåíèå íå ÿâëÿåòñÿ îáû÷íî áîëüøîé ïðîáëåìîé, íî ïî ìåðå óâåëè÷åíèÿ ÏÎ àäàïòàöèÿ ñòàíîâèòñÿ âñå òðóäíåå. Áîëüøàÿ ïðîãðàììíàÿ ñèñòåìà ÷àñòî âèäèòñÿ êàê îãðîìíûé êàðòî÷íûé äîì, óäàëåíèå îäíîãî ýëåìåíòà
ìîæåò ïðèâåñòè ê ðàçðóøåíèþ âñåãî ïîñòðîåíèÿ.
Òðàäèöèîííûå ïîäõîäû ê ïîñòðîåíèþ ÏÎ íå óäåëÿëè äîëæíîãî âíèìàíèÿ èçìåíåíèÿì. Îíè ñêîðåå èñõîäèëè èç èäåàëüíîãî âçãëÿäà íà æèçíåííûé öèêë ÏÎ, ãäå òðåáîâàíèÿ çàìîðàæèâàþòñÿ ïîñëå
çàâåðøåíèÿ ïåðâîíà÷àëüíîé ñòóïåíè àíàëèçà. Ïîñëåäóþùèé ïðîöåññ ïîñâÿùàëñÿ ïðîåêòèðîâàíèþ è
ïîñòðîåíèþ ðåøåíèÿ ïðè ôèêñèðîâàííûõ òðåáîâàíèÿõ. Ýòî âïîëíå ïîíÿòíî: íà òîì ýòàïå ðàçâèòèÿ
äèñöèïëèíû çàäà÷à ñîñòîÿëà â ðàçðàáîòêå íàäåæíûõ òåõíè÷åñêèõ ïðèåìîâ äëÿ ïîñòàíîâêè è ðåøåíèÿ ôèêñèðîâàííûõ ïðîáëåì. Íî ñåé÷àñ ñòàëî âîçìîæíûì ïðèçíàòü è ðàññìîòðåòü öåíòðàëüíûé
âîïðîñ - ÷òî äåëàòü, åñëè ïðîáëåìà èçìåíÿåòñÿ â õîäå åå ðåøåíèÿ. Èçìåíåíèÿ õàðàêòåðíû äëÿ ïðîöåññà ðàçðàáîòêè ÏÎ: ìåíÿþòñÿ òðåáîâàíèÿ, íàøå ïîíèìàíèå òðåáîâàíèé, àëãîðèòìû, ïðåäñòàâëåíèå
äàííûõ, ïðèåìû ðåàëèçàöèè. Ïîääåðæêà èçìåíåíèé ÿâëÿåòñÿ îñíîâíîé öåëüþ îáúåêòíîé òåõíîëîãèè
è ïîñòîÿííîé òåìîé íàøèõ ëåêöèé.
Õîòÿ ìíîãèå èç òåõíè÷åñêèõ ïðèåìîâ, óëó÷øàþùèõ ðàñøèðÿåìîñòü, ìîæíî îáúÿñíèòü âî ââîäíûõ
êóðñàõ è íà íåáîëüøèõ ïðèìåðàõ, èõ çíà÷èìîñòü ñòàíîâèòñÿ ÿâíîé òîëüêî äëÿ áîëüøèõ ïðîåêòîâ.
Äëÿ óëó÷øåíèÿ ðàñøèðÿåìîñòè âàæíû äâà ïðèíöèïà:
• Ïðîñòîòà ïîñòðîåíèÿ : ïðîñòàÿ àðõèòåêòóðà ëåã÷å àäàïòèðóåòñÿ ê èçìåíåíèÿì, ÷åì ñëîæíàÿ.
• Äåöåíòðàëèçàöèÿ : ÷åì áîëåå àâòîíîìíû ìîäóëè, òåì âûøå âåðîÿòíîñòü òîãî, ÷òî ïðîñòîå èçìåíåíèå çàòðîíåò òîëüêî îäèí èëè íåáîëüøîå êîëè÷åñòâî ìîäóëåé è íå âûçîâåò öåïíóþ ðåàêöèþ
èçìåíåíèé âî âñåé ñèñòåìå.
Ïîâòîðíîå èñïîëüçîâàíèå (Reusability)
Îïðåäåëåíèå 5. Ïîâòîðíîå èñïîëüçîâàíèå åñòü ñïîñîáíîñòü ýëåìåíòîâ ÏÎ ñëóæèòü äëÿ ïîñòðîåíèÿ
ìíîãèõ ðàçëè÷íûõ ïðèëîæåíèé.
Íåîáõîäèìîñòü è âîçìîæíîñòü ïîâòîðíîãî èñïîëüçîâàíèÿ âîçíèêàåò èç íàáëþäåíèé ñõîäñòâà ñèñòåì - ñèñòåìû ÏÎ ÷àñòî èìåþò ïîõîæóþ ñõåìó. Ñëåäóåò èñïîëüçîâàòü ýòî ñõîäñòâî è íå èçîáðåòàòü
âåëîñèïåä çàíîâî. Ïîíèìàíèå ýòîé ñõåìû äàñò âîçìîæíîñòü ïîâòîðíî ïðèìåíÿòü ñîçäàííûé ýëåìåíò
ÏÎ âî ìíîãèõ äðóãèõ ðàçðàáîòêàõ.
Ïîâòîðíîå èñïîëüçîâàíèå âëèÿåò íà âñå îñòàëüíûå àñïåêòû êà÷åñòâà ÏÎ. Ïîñêîëüêó ðåøåíèå ïðîáëåìû ïîâòîðíîãî èñïîëüçîâàíèÿ â ñóùíîñòè îçíà÷àåò, ÷òî íóæíî ïèñàòü ìåíüøå ïðîãðàìì, ñëå-
äîâàòåëüíî, ìîæíî ïðèëàãàòü áîëüøå óñèëèé (ïðè òîé æå îáùåé ñòîèìîñòè) ê óëó÷øåíèþ äðóãèõ
ôàêòîðîâ, òàêèõ êàê, íàïðèìåð, êîððåêòíîñòü è óñòîé÷èâîñòü.
Ñîâìåñòèìîñòü (Compatibility)
Îïðåäåëåíèå 6. Ñîâìåñòèìîñòü - ýòî ëåãêîñòü ñî÷åòàíèÿ îäíèõ ýëåìåíòîâ ÏÎ ñ äðóãèìè.
Ñîâìåñòèìîñòü âàæíà, ïîñêîëüêó ìû íå ðàçðàáàòûâàåì ýëåìåíòû ÏÎ â âàêóóìå: èì íåîáõîäèìî
âçàèìîäåéñòâîâàòü äðóã ñ äðóãîì. Íî ïðè ýòîì ñëèøêîì ÷àñòî âîçíèêàþò ïðîáëåìû, ïîñêîëüêó ñóæäåíèÿ ðàçíûõ ýëåìåíòîâ îá îñòàëüíîì ìèðå ïðîòèâîðå÷èâû. Ïðîñòåéøèì ïðèìåðîì ìîæåò ñëóæèòü
øèðîêîå ðàçíîîáðàçèå íåñîâìåñòèìûõ ôàéëîâûõ ôîðìàòîâ, èç-çà ÷åãî, íàïðèìåð, îäíà ïðîãðàììà
íå ìîæåò íåïîñðåäñòâåííî èñïîëüçîâàòü ðåçóëüòàò ðàáîòû äðóãîé ïðîãðàììû.
Êëþ÷ ê ñîâìåñòèìîñòè íàõîäèòñÿ â îäíîðîäíîñòè ïîñòðîåíèÿ è â ñòàíäàðòíûõ ñîãëàøåíèÿõ íà
êîììóíèêàöèè ìåæäó ïðîãðàììàìè. Ýòè ïîäõîäû âêëþ÷àþò:
• Ñòàíäàðòíûå ôîðìàòû ôàéëîâ, êàê â ñèñòåìå Unix, ãäå êàæäûé òåêñòîâûé ôàéë - ýòî ïðîñòî
ïîñëåäîâàòåëüíîñòü ñèìâîëîâ.
• Ñòàíäàðòíûå ñòðóêòóðû äàííûõ, êàê â ñèñòåìå Lisp, ãäå âñå äàííûå, à òàêæå ïðîãðàììû,
ïðåäñòàâëåíû áèíàðíûìè äåðåâüÿìè (íàçûâàåìûìè ñïèñêàìè).
• Ñòàíäàðòíûå ïîëüçîâàòåëüñêèå èíòåðôåéñû, êàê â ðàçëè÷íûõ âåðñèÿõ Windows, Unix/Linux è
MacOS, ãäå âñå èíñòðóìåíòû îïèðàþòñÿ íà åäèíóþ ïàðàäèãìó äëÿ êîììóíèêàöèè ñ ïîëüçîâàòåëåì, îñíîâàííóþ íà ñòàíäàðòíûõ êîìïîíåíòàõ, òàêèõ êàê îêíà, çíà÷êè, ìåíþ è ò. ä.
Áîëüøàÿ îáùíîñòü äîñòèãàåòñÿ ïðè îïðåäåëåíèè ñòàíäàðòíûõ ïðîòîêîëîâ äîñòóïà êî âñåì âàæíûì
ýëåìåíòàì, óïðàâëÿåìûì ïðîãðàììàìè. Òàêîâà èäåÿ, ëåæàùàÿ â îñíîâå àáñòðàêòíûõ òèïîâ äàí-
íûõ è ÎÎ-ïîäõîäà, à òàêæå òàê íàçûâàåìîãî ñâÿçóþùåãî ïðîãðàììíîãî îáåñïå÷åíèÿ (middleware),
íàïðèìåð CORBA è Microsoft's OLE-COM (ActiveX).
Ýôôåêòèâíîñòü (Eciency)
Îïðåäåëåíèå 7. Ýôôåêòèâíîñòü - ýòî ñïîñîáíîñòü ÏÎ êàê ìîæíî ìåíüøå çàâèñåòü îò ðåñóðñîâ
îáîðóäîâàíèÿ: ïðîöåññîðíîãî âðåìåíè, ïðîñòðàíñòâà, çàíèìàåìîãî âî âíóòðåííåé è âíåøíåé ïàìÿòè,
ïðîïóñêíîé ñïîñîáíîñòè, èñïîëüçóåìîé â óñòðîéñòâàõ ñâÿçè.
Ïî÷òè ñèíîíèìîì ýôôåêòèâíîñòè ÿâëÿåòñÿ ñëîâî ïðîèçâîäèòåëüíîñòü (performance).  ïðîãðàììèñòñêîì ñîîáùåñòâå åñòü äâà òèïè÷íûõ îòíîøåíèÿ ê ýôôåêòèâíîñòè:
• Íåêîòîðûå ðàçðàáîò÷èêè îäåðæèìû ïðîáëåìàìè ïðîèçâîäèòåëüíîñòè, ÷òî çàñòàâëÿåò èõ ïðèëàãàòü ìíîãî óñèëèé ê ïðåäïîëàãàåìîé îïòèìèçàöèè.
• Ñóùåñòâóåò îáùàÿ òåíäåíöèÿ íåäîîöåíêè âîïðîñîâ ýôôåêòèâíîñòè, âûòåêàþùàÿ èç ñïðàâåäëèâûõ óáåæäåíèé, ñóùåñòâóþùèõ â ïðîìûøëåííîñòè:ñäåëàé ïðàâèëüíî, ïðåæäå ÷åì ñäåëàòü
áûñòðî è ìîäåëü êîìïüþòåðà áóäóùåãî ãîäà âñå ðàâíî áóäåò íà 50% áûñòðåå.
Ïîñòîÿííîå óâåëè÷åíèå êîìïüþòåðíîé ìîùè, êàêèì áû îíî íè áûëî âïå÷àòëÿþùèì, íå ìîæåò
çàìåíèòü ýôôåêòèâíîñòü, ïî êðàéíåé ìåðå, ïî òðåì ïðè÷èíàì:
• Òîò, êòî ïîêóïàåò áîëüøèé è áîëåå áûñòðûé êîìïüþòåð, õî÷åò âèäåòü äåéñòâèòåëüíûå âûãîäû îò äîïîëíèòåëüíîé ìîùíîñòè - ðåøàòü íîâûå çàäà÷è, áîëåå áûñòðî ðàáîòàòü ñî ñòàðûìè
çàäà÷àìè, ðåøàòü áîëåå âàæíûå âåðñèè ñòàðûõ çàäà÷ çà òî æå âðåìÿ. Åñëè íîâûé êîìïüþòåð
ðåøàåò ñòàðûå çàäà÷è çà òî æå ñàìîå âðåìÿ - ýòî íåõîðîøî!
• ßâíûé ýôôåêò ïîâûøåíèÿ ìîùíîñòè êîìïüþòåðà ñêàçûâàåòñÿ òîãäà, êîãäà âåëèêà äîëÿ õîðîøèõ àëãîðèòìîâ ïî îòíîøåíèþ ê ïëîõèì. Ïðåäïîëîæèì, ÷òî íîâàÿ ìàøèíà ðàáîòàåò â äâà
ðàçà áûñòðåå, ÷åì ñòàðàÿ. Ïóñòü n - ðàçìåð ðåøàåìîé çàäà÷è, à N - ìàêñèìàëüíûé ðàçìåð,
ïðè êîòîðîì óäàåòñÿ ðåøèòü çàäà÷ó íà ñòàðîì êîìïüþòåðå çà ïðèåìëåìîå âðåìÿ. Åñëè èñïîëüçóåòñÿ ëèíåéíûé àëãîðèòì, âðåìåííàÿ ñëîæíîñòü êîòîðîãî O(n) , òî íîâûé êîìïüþòåð äàñò
âîçìîæíîñòü ðåøèòü çàäà÷ó âäâîå áîëüøåãî ðàçìåðà - 2 ∗ N . Äëÿ êâàäðàòè÷íîãî àëãîðèòìà ñî
2
ñëîæíîñòüþ O(n ) óâåëè÷åíèå N ñîñòàâèò òîëüêî 41%. Ïåðåáîðíûé àëãîðèòì ñî ñëîæíîñòüþ
O(2n ) äîáàâèò ê N òîëüêî åäèíèöó - íåáîëüøîå óëó÷øåíèå çà òàêèå äåíüãè.
•  íåêîòîðûõ ñëó÷àÿõ ýôôåêòèâíîñòü ìîæåò âëèÿòü íà êîððåêòíîñòü. Ñïåöèôèêàöèÿ ìîæåò
óñòàíàâëèâàòü, ÷òî îòâåò êîìïüþòåðà íà îïðåäåëåííîå ñîáûòèå äîëæåí ïðîèçîéòè íå ïîçæå,
÷åì çà îïðåäåëåííîå âðåìÿ, íàïðèìåð, áîðòîâîé êîìïüþòåð äîëæåí áûòü ãîòîâ îïðåäåëèòü
è îáðàáîòàòü ñîîáùåíèå ñ ñåíñîðà ðû÷àãà óïðàâëåíèÿ äâèãàòåëÿ äîñòàòî÷íî áûñòðî, ÷òîáû
ñðàáîòàëî êîððåêòèðóþùåå äåéñòâèå. Ýòà ñâÿçü ìåæäó ýôôåêòèâíîñòüþ è êîððåêòíîñòüþ íå
îãðàíè÷èâàåòñÿ ïðèëîæåíèÿìè, ðàáîòàþùèìè â ðåàëüíîì âðåìåíè; íåìíîãèå ëþäè çàèíòåðåñóþòñÿ ìîäåëüþ ïðåäñêàçàíèÿ ïîãîäû, êîòîðîé òðåáóåòñÿ 24 ÷àñà, ÷òîáû ïðåäñêàçàòü ïîãîäó
íà çàâòðà.
Ïåðåíîñèìîñòü (Portability)
Îïðåäåëåíèå 8. Ïåðåíîñèìîñòü - ýòî ëåãêîñòü ïåðåíîñà ÏÎ â ðàçëè÷íûå ïðîãðàììíûå è àïïàðàòíûå ñðåäû.
Ïåðåíîñèìîñòü èìååò äåëî ñ ðàçíîîáðàçèåì íå òîëüêî ôèçè÷åñêîãî îáîðóäîâàíèÿ, íî ÷àùå àïïàðàòíîïðîãðàììíîãî ìåõàíèçìà, òîãî, êîòîðûé ìû äåéñòâèòåëüíî ïðîãðàììèðóåì, âêëþ÷àþùåãî îïåðàöèîííóþ ñèñòåìó, ñèñòåìó îêîí, åñëè îíà ïðèìåíÿåòñÿ, è äðóãèå îñíîâíûå èíñòðóìåíòû.
Ïðîñòîòà èñïîëüçîâàíèÿ (Easy of Use)
Îïðåäåëåíèå 9. Ïðîñòîòà èñïîëüçîâàíèÿ - ýòî ëåãêîñòü, ñ êîòîðîé ëþäè ñ ðàçëè÷íûìè çíàíèÿìè è
êâàëèôèêàöèåé ìîãóò íàó÷èòüñÿ èñïîëüçîâàòü ÏÎ è ïðèìåíÿòü åãî äëÿ ðåøåíèÿ çàäà÷. Ñþäà òàêæå
îòíîñèòñÿ ïðîñòîòà óñòàíîâêè, ðàáîòû è òåêóùåãî êîíòðîëÿ.
Îïðåäåëåíèå ïîä÷åðêèâàåò íàëè÷èå ðàçëè÷íûõ óðîâíåé îïûòíîñòè ïîòåíöèàëüíûõ ïîëüçîâàòåëåé. Ýòî òðåáîâàíèå ñòàâèò îäíó èç âàæíûõ ïðîáëåì ïåðåä ïðîåêòèðîâùèêàìè ÏÎ, çàíèìàþùèìèñÿ
ïðîñòîòîé èñïîëüçîâàíèÿ: êàê îáåñïå÷èòü ïîäðîáíîå ðóêîâîäñòâî è îáúÿñíåíèÿ íà÷èíàþùèì ïîëüçîâàòåëÿì, íå ìåøàÿ óìåëûì ïîëüçîâàòåëÿì, êîòîðûå ñðàçó õîòÿò ïðèíÿòüñÿ çà ðàáîòó?
Æåëàòåëüíî, ÷òîáû ïðîåêòèðîâùèêè ÏÎ, îçàáî÷åííûå ïðîñòîòîé èñïîëüçîâàíèÿ, ñ íåêîòîðûì
íåäîâåðèåì ðàññìàòðèâàëè ïðèíöèï çíàé ïîëüçîâàòåëÿ. Ïîäðàçóìåâàåòñÿ, ÷òî õîðîøèé ïðîåêòèðîâùèê äîëæåí ïðèëîæèòü óñèëèå äëÿ ïîíèìàíèÿ òîãî, äëÿ êàêèõ ïîëüçîâàòåëåé ïðåäíàçíà÷åíà
ñèñòåìà. Ýòîò âçãëÿä èãíîðèðóåò îäíî èç ñâîéñòâ óñïåøíîé ñèñòåìû: îíà âñåãäà âûõîäèò çà ïðåäåëû ïðåäïîëàãàåìîãî êðóãà ïîëüçîâàòåëåé. Íàïîìíþ äâà ñòàðûõ èçâåñòíûõ ïðèìåðà - ÿçûê Fortran
ðàçðàáàòûâàëñÿ êàê èíñòðóìåíò äëÿ ðåøåíèÿ çàäà÷è íåáîëüøîãî ñîîáùåñòâà èíæåíåðîâ è ó÷åíûõ,
ïðîãðàììèðóþùèõ íà IBM 704, îïåðàöèîííàÿ ñèñòåìà Unix ïðåäíàçíà÷àëàñü äëÿ âíóòðåííåãî èñïîëüçîâàíèÿ â Bell Laboratories. Ñèñòåìà, èçíà÷àëüíî ñïðîåêòèðîâàííàÿ äëÿ îñîáîé ãðóïïû ëþäåé,
èñõîäèò èç ïðåäïîëîæåíèé, êîòîðûå ïðîñòî íå áóäóò ðàáîòàòü äëÿ áîëåå øèðîêîé ãðóïïû.
Õîðîøèå ïðîåêòèðîâùèêè ïîëüçîâàòåëüñêîãî èíòåðôåéñà ïðèäåðæèâàþòñÿ áîëåå îñìîòðèòåëüíîé
ïîëèòèêè. Îíè äåëàþò êàê ìîæíî ìåíüøå ïðåäïîëîæåíèé îòíîñèòåëüíî ñâîèõ ïîëüçîâàòåëåé. Ïðè
ïðîåêòèðîâàíèè èíòåðàêòèâíîé ñèñòåìû ìîæíî ñ÷èòàòü, ÷òî ïîëüçîâàòåëè ïðîñòî ëþäè è ÷òî îíè
óìåþò ÷èòàòü, äâèãàòü ìûøüþ, íàæèìàòü êíîïêè è íàáèðàòü òåêñò (ìåäëåííî), è íå áîëåå. Åñëè
ÏÎ ñîçäàåòñÿ äëÿ ñïåöèàëèçèðîâàííîé îáëàñòè ïðèëîæåíèÿ, âåðîÿòíî, ìîæíî, ïðåäïîëîæèòü, ÷òî
ïîëüçîâàòåëè çíàêîìû ñ åå îñíîâíûìè êîíöåïöèÿìè. Íî äàæå ýòî ðèñêîâàííî.
Ïðèíöèï ïîñòðîåíèÿ ïîëüçîâàòåëüñêîãî èíòåðôåéñà Íå äåëàéòå âèä, ÷òî âû çíàåòå ïîëüçîâà-
òåëÿ - ýòî íå òàê.
Ôóíêöèîíàëüíîñòü (Functionality)
Îïðåäåëåíèå 10. Ôóíêöèîíàëüíîñòü - ýòî ñòåïåíü âîçìîæíîñòåé, îáåñïå÷èâàåìûõ ñèñòåìîé.
Îäíà èç ñàìûõ òðóäíûõ ïðîáëåì, ñ êîòîðîé ñòàëêèâàåòñÿ ðóêîâîäèòåëü ïðîåêòà, - îïðåäåëåíèå
äîñòàòî÷íîé ôóíêöèîíàëüíîñòè. Âñåãäà ñóùåñòâóåò æåëàíèå äîáàâëÿòü â ñèñòåìó âñå íîâûå è íîâûå ñâîéñòâà. Æåëàíèå, èçâåñòíîå íà ÿçûêå èíäóñòðèè êàê
ôè÷åðèçì (featurism) , ÷àñòî ïîëçó÷èé
ôè÷åðèçì (creeping featurism) . Åãî ïîñëåäñòâèÿ ïëà÷åâíû äëÿ âíóòðåííèõ ïðîåêòîâ, ãäå äàâëåíèå
èñõîäèò îò ðàçíûõ ãðóïï ïîëüçîâàòåëåé âíóòðè îäíîé è òîé æå êîìïàíèè. Îíè åùå õóæå äëÿ êîììåð÷åñêèõ ïðîäóêòîâ, èñïûòûâàþùèõ äàâëåíèå, íàïðèìåð îò æóðíàëèñòñêèõ ñðàâíèòåëüíûõ îáçîðîâ,
ïðåäñòàâëÿþùèõ ÷àùå âñåãî òàáëèöó, âêëþ÷àþùóþ îäíîâðåìåííî ñâîéñòâà ðàçíûõ êîíêóðèðóþùèõ
ïðîäóêòîâ.
Ðàñøèðåíèå ñâîéñòâ ñèñòåìû ïðèâîäèò ê äâóì ïðîáëåìàì, îäíà ñëîæíåå äðóãîé. Áîëåå ïðîñòàÿ
ïðîáëåìà - ïîòåðÿ íåïðîòèâîðå÷èâîñòè, êîòîðàÿ ìîæåò âîçíèêíóòü ïðè äîáàâëåíèè íîâûõ ñâîéñòâ,
çàòðàãèâàþùèõ ïðîñòîòó èñïîëüçîâàíèÿ. Èçâåñòíî, ÷òî ïîëüçîâàòåëè æàëóþòñÿ, ÷òî âñå óêðàøåíèÿ
íîâîé âåðñèè ïðîäóêòà äåëàþò åãî óæàñíî ñëîæíûì. Îäíàêî òàêèì êîììåíòàðèÿì íå ñòîèò ñëèøêîì
äîâåðÿòü. Íîâûå ñâîéñòâà íå âîçíèêàþò èç íè÷åãî - â îñíîâíîì îíè âîçíèêàþò èç ñïðîñà ïîëüçîâàòåëåé, äðóãèõ ïîëüçîâàòåëåé. ×òî äëÿ ìåíÿ âûãëÿäèò íåíóæíîé áåçäåëóøêîé, ìîæåò äëÿ âàñ áûòü
íåîáõîäèìûì ñâîéñòâîì.
Êàêîâî æå ðåøåíèå ïðîáëåìû? Íåîáõîäèìî ñíîâà è ñíîâà ðàáîòàòü íàä ñîñòîÿíèåì âñåãî ïðîäóêòà,
ïûòàÿñü ïðèâåñòè åãî â ñîîòâåòñòâèå ñ îáùèì çàìûñëîì. Õîðîøåå ÏÎ îñíîâûâàåòñÿ íà íåáîëüøîì
êîëè÷åñòâå ñèëüíûõ èäåé. Ó íåãî ìîæåò áûòü ìíîãî ñïåöèàëüíûõ ñâîéñòâ - âñå îíè äîëæíû áûòü
ñëåäñòâèÿìè îñíîâíûõ ïîëîæåíèé. Âåëèêèé ïëàí äîëæåí áûòü âèäåí, è â íåì âñåìó äîëæíî îòâîäèòüñÿ ñâîå ìåñòî.
Ðèñ. 1.4: Êðèâûå Îñìîíäà
Áîëåå ñëîæíàÿ ïðîáëåìà - ñëèøêîì áîëüøîå âíèìàíèå ê îäíèì ñâîéñòâàì â óùåðá äðóãèì êà÷åñòâàì ñèñòåìû.  ïðîåêòàõ ÷àñòî âñòðå÷àåòñÿ îøèáêà, ñèòóàöèÿ, êîòîðóþ îïèñàë Ðîäæåð Îñìîíä
â âèäå äâóõ âîçìîæíûõ ïóòåé ðàáîòû íàä ïðîåêòîì: Íèæíÿÿ êðèâàÿ îïèñûâàåò ôè÷åðèçì: â ëèõîðàäî÷íîé ïîãîíå çà äîïîëíèòåëüíûìè ñâîéñòâàìè òåðÿåòñÿ íèòü îáùåãî êà÷åñòâà. Çàâåðøàþùàÿ
ôàçà òàêîãî ïðîåêòà, ïðåäïîëàãàþùàÿ îáùóþ êîððåêòèðîâêó âñåõ ñâîéñòâ, ìîæåò áûòü äîëãîé è íàïðÿæåííîé. Åñëè ïîä äàâëåíèåì ïîëüçîâàòåëåé èëè êîíêóðåíòîâ âû âûíóæäåíû âûïóñòèòü ïðîäóêò
äîñòàòî÷íî áûñòðî - íà ñòàäèÿõ, îòìå÷åííûõ íà ðèñóíêå êâàäðàòàìè, - ðåçóëüòàò ìîæåò ïîâðåäèòü
âàøåé ðåïóòàöèè.
Îñìîíä ïðåäëàãàåò (âåðõíÿÿ êðèâàÿ) âî âðåìÿ ñîçäàíèÿ ïðîåêòà ïîääåðæèâàòü íà âûñîêîì ïîñòîÿííîì óðîâíå êà÷åñòâî âñåõ ôàêòîðîâ, êðîìå ôóíêöèîíàëüíîñòè. Íèêàêèõ êîìïðîìèññîâ ïî íàäåæíîñòè, ðàñøèðÿåìîñòè è ïðî÷èì ôàêòîðàì: âû ïðîñòî îòêàçûâàåòåñü îò äîáàâëåíèÿ íîâûõ ñâîéñòâ
äî òåõ ïîð, ïîêà âàñ óäîâëåòâîðÿþò ñóùåñòâóþùèå.
Ñâîåâðåìåííîñòü (Timeliness)
Îïðåäåëåíèå 11. Ñâîåâðåìåííîñòü - ýòî âûïóñê ÏÎ â íóæíûé ìîìåíò, òî åñòü òîãäà èëè íåçàäîëãî
äî òîãî, êàê ó ïîëüçîâàòåëåé ïîÿâèëàñü ñîîòâåòñòâóþùàÿ ïîòðåáíîñòü â ïîäîáíîé ñèñòåìå.
Íåñâîåâðåìåííîñòü - îäíî èç áîëüøèõ ðàçî÷àðîâàíèé íàøåé ïðîìûøëåííîñòè. Ïðåêðàñíîå ÏÎ,
ïîÿâëÿþùååñÿ ñëèøêîì ïîçäíî, ìîæåò ñîâñåì íå äîñòè÷ü ñâîåé öåëè. Òàê îáñòîèò äåëî è â äðóãèõ
îòðàñëÿõ ïðîìûøëåííîñòè, ðàçíèöà â òîì, ÷òî íåìíîãèå ïðîäóêòû ïîÿâëÿþòñÿ òàê æå áûñòðî êàê
ïðîãðàììíûå.
Äðóãèå êà÷åñòâà
Äðóãèå êà÷åñòâà, êðîìå òåõ, êîòîðûå äî ñèõ ïîð îáñóæäàëèñü, çàòðàãèâàþò ïîëüçîâàòåëåé ñèñòåì
ÏÎ è ëþäåé, ïîêóïàþùèõ ýòè ñèñòåìû èëè çàêàçûâàþùèõ èõ ðàçðàáîòêè.  ÷àñòíîñòè:
• Âåðèôèöèðóåìîñòü (Veriability) - ýòî ëåãêîñòü ïîäãîòîâêè ïðîöåäóð ïðèåìêè, îñîáåííî òåñòîâûõ äàííûõ, ïðîöåäóð îáíàðóæåíèÿ íåïîëàäîê è òðàññèðîâêè îøèáîê íà ýòàïàõ çàêëþ÷èòåëüíîé ïðîâåðêè è ââåäåíèÿ ïðîåêòà â äåéñòâèå.
• Öåëîñòíîñòü (Integrity) - ýòî ñïîñîáíîñòü ÏÎ çàùèùàòü ñâîè ðàçëè÷íûå êîìïîíåíòû (ïðîãðàììû, äàííûå) îò íåñàíêöèîíèðîâàííîãî äîñòóïà è ìîäèôèêàöèè.
• Âîññòàíàâëèâàåìîñòü (Repairability) - ýòî ñïîñîáíîñòü îáëåã÷àòü óñòðàíåíèå äåôåêòîâ.
• Ýêîíîìè÷íîñòü (Economy) ñî÷åòàåòñÿ c ñâîåâðåìåííîñòüþ - ýòî ñïîñîáíîñòü ñèñòåìû çàâåðøèòüñÿ, íå ïðåâûñèâ âûäåëåííîãî áþäæåòà èëè äàæå íå èñòðàòèâ åãî.
Î äîêóìåíòàöèè
Êàçàëîñü áû, íàëè÷èå õîðîøåé äîêóìåíòàöèè ýòî òîæå îäèí èç ôàêòîðîâ êà÷åñòâà ÏÎ. Íî ýòî íå
òàê - íàïðîòèâ, íåîáõîäèìîñòü äîêóìåíòàöèè ÿâëÿåòñÿ ñëåäñòâèåì äðóãèõ ôàêòîðîâ êà÷åñòâà, ðàññìîòðåííûõ âûøå. Âûäåëèì òðè âèäà äîêóìåíòàöèè:
• Âíåøíþþ, äàþùóþ ïîëüçîâàòåëÿì âîçìîæíîñòü ïîíÿòü ñèëüíûå ñòîðîíû ñèñòåìû è óäîáñòâî
èõ èñïîëüçîâàíèÿ. Íåîáõîäèìîñòü â íåé ÿâëÿåòñÿ ñëåäñòâèåì ïðîñòîòû èñïîëüçîâàíèÿ ñèñòåìû.
• Âíóòðåííþþ, äàþùóþ ðàçðàáîò÷èêàì ÏÎ âîçìîæíîñòü ïîíÿòü ñòðóêòóðó è ðåàëèçàöèþ ñèñòåìû, - ñëåäñòâèå òðåáîâàíèÿ ðàñøèðÿåìîñòè.
• Îïèñûâàþùóþ èíòåðôåéñ ìîäóëåé. Îíà äàåò âîçìîæíîñòü ðàçðàáîò÷èêàì ïîíÿòü ôóíêöèè,
ðåàëèçîâàííûå ìîäóëåì, áåç èçó÷åíèÿ åãî ðåàëèçàöèè. Ýòîò âèä äîêóìåíòàöèè ÿâëÿåòñÿ ñëåäñòâèåì òðåáîâàíèÿ ïîâòîðíîãî èñïîëüçîâàíèÿ è ðàñøèðÿåìîñòè, ïîñêîëüêó äîêóìåíòàöèÿ ïîçâîëÿåò îïðåäåëèòü, áóäåò ëè äàííîå èçìåíåíèå âëèÿòü íà îïðåäåëåííûé ìîäóëü.
Äîêóìåíòàöèþ íå ñëåäóåò ñ÷èòàòü íåçàâèñèìîé ÷àñòüþ ïðîåêòà. Ïðåäïî÷òèòåëüíåå â ìàêñèìàëüíî âîçìîæíîé ñòåïåíè ñîçäàâàòü ñàìîäîêóìåíòèðóåìîå ÏÎ. Ýòî ñïðàâåäëèâî äëÿ âñåõ òðåõ âèäîâ
äîêóìåíòàöèè:
• Âêëþ÷åíèå âîçìîæíîñòè ïîëó÷åíèÿ ñïðàâêè ïðîÿñíÿåò ñîãëàøåíèÿ ïîëüçîâàòåëüñêîãî èíòåðôåéñà. Òåì ñàìûì îáëåã÷àåòñÿ çàäà÷à àâòîðîâ ðóêîâîäñòâ ïîëüçîâàòåëåé è äðóãèõ ôîðì âíåøíåé äîêóìåíòàöèè.
• Õîðîøèé ÿçûê ðåàëèçàöèè óñòðàíÿåò íåîáõîäèìîñòü áîëüøîé ÷àñòè âíåøíåé äîêóìåíòàöèè.
Ýòî áóäåò îäíèì èç ãëàâíûõ òðåáîâàíèé ÎÎ-íîòàöèè, ðàçðàáîòàííîé â ýòîé êíèãå.
• Íîòàöèÿ áóäåò ïîääåðæèâàòü ñîêðûòèå èíôîðìàöèè è äðóãèå òåõíè÷åñêèå ïðèåìû (òàêèå êàê
óòâåðæäåíèÿ), ïîçâîëÿþùèå îòäåëèòü èíòåðôåéñ ìîäóëÿ îò åãî ðåàëèçàöèè. Ïðè ýòîì ñòàíîâèòñÿ âîçìîæíûì èç òåêñòîâ àâòîìàòè÷åñêè èçâëåêàòü äîêóìåíòàöèþ èíòåðôåéñà ìîäóëåé.
Ýòà òåìà ïîäðîáíî èçó÷àåòñÿ â ëåêöèÿõ êíèãè. Âñå ýòè ïðèåìû óìåíüøàþò ðîëü òðàäèöèîííîé
äîêóìåíòàöèè, õîòÿ, êîíå÷íî, íå ñëåäóåò îæèäàòü, ÷òî îíè ïîëíîñòüþ åå çàìåíÿò.
Êîìïðîìèññû
 äàííîì îáçîðå âíåøíèõ ôàêòîðîâ êà÷åñòâà ÏÎ ìû âñòðåòèëèñü ñ òðåáîâàíèÿìè, êîòîðûå ìîãóò
êîíôëèêòîâàòü äðóã ñ äðóãîì.
öåëîñòíîñòè, åñëè íå ââîäèòü çàùèòû ðàçëè÷íîãî ðîäà, ÷òî íåèçáåæíî çàòðóäíèò ïðîñòîòó èñïîëüçîâàíèÿ ? Ýêîíîìè÷íîñòü ÷àñòî êîíôëèêòóåò ñ ôóíêöèîíàëüíîñòüþ.
Îïòèìàëüíàÿ ýôôåêòèâíîñòü òðåáóåò ïîëíîé àäàïòàöèè ê îïðåäåëåííîìó îáîðóäîâàíèþ è ïðîãðàììíîé ñðåäå, ÷òî ÿâëÿåòñÿ ïðîòèâîïîëîæíîñòüþ ïåðåíîñèìîñòè. Ïîâòîðíîå èñïîëüçîâàíèå òðåáóåò ðåøåíèÿ îáùèõ çàäà÷, ÷òî ðàñøèðÿåò ãðàíèöû, çàäàííûå ñïåöèôèêàöèåé. Äàâëåíèå ñâîåâðåìåííîñòè ìîæåò ñêëîíèòü íàñ ê òåõíèêå RAD - áûñòðîé ðàçðàáîòêè ïðèëîæåíèÿ (Rapid Application
Development), ÷òî ìîæåò ïîâðåäèòü ðàñøèðÿåìîñòè. Õîòÿ âî ìíîãèõ ñëó÷àÿõ óäàåòñÿ íàéòè ðåøåíèå,
Êàê ìîæíî äîñòè÷ü
ïðèìèðÿþùåå ÿâíî êîíôëèêòóþùèå ôàêòîðû, èíîãäà ïðèõîäèòñÿ èäòè íà êîìïðîìèññ.
Ðàçðàáîò÷èêè ñëèøêîì ÷àñòî è áåç êîëåáàíèé èäóò íà êîìïðîìèññ, íå äàâàÿ ñåáå òðóäà ðàññìîòðåòü
ñîîòâåòñòâóþùèå âîïðîñû è èìåþùèåñÿ âàðèàíòû.  òàêèõ ìîë÷àëèâûõ ðåøåíèÿõ äîìèíèðóþùèì
ôàêòîðîì îáû÷íî ÿâëÿåòñÿ ýôôåêòèâíîñòü. Ïî-íàñòîÿùåìó èíæåíåðíûé ïîäõîä ê ñîçäàíèþ ÏÎ
ïîäðàçóìåâàåò ðàáîòó ïî ÿñíîé ôîðìóëèðîâêå êðèòåðèåâ è îñîçíàííîãî âûáîðà âàðèàíòîâ.
Êàê áû íè áûëè íåîáõîäèìû êîìïðîìèññû ìåæäó ôàêòîðàìè êà÷åñòâà, îäèí èç ôàêòîðîâ ñòîèò â
ñòîðîíå îò îñòàëüíûõ - êîððåêòíîñòü. Íåò íèêàêîãî îïðàâäàíèÿ òîìó, ÷òî êîððåêòíîñòü ïîäâåðãàåòñÿ
îïàñíîñòè ðàäè äðóãèõ ôàêòîðîâ, òàêèõ êàê ýôôåêòèâíîñòü. Åñëè ÏÎ íå âûïîëíÿåò ñâîþ ôóíêöèþ,
âñå îñòàëüíîå íå èìååò ñìûñëà.
Êëþ÷åâûå âîïðîñû
Âñå îïèñàííûå âûøå ôàêòîðû âàæíû. Íî ïðè ñîâðåìåííîì ñîñòîÿíèè èíäóñòðèè ÏÎ ÷åòûðå ôàêòîðà
èìåþò îñîáóþ âàæíîñòü:
• Êîððåêòíîñòü è óñòîé÷èâîñòü : âñå åùå ñëèøêîì òðóäíî ñîçäàâàòü ÏÎ áåç îøèáîê (bugs),
è ñëèøêîì ñëîæíî èñïðàâëÿòü îøèáêè, êîãäà îíè ïîÿâëÿþòñÿ. Ðàçíîâèäíîñòè òåõíè÷åñêèõ
ïðèåìîâ äëÿ óëó÷øåíèÿ êîððåêòíîñòè è óñòîé÷èâîñòè îäíè è òå æå: áîëåå ñèñòåìàòè÷åñêèå
ïîäõîäû ê ïîñòðîåíèþ ÏÎ; áîëåå ôîðìàëüíûå ñïåöèôèêàöèè; âñòðîåííûé êîíòðîëü â òå÷åíèå
âñåãî ïðîöåññà ïîñòðîåíèÿ ÏÎ (íå ïðîñòî èñïûòàíèÿ è îòëàäêà ïîñëå ñîçäàíèÿ); áîëåå ñîâåðøåííûå ÿçûêîâûå ìåõàíèçìû, òàêèå êàê ñòàòè÷åñêàÿ òèïèçàöèÿ, óòâåðæäåíèÿ, àâòîìàòè÷åñêîå
óïðàâëåíèå ïàìÿòüþ è óïîðÿäî÷åííîå óïðàâëåíèå èñêëþ÷èòåëüíûìè ñèòóàöèÿìè, îáåñïå÷åíèå
âîçìîæíîñòè ðàçðàáîò÷èêàì óñòàíàâëèâàòü òðåáîâàíèÿ êîððåêòíîñòè è óñòîé÷èâîñòè â ñî÷åòàíèè ñ âîçìîæíîñòüþ èíñòðóìåíòîâ îáíàðóæèâàòü ñëó÷àè íåñîñòîÿòåëüíîñòè äî òîãî, êàê îíè
ïðèâåäóò ê îøèáêàì. Áëèçîñòü âîïðîñîâ êîððåêòíîñòè è óñòîé÷èâîñòè äåëàåò óäîáíûì ââåäåíèå
îáùåãî òåðìèíà äëÿ îáîçíà÷åíèÿ îáîèõ ôàêòîðîâ - íàäåæíîñòü (reliability).
• Ðàñøèðÿåìîñòü è ïîâòîðíîå èñïîëüçîâàíèå : ÏÎ äîëæíî áûòü ëåãêî èçìåíÿåìûì; êîìïîíåíòû
ñîçäàâàåìîãî ÏÎ äîëæíû áûòü øèðîêî ïðèìåíèìû, è äîëæåí ñóùåñòâîâàòü áîëüøèé ïåðå÷åíü
îáùåöåëåâûõ êîìïîíåíòîâ, êîòîðûå ìîæíî ïîâòîðíî èñïîëüçîâàòü ïðè ðàçðàáîòêå íîâîé ñèñòåìû. Çäåñü òàêæå îäíè è òå æå èäåè ïîëåçíû äëÿ óëó÷øåíèÿ îáîèõ êà÷åñòâ: ëþáàÿ èäåÿ,
ïîìîãàþùàÿ ïðîèçâîäèòü ïðîäóêò ñ áîëåå äåöåíòðàëèçîâàííîé àðõèòåêòóðîé, êîìïîíåíòû êîòîðîé àâòîíîìíû è âçàèìîäåéñòâóþò òîëüêî ÷åðåç îãðàíè÷åííûå è ÿñíî îïðåäåëåííûå êàíàëû,
áóäåò ïîëåçíîé. Òåðìèí
ìîäóëüíîñòü (modularity) âêëþ÷àåò ïîâòîðíîå èñïîëüçîâàíèå è ðàñ-
øèðÿåìîñòü.
ÎÎ-ìåòîä ìîæåò çíà÷èòåëüíî óëó÷øèòü ÷åòûðå îñíîâíûõ ôàêòîðà êà÷åñòâà, âîò ïî÷åìó îí òàê
ïðèâëåêàòåëåí. Îí òàêæå ìîæåò âíåñòè çíà÷èòåëüíûé âêëàä â äðóãèå àñïåêòû, â ÷àñòíîñòè:
• Ñîâìåñòèìîñòü : ìåòîä îáåñïå÷èâàåò îáùèé ñòèëü ïðîåêòèðîâàíèÿ è ñòàíäàðòèçàöèþ èíòåðôåéñîâ ìîäóëåé è ñèñòåì, ÷òî ïîìîãàåò ñîâìåñòíî ðàáîòàòü ðàçíûì ñèñòåìàì.
• Ïåðåíîñèìîñòü : óäåëÿÿ îñîáîå âíèìàíèå àáñòðàêöèè è ñêðûòèþ èíôîðìàöèè, îáúåêòíàÿ òåõíîëîãèÿ ñïîñîáñòâóåò òîìó, ÷òî ïðîåêòèðîâùèêè íà÷èíàþò îòäåëÿòü ñïåöèôèêàöèþ îò îñîáåííîñòåé ðåàëèçàöèè, ÷òî è îáëåã÷àåò ïåðåíîñ. Ïîëèìîðôèçì è äèíàìè÷åñêîå ñâÿçûâàíèå äåëàåò
âîçìîæíûì ñîçäàíèå ñèñòåìû, àâòîìàòè÷åñêè àäàïòèðóåìîé ê àïïàðàòíî-ïðîãðàììíîìó ìåõàíèçìó, íàïðèìåð, ðàçëè÷íûì ñèñòåìàì îêîí èëè ðàçëè÷íûì ñèñòåìàì óïðàâëåíèÿ áàçàìè
äàííûõ.
• Ïðîñòîòà èñïîëüçîâàíèÿ : âêëàä ÎÎ-èíñòðóìåíòîâ â ñîâðåìåííûå èíòåðàêòèâíûå ñèñòåìû,
è îñîáåííî èõ ïîëüçîâàòåëüñêèå èíòåðôåéñû, òàê õîðîøî èçâåñòåí, ÷òî èíîãäà îí çàòìåâàåò äðóãèå àñïåêòû (ëþäè, ñîçäàþùèå ðåêëàìó - íå åäèíñòâåííûå, êòî íàçûâàåò îáúåêòíîîðèåíòèðîâàííîé ëþáóþ ñèñòåìó, èñïîëüçóþùóþ çíà÷êè, îêíà è ââîä ñ ïîìîùüþ ìûøè).
• Ýôôåêòèâíîñòü : êàê îòìå÷àëîñü âûøå, ïîâòîðíîå èñïîëüçîâàíèå êîìïîíåíòîâ ïðîôåññèîíàëüíîãî êà÷åñòâà ÷àñòî ìîæåò çíà÷èòåëüíî óëó÷øèòü ïðîèçâîäèòåëüíîñòü.
• Ñâîåâðåìåííîñòü, ýêîíîìè÷íîñòü è ôóíêöèîíàëüíîñòü : ÎÎ-òåõíèêà äàåò âîçìîæíîñòü òåì,
êòî åå îñâîèë, ïðîèçâîäèòü ÏÎ áûñòðåå è ïî áîëåå íèçêîé ñòîèìîñòè; îíà îáëåã÷àåò äîáàâëåíèå
ôóíêöèé è äàæå ñàìà ìîæåò ïðåäëîæèòü íîâûå ôóíêöèè.
Íåñìîòðÿ íà âñå ýòè óñïåõè, ìû äîëæíû ïîìíèòü, ÷òî ÎÎ-ìåòîä - ýòî íå ïàíàöåÿ, è ÷òî ìíîãèå
îáû÷íûå âîïðîñû ïðîåêòèðîâàíèÿ ÏÎ îñòàþòñÿ íåðåøåííûìè. Ïîìîùü â ðåøåíèè ïðîáëåìû - ýòî
íå òî æå ñàìîå, ÷òî åå ðåøåíèå.
1.3 Î ïðîãðàììíîì ñîïðîâîæäåíèè
Ïðèâåäåííûé ñïèñîê ôàêòîðîâ íå âêëþ÷èë îáû÷íî ïðèâîäèìîå êà÷åñòâî: âîçìîæíîñòü ñîïðîâîæäåíèÿ (maintainability). ×òîáû ïîíÿòü ïî÷åìó, ìû äîëæíû ïîáëèæå âçãëÿíóòü íà ëåæàùåå â åãî
îñíîâå ïîíÿòèå:
ñîïðîâîæäåíèå (maintenance) . Ñîïðîâîæäåíèå íà÷èíàåòñÿ ñ ìîìåíòà ïîñòàâêè ÏÎ
ïîëüçîâàòåëÿì.
Îáñóæäåíèÿ ìåòîäîëîãèè ñîçäàíèÿ ÏÎ îáû÷íî ñîñðåäîòî÷èâàåòñÿ íà ôàçå ðàçðàáîòêè; òî æå íàõîäèì è âî ââîäíûõ êóðñàõ ïî ïðîãðàììèðîâàíèþ. Íî øèðîêî èçâåñòíî, ÷òî 70% ñòîèìîñòè ÏÎ ïðèõîäèòñÿ íà åãî ñîïðîâîæäåíèå. Íèêàêîå èçó÷åíèå êà÷åñòâà ÏÎ íå ìîæåò áûòü óäîâëåòâîðèòåëüíûì,
åñëè îíî èãíîðèðóåò ýòîò àñïåêò. Âûøåïðèâåäåííàÿ äèàãðàììà, âçÿòàÿ èç êëþ÷åâîãî èññëåäîâàíèÿ
Ëèåíöà è Ñâîíñîíà, ïðîëèâàåò íåêîòîðûé ñâåò íà òî, ÷òî íà ñàìîì äåëå çíà÷èò âêëþ÷àþùèé ðàçíîîáðàçíûå ïîíÿòèÿ òåðìèí ñîïðîâîæäåíèå. Èññëåäîâàíèå ðàññìîòðåëî 487 ñèñòåì, ðàçðàáàòûâàþùèõ
ÏÎ ðàçíîãî ðîäà; âîçìîæíî, îíî íåìíîãî óñòàðåëî, íî áîëåå ïîçäíèå ïóáëèêàöèè ïîäòâåðæäàþò òå
æå îáùèå ðåçóëüòàòû. Îíî ïîêàçûâàåò äîëþ ñòîèìîñòè, ïðèõîäÿùóþñÿ íà êàæäûé èäåíòèôèöèðîâàííûé àâòîðàìè âèä ðàáîò ïî ñîïðîâîæäåíèþ.
Ðèñ. 1.5: Ðàñïðåäåëåíèå ðàñõîäîâ íà ñîïðîâîæäåíèå
Êëþ÷åâûå êîíöåïöèè
• Öåëüþ ïðîãðàììíîé èíæåíåðèè ÿâëÿåòñÿ íàõîæäåíèå ïóòåé ïîñòðîåíèÿ ÏÎ âûñîêîãî êà÷åñòâà.
• Êà÷åñòâî ÏÎ ëó÷øå âñåãî âèäèòñÿ êàê êîìïðîìèññ ìåæäó öåëûì ðÿäîì ðàçëè÷íûõ öåëåé, à íå
êàê åäèíûé ôàêòîð.
• Âíåøíèå ôàêòîðû, ïîíÿòíûå ïîëüçîâàòåëÿì è êëèåíòàì, ñëåäóåò îòëè÷àòü îò âíóòðåííèõ ôàêòîðîâ, ïîíÿòíûõ ïðîåêòèðîâùèêàì è êîíñòðóêòîðàì.
• Äåéñòâèòåëüíîå çíà÷åíèå èìåþò âíåøíèå ôàêòîðû, íî óïðàâëåíèå ñèñòåìîé âîçìîæíî òîëüêî
÷åðåç âíóòðåííèå ôàêòîðû, áëàãîäàðÿ êîòîðûì äîñòèãàåòñÿ íóæíûé ýôôåêò.
• Ñïèñîê îñíîâíûõ âíåøíèõ ôàêòîðîâ êà÷åñòâà ïðèâåäåí âûøå. ÎÎ-ìåòîä íàïðàâëåí íà óëó÷øåíèå êà÷åñòâà òåõ ôàêòîðîâ, êîòîðûå ïðåæäå âñåãî íóæäàþòñÿ â ëó÷øèõ ïîäõîäàõ. Ê íèì
îòíîñÿòñÿ ôàêòîðû êîððåêòíîñòè è óñòîé÷èâîñòè, ñâÿçàííûå ñ áåçîïàñíîñòüþ, âìåñòå èçâåñòíûå êàê íàäåæíîñòü, è ôàêòîðû, òðåáóþùèå äåöåíòðàëèçîâàííîé àðõèòåêòóðû ÏÎ, - ïîâòîðíîå
èñïîëüçîâàíèå è ðàñøèðÿåìîñòü, âìåñòå èçâåñòíûå êàê ìîäóëüíîñòü.
• Ñîïðîâîæäåíèå ÏÎ, ïîòðåáëÿþùåå áîëüøóþ äîëþ åãî ñòîèìîñòè, íàõîäèòñÿ â íåâûãîäíîì ïîëîæåíèè èç-çà òðóäíîñòè ðåàëèçàöèè èçìåíåíèé â ÏÎ è èç-çà ñëèøêîì áîëüøîé çàâèñèìîñòè
ïðîãðàìì îò ôèçè÷åñêîé ñòðóêòóðû äàííûõ, êîòîðûìè îíè ìàíèïóëèðóþò.
Êîíòðîëüíûå âîïðîñû
Begin Quiz
1. Ê âíåøíèì ôàêòîðàì, âëèÿþùèì íà êà÷åñòâî ÏÎ îòíîñÿòñÿ
êîððåêòíîñòü
ìîäóëüíîñòü
ðàñøèðÿåìîñòü
ÿçûê ðàçðàáîòêè
2. Ê âíóòðåííèì ôàêòîðàì, âëèÿþùèì íà êà÷åñòâî ÏÎ îòíîñÿòñÿ
ðàñøèðÿåìîñòü
ñîâìåñòèìîñòü
ìîäóëüíîñòü
îáúåêòíàÿ îðèåíòèðîâàííîñòü
ïåðåíîñèìîñòü
3. Êðèâûå Îñìîíäà õàðàêòåðèçóþò
ýôôåêòèâíîñòü ðàçðàáîòêè ÏÎ
êîððåêòíîñòü ðàçðàáîòêè ÏÎ
ðàçëè÷íûå ïîäõîäû ê ïðîåêòèðîâàíèþ ÏÎ, îñíîâàííûå íà ïðèîðèòåòå ðàçëè÷íûõ ôàêòîðîâ
âêëàä ðàçëè÷íûõ ôàêòîðîâ íà ñîïðîâîæäåíèå ÏÎ
4. Ïîä êîððåêòíîñòüþ ÏÎ ïîíèìàåòñÿ?
ñïîñîáíîñòü ÏÎ ðåàãèðîâàòü íà èçìåíåíèÿ ñïåöèôèêàöèé
ñïîñîáíîñòü ÏÎ ðàáîòàòü â òî÷íîì ñîîòâåòñòâèè ñî ñïåöèôèêàöèåé
áåçîøèáî÷íàÿ ðàáîòà ÏÎ âî âñåõ ñèòóàöèÿõ
ñïîñîáíîñòü îòâå÷àòü íà âñå âîïðîñû ïîëüçîâàòåëÿ
5. Ïîä ðàñøèðÿåìîñòüþ ÏÎ ïîíèìàåòñÿ?
âîçìîæíîñòü äîáàâëåíèÿ íîâûõ ôóíêöèé
âîçìîæíîñòü ñáîðêè ÏÎ èç ãîòîâûõ êîìïîíåíòîâ
ëåãêîñòü àäàïòàöèè ÏÎ ê èçìåíåíèÿì ñïåöèôèêàöèè
àâòîìàòè÷åñêîå ðàçâåðòûâàíèå êîäà ìîäóëåé
6. Äîêóìåíòàöèÿ
ÿâëÿåòñÿ ñàìîñòîÿòåëüíûì ôàêòîðîì êà÷åñòâà ÏÎ
ìîæåò áûòü âíåøíåé, îðèåíòèðîâàííîé íà ïîëüçîâàòåëÿ
ìîæåò áûòü âíóòðåííåé, îðèåíòèðîâàííîé íà ðàçðàáîò÷èêîâ
äîëæíà áûòü íåîòúåìëåìîé ÷àñòüþ ÏÎ
äîëæíà äîïóñêàòü àâòîìàòè÷åñêîå èçâëå÷åíèå
7. Ïðè ðàçðàáîòêå ñëîæíîãî ÏÎ îñíîâíàÿ äîëÿ çàòðàò ïðèõîäèòñÿ íà?
ðàçðàáîòêó
ñîçäàíèå ñïåöèôèêàöèé
îòëàäêó
ñîïðîâîæäåíèå
8. Ïîâòîðíîå èñïîëüçîâàíèå îçíà÷àåò
ìíîãîêðàòíûé âûçîâ ïðîöåäóð è ôóíêöèé â ïðåäåëàõ îäíîãî ìîäóëÿ
ìíîãîêðàòíûé âûçîâ ïðîöåäóð è ôóíêöèé â ïðåäåëàõ îäíîãî ïðèëîæåíèÿ
èñïîëüçîâàíèå áèáëèîòåê êîìïîíåíòîâ
ñîçäàíèå êîìïîíåíòîâ ÏÎ, ñïîñîáíûõ ñëóæèòü äëÿ ïîñòðîåíèÿ ðàçëè÷íûõ ïðèëîæåíèé
9. Ïðè ñîïðîâîæäåíèè äâà îñíîâíûõ ôàêòîðà, îïðåäåëÿþùèõ çàòðàòû, ñâÿçàíû ñ?
ïîñòðîåíèåì äîêóìåíòàöèè
èçìåíåíèåì òðåáîâàíèé ïîëüçîâàòåëÿ
óëó÷øåíèåì ýôôåêòèâíîñòè
èçìåíåíèåì â ôîðìàòå äàííûõ
îòëàäêîé îñòàâøèõñÿ îøèáîê
10. Ïðè ðàçðàáîòêå ÏÎ â ïåðâóþ î÷åðåäü ñëåäóåò çàáîòèòüñÿ î?
êîððåêòíîñòè
ôóíêöèîíàëüíîñòè
ïðîñòîòå èñïîëüçîâàíèÿ
èíòåðôåéñå ïîëüçîâàòåëÿ
11. Óñëîâíàÿ êîððåêòíîñòü ÏÎ îçíà÷àåò?
êîððåêòíîñòü ïðè óñëîâèè, ÷òî âñå íèæåëåæàùåå ÏÎ áèáëèîòåêè, êîìïèëÿòîðû, ñðåäà ðàçðàáîòêè - êîððåêòíû
êîððåêòíîñòü ïðè óñëîâèè êîððåêòíîñòè ñïåöèôèêàöèè
âîçìîæíîñòü íàðóøåíèÿ ñïåöèôèêàöèé â íåáîëüøîì ïðîöåíòå ñèòóàöèé
çàäàíèå óñëîâèé, ïðè êîòîðûõ äîïóñòèìî íàðóøåíèå ñïåöèôèêàöèé
12. Âûäåëèòå ÷åòûðå îñíîâíûõ ôàêòîðà, âëèÿþùèõ íà êà÷åñòâî ÏÎ
ôóíêöèîíàëüíîñòü
óñòîé÷èâîñòü
ïðîñòîòà èñïîëüçîâàíèÿ
ïîâòîðíîå èñïîëüçîâàíèå
ñâîåâðåìåííîñòü
ñàìîäîêóìåíòèðóåìîñòü
êîððåêòíîñòü
ðàñøèðÿåìîñòü
13. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
ýôôåêòèâíîñòü ÿâëÿåòñÿ îäíèì èç âàæíåéøèõ ôàêòîðîâ
îïòèìèçàöèÿ ÏÎ ìîæåò îêàçàòüñÿ èçëèøíåé è ïîâðåäèòü ðàñøèðÿåìîñòè
íóæíî âñåãäà ñòðåìèòüñÿ ê ïîñòðîåíèþ íàèáîëåå ýôôåêòèâíîãî ÏÎ
ëèíåéíûé àëãîðèòì ñî ñëîæíîñòüþ O(n) âñåãäà ðàáîòàåò áûñòðåå êâàäðàòè÷íîãî àëãîðèòìà
2
ñî ñëîæíîñòüþ O(n )
14. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
ñèñòåìà äîëæíà âûïîëíÿòü ñâîè çàäà÷è è â àâàðèéíûõ ñèòóàöèÿõ, âûõîäÿùèõ çà ïðåäåëû
ñïåöèôèêàöèé
ïîñëå òîãî, êàê ñïåöèôèêàöèè ê ñèñòåìå ñôîðìóëèðîâàíû, îíè çàìîðàæèâàþòñÿ äî ìîìåíòà
çàâåðøåíèÿ ïðîöåññà ðàçðàáîòêè ñèñòåìû
äåöåíòðàëèçàöèÿ ìîäóëåé óëó÷øàåò ðàñøèðÿåìîñòü ÏÎ
ñâîåâðåìåííîñòü ýòî âûïóñê ÏÎ â òîò ìîìåíò, êîãäà ïîÿâëÿåòñÿ â íåì íåîáõîäèìîñòü
15. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
ïîä íàäåæíîñòüþ ÏÎ ïîíèìàþò åãî êîððåêòíîñòü è óñòîé÷èâîñòü
ïîä ìîäóëüíîñòüþ ÏÎ ïîíèìàþò ðàñøèðÿåìîñòü è ïîâòîðíîå èñïîëüçîâàíèå
ðàçðàáîò÷èêè ÏÎ íå äîëæíû äóìàòü î åãî ñîïðîâîæäåíèè
ñîâìåñòèìîñòü ýòî ëåãêîñòü ñî÷åòàíèÿ îäíèõ ýëåìåíòîâ ÏÎ ñ äðóãèìè
End Quiz
2 Êðèòåðèè îáúåêòíîé îðèåíòàöèè
2.1 Î êðèòåðèÿõ
Ðàññìîòðèì âûáîð êðèòåðèåâ, ïîçâîëÿþùèõ îöåíèòü îáúåêòíóþ îðèåíòèðîâàííîñòü ñèñòåìû (objectness).
Íàáîð êðèòåðèåâ äåëèòñÿ íà òðè ÷àñòè:
• Ìåòîä è ÿçûê (Method and Language): ýòè äâà ïî÷òè íå ðàçëè÷èìûå àñïåêòà îõâàòûâàþò ìûñëèòåëüíûå ïðîöåññû è íîòàöèþ, èñïîëüçóþùóþñÿ äëÿ àíàëèçà, ïðîåêòèðîâàíèÿ è ïðîãðàììèðîâàíèÿ ÏÎ. Çàìåòüòå, ÷òî (îñîáåííî â îáúåêòíîé òåõíîëîãèè) òåðìèí ÿçûê îòíîñèòñÿ íå
òîëüêî ê ÿçûêó ïðîãðàììèðîâàíèÿ â ñòðîãîì ñìûñëå, íî òàêæå è ê ÿçûêàì àíàëèçà è ïðîåêòèðîâàíèÿ è èñïîëüçóåìîé â íèõ íîòàöèè, òåêñòîâîé èëè ãðàôè÷åñêîé.
• Ðåàëèçàöèÿ (Implementation) è Ñðåäà (Environment): êðèòåðèè â ýòîé êàòåãîðèè îïèñûâàþò
îñíîâíûå ñâîéñòâà èíñòðóìåíòàðèÿ, ïîçâîëÿþùåãî ðàçðàáîò÷èêàì ïðèìåíÿòü ÎÎ-èäåè.
• Áèáëèîòåêè (Libraries): îáúåêòíàÿ òåõíîëîãèÿ îñíîâàíà íà ïîâòîðíîì èñïîëüçîâàíèè êîìïîíåíòîâ ÏÎ. Êðèòåðèè â ýòîé êàòåãîðèè îïèñûâàþò êàê íàëè÷èå áàçîâûõ áèáëèîòåê, òàê è
ìåõàíèçìû, íåîáõîäèìûå äëÿ èõ èñïîëüçîâàíèÿ è ñîçäàíèÿ íîâûõ áèáëèîòåê.
Òàêîå äåëåíèå óäîáíî, íî íå àáñîëþòíî, ïîñêîëüêó íåêîòîðûå êðèòåðèè îòíîñÿòñÿ ê äâóì èëè òðåì
êàòåãîðèÿì. Íàïðèìåð êðèòåðèé, ïîìå÷åííûé óïðàâëåíèå ïàìÿòüþ, îòíîñèòñÿ ê êàòåãîðèè ÿçûêà,
ïîñêîëüêó ÿçûê ìîæåò ïîääåðæèâàòü èëè íå äîïóñêàòü àâòîìàòè÷åñêóþ ¾ñáîðêó ìóñîðà¿. Ýòîò æå
êðèòåðèé îòíîñèòñÿ ê êàòåãîðèè ðåàëèçàöèè è ñðåäû.
2.2 Ìåòîä è ÿçûê
Ïåðâûé íàáîð êðèòåðèåâ îòíîñèòñÿ ê ìåòîäó è ïîääåðæèâàþùåé åãî íîòàöèè.
Áåñøîâíîñòü (seamlessness)
ÎÎ-ïîäõîä âêëþ÷àåò âåñü æèçíåííûé öèêë ÏÎ. Ïðè ðàññìîòðåíèè ÎÎ-ðåøåíèé ñëåäóåò ïðîâåðèòü,
÷òî ìåòîä, ÿçûê è ïîääåðæèâàþùèå èõ èíñòðóìåíòû, ïðèìåíèìû ê àíàëèçó è ïðîåêòèðîâàíèþ, à
òàêæå ê ðåàëèçàöèè è ñîïðîâîæäåíèþ. ßçûê, â ÷àñòíîñòè, äîëæåí ñëóæèòü ñðåäñòâîì ìûøëåíèÿ,
ïîìîãàþùèì íà âñåõ ñòàäèÿõ ðàáîòû.
 ðåçóëüòàòå ïîëó÷àåòñÿ áåñøîâíûé ïðîöåññ ðàçðàáîòêè, ãäå îáùíîñòü êîíöåïöèé è íîòàöèè ïîìîãàåò ñãëàäèòü ïåðåõîäû ìåæäó ïîñëåäîâàòåëüíûìè ñòóïåíÿìè æèçíåííîãî öèêëà.
Êëàññû
êëàññ - ýëåìåíò ÏÎ, îïèñûâàþùèé àáñòðàêòíûé
òèï äàííûõ è åãî ÷àñòè÷íóþ èëè ïîëíóþ ðåàëèçàöèþ. Àáñòðàêòíûé òèï äàííûõ (èíòåðôåéñ) -
ÎÎ-ìåòîä îñíîâàí íà ïîíÿòèè êëàññà. Íåôîðìàëüíî,
ìíîæåñòâî îáúåêòîâ, îïðåäåëÿåìîå ñïèñêîì îïåðàöèé, ïðèìåíèìûõ ê ýòèì îáúåêòàì, è èõ ñâîéñòâàì.
Ïîíÿòèå êëàññà äîëæíî áûòü öåíòðàëüíîé êîíöåïöèåé ìåòîäà è ÿçûêà.
Óòâåðæäåíèÿ (Assertions)
Êîìïîíåíòû àáñòðàêòíîãî òèïà äàííûõ èìåþò ôîðìàëüíî ñïåöèôèöèðîâàííûå ñâîéñòâà, îòðàæàåìûå â ñîîòâåòñòâóþùèõ êëàññàõ.
Óòâåðæäåíèÿ - ïðåäóñëîâèÿ è ïîñòóñëîâèÿ ïðîãðàìì êëàññà è èíâàðèàíòû êëàññîâ - èãðàþò ýòó
ðîëü.
Óòâåðæäåíèÿ èìåþò òðè îñíîâíûõ ïðèìåíåíèÿ: ïîìîãàþò ñîçäàòü íàäåæíîå ÏÎ, îáåñïå÷èâàþò
ñèñòåìàòè÷åñêóþ äîêóìåíòàöèþ è ÿâëÿþòñÿ èíñòðóìåíòîì òåñòèðîâàíèÿ è îòëàäêè ÏÎ.
ßçûê äîëæåí äàâàòü âîçìîæíîñòü: ïîñòàâëÿòü êëàññ è åãî êîìïîíåíòû âìåñòå ñ óòâåðæäåíèÿìè
(ïðåäóñëîâèÿìè, ïîñòóñëîâèÿìè è èíâàðèàíòàìè); âêëþ÷àòü èíñòðóìåíòàðèé äëÿ ïîëó÷åíèÿ äîêóìåíòàöèè èç ýòèõ óòâåðæäåíèé; îñóùåñòâëÿòü ìîíèòîðèíã óòâåðæäåíèé âî âðåìÿ âûïîëíåíèÿ ïðîãðàììû.
Êëàññû êàê ìîäóëè
Îáúåêòíàÿ îðèåíòàöèÿ - â ïåðâóþ î÷åðåäü àðõèòåêòóðíàÿ òåõíèêà: îíà â îñíîâíîì çàòðàãèâàåò ìîäóëüíóþ ñòðóêòóðó ñèñòåìû.
Êëàññû äîëæíû áûòü åäèíñòâåííûì âèäîì ìîäóëåé.
 ÷àñòíîñòè, èñ÷åçàåò ïîíÿòèå ãëàâíîé ïðîãðàììû, à ïîäïðîãðàììû íå ñóùåñòâóþò êàê íåçàâèñèìûå ìîäóëüíûå åäèíèöû (îíè ìîãóò ïîÿâëÿòüñÿ òîëüêî êàê ÷àñòü êëàññîâ).
Êëàññû êàê òèïû
Ïîíÿòèå êëàññà äîñòàòî÷íî ìîùíîå, ÷òîáû èçáåæàòü íåîáõîäèìîñòè ëþáîãî äðóãîãî ìåõàíèçìà òèïèçàöèè.
Êàæäûé òèï äîëæåí áûòü îñíîâàí íà êëàññå.
Äàæå áàçîâûå òèïû, òàêèå êàê
integer è oat, ìîæíî ðàññìàòðèâàòü êàê êëàññû; îáû÷íî òàêèå
êëàññû ÿâëÿþòñÿ âñòðîåííûìè.
Ñêðûòèå èíôîðìàöèè (information hiding)
Ìåõàíèçì, äåëàþùèé îïðåäåëåííûå êîìïîíåíòû íåäîñòóïíûìè äëÿ êëèåíòîâ, íàçûâàåòñÿ ñêðûòèåì
èíôîðìàöèè.
Ñîçäàòåëè êëàññîâ äîëæíû òàêæå èìåòü âîçìîæíîñòü èçáèðàòåëüíî ýêñïîðòèðîâàòü êîìïîíåíòû
äëÿ èçáðàííûõ êëèåíòîâ.
Àâòîð êëàññà äîëæåí èìåòü âîçìîæíîñòü óêàçàòü, ÷òî êîìïîíåíò äîñòóïåí: âñåì êëèåíòàì, íè
îäíîìó êëèåíòó èëè èçáðàííûì êëèåíòàì.
Îáðàáîòêà èñêëþ÷åíèé (Exception handling)
 ïðîöåññå âûïîëíåíèÿ ïðîãðàìì ìîãóò âñòðå÷àòüñÿ ðàçëè÷íûå àíîìàëèè.  ÎÎ-âû÷èñëåíèÿõ îíè
ñîîòâåòñòâóþò âûçîâàì, êîòîðûå íå ìîãóò áûòü âûïîëíåíû íàäëåæàùèì îáðàçîì: íàïðèìåð â ðåçóëüòàòå ñáîÿ â îáîðóäîâàíèè, ïåðåïîëíåíèÿ ïðè âûïîëíåíèè àðèôìåòè÷åñêèõ îïåðàöèé èëè îøèáîê
ÏÎ.
Äëÿ ñîçäàíèÿ íàäåæíîãî ÏÎ íåîáõîäèìî èìåòü âîçìîæíîñòü âîññòàíîâëåíèÿ íîðìàëüíîãî õîäà
âû÷èñëåíèé. Ýòî ÿâëÿåòñÿ öåëüþ ìåõàíèçìà îáðàáîòêè èñêëþ÷åíèé.
ßçûê äîëæåí îáåñïå÷èâàòü ìåõàíèçì âîññòàíîâëåíèÿ â íåîæèäàííûõ àâàðèéíûõ ñèòóàöèÿõ.
Ñòàòè÷åñêàÿ òèïèçàöèÿ (static typing)
×òîáû ãàðàíòèðîâàòü êîððåêòíîå âûïîëíåíèå, ÿçûê äîëæåí áûòü òèïèçèðîâàí. Ýòî îçíà÷àåò, ÷òî îí
îòâå÷àåò íåñêîëüêèì ïðàâèëàì ñîâìåñòèìîñòè:
• Êàæäàÿ ñóùíîñòü (entity) îáúÿâëÿåòñÿ ÿâíûì îáðàçîì ñ óêàçàíèåì îïðåäåëåííîãî òèïà, ïîðîæäåííîãî êëàññîì. Ïîä ñóùíîñòüþ ïîíèìàåòñÿ èìÿ ïåðåìåííîé, èñïîëüçóåìîå â òåêñòå ÏÎ
äëÿ ññûëêè íà îáúåêòû âðåìåíè âûïîëíåíèÿ.
• Êàæäûé âûçîâ êîìïîíåíòà - ýòî âûçîâ äîñòóïíîãî êîìïîíåíòà ñîîòâåòñòâóþùåãî êëàññà.
• Ïðèñâàèâàíèå è ïåðåäà÷à àðãóìåíòîâ ïîä÷èíÿþòñÿ ïðàâèëàì ñîãëàñîâàíèÿ, òðåáóþùèì ñîâìåñòèìîñòè èñõîäíîãî òèïà è öåëåâîãî òèïà.
 ÿçûêå, âêëþ÷àþùåì òàêóþ ïîëèòèêó, âîçìîæåí ñòàòè÷åñêèé êîíòðîëü òèïîâ. Òîãäà åùå íà ýòàïå
êîìïèëÿöèè ïîäîáíûå îøèáêè áóäóò îáíàðóæåíû, è âî âðåìÿ âûïîëíåíèÿ ãàðàíòèðóåòñÿ îòñóòñòâèå
îøèáîê òèïà: êîìïîíåíò íåäîñòóïåí îáúåêòó.  ÿçûêå Python èñïîëüçóåòñÿ äèíàìè÷åñêàÿ òèïèçàöèÿ.
Óíèâåðñàëüíîñòü (genericity)
Äëÿ òîãî ÷òîáû òèïèçàöèÿ áûëà ïðàêòè÷íîé, íåîáõîäèìî èìåòü âîçìîæíîñòü îïðåäåëÿòü êëàññû ñ
ïàðàìåòðàìè, çàäàþùèìè òèï. Òàêèå êëàññû èçâåñòíû êàê ðîäîâûå. Ðîäîâîé êëàññ (ïàðàìåòðè÷åñêèé êëàññ) List<G>îïèñûâàåò ñïèñêè ýëåìåíòîâ ïðîèçâîëüíîãî òèïà G - ôîðìàëüíûì ðîäîâûì
ïàðàìåòðîì.
Åäèíè÷íîå íàñëåäîâàíèå (single inheritance)
Ðàçðàáîòêà ÏÎ âêëþ÷àåò ñîçäàíèå áîëüøîãî ÷èñëà êëàññîâ, ìíîãèå èç êîòîðûõ ÿâëÿþòñÿ âàðèàíòàìè
ðàíåå ñîçäàííûõ êëàññîâ. Äëÿ óïðàâëåíèÿ ïîòåíöèàëüíîé ñëîæíîñòüþ òàêîé ñèñòåìû íåîáõîäèì
ìåõàíèçì êëàññèôèêàöèè, èçâåñòíûé êàê íàñëåäîâàíèå. Êëàññ A áóäåò íàñëåäíèêîì (heir) êëàññà B,
åñëè îí âñòðàèâàåò (íàñëåäóåò) êîìïîíåíòû êëàññà B â äîïîëíåíèå ê ñâîèì ñîáñòâåííûì. Ïîòîìîê
(descendant)- ýòî ïðÿìîé èëè íåïðÿìîé íàñëåäíèê; îáðàòíîå ïîíÿòèå - ïðåäîê (ancestor).
Äîëæíî áûòü âîçìîæíûì îáúÿâèòü êëàññ íàñëåäíèêîì äðóãîãî êëàññà.
Íàñëåäîâàíèå - îäíî èç öåíòðàëüíûõ ïîíÿòèé ÎÎ-ìåòîäà; îíî îêàçûâàåò áîëüøîå âëèÿíèå íà
ïðîöåññ ðàçðàáîòêè ÏÎ.
Ìíîæåñòâåííîå íàñëåäîâàíèå (Multiple inheritance)
×àñòî íåîáõîäèìî ñî÷åòàòü ðàçëè÷íûå àáñòðàêöèè.
Êëàññ äîëæåí èìåòü âîçìîæíîñòü áûòü íàñëåäíèêîì íåñêîëüêèõ êëàññîâ.
Êîíôëèêòû èìåí ïðè íàñëåäîâàíèè ðàçðåøàþòñÿ àäåêâàòíûì ìåõàíèçìîì.
Äóáëèðóåìîå íàñëåäîâàíèå (Repeated inheritance)
Ïðè ìíîæåñòâåííîì íàñëåäîâàíèè âîçíèêàåò ñèòóàöèÿ äóáëèðóåìîãî íàñëåäîâàíèÿ (repeated inheritance),
êîãäà íåêîòîðûé êëàññ ìíîãîêðàòíî ñòàíîâèòñÿ íàñëåäíèêîì îäíîãî è òîãî æå êëàññà, ïðîõîäÿ ïî
ðàçíûì âåòâÿì íàñëåäîâàíèÿ:
 ýòîì ñëó÷àå ÿçûê äîëæåí îáåñïå÷èòü òî÷íûå ïðàâèëà, îïðåäåëÿþùèå, ÷òî ïðîèñõîäèò ñ êîìïîíåíòàìè, íàñëåäîâàííûìè ïîâòîðíî îò îáùåãî ïðåäêà (íà ðèñóíêå - ýòî A).  íåêîòîðûõ ñëó÷àÿõ
æåëàòåëüíî, ÷òîáû êîìïîíåíò èç A ñîçäàâàë òîëüêî îäèí êîìïîíåíò â D (ðàçäåëåíèå), à â äðóãèõ íóæíî, ÷òîáû îí ñîçäàâàë äâà (äóáëèðîâàíèå). Ðàçðàáîò÷èêè äîëæíû îáëàäàòü ãèáêèìè ñðåäñòâàìè,
ïîçâîëÿþùèìè ïðåäïèñûâàòü îäíó èç âîçìîæíîñòåé íåçàâèñèìî äëÿ êàæäîãî êîìïîíåíòà.
Ïðè äóáëèðóåìîì íàñëåäîâàíèè ñóäüáîé êîìïîíåíòîâ äîëæíû óïðàâëÿòü òî÷íî îïðåäåëåííûå ïðàâèëà, ïîçâîëÿþùèå ðàçðàáîò÷èêàì âûáèðàòü äëÿ êàæäîãî òàêîãî êîìïîíåíòà ðàçäåëåíèå, ëèáî äóáëèðîâàíèå.
Ðèñ. 2.1: Äóáëèðóåìîå íàñëåäîâàíèå
Îãðàíè÷åííàÿ óíèâåðñàëüíîñòü (Constrained genericity)
Ñî÷åòàíèå óíèâåðñàëüíîñòè è íàñëåäîâàíèÿ äàåò ïîëåçíóþ òåõíèêó - îãðàíè÷åííóþ óíèâåðñàëüíîñòü
(constrained genericity). Òåïåðü âû ìîæåòå îïðåäåëèòü êëàññ ñ ðîäîâûì ïàðàìåòðîì, ïðåäñòàâëÿþùèì
íå ïðîèçâîëüíûé òèï, à ëèøü òèï, ÿâëÿþùèéñÿ ïîòîìêîì íåêîòîðîãî êëàññà.
Ðîäîâîé êëàññ SortableList îïèñûâàåò ñïèñêè; îí ñîäåðæèò êîìïîíåíò sort, ñîðòèðóþùèé ýëåìåíòû
ñïèñêà â ñîîòâåòñòâèè ñ çàäàííûì îòíîøåíèåì ïîðÿäêà. Ïàðàìåòð ýòîãî ðîäîâîãî êëàññà çàäàåò òèï
ýëåìåíòîâ ñïèñêà. Íî ýòîò òèï íå ìîæåò áûòü ïðîèçâîëüíûì: îí äîëæåí ïîääåðæèâàòü îòíîøåíèå
ïîðÿäêà. Ôàêòè÷åñêèé ðîäîâîé ïàðàìåòð äîëæåí áûòü ïîòîìêîì áèáëèîòå÷íîãî êëàññà Comparable,
îïèñûâàþùåãî îáúåêòû, ñíàáæåííûå îòíîøåíèåì ïîðÿäêà. Îãðàíè÷åííàÿ óíèâåðñàëüíîñòü ïîçâîëÿåò îáúÿâèòü íàø ðîäîâîé êëàññ ñëåäóþùèì îáðàçîì: SortableList<G, Comparable>.
Ìåõàíèçì óíèâåðñàëüíîñòè äîëæåí ïîääåðæèâàòü ôîðìó îãðàíè÷åííîé óíèâåðñàëüíîñòè.
Ïåðåîïðåäåëåíèå (redenition)
Êîãäà êëàññ ÿâëÿåòñÿ íàñëåäíèêîì äðóãîãî êëàññà, ìîæåò ïîòðåáîâàòüñÿ èçìåíèòü ðåàëèçàöèþ èëè
äðóãèå ñâîéñòâà íåêîòîðûõ íàñëåäîâàííûõ êîìïîíåíò. Êëàññ Session, óïðàâëÿþùèé ñåàíñàìè ïîëüçîâàòåëåé â îïåðàöèîííîé ñèñòåìå, ìîæåò èìåòü êîìïîíåíò terminate, âûïîëíÿþùèé ÷èñòêó â êîíöå
ñåàíñà. Åãî íàñëåäíèêîì ìîæåò áûòü êëàññ RemoteSession, óïðàâëÿþùèé ñåàíñîì óäàëåííîãî êîìïüþòåðà â ñåòè.
Åñëè çàâåðøåíèå óäàëåííîãî ñåàíñà òðåáóåò äîïîëíèòåëüíûõ äåéñòâèé, òàêèõ êàê, íàïðèìåð, óâåäîìëåíèå óäàëåííîãî êîìïüþòåðà, êëàññ RemoteSession ïåðåîïðåäåëèò êîìïîíåíò terminate.
Ïåðåîïðåäåëåíèå ìîæåò ïîâëèÿòü íà ðåàëèçàöèþ êîìïîíåíòà, åãî ñèãíàòóðó (òèï àðãóìåíòîâ è
ðåçóëüòàòà) è ñïåöèôèêàöèþ.
Äîëæíî áûòü âîçìîæíûì ïåðåîïðåäåëèòü ñïåöèôèêàöèþ, ñèãíàòóðó è ðåàëèçàöèþ íàñëåäîâàííîãî
êîìïîíåíòà.
Ïîëèìîðôèçì
Ïðè íàñëåäîâàíèè, òðåáîâàíèå ñòàòè÷åñêîé òèïèçàöèè, î êîòîðîì ãîâîðèëîñü âûøå, ñòàíîâèòñÿ îãðàíè÷èâàþùèì, åñëè áû îíî îçíà÷àëî, ÷òî êàæäàÿ ñóùíîñòü òèïà C ìîæåò áûòü ñâÿçàíà òîëüêî ñ
îáúåêòîì òî÷íî òàêîãî æå òèïà Ñ.
Êàê óæå îòìå÷àëîñü, ñóùíîñòü - ýòî èìÿ, ê êîòîðîìó âî âðåìÿ âûïîëíåíèÿ ìîãóò ïðèñîåäèíÿòüñÿ
ðàçëè÷íûå çíà÷åíèÿ. Ñóùíîñòü - ýòî îáîáùåíèå òðàäèöèîííîãî ïîíÿòèÿ ïåðåìåííîé.
Ïîëèìîðôèçì (polymorphism) - ñïîñîáíîñòü ïðèñîåäèíÿòü ê ñóùíîñòè îáúåêòû ðàçëè÷íûõ âîç-
ìîæíûõ òèïîâ.  ñòàòè÷åñêè òèïèçèðîâàííîé ñðåäå ïîëèìîðôèçì íå áóäåò ïðîèçâîëüíûì, à áóäåò
êîíòðîëèðîâàòüñÿ íàñëåäîâàíèåì.
Äîëæíà èìåòüñÿ âîçìîæíîñòü â ïåðèîä âûïîëíåíèÿ ïðèñîåäèíÿòü ê ñóùíîñòè îáúåêòû ðàçëè÷íûõ
âîçìîæíûõ òèïîâ ïîä óïðàâëåíèåì íàñëåäîâàíèÿ.
Äèíàìè÷åñêîå ñâÿçûâàíèå
Ñî÷åòàíèå ïîñëåäíèõ äâóõ ìåõàíèçìîâ, ïåðåîïðåäåëåíèÿ è ïîëèìîðôèçìà, íåïîñðåäñòâåííî ïðåäïîëàãàåò ñëåäóþùèé ìåõàíèçì. Âûçîâ ñóùíîñòüþ êîìïîíåíòà âñåãäà äîëæåí çàïóñêàòü òîò êîìïîíåíò,
êîòîðûé ñîîòâåòñòâóåò òèïó ïðèñîåäèíåííîãî îáúåêòà, à íå òèïó ñóùíîñòè. Ïðè ðàçëè÷íûõ âûïîëíåíèÿõ îäíîãî è òîãî æå âûçîâà ìîãóò çàïóñêàòüñÿ ðàçíûå êîìïîíåíòû.
Âûÿñíåíèå òèïà îáúåêòà â ïåðèîä âûïîëíåíèÿ
Ðàçðàáîò÷èêè ÎÎ-ÏÎ âñêîðå âûðàáàòûâàþò çäîðîâóþ íåïðèÿçíü ê ëþáîìó ñòèëþ âû÷èñëåíèé, îñíîâàííîìó íà ÿâíîì âûáîðå ìåæäó ðàçëè÷íûìè òèïàìè îáúåêòà. Ïîëèìîðôèçì è äèíàìè÷åñêîå ñâÿçûâàíèå íàìíîãî ïðåäïî÷òèòåëüíåå. Îäíàêî â íåêîòîðûõ ñëó÷àÿõ îáúåêò ïðèõîäèò èçâíå, òàê ÷òî
àâòîð ÏÎ íå èìååò âîçìîæíîñòè ñ îïðåäåëåííîñòüþ ïðåäñêàçàòü åãî òèï.  ÷àñòíîñòè, ýòî ñëó÷àåòñÿ, åñëè îáúåêò èçâëåêàåòñÿ èç âíåøíèõ õðàíèëèù, ïîëó÷åí ïî ñåòè èëè ïåðåäàí íåêîòîðîé äðóãîé
ñèñòåìîé.
Òîãäà ÏÎ íóæäàåòñÿ â ìåõàíèçìå, îáåñïå÷èâàþùåì áåçîïàñíûé ñïîñîá äîñòóïà ê îáúåêòó áåç
íàðóøåíèÿ îãðàíè÷åíèé ñòàòè÷åñêîé òèïèçàöèè. Òàêîé ìåõàíèçì äîëæåí ïðîåêòèðîâàòüñÿ ñ áîëüøîé
àêêóðàòíîñòüþ, òàê ÷òîáû íå óòðàòèòü ïîëüçû îò ïîëèìîðôèçìà è äèíàìè÷åñêîãî ñâÿçûâàíèÿ.
Àáñòðàêòíûå (abstract) ñâîéñòâà è êëàññû
 íåêîòîðûõ ñëó÷àÿõ, äëÿ êîòîðûõ äèíàìè÷åñêîå ñâÿçûâàíèå äàåò ýëåãàíòíîå ðåøåíèå, óñòðàíÿÿ
íåîáõîäèìîñòü ÿâíûõ ïðîâåðîê, íå ñóùåñòâóåò íà÷àëüíîé âåðñèè êîìïîíåíòà, ïîäëåæàùåãî ïåðåîïðåäåëåíèþ. Íåîáõîäèìî èìåòü âîçìîæíîñòü íàïèñàíèÿ êëàññà èëè êîìïîíåíòà êàê îòëîæåííîãî,
òî åñòü ñïåöèôèöèðîâàííîãî, íî íå ïîëíîñòüþ ðåàëèçîâàííîãî.
Àáñòðàêòíûå êëàññû îñîáåííî âàæíû äëÿ ÎÎ-àíàëèçà è âûñîêîóðîâíåâîãî ïðîåêòèðîâàíèÿ, ïîñêîëüêó îíè äåëàþò âîçìîæíûì çàäàòü îñíîâíûå àñïåêòû ñèñòåìû, îñòàâëÿÿ äåòàëè äî áîëåå ïîçäíåé
ñòàäèè.
Óïðàâëåíèå ïàìÿòüþ (memory management) è ñáîðêà ìóñîðà (garbage collection)
Ìîæåò ïîêàçàòüñÿ, ÷òî ýòîò êðèòåðèé ìåòîäà è ÿçûêà äîëæåí ïðèíàäëåæàòü ê ñëåäóþùåé êàòåãîðèè
- ðåàëèçàöèè è ñðåäå. Íà ñàìîì äåëå îí ïðèíàäëåæèò ê îáåèì êàòåãîðèÿì. Âàæíåéøèå òðåáîâàíèÿ
ïðåäúÿâëÿþòñÿ ê ÿçûêó, îñòàëüíîå - ýòî âîïðîñ õîðîøåé èíæåíåðèè.
ÎÎ-ñèñòåìû äàæå â áîëüøåé ñòåïåíè, ÷åì òðàäèöèîííûå ñèñòåìû, çà èñêëþ÷åíèåì, áûòü ìîæåò,
Lisp, èìåþò òåíäåíöèþ ñîçäàíèÿ áîëüøîãî ÷èñëà îáúåêòîâ, èíîãäà ñî ñëîæíûìè âçàèìîçàâèñèìîñòÿìè. Ïîëèòèêà, âîçëàãàþùàÿ íà ðàçðàáîò÷èêîâ îòâåòñòâåííîñòü çà óïðàâëåíèå ïàìÿòüþ, âðåäèò
è ýôôåêòèâíîñòè ïðîöåññà ðàçðàáîòêè, è áåçîïàñíîñòè ïîëó÷åííîé ñèñòåìû. Òðóäíî óòèëèçèðîâàòü
ïàìÿòü, çàíÿòóþ áîëåå íå íóæíûìè îáúåêòàìè, óñëîæíÿþòñÿ ïðîãðàììû, âñå ýòî òðåáóåò âðåìåíè
ðàçðàáîò÷èêîâ, óâåëè÷èâàåòñÿ ðèñê íåêîððåêòíîé îáðàáîòêè îáëàñòåé ïàìÿòè.  õîðîøåé ÎÎ-ñðåäå
óïðàâëåíèå ïàìÿòüþ áóäåò àâòîìàòè÷åñêèì, ïîä êîíòðîëåì ñáîðùèêà ìóñîðà (garbage collector) êîìïîíåíòà ñèñòåìû ïåðèîäà âûïîëíåíèÿ (runtime system).
Àâòîìàòè÷åñêàÿ ñáîðêà ìóñîðà - ýòî ïðîáëåìà ÿçûêà, òàê æå êàê è ðåàëèçàöèè. Åñëè ÿçûê ÿâíî
íå ñïðîåêòèðîâàí äëÿ àâòîìàòè÷åñêîãî óïðàâëåíèÿ ïàìÿòüþ, òî çà÷àñòóþ ðåàëèçàöèÿ ñòàíîâèòñÿ
íåâîçìîæíîé. Ýòî ñïðàâåäëèâî äëÿ ÿçûêîâ, ãäå, íàïðèìåð, óêàçàòåëü íà îáúåêò îïðåäåëåííîãî òèïà
ìîæåò áûòü ïðåîáðàçîâàí (èñïîëüçóÿ êàñòèíã - cast) â óêàçàòåëü äðóãîãî òèïà èëè äàæå â öåëîå
÷èñëî, - òàêèå ñðåäñòâà äåëàþò íåâîçìîæíûì ñîçäàíèå íàäåæíîãî ñáîðùèêà ìóñîðà.
ßçûê äîëæåí äàâàòü âîçìîæíîñòü íàäåæíîãî àâòîìàòè÷åñêîãî óïðàâëåíèÿ ïàìÿòüþ, à ðåàëèçàöèÿ äîëæíà îáåñïå÷èòü íàëè÷èå àâòîìàòè÷åñêîãî ìåíåäæåðà, óïðàâëÿþùåãî ïàìÿòüþ, â ôóíêöèþ
êîòîðîãî âõîäèò ñáîðêà ìóñîðà.
2.3 Ðåàëèçàöèÿ è ñðåäà
Ìû ïîäîøëè ê âàæíûì ñâîéñòâàì ñðåäû ðàçðàáîòêè, ïîääåðæèâàþùåé ñîçäàíèå ÎÎ-ÏÎ.
Àâòîìàòè÷åñêîå îáíîâëåíèå (automatic update)
Ðàçðàáîòêà ÏÎ - ïðîöåññ íàðàñòàþùèé. Ðàçðàáîò÷èêè îáû÷íî íå ïèøóò òûñÿ÷è ñòðîê çà îäèí ðàç;
îíè ðàáîòàþò, äîáàâëÿÿ è ìîäèôèöèðóÿ, íà÷èíàÿ ÷àùå âñåãî ñ ñèñòåìû, óæå èìåþùåé çíà÷èòåëüíûé
ðàçìåð.
Ïðè âûïîëíåíèè òàêîãî îáíîâëåíèÿ âàæíî èìåòü ãàðàíòèþ, ÷òî ïîëó÷åííàÿ â ðåçóëüòàòå ñèñòåìà áóäåò ñîãëàñîâàííîé. Òðàäèöèîííûå ïîäõîäû ê ýòîé ïðîáëåìå ïðåäïîëàãàþò ðàáîòó âðó÷íóþ,
çàñòàâëÿÿ ðàçðàáîò÷èêîâ çàïèñûâàòü âñå çàâèñèìîñòè è ïðîñëåæèâàòü èõ èçìåíåíèÿ, èñïîëüçóÿ ñïåöèàëüíûå ìåõàíèçìû, èçâåñòíûå êàê ñîçäàâàòü ôàéëû è âêëþ÷àòü ôàéëû. Ýòî íåïðèåìëåìî â ñîâðåìåííûõ ðàçðàáîòêàõ ïðîãðàììíûõ ïðîäóêòîâ, îñîáåííî â ÎÎ-ìèðå, ãäå âçàèìîçàâèñèìîñòè ìåæäó êëàññàìè, âûòåêàþùèå èç îòíîøåíèé íàñëåäîâàíèÿ, ÷àñòî ñëîæíû, íî ìîãóò áûòü âûâåäåíû èç
ñèñòåìàòè÷åñêîãî ðàññìîòðåíèÿ òåêñòà ÏÎ.
Îáíîâëåíèå ñèñòåìû ïîñëå èçìåíåíèÿ äîëæíî áûòü àâòîìàòè÷åñêèì, à àíàëèç ìåæêëàññîâûõ çàâèñèìîñòåé âûïîëíÿòüñÿ èíñòðóìåíòàðèåì, à íå âðó÷íóþ ðàçðàáîò÷èêàìè.
Ýòî òðåáîâàíèå ìîæíî óäîâëåòâîðèòü â êîìïèëèðóåìîé ñðåäå (ãäå êîìïèëÿòîð áóäåò ðàáîòàòü
âìåñòå ñ èíñòðóìåíòàðèåì, âûïîëíÿþùèì àíàëèç çàâèñèìîñòåé), â èíòåðïðåòèðóåìîé ñðåäå èëè â
ñðåäå, ñî÷åòàþùåé îáå ýòè òåõíèêè ðåàëèçàöèè ÿçûêà.
Áûñòðîå îáíîâëåíèå (fast update)
Íà ïðàêòèêå ìåõàíèçì îáíîâëåíèÿ ñèñòåìû äîëæåí áûòü íå òîëüêî àâòîìàòè÷åñêèì, íî è áûñòðûì.
Áîëåå òî÷íî, îí äîëæåí áûòü ïðîïîðöèîíàëüíûì ðàçìåðó èçìåíåíèé, à íå ðàçìåðó ñèñòåìû â öå-
ëîì. Áåç ýòîãî ñâîéñòâà ìåòîä è ñðåäà ìîãóò áûòü ïðèìåíèìûìè òîëüêî ê íåáîëüøèì ñèñòåìàì, à
ïðèìåíÿòü èõ íóæíî ê áîëüøèì.
Âðåìÿ îáðàáîòêè ðÿäà èçìåíåíèé â ñèñòåìå, ñîçäàþùèõ îáíîâëåííóþ âåðñèþ, äîëæíî áûòü ôóíêöèåé ðàçìåðà èçìåíåííûõ êîìïîíåíòîâ è íå çàâèñèò îò ðàçìåðà ñèñòåìû â öåëîì.
Ñåðèàëèçàöèÿ (serialization)
Ìíîãèå ïðèëîæåíèÿ, âåðîÿòíî, áîëüøèíñòâî, òðåáóþò ñîõðàíåíèÿ îáúåêòîâ îò îäíîãî ñåàíñà äî ñëåäóþùåãî. Ñðåäà äîëæíà îáåñïå÷èâàòü ìåõàíèçì âûïîëíåíèÿ ýòîãî ïðîñòûì ñïîñîáîì.
Îáúåêò ÷àñòî ñîäåðæèò ññûëêè íà äðóãèå îáúåêòû, òîæå ñîäåðæàùèå, â ñâîþ î÷åðåäü, ññûëêè íà
îáúåêòû. Ïîýòîìó êàæäûé îáúåêò ìîæåò èìåòü áîëüøîå êîëè÷åñòâî çàâèñèìûõ îáúåêòîâ ñ âîçìîæíî
ñëîæíûì ãðàôîì çàâèñèìîñòè (êîòîðûé ìîæåò ñîäåðæàòü öèêëû). Îáû÷íî íå èìååò ñìûñëà ñîõðàíÿòü èëè âîññòàíàâëèâàòü îáúåêò áåç âñåõ åãî ïðÿìûõ è íåïðÿìûõ çàâèñèìûõ îáúåêòîâ. Ìåõàíèçì
ñåðàèëèçàöèè äîëæåí àâòîìàòè÷åñêè ñîõðàíÿòü çàâèñèìûå îáúåêòû íàðÿäó ñ ñàìèì îáúåêòîì.
Äîêóìåíòàöèÿ
Ðàçðàáîò÷èêè êëàññîâ è ñèñòåì äîëæíû îáåñïå÷èâàòü ðóêîâîäñòâî, çàêàç÷èêîâ è äðóãèõ ðàçðàáîò÷èêîâ ÿñíûìè âûñîêîóðîâíåâûìè îïèñàíèÿìè ñîçäàâàåìîãî ÏÎ. Èì íåîáõîäèì èíñòðóìåíòàðèé, ïîìîãàþùèé â ýòîé ðàáîòå. Áîëüøàÿ ÷àñòü äîêóìåíòàöèè äîëæíà àâòîìàòè÷åñêè ñîçäàâàòüñÿ íà îñíîâå
òåêñòîâ ÏÎ. Óòâåðæäåíèÿ, êàê óæå îòìå÷åíî, ïîìîãàþò ñäåëàòü òàêèå äîêóìåíòû, èçâëåêàåìûå èç
ÏÎ, òî÷íûìè è èíôîðìàòèâíûìè.
Äîëæíû áûòü â íàëè÷èè èíñòðóìåíòàëüíûå ñðåäñòâà äëÿ àâòîìàòè÷åñêîãî ïîëó÷åíèÿ äîêóìåíòàöèè î êëàññàõ è ñèñòåìàõ.
Áûñòðûé ïðîñìîòð (browsing)
Ïðè ðàáîòå ñ êëàññîì ÷àñòî íåîáõîäèìî ïîëó÷èòü èíôîðìàöèþ î äðóãèõ êëàññàõ; â ÷àñòíîñòè, êîìïîíåíòû äàííîãî êëàññà ÷àñòî ìîãóò îïðåäåëÿòüñÿ íå â ñàìîì êëàññå, à â åãî ðàçëè÷íûõ ïðåäêàõ.
Ñðåäà äîëæíà îáåñïå÷èòü ðàçðàáîò÷èêîâ èíñòðóìåíòàìè äëÿ èññëåäîâàíèÿ òåêñòà êëàññà, íàõîæäåíèÿ çàâèñèìûõ êëàññîâ è áûñòðîãî ïåðåêëþ÷åíèÿ ñ òåêñòà îäíîãî êëàññà íà äðóãîé.
 ýòîì è ñîñòîèò çàäà÷à ïðîñìîòðà. Òèïè÷íûå õîðîøèå âîçìîæíîñòè ïðîñìîòðà âêëþ÷àþò: ïîèñê
êëàññîâ - êëèåíòîâ, ïîñòàâùèêîâ, ïîòîìêîâ, ïðåäêîâ; ïîèñê âñåõ ïåðåîïðåäåëåíèé êîìïîíåíòà; ïîèñê
èñõîäíîãî îáúÿâëåíèÿ ïåðåîïðåäåëåííîãî êîìïîíåíòà.
Ñðåäñòâà èíòåðàêòèâíîãî ïðîñìîòðà äîëæíû äàâàòü âîçìîæíîñòü ðàçðàáîò÷èêàì ÏÎ áûñòðî è
óäîáíî ïðîñëåæèâàòü çàâèñèìîñòè ìåæäó êëàññàìè è êîìïîíåíòàìè.
Áèáëèîòåêè
Îäèí èç õàðàêòåðíûõ àñïåêòîâ ðàçðàáîòêè ÏÎ ÎÎ-ñïîñîáîì - âîçìîæíîñòü ñîçäàâàòü åãî íà îñíîâå ñóùåñòâóþùèõ áèáëèîòåê. ÎÎ-ñðåäà äîëæíà îáåñïå÷èâàòü õîðîøèå áèáëèîòåêè è ìåõàíèçìû
ñîçäàíèÿ íîâûõ áèáëèîòåê.
Áàçîâûå áèáëèîòåêè
Èçíà÷àëüíî â èíôîðìàòèêå èçó÷àþòñÿ ôóíäàìåíòàëüíûå ñòðóêòóðû äàííûõ - ìíîæåñòâà, ñïèñêè,
äåðåâüÿ, ñòåêè; ñâÿçàííûå ñ íèìè àëãîðèòìû - ñîðòèðîâêè, ïîèñêà, îáõîäà, ñîïîñòàâëåíèÿ ñ îáðàçöîì.
Ýòè ñòðóêòóðû è àëãîðèòìû âåçäåñóùè â ðàçðàáîòêàõ ÏÎ. Íåðåäêî, êîãäà â ñâîåé ñèñòåìå î÷åðåäíîé
ðàçðàáîò÷èê ïîâòîðíî èõ ðåàëèçóåò. Ýòî íå òîëüêî ðàñòî÷èòåëüíî, íî è ïàãóáíî îòðàæàåòñÿ íà êà÷åñòâå ÏÎ, ïîñêîëüêó âðÿä ëè îòäåëüíûé ðàçðàáîò÷èê, ðåàëèçóþùèé ñòðóêòóðó äàííûõ íå êàê öåëü
ñàìó ïî ñåáå, à â êà÷åñòâå êîìïîíåíòà íåêîòîðîãî ïðèëîæåíèÿ, äîñòèãíåò îïòèìàëüíîé íàäåæíîñòè
è ïðîèçâîäèòåëüíîñòè.
ÎÎ-ñðåäà ðàçðàáîòêè äîëæíà îáåñïå÷èòü ïîâòîðíî èñïîëüçóåìûå êëàññû, óäîâëåòâîðÿþùèå îáùèì
ïîòðåáíîñòÿì.
Äîëæíû áûòü äîñòóïíû ïîâòîðíî èñïîëüçóåìûå êëàññû, ðåàëèçóþùèå ôóíäàìåíòàëüíûå ñòðóêòóðû äàííûõ è àëãîðèòìû.
Ãðàôèêà è ïîëüçîâàòåëüñêèå èíòåðôåéñû
Ìíîãèå ñîâðåìåííûå ñèñòåìû ÏÎ èíòåðàêòèâíû. Ïðè âçàèìîäåéñòâèè ñ ïîëüçîâàòåëåì øèðîêî èñïîëüçóåòñÿ ãðàôèêà è óäîáíûé, ÷àùå âñåãî ãðàôè÷åñêèé èíòåðôåéñ. Ýòî îäíà èç îáëàñòåé, ãäå ÎÎìîäåëü îêàçàëàñü íàèáîëåå âïå÷àòëÿþùåé è ïîëåçíîé. Ðàçðàáîò÷èêè äîëæíû èìåòü âîçìîæíîñòü
èñïîëüçîâàòü ãðàôè÷åñêèå áèáëèîòåêè äëÿ áûñòðîãî è ýôôåêòèâíîãî ïîñòðîåíèÿ èíòåðàêòèâíûõ
ïðèëîæåíèé.
Äîëæíû áûòü äîñòóïíû ïîâòîðíî èñïîëüçóåìûå êëàññû äëÿ ðàçðàáîòêè ïðèëîæåíèé, îáåñïå÷èâàþùèõ ïîëüçîâàòåëåé ïðèÿòíûìè ãðàôè÷åñêèìè ïîëüçîâàòåëüñêèìè èíòåðôåéñàìè.
Ìåõàíèçìû ýâîëþöèè áèáëèîòåê
Ðàçðàáîòêà âûñîêîêà÷åñòâåííûõ áèáëèîòåê - äîëãàÿ è òðóäíàÿ çàäà÷à. Íåâîçìîæíî ãàðàíòèðîâàòü,
÷òî ïîñòðîåííûå áèáëèîòåêè ñðàçó áóäóò ñîâåðøåííûìè. Ñëåäîâàòåëüíî, âàæíîé ïðîáëåìîé ÿâëÿåòñÿ îáåñïå÷åíèå ðàçðàáîò÷èêîâ áèáëèîòåêè âîçìîæíîñòüþ îáíîâëÿòü è ìîäèôèöèðîâàòü èõ ïðîåêòû,
íå íàíîñÿ âðåäà ñóùåñòâóþùèì ñèñòåìàì, îñíîâàííûì íà áèáëèîòåêàõ. Ýòîò âàæíûé êðèòåðèé ýâîëþöèè ìû îòíåñëè ê êàòåãîðèè áèáëèîòåê, íî îí îòíîñèòñÿ òàêæå è ê êàòåãîðèè ìåòîäà è ÿçûêà.
Äîëæíû áûòü äîñòóïíû ìåõàíèçìû, îáëåã÷àþùèå ýâîëþöèþ áèáëèîòåê ñ ìèíèìàëüíûìè íàðóøåíèÿìè ðàáîòû ÏÎ êëèåíòîâ.
Ìåõàíèçìû èíäåêñàöèè â áèáëèîòåêàõ
Åùå îäíà íàñóùíàÿ ïðîáëåìà áèáëèîòåê - ýòî íåîáõîäèìîñòü ìåõàíèçìîâ èäåíòèôèêàöèè êëàññîâ
äëÿ óäîâëåòâîðåíèÿ îïðåäåëåííûõ íóæä. Ýòîò êðèòåðèé çàòðàãèâàåò âñå òðè êàòåãîðèè: áèáëèîòåêè,
ÿçûê (ïîñêîëüêó äîëæåí áûòü ñïîñîá ââîäèòü èíäåêñèðóþùóþ èíôîðìàöèþ â òåêñò êàæäîãî êëàññà)
è èíñòðóìåíòàðèé (äëÿ îáðàáîòêè çàïðîñîâ äëÿ êëàññîâ, óäîâëåòâîðÿþùèõ îïðåäåëåííûì óñëîâèÿì).
Áèáëèîòå÷íûå êëàññû äîëæíû áûòü ñíàáæåíû èíäåêñèðóþùåé èíôîðìàöèåé, äîïóñêàþùåé ïîèñê,
îñíîâàííûé íà ñâîéñòâàõ.
Êîíòðîëüíûå âîïðîñû
Begin Quiz
1. Äëÿ ÎÎ-ìåòîäà ðàçðàáîòêè ÏÎ
íåêîòîðûå êëàññû ïðåäñòàâëÿþò ñîáîé ìîäóëè, äðóãèå òèïû äàííûõ
êëàññ âñåãäà ÿâëÿåòñÿ ìîäóëåì
âñòðîåííûå òèïû äàííûõ êëàññàìè íå ÿâëÿþòñÿ
êëàññ âñåãäà ÿâëÿåòñÿ òèïîì äàííûõ
òèï äàííûõ âñåãäà ÿâëÿåòñÿ êëàññîì
2. Óíèâåðñàëüíûé êëàññ
ýòî êëàññ, ñïîñîáíûé ðåøàòü øèðîêèé ñïåêòð çàäà÷
ýòî êëàññ ñ ðîäîâûìè ïàðàìåòðàìè, ïðåäñòàâëÿþùèìè ñîáîé òèïû
êëàññ, ñïîñîáíûé âûïîëíÿòü îïåðàöèè íàä äàííûìè ðàçíûõ òèïîâ
ñèíîíèì àáñòðàêòíîãî êëàññà
3. Æèâó÷åñòü - ýòî?
ñïîñîáíîñòü ÏÎ ðàáîòàòü â óñëîâèÿõ, êîãäà íàðóøàþòñÿ ñïåöèôèêàöèè
âîçìîæíîñòü ñîõðàíåíèÿ ñîñòîÿíèÿ îáúåêòà
âîçìîæíîñòü ñîõðàíåíèÿ ñîñòîÿíèÿ îáúåêòà ñ îäíîâðåìåííûì ñîõðàíåíèåì âñåõ ñâÿçàííûõ
îáúåêòîâ
ñâîéñòâî êëàññà, ïîçâîëÿþùåå ñîõðàíÿòü åãî ìåòîäû è ñâîéñòâà
4. Ñòàòè÷åñêàÿ òèïèçàöèÿ îçíà÷àåò?
äëÿ êàæäîé ñóùíîñòè ïðè åå îáúÿâëåíèè çàäàåòñÿ òèï
òèï îáúåêòà, ñâÿçûâàåìîãî ñ ñóùíîñòüþ, äîëæåí ñîâïàäàòü ñ òèïîì ñóùíîñòè
ïîñëå òîãî, êàê ñóùíîñòü ñâÿçàíà ñ îáúåêòîì, äðóãèå îáúåêòû íå ìîãóò ïðèñîåäèíÿòüñÿ ê
ñóùíîñòè
ñâÿçûâàíèå îáúåêòà è ñóùíîñòè âûïîëíÿåòñÿ åùå íà ýòàïå òðàíñëÿöèè è ýòà ñâÿçü íå ìîæåò
èçìåíÿòüñÿ äèíàìè÷åñêè â ïðîöåññå âûïîëíåíèÿ ïðèëîæåíèÿ
5. Íàñëåäîâàíèå ìîæåò áûòü?
åäèíè÷íîå
ìíîæåñòâåííîå
ïîâòîðíîå
ìíîãîÿçû÷íîå
6. Ñáîðêà ìóñîðà ýòî?
óäàëåíèå ìîäóëåé, íå âûçûâàåìûõ â òåêóùåé ñåññèè ðàáîòû ÏÎ
óäàëåíèå ìåòîäîâ êëàññà ñðàçó ïîñëå èõ âûçîâà
óäàëåíèå îáúåêòà ñðàçó ïîñëå òîãî, êàê ñ íèì ðàçîðâàíà ñâÿçü
àâòîìàòè÷åñêîå óäàëåíèå íåèñïîëüçóåìûõ îáúåêòîâ
îáÿçàííîñòü ïðîãðàììèñòà ïåðèîäè÷åñêè îñâîáîæäàòü ïàìÿòü, îòâîäèìóþ îáúåêòàì
7. Îòëîæåííûé êëàññ
ýòî êëàññ, êîòîðûé âðåìåííî íå âêëþ÷àåòñÿ â ñîñòàâ ïðèëîæåíèÿ
ïîíÿòèå ýêâèâàëåíòíîå ïîíÿòèþ àáñòðàêòíûé êëàññ
êëàññ, äëÿ êîòîðîãî íå çàäàíû ñïåöèôèêàöèè
êëàññ, äëÿ êîòîðîãî íå çàäàíà ðåàëèçàöèÿ
êëàññ, äëÿ êîòîðîãî ðåàëèçàöèÿ çàäàíà ÷àñòè÷íî
8. Ïîä ñêðûòèåì èíôîðìàöèè ïîíèìàåòñÿ?
ñêðûòèå ñïåöèôèêàöèé îò ïîëüçîâàòåëåé
ñêðûòèå ðåàëèçàöèè îò ïîëüçîâàòåëåé
íåäîêóìåíòèðîâàííûå âîçìîæíîñòè ÏÎ
ìåõàíèçì, äåëàþùèé îïðåäåë¼ííûå êîìïîíåíòû íåäîñòóïíûìè äëÿ êëèåíòîâ
9. Ïîëèìîðôèçì - ýòî?
ñóùåñòâîâàíèå íåñêîëüêèõ ðåàëèçàöèé ìåòîäà êëàññà
ñïîñîáíîñòü ïðèñîåäèíÿòü ê ñóùíîñòè îáúåêòû ðàçëè÷íûõ âîçìîæíûõ òèïîâ
ñïîñîáíîñòü ïðèñîåäèíÿòü ê ñóùíîñòè çíà÷åíèå void
âîçìîæíîñòü óïðàâëÿòü îáúåêòàìè, òèï êîòîðûõ íå èçâåñòåí
10. Îáðàáîòêà èñêëþ÷åíèé
îáåñïå÷èâàåò óñòîé÷èâîñòü ÏÎ
ïðåäíàçíà÷åíà äëÿ îáðàáîòêè ñïåöèàëüíûõ ñëó÷àåâ, ïðåäóñìîòðåííûõ ñïåöèôèêàöèåé
ïîçâîëÿåò îòêëþ÷àòü íåêîòîðûå ìîäóëè ïðèëîæåíèÿ
ÿâëÿåòñÿ ìåõàíèçìîì âîññòàíîâëåíèÿ â àâàðèéíûõ ñèòóàöèÿõ
11. Ïîä áåñøîâíîñòüþ ïîíèìàåòñÿ?
ïðîöåññ ðàçðàáîòêè ÏÎ èç ãîòîâûõ êîìïîíåíòîâ
èñïîëüçîâàíèå îäíîãî ÿçûêà ïðîãðàììèðîâàíèÿ äëÿ ðàçðàáîòêè âñåõ êîìïîíåíòîâ ÏÎ
èñïîëüçîâàíèå îäíèõ è òåõ æå ÎÎ-ìåõàíèçìîâ íà âñåõ ýòàïàõ æèçíåííîãî öèêëà ñîçäàíèÿ ÏÎ
- ïðîåêòèðîâàíèÿ, ðàçðàáîòêè, ñîïðîâîæäåíèÿ
èñïîëüçîâàíèå ñïåöèàëüíîé òåõíîëîãèè "NoShow"
12. Ïðè ÎÎ-âû÷èñëåíèÿõ
äîïóñòèì øèðîêèé ñïåêòð îðãàíèçàöèè âû÷èñëåíèé
ðàçðåøàåòñÿ èñïîëüçîâàòü ãëîáàëüíûå ñóùíîñòè
ðàçðåøàåòñÿ âûçûâàòü ãëîáàëüíûå ìåòîäû, íå ïðèíàäëåæàùèå êîíêðåòíîìó êëàññó
äîïóñòèì åäèíñòâåííûé ìåõàíèçì âûçîâ îáúåêòîì ñâîåãî ìåòîäà è ñâîéñòâà
ìåòîäó ìîãóò ïåðåäàâàòüñÿ àðãóìåíòû â ìîìåíò åãî âûçîâà îáúåêòîì
13. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
ðîäîâûå êëàññû ýòî êëàññû, äëÿ êîòîðûõ çàäàí èõ ðîä
êëèåíòîì êëàññà À ÿâëÿåòñÿ êëàññ Â, âûçûâàþùèé êîìïîíåíòû êëàññà À
ïîâòîðíîå íàñëåäîâàíèå ýòî ñèòóàöèÿ, ïðè êîòîðîé êëàññ äèíàìè÷åñêè ïîëó÷àåò íîâîãî
ðîäèòåëÿ
óòâåðæäåíèÿ äîëæíû áûòü ÷àñòüþ ÏÎ è àâòîìàòè÷åñêè âêëþ÷àòüñÿ â äîêóìåíòàöèþ
14. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
êîìïîíåíò ìîæåò áûòü äîñòóïíûì îäíèì êëèåíòàì è ñêðûò äëÿ äðóãèõ
äëÿ òîãî ÷òîáû òèïèçàöèÿ áûëà ïðàêòè÷íîé, íåîáõîäèìî èìåòü âîçìîæíîñòü îïðåäåëÿòü êëàññû ñ ïàðàìåòðàìè, çàäàþùèìè òèï
ïðåäêè è ïîòîìêè ìîãóò îáìåíèâàòüñÿ êîìïîíåíòàìè ïðè íàñëåäîâàíèè
ïîòîìîê íå ìîæåò èçìåíÿòü ðåàëèçàöèþ íàñëåäîâàííîãî èì êîìïîíåíòà
15. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
â ñèòóàöèÿõ, ãäå äîïóñòèìà îïåðàöèÿ ïðèñâàèâàíèÿ, äîïóñòèìà è îïåðàöèÿ ïîïûòêà ïðèñâàèâàíèÿ
åñëè êëàññ ÿâëÿåòñÿ îòëîæåííûì, îí ñ÷èòàåòñÿ ýôôåêòèâíûì
ñáîðùèê ìóñîðà - ýòî êîìïîíåíò ñèñòåìû ïåðèîäà âûïîëíåíèÿ
ÎÎ-ìîäåëü íå ïðèãîäíà äëÿ çàäà÷è ñîçäàíèÿ ãðàôè÷åñêîãî èíòåðôåéñà
End Quiz
Íàáðàíî áàëëîâ
3 Ìîäóëüíîñòü
×òîáû îáåñïå÷èòü ðàñøèðÿåìîñòü (extendibility) è ïîâòîðíîå èñïîëüçîâàíèå (reusability), äâóõ îñíîâíûõ ôàêòîðîâ êà÷åñòâà, íåîáõîäèìà ñèñòåìà ñ ãèáêîé àðõèòåêòóðîé, ñîñòîÿùàÿ èç àâòîíîìíûõ
ïðîãðàììíûõ êîìïîíåíò. Èìåííî ïîýòîìó áûë ââåäåí òåðìèí ìîäóëüíîñòü (modularity), ñî÷åòàþùèé
îáà ôàêòîðà. Ìîäóëüíîå ïðîãðàììèðîâàíèå ðàíåå ïîíèìàëîñü êàê ñáîðêà ïðîãðàìì èç íåáîëüøèõ
÷àñòåé, îáû÷íî ïîäïðîãðàìì. Íî òàêîé ïîäõîä íå ìîæåò îáåñïå÷èòü ðåàëüíóþ ðàñøèðÿåìîñòü è
ïîâòîðíîå èñïîëüçîâàíèå ïðîãðàììíîãî ïðîäóêòà, åñëè íå ãàðàíòèðîâàòü, ÷òî ýëåìåíòû ñáîðêè ìîäóëè - ÿâëÿþòñÿ ñàìîäîñòàòî÷íûìè è îáðàçóþò óñòîé÷èâûå ñòðóêòóðû. Ëþáîå äîñòàòî÷íî ïîëíîå îïðåäåëåíèå ìîäóëüíîñòè äîëæíî îáåñïå÷èâàòü ðåàëèçàöèþ ýòèõ ñâîéñòâ. Òàêèì îáðàçîì, ìåòîä
ïðîåêòèðîâàíèÿ ïðîãðàììíîãî ïðîäóêòà ÿâëÿåòñÿ ìîäóëüíûì, åñëè îí ïîìîãàåò ïðîåêòèðîâùèêàì
ñîçäàòü ñèñòåìó, ñîñòîÿùóþ èç àâòîíîìíûõ ýëåìåíòîâ ñ ïðîñòûìè è ñîãëàñîâàííûìè ñòðóêòóðíûìè
ñâÿçÿìè ìåæäó íèìè.
3.1 Ïÿòü êðèòåðèåâ
Ìåòîä ïðîåêòèðîâàíèÿ, êîòîðûé ìîæíî íàçûâàòü ìîäóëüíûì, äîëæåí óäîâëåòâîðÿòü ïÿòè îñíîâíûì òðåáîâàíèÿì:
1. Äåêîìïîçèöèè (decomposability).
2. Êîìïîçèöèè (composability).
3. Ïîíÿòíîñòè (understandability).
4. Íåïðåðûâíîñòè (continuity).
5. Çàùèùåííîñòè (protection).
Äåêîìïîçèöèÿ
Îïðåäåëåíèå 12. Ìåòîä ïðîåêòèðîâàíèÿ óäîâëåòâîðÿåò êðèòåðèþ äåêîìïîçèöèè, åñëè îí ïîìîãàåò ðàçëîæèòü çàäà÷ó íà íåñêîëüêî ìåíåå ñëîæíûõ ïîäçàäà÷, îáúåäèíÿåìûõ ïðîñòîé ñòðóêòóðîé, è
íàñòîëüêî íåçàâèñèìûõ, ÷òî â äàëüíåéøåì ìîæíî îòäåëüíî ïðîäîëæèòü ðàáîòó íàä êàæäîé èç íèõ.
Òàêîé ïðîöåññ ÷àñòî áóäåò ðåêóðñèâíûì, ïîñêîëüêó êàæäàÿ ïîäçàäà÷à ìîæåò îêàçàòüñÿ äîñòàòî÷íî ñëîæíîé è ïîòðåáóåò äàëüíåéøåãî ðàçëîæåíèÿ. Ñëåäñòâèåì òðåáîâàíèÿ äåêîìïîçèöèè ÿâëÿåòñÿ
ðàçäåëåíèå òðóäà (division of labor): êàê òîëüêî ñèñòåìà áóäåò ðàçëîæåíà íà ïîäñèñòåìû, ðàáîòó
íàä íèìè ñëåäóåò ðàñïðåäåëèòü ìåæäó ðàçíûìè ðàçðàáîò÷èêàìè èëè ãðóïïàìè ðàçðàáîò÷èêîâ. Ýòî
òðóäíàÿ çàäà÷à, òàê êàê íåîáõîäèìî îãðàíè÷èòü âîçìîæíûå âçàèìîçàâèñèìîñòè ìåæäó ïîäñèñòåìàìè:
• Íåîáõîäèìî ñâåñòè òàêèå âçàèìîçàâèñèìîñòè ê ìèíèìóìó; â ïðîòèâíîì ñëó÷àå ðàçðàáîòêà êàæäîé èç ïîäñèñòåì áóäåò îãðàíè÷èâàòüñÿ òåìïàìè ðàáîòû íàä äðóãèìè ïîäñèñòåìàìè.
• Ýòè âçàèìîçàâèñèìîñòè äîëæíû áûòü èçâåñòíû: åñëè íå óäàñòñÿ ñîñòàâèòü ïåðå÷åíü âñåõ ñâÿçåé
ìåæäó ïîäñèñòåìàìè, òî ïîñëå çàâåðøåíèÿ ðàçðàáîòêè ïðîåêòà áóäåò ïîëó÷åí íàáîð ýëåìåíòîâ ïðîãðàììû, êîòîðûå, âîçìîæíî, áóäóò ðàáîòàòü êàæäàÿ â îòäåëüíîñòè, íî íå ñìîãóò áûòü
Ðèñ. 3.1: Äåêîìïîçèöèÿ
ñîáðàíû âìåñòå â çàâåðøåííóþ ñèñòåìó, óäîâëåòâîðÿþùóþ îáùèì òðåáîâàíèÿì ê èñõîäíîé çàäà÷å.
Íàèáîëåå î÷åâèäíûì ïðèìåðîì îáñóæäàåìîãî ìåòîäà, óäîâëåòâîðÿþùèì êðèòåðèþ äåêîìïîçèöèè,
ÿâëÿåòñÿ ìåòîä
íèñõîäÿùåãî (ñâåðõó âíèç) ïðîåêòèðîâàíèÿ (top-down design). Â ñîîòâåòñòâèè ñ ýòèì
ìåòîäîì ðàçðàáîò÷èê äîëæåí íà÷àòü ñ íàèáîëåå àáñòðàêòíîãî îïèñàíèÿ ôóíêöèè, âûïîëíÿåìîé ñèñòåìîé. Çàòåì ïîñëåäîâàòåëüíûìè øàãàìè äåòàëèçèðîâàòü ýòî ïðåäñòàâëåíèå, ðàçáèâàÿ íà êàæäîì
øàãå êàæäóþ ïîäñèñòåìó íà íåáîëüøîå ÷èñëî áîëåå ïðîñòûõ ïîäñèñòåì äî òåõ ïîð, ïîêà íå áóäóò
ïîëó÷åíû ýëåìåíòû ñ íàñòîëüêî íèçêèì óðîâíåì àáñòðàêöèè, ÷òî ñòàíîâèòñÿ âîçìîæíîé èõ íåïîñðåäñòâåííàÿ ðåàëèçàöèÿ. Ýòîò ïðîöåññ ìîæíî ïðåäñòàâèòü â âèäå äåðåâà.
Òèïè÷íûì êîíòðïðèìåðîì (counter-example) ÿâëÿåòñÿ ëþáîé ìåòîä, ïðåäóñìàòðèâàþùèé âêëþ÷åíèå â ðàçðàáàòûâàåìóþ ñèñòåìó ìîäóëÿ ãëîáàëüíîé èíèöèàëèçàöèè. Ìíîãèå ìîäóëè ñèñòåìû íóæäàþòñÿ â èíèöèàëèçàöèè - îòêðûòèè ôàéëîâ èëè èíèöèàëèçàöèè ïåðåìåííûõ.
Ðèñ. 3.2: Èåðàðõèÿ íèñõîäÿùåãî ïðîåêòèðîâàíèÿ
Êàæäûé ìîäóëü äîëæåí ïðîèçâåñòè ýòó èíèöèàëèçàöèþ äî íà÷àëà âûïîëíåíèÿ íåïîñðåäñòâåííî
âîçëîæåííûõ íà íåãî îïåðàöèé.
 îáúåêòíî-îðèåíòèðîâàííîì ìåòîäå êàæäûé ìîäóëü äîëæåí ñàìîñòîÿòåëüíî èíèöèàëèçèðîâàòü
ñâîè ñòðóêòóðû äàííûõ.
Ìîäóëüíàÿ êîìïîçèöèÿ
Îïðåäåëåíèå 13. Ìåòîä óäîâëåòâîðÿåò êðèòåðèþ ìîäóëüíîé êîìïîçèöèè, åñëè îí îáåñïå÷èâàåò
ðàçðàáîòêó ýëåìåíòîâ ïðîãðàììíîãî ïðîäóêòà, ñâîáîäíî îáúåäèíÿåìûõ ìåæäó ñîáîé äëÿ ïîëó÷åíèÿ
íîâûõ ñèñòåì, áûòü ìîæåò, â ñðåäå, îòëè÷àþùåéñÿ îò òîé, äëÿ êîòîðîé ýòè ýëåìåíòû ïåðâîíà÷àëüíî
ðàçðàáàòûâàëèñü.
Êîìïîçèöèÿ îïðåäåëÿåò ïðîöåññ, îáðàòíûé äåêîìïîçèöèè: ýëåìåíòû ïðîãðàììíîãî ïðîäóêòà èç-
Ðèñ. 3.3: Êîìïîçèöèÿ
âëåêàþòñÿ èç òîãî êîíòåêñòà, äëÿ êîòîðîãî îíè áûëè ïåðâîíà÷àëüíî ïðåäíàçíà÷åíû, äëÿ èñïîëüçîâàíèÿ èõ âíîâü â èíîì êîíòåêñòå.
Ìåòîä ìîäóëüíîãî ïðîåêòèðîâàíèÿ îáëåã÷àåò ýòîò ïðîöåññ, ñîçäàâàÿ àâòîíîìíûå ýëåìåíòû ïðîãðàììíîãî ïðîäóêòà äîñòàòî÷íî íåçàâèñèìûìè îò ïåðâîíà÷àëüíî ïîñòàâëåííîé çàäà÷è, ÷òî äåëàåò
òàêîå èçâëå÷åíèå âîçìîæíûì.
Êîìïîçèöèÿ íåïîñðåäñòâåííî ñâÿçàíà ñ ïîâòîðíûì èñïîëüçîâàíèåì. Ýòîò êðèòåðèé îòðàæàåò ñòàðóþ ìå÷òó - ïðåâðàòèòü ïðîöåññ êîíñòðóèðîâàíèÿ ïðîãðàììíîãî ïðîäóêòà â ðàáîòó ïî ñêëàäûâàíèþ
êóáèêîâ òàê, ÷òîáû ñòðîèòü ïðîãðàììû èç ôàáðè÷íî èçãîòîâëåííûõ ýëåìåíòîâ.
• Ïðèìåð 1: Áèáëèîòåêè ïîäïðîãðàìì. Áèáëèîòåêè ïîäïðîãðàìì ñîçäàþòñÿ êàê íàáîðû êîìïîíóåìûõ ýëåìåíòîâ. Îäíîé èç îáëàñòåé, ãäå îíè óñïåøíî èñïîëüçóþòñÿ, ÿâëÿþòñÿ ÷èñëåííûå
âû÷èñëåíèÿ, îñíîâàííûå íà òùàòåëüíî ïîäãîòîâëåííûõ áèáëèîòåêàõ ïîäïðîãðàìì äëÿ ðåøåíèÿ çàäà÷ ëèíåéíîé àëãåáðû, ìåòîäà êîíå÷íûõ ýëåìåíòîâ, äèôôåðåíöèàëüíûõ óðàâíåíèé è
äð.
• Ïðèìåð 2: Ñîãëàøåíèÿ, ïðèíÿòûå â êîìàíäíîì ÿçûêå Shell îïåðàöèîííîé ñèñòåìû UNIX. Îñíîâíûå êîìàíäû ñèñòåìû UNIX îïåðèðóþò ñ âõîäíûì ïîòîêîì ïîñëåäîâàòåëüíûõ ñèìâîëîâ è
âûäàþò ðåçóëüòàò, èìåþùèé òàêóþ æå ñòàíäàðòíóþ ñòðóêòóðó. Ïîòåíöèàëüíàÿ âîçìîæíîñòü
êîìïîçèöèè ïîääåðæèâàåòñÿ îïåðàòîðîì |êîìàíäíîãî ÿçûêà Shell. Çàïèñü A |B îçíà÷àåò êîìïîçèöèþ ïðîãðàìì. Âíà÷àëå çàïóñêàåòñÿ ïðîãðàììà A, åå ðåçóëüòàòû ïîñòóïàþò íà âõîä ïðîãðàììû B, íà÷èíàþùåé ñâîþ ðàáîòó ïî çàâåðøåíèè ðàáîòû ïðîãðàììû À. Òàêîå ñèñòåìíîå
ñîãëàøåíèå áëàãîïðèÿòñòâóåò êîìïîçèöèè ïðîãðàììíûõ ñðåäñòâ.
• Êîíòðïðèìåð: Ïðåïðîöåññîðû. Îáùåïðèíÿòûì ñïîñîáîì ðàñøèðåíèÿ ÿçûêà ïðîãðàììèðîâàíèÿ, à èíîãäà è ïðåîäîëåíèÿ åãî íåäîñòàòêîâ, ÿâëÿåòñÿ èñïîëüçîâàíèå ïðåïðîöåññîðà, ïðèíèìàþùåãî âõîäíûå äàííûå â ðàñøèðåííîì ñèíòàêñèñå è îòîáðàæàþùåãî èõ â ñòàíäàðòíîé äëÿ
ýòîãî ÿçûêà ôîðìå. Òèïè÷íûå ïðåïðîöåññîðû äëÿ Fortran'à è C ïîääåðæèâàþò ãðàôè÷åñêèå
ïðèìèòèâû, ðàñøèðåííûå óïðàâëÿþùèå ñòðóêòóðû èëè îïåðàöèè íàä áàçàìè äàííûõ. Îäíàêî
îáû÷íî òàêèå ðàñøèðåíèÿ íå ÿâëÿþòñÿ âçàèìíî ñîâìåñòèìûìè; ÷òî íå ïîçâîëÿåò ñî÷åòàòü äâà
òàêèõ ïðåïðîöåññîðà, è ïðèõîäèòñÿ âûáèðàòü ìåæäó, íàïðèìåð, ãðàôèêîé èëè áàçîé äàííûõ.
Êàê êîìïîçèöèÿ, òàê è äåêîìïîçèöèÿ ÿâëÿþòñÿ ÷àñòüþ òðåáîâàíèé ê ìîäóëüíîìó ìåòîäó ïðîåêòèðîâàíèÿ. Íåèçáåæíà ñìåñü äâóõ ïîäõîäîâ ê ïðîåêòèðîâàíèþ: ñâåðõó-âíèç è ñíèçó-ââåðõ.
Ìîäóëüíàÿ ïîíÿòíîñòü
Îïðåäåëåíèå 14. Ìåòîä óäîâëåòâîðÿåò êðèòåðèþ ìîäóëüíîé ïîíÿòíîñòè, åñëè îí ïîìîãàåò ïîëó÷èòü òàêóþ ïðîãðàììó, ÷èòàÿ êîòîðóþ ìîæíî ïîíÿòü ñîäåðæàíèå êàæäîãî ìîäóëÿ, íå çíàÿ òåêñòà
îñòàëüíûõ, èëè, â õóäøåì ñëó÷àå, îçíàêîìèâøèñü ëèøü ñ íåêîòîðûìè èç íèõ.
Âàæíîñòü ýòîãî êðèòåðèÿ ñëåäóåò èç åãî âëèÿíèÿ íà ïðîöåññ ñîïðîâîæäåíèÿ ïðîãðàììíîãî ïðîäóêòà. Ïî÷òè âñå äåéñòâèÿ ïî ñîïðîâîæäåíèþ ïðîãðàììû, êàê íåèçáåæíûå, òàê è íå ñòîëü íåèçáåæíûå,
Ðèñ. 3.4: Ïîíÿòíîñòü
ñâÿçàíû ñ ãëóáîêèì ïîíèìàíèåì åå ýëåìåíòîâ. Ìåòîä åäâà ëè ìîæåò íàçûâàòüñÿ ìîäóëüíûì, åñëè
òîò, êòî ÷èòàåò ïðîãðàììíûé òåêñò, íå â ñîñòîÿíèè ïîíÿòü åãî ñìûñë.
Ýòîò êðèòåðèé, ïîäîáíî ÷åòûðåì îñòàëüíûì, ïðèìåíèì ê ìîäóëÿì ïðè îïèñàíèè ñèñòåìû íà ëþáîì
óðîâíå: àíàëèçà, ïðîåêòèðîâàíèÿ, ðåàëèçàöèè.
Ìîäóëüíàÿ íåïðåðûâíîñòü
Îïðåäåëåíèå 15. Ìåòîä óäîâëåòâîðÿåò êðèòåðèþ ìîäóëüíîé íåïðåðûâíîñòè, åñëè íåçíà÷èòåëüíîå èçìåíåíèå ñïåöèôèêàöèé ðàçðàáîòàííîé ñèñòåìû ïðèâåäåò ê èçìåíåíèþ îäíîãî èëè íåáîëüøîãî
÷èñëà ìîäóëåé.
Ýòîò êðèòåðèé íåïîñðåäñòâåííî ñâÿçàí ñ êðèòåðèåì ðàñøèðÿåìîñòè. Êàê ïîä÷åðêèâàëîñü â ïðåäû-
Ðèñ. 3.5: Íåïðåðûâíîñòü
äóùåé ëåêöèè, âíåñåíèå èçìåíåíèé ÿâëÿåòñÿ íåîòúåìëåìîé ÷àñòüþ ïðîöåññà ðàçðàáîòêè ïðîãðàììíîãî ïðîäóêòà. Ñîîòâåòñòâóþùèå òðåáîâàíèÿ ê ïðîãðàììå áóäóò íåìèíóåìî èçìåíÿòüñÿ â õîäå ðàçðàáîòêè. Íåïðåðûâíîñòü îçíà÷àåò, ÷òî íåáîëüøèå èçìåíåíèÿ áóäóò âîçäåéñòâîâàòü òîëüêî íà îòäåëüíûå
ìîäóëè â ñòðóêòóðå ñèñòåìû, à íå íà âñþ ñèñòåìó. Ýòîò ìàòåìàòè÷åñêèé òåðìèí ââåäåí çäåñü ëèøü
ïî àíàëîãèè, ïîñêîëüêó íå ñóùåñòâóåò ôîðìàëüíîãî ïîíÿòèÿ ðàçìåðà ñïåöèôèêàöèè è ïðîãðàììû.
Ìîæíî áûëî áû ââåñòè ïðèåìëåìóþ ìåðó äëÿ îïðåäåëåíèÿ íåáîëüøèõ èëè áîëüøèõ èçìåíåíèé
ïðîãðàììû, íî äàòü ïîäîáíîå îïðåäåëåíèå äëÿ ñïåöèôèêàöèé ê ïðîãðàììå ýòî óæå íàñòîÿùàÿ ïðîáëåìà.
Ðèñ. 3.6: Íàðóøåíèå çàùèùåííîñòè
Ìîäóëüíàÿ çàùèùåííîñòü
Îïðåäåëåíèå 16. Ìåòîä óäîâëåòâîðÿåò êðèòåðèþ ìîäóëüíîé çàùèùåííîñòè, åñëè îí ïðèâîäèò ê
àðõèòåêòóðå ñèñòåìû, â êîòîðîé àâàðèéíàÿ ñèòóàöèÿ, âîçíèêøàÿ âî âðåìÿ âûïîëíåíèÿ ìîäóëÿ, îãðàíè÷èòñÿ òîëüêî ýòèì ìîäóëåì, èëè, â õóäøåì ñëó÷àå, ðàñïðîñòðàíèòñÿ ëèøü íà íåñêîëüêî ñîñåäíèõ
ìîäóëåé.
Âîïðîñ îá îòêàçàõ è îøèáêàõ ÿâëÿåòñÿ îñíîâíûì â ïðîãðàììíîé èíæåíåðèè. Ñåé÷àñ ðå÷ü èäåò îá
îøèáêàõ ïåðèîäà èñïîëíåíèÿ ïðîãðàììû, ñâÿçàííûõ ñ àïïàðàòíûìè ïðåðûâàíèÿìè, îøèáî÷íûìè
âõîäíûìè äàííûìè èëè èñ÷åðïàíèåì íåîáõîäèìûõ ðåñóðñîâ (íàïðèìåð, èç-çà íåäîñòàòî÷íîãî îáúåìà ïàìÿòè). Êðèòåðèé çàùèùåííîñòè íàïðàâëåí íå íà ïðåäîòâðàùåíèå èëè èñïðàâëåíèå îøèáîê, à
íà ïðîáëåìó, íåïîñðåäñòâåííî ñâÿçàííóþ ñ ìîäóëüíîñòüþ - ðàñïðîñòðàíåíèåì îøèáîê â ìîäóëüíîé
ñèñòåìå.
3.2 Ïÿòü ïðàâèë
Èç ðàññìîòðåííûõ êðèòåðèåâ ñëåäóþò ïÿòü ïðàâèë, êîòîðûå äîëæíû ñîáëþäàòüñÿ, ÷òîáû îáåñïå÷èòü
ìîäóëüíîñòü:
1. Ïðÿìîå îòîáðàæåíèå (Direct Mapping).
2. Ìèíèìóì èíòåðôåéñîâ (Few Interfaces).
3. Ñëàáàÿ ñâÿçíîñòü èíòåðôåéñîâ (Small interfaces - weak coupling).
4. ßâíûå èíòåðôåéñû (Explicit Interfaces).
5. Ñêðûòèå èíôîðìàöèè (èíêàïñóëÿöèÿ) (Information Hiding).
Ïåðâîå ïðàâèëî êàñàåòñÿ îòíîøåíèÿ ìåæäó âíåøíåé ñèñòåìîé è ÏÎ. Ñëåäóþùèå ÷åòûðå ïðàâèëà
êàñàþòñÿ îáùåé ïðîáëåìû - êàê ìîäóëè îáùàþòñÿ ìåæäó ñîáîé. Äëÿ ïîëó÷åíèÿ õîðîøåé ìîäóëüíîé
àðõèòåêòóðû íåîáõîäèì óïðàâëÿåìûé è ñòðîãèé ìåòîä îáåñïå÷åíèÿ ìåæìîäóëüíûõ ñâÿçåé.
Ïðÿìîå îòîáðàæåíèå
Ëþáàÿ ïðèêëàäíàÿ ñèñòåìà ñòðåìèòñÿ óäîâëåòâîðèòü ïîòðåáíîñòè íåêîòîðîé ïðîáëåìíîé îáëàñòè.
Åñëè èìååòñÿ õîðîøàÿ ìîäåëü äëÿ îïèñàíèÿ ýòîé ïðîáëåìíîé îáëàñòè, òî æåëàòåëüíî îáåñïå÷èòü
÷åòêîå îòîáðàæåíèå ñòðóêòóðû ïðîáëåìû, îïèñûâàåìîé ìîäåëüþ, íà ñòðóêòóðó ñèñòåìû. Èç ýòîãî
ñëåäóåò ïåðâîå ïðàâèëî:
Ìîäóëüíàÿ ñòðóêòóðà, ñîçäàâàåìàÿ â ïðîöåññå êîíñòðóèðîâàíèÿ ÏÎ, äîëæíà îñòàâàòüñÿ
ñîâìåñòèìîé ñ ìîäóëüíîé ñòðóêòóðîé, ñîçäàâàåìîé â ïðîöåññå ìîäåëèðîâàíèÿ ïðîáëåìíîé
îáëàñòè.
Ýòà ðåêîìåíäàöèÿ ñëåäóåò, â ÷àñòíîñòè, èç äâóõ êðèòåðèåâ ìîäóëüíîñòè:
• Íåïðåðûâíîñòü: îòñëåæèâàíèå ìîäóëüíîé ñòðóêòóðû ïðîáëåìû â ñòðóêòóðå ðåøåíèÿ îáëåã÷èò
îöåíêó è îãðàíè÷èò ïîñëåäñòâèÿ èçìåíåíèé.
• Äåêîìïîçèöèÿ: åñëè óæå áûëà ïðîäåëàíà íåêîòîðàÿ ðàáîòà ïî àíàëèçó ìîäóëüíîé ñòðóêòóðû
ïðîáëåìíîé îáëàñòè, òî ýòî ìîæåò ÿâèòüñÿ õîðîøåé îòïðàâíîé òî÷êîé äëÿ ðàçáèåíèÿ ïðîãðàììû íà ìîäóëè.
Ìèíèìóì èíòåðôåéñîâ
Ïðàâèëî
ìèíèìóìà èíòåðôåéñîâ îãðàíè÷èâàåò îáùåå ÷èñëî èíôîðìàöèîííûõ êàíàëîâ, ñâÿçûâàþ-
ùèõ ìîäóëè ñèñòåìû:
Êàæäûé ìîäóëü äîëæåí ïîääåðæèâàòü ñâÿçü ñ âîçìîæíî ìåíüøèì ÷èñëîì äðóãèõ ìîäóëåé.
Ñâÿçü ìåæäó ìîäóëÿìè ìîæåò îñóùåñòâëÿòüñÿ ðàçëè÷íûìè ñïîñîáàìè. Ìîäóëè ìîãóò âûçûâàòü
äðóã äðóãà (åñëè îíè ÿâëÿþòñÿ ïðîöåäóðàìè), ñîâìåñòíî èñïîëüçîâàòü ñòðóêòóðû äàííûõ è òàê
äàëåå. Ïðàâèëî Ìèíèìóìà Èíòåðôåéñîâ îãðàíè÷èâàåò ÷èñëî òàêèõ ñâÿçåé.
 ñèñòåìå, ñîñòàâëåííîé èç n ìîäóëåé, ÷èñëî ìåæìîäóëüíûõ ñâÿçåé äîëæíî áûòü íàìíîãî áëèæå
ê ìèíèìàëüíîìó çíà÷åíèþ n − 1, êàê ïîêàçàíî íà ðèñóíêå (A), ÷åì ê ìàêñèìàëüíîìó n(n − 1)/2, êàê
ïîêàçàíî íà ðèñóíêå (B).
Ýòî ïðàâèëî ñëåäóåò, â ÷àñòíîñòè, èç êðèòåðèåâ íåïðåðûâíîñòè è çàùèùåííîñòè: åñëè ìåæäó ìîäóëÿìè èìååòñÿ ñëèøêîì ìíîãî âçàèìîñâÿçåé, òî âëèÿíèå èçìåíåíèÿ èëè îøèáêè ìîæåò ðàñïðîñòðàíèòüñÿ íà áîëüøîå ÷èñëî ìîäóëåé. Îíî òàêæå èìååò îòíîøåíèå ê êðèòåðèÿì êîìïîçèöèè (÷òîáû
Ðèñ. 3.7: Âèäû ñòðóêòóð ìåæìîäóëüíûõ ñâÿçåé
ìîäóëü ìîã èñïîëüçîâàòüñÿ â íîâîé ïðîãðàììíîé ñðåäå, îí íå äîëæåí çàâèñåòü îò ñëèøêîì áîëüøîãî ÷èñëà äðóãèõ ìîäóëåé), ïîíÿòíîñòè è äåêîìïîçèöèè.
Âàðèàíò (A) íà ïîñëåäíåì ðèñóíêå ïîêàçûâàåò, êàê äîáèòüñÿ ìèíèìàëüíîãî ÷èñëà ñâÿçåé, n − 1,
ñ ïîìîùüþ âåñüìà öåíòðàëèçîâàííîé ñòðóêòóðû: îäèí îñíîâíîé ìîäóëü, à âñå îñòàëüíûå îáùàþòñÿ
òîëüêî ñ íèì. Íî èìåþòñÿ íàìíîãî áîëåå äåìîêðàòè÷åñêèå ñòðóêòóðû, òàêèå êàê (C), ñîäåðæàùèå ïî÷òè òàêîå æå ÷èñëî ñâÿçåé.  ýòîé ñõåìå êàæäûé ìîäóëü íåïîñðåäñòâåííî îáùàåòñÿ ñ äâóìÿ
áëèæàéøèìè ñîñåäÿìè, öåíòðàëüíîé âëàñòè çäåñü íåò. Òàêîé ïîäõîä ê êîíñòðóèðîâàíèþ ïðîãðàììû êàæåòñÿ ñíà÷àëà íåìíîãî íåîæèäàííûì, ïîñêîëüêó îí íå ñîãëàñóåòñÿ ñ òðàäèöèîííîé ìîäåëüþ
íèñõîäÿùåãî ïðîåêòèðîâàíèÿ. Íî îí ìîæåò ïðèâîäèòü ê íàäåæíûì, ðàñøèðÿåìûì ðåøåíèÿì. Ýòî
èìåííî òàêîé âèä ñòðóêòóðû, ê ñîçäàíèþ êîòîðîé áóäåò ñòðåìèòüñÿ ÎÎ-ìåòîä ïðè åãî ðàçóìíîì
ïðèìåíåíèè.
Ðèñ. 3.8: Êàíàë ñâÿçè ìåæäó ìîäóëÿìè
Ñëàáàÿ ñâÿçíîñòü èíòåðôåéñîâ
Ïðàâèëî
ñëàáîé ñâÿçíîñòè èíòåðôåéñîâ îòíîñèòñÿ ê ðàçìåðó ïåðåäàâàåìîé èíôîðìàöèè, à íå ê
÷èñëó ñâÿçåé:
Åñëè äâà ìîäóëÿ îáùàþòñÿ ìåæäó ñîáîé, òî îíè äîëæíû îáìåíèâàòüñÿ êàê ìîæíî ìåíüøèì îáúåìîì èíôîðìàöèè.
Èíæåíåð-ýëåêòðèê ñêàçàë áû, ÷òî êàíàëû ñâÿçè ìåæäó ìîäóëÿìè äîëæíû èìåòü îãðàíè÷åííóþ
ïîëîñó ïðîïóñêàíèÿ:
Òðåáîâàíèå Ñëàáîé ñâÿçíîñòè èíòåðôåéñîâ ñëåäóåò, â ÷àñòíîñòè, èç êðèòåðèåâ íåïðåðûâíîñòè è
çàùèùåííîñòè.
ßâíûå èíòåðôåéñû
Âñÿêîå îáùåíèå äâóõ ìîäóëåé A è B ìåæäó ñîáîé äîëæíî áûòü î÷åâèäíûì è îòðàæàòüñÿ
â òåêñòå A è/èëè B.
Çà ýòèì ïðàâèëîì ñòîÿò êðèòåðèè:
Ðèñ. 3.9: Ñîâìåñòíîå èñïîëüçîâàíèå äàííûõ
• Äåêîìïîçèöèè è êîìïîçèöèè. Åñëè íóæíî ðàçëîæèòü ìîäóëü íà íåñêîëüêî ïîäìîäóëåé èëè
êîìïîíîâàòü åãî ñ äðóãèìè ìîäóëÿìè, òî ëþáàÿ âíåøíÿÿ ñâÿçü äîëæíà áûòü ÿñíî âèäíà.
• Íåïðåðûâíîñòè. Äîëæíî áûòü î÷åâèäíî, êàêèå ýëåìåíòû ìîãóò áûòü çàòðîíóòû âîçìîæíûì
èçìåíåíèåì.
• Ïîíÿòíîñòè. Êàê ìîæíî èñòîëêîâûâàòü äåéñòâèå ìîäóëÿ A, åñëè íà åãî ïîâåäåíèå ìîæåò êîñâåííûì îáðàçîì âëèÿòü ìîäóëü B?
Îäíîé èç ïðîáëåì, âîçíèêàþùèõ ïðè ïðèìåíåíèè ïðàâèëà
ÿâíûõ èíòåðôåéñîâ, ÿâëÿåòñÿ òî, ÷òî
ìåæìîäóëüíàÿ ñâÿçü ìîæåò îñóùåñòâëÿòüñÿ íå òîëüêî ÷åðåç âûçîâ ïðîöåäóðû; èñòî÷íèêîì êîñâåííîé
ñâÿçè ìîæåò áûòü, íàïðèìåð, ñîâìåñòíîå èñïîëüçîâàíèå äàííûõ (data sharing):
Ñêðûòèå èíôîðìàöèè
Ïðàâèëî
ñêðûòèÿ èíôîðìàöèè ìîæíî ñôîðìóëèðîâàòü ñëåäóþùèì îáðàçîì:
Ðàçðàáîò÷èê êàæäîãî ìîäóëÿ äîëæåí âûáðàòü íåêîòîðîå ïîäìíîæåñòâî ñâîéñòâ ìîäóëÿ â
êà÷åñòâå îôèöèàëüíîé èíôîðìàöèè î ìîäóëå, äîñòóïíîé àâòîðàì êëèåíòñêèõ ìîäóëåé.
Ïðèìåíåíèå ýòîãî ïðàâèëà îçíà÷àåò, ÷òî êàæäûé ìîäóëü èçâåñòåí âñåì îñòàëüíûì (òî åñòü ðàçðàáîò÷èêàì äðóãèõ ìîäóëåé) ÷åðåç íåêîòîðîå îôèöèàëüíîå îïèñàíèå, èëè òàê íàçûâàåìûå îáùåäîñòóïíûå (public) ñâîéñòâà.
 îñíîâå ïðàâèëà ñêðûòèÿ èíôîðìàöèè ëåæèò êðèòåðèé íåïðåðûâíîñòè. Ïðåäïîëîæèì, ÷òî â
íåêîòîðîì ìîäóëå ïðîèñõîäÿò èçìåíåíèÿ, êàñàþùèåñÿ ëèøü åãî ñêðûòûõ ýëåìåíòîâ è íå çàòðàãèâàþùèå îáùåäîñòóïíûõ ñâîéñòâ; òîãäà íà äðóãèå îáðàùàþùèåñÿ ê íåìó ìîäóëè, íàçûâàåìûå åãî
êëèåíòàìè, ýòè èçìåíåíèÿ íå ïîäåéñòâóþò. ×åì ìåíüøå îáùåäîñòóïíàÿ ÷àñòü, òåì áîëüøå øàíñîâ
íà òî, ÷òî èçìåíåíèÿ â ìîäóëå áóäóò ñîäåðæàòüñÿ â åãî ñêðûòîé ÷àñòè.
Ïðàâèëî ñêðûòèÿ èíôîðìàöèè ïðèäàåò îñîáîå çíà÷åíèå îòäåëåíèþ îïèñàíèÿ ôóíêöèè îò åå ðåàëèçàöèè, - ÷òî äåëàåò ôóíêöèÿ è êàê îíà ýòî äåëàåò - ðàçíûå âåùè. Ïîìèìî êðèòåðèÿ íåïðåðûâíîñòè,
ýòî ïðàâèëî ñâÿçàíî òàêæå ñ êðèòåðèÿìè äåêîìïîçèöèè, êîìïîçèöèè è ïîíÿòíîñòè. Íåëüçÿ íåçàâèñèìî ðàçðàáàòûâàòü ìîäóëè ñèñòåìû, êîìáèíèðîâàòü ñóùåñòâóþùèå ìîäóëè èëè ïîíèìàòü äåéñòâèå
îòäåëüíûõ ìîäóëåé, åñëè íåèçâåñòíî â òî÷íîñòè, ÷òî êàæäûé èç íèõ ìîæåò (èëè íå ìîæåò) îæèäàòü
îò äðóãèõ ìîäóëåé.
Êàêèå æå èç ñâîéñòâ ìîäóëÿ äîëæíû áûòü îáùåäîñòóïíûìè, à êàêèå - ñêðûòûìè? Êàê ïðàâèëî, â
îáùåäîñòóïíóþ ÷àñòü ñëåäóåò âêëþ÷àòü ôóíêöèîíàëüíîñòü, çàäàííóþ ñïåöèôèêàöèåé ìîäóëÿ, à âñå,
÷òî ñâÿçàíî ñ ðåàëèçàöèåé ýòèõ ôóíêöèîíàëüíûõ âîçìîæíîñòåé, äîëæíî áûòü ñêðûòî, ïðåäîõðàíÿÿ
äðóãèå ìîäóëè îò ïîñëåäóþùèõ èçìåíåíèé ðåàëèçàöèè ïðîãðàììû.
Îäíàêî ýòà ðåêîìåíäàöèÿ ÿâëÿåòñÿ íå÷åòêîé, òàê êàê íå äàíî îïðåäåëåíèå ñïåöèôèêàöèè (specication)
è ðåàëèçàöèè (implementation). Äåéñòâèòåëüíî, ìîæíî ïîääàòüñÿ èñêóøåíèþ, èçìåíèâ îïðåäåëåíèå
Ðèñ. 3.10: Ìîäóëü â óñëîâèÿõ ñêðûòèÿ èíôîðìàöèè
íà ïðÿìî ïðîòèâîïîëîæíîå, è óòâåðæäàòü, ÷òî ñïåöèôèêàöèÿ ñîñòîèò èç îáùåäîñòóïíûõ ñâîéñòâ
ìîäóëÿ, à ðåàëèçàöèÿ - èç åãî ñêðûòûõ ñâîéñòâ! ÎÎ-ïîäõîä îáåñïå÷èò íàìíîãî áîëåå òî÷íûå ðåêîìåíäàöèè íà îñíîâå òåîðèè àáñòðàêòíûõ òèïîâ äàííûõ.
3.3 Ïÿòü ïðèíöèïîâ
Èç ïðåäûäóùèõ ïðàâèë è, êîñâåííûì îáðàçîì, èç êðèòåðèåâ ñëåäóþò ïÿòü ïðèíöèïîâ êîíñòðóèðîâàíèÿ ÏÎ:
• Ëèíãâèñòè÷åñêèõ ìîäóëüíûõ åäèíèö (Linguistic Modular Units).
• Ñàìîäîêóìåíòèðîâàíèÿ (Self-Documentation).
• Óíèôèöèðîâàííîãî äîñòóïà (Uniform Access).
• Îòêðûò-çàêðûò (Open-Closed).
• Åäèíñòâåííîãî âûáîðà (Single Choice).
Ëèíãâèñòè÷åñêèå ìîäóëüíûå åäèíèöû
ëèíãâèñòè÷åñêèõ ìîäóëüíûõ åäèíèö óòâåðæäàåò, ÷òî ôîðìàëèçì îïèñàíèÿ ÏÎ íà ðàçëè÷-
Ïðèíöèï
íûõ óðîâíÿõ (ñïåöèôèêàöèè, ïðîåêòèðîâàíèÿ, ðåàëèçàöèè) äîëæåí ïîääåðæèâàòü ìîäóëüíîñòü:
Ìîäóëè äîëæíû ñîîòâåòñòâîâàòü ñèíòàêñè÷åñêèì åäèíèöàì èñïîëüçóåìîãî ÿçûêà.
Óïîìÿíóòûì âûøå ÿçûêîì ìîæåò áûòü ÿçûê ïðîãðàììèðîâàíèÿ, ÿçûê ïðîåêòèðîâàíèÿ, ÿçûê
îôîðìëåíèÿ òåõíè÷åñêèõ òðåáîâàíèé è ò. ä.  ñëó÷àå ÿçûêà ïðîãðàììèðîâàíèÿ ìîäóëè äîëæíû
íåçàâèñèìî êîìïèëèðîâàòüñÿ.
Ñàìîäîêóìåíòèðîâàíèå
Ïîäîáíî ïðàâèëó ñêðûòèÿ èíôîðìàöèè, ïðèíöèï
ñàìîäîêóìåíòèðîâàíèÿ îïðåäåëÿåò, êàê ñëåäóåò
äîêóìåíòèðîâàòü ìîäóëè:
Ðàçðàáîò÷èê ìîäóëÿ äîëæåí ñòðåìèòüñÿ ê òîìó, ÷òîáû âñÿ èíôîðìàöèÿ î ìîäóëå ñîäåðæàëàñü â ñàìîì ìîäóëå.
Îáû÷íî ðåàëèçàöèè ýòîãî ïðèíöèïà ìåøàåò îáùåïðèíÿòîå ïîëîæåíèå, ñîãëàñíî êîòîðîìó èíôîðìàöèþ î ìîäóëå ïîìåùàþò â îòäåëüíûå ïðîåêòíûå äîêóìåíòû.
Óíèôèöèðîâàííûé äîñòóï
 îáùåì âèäå ïðèíöèï ìîæíî ñôîðìóëèðîâàòü òàê:
Âñå ñëóæáû, ïðåäîñòàâëÿåìûå ìîäóëåì, äîëæíû áûòü äîñòóïíû â óíèôèöèðîâàííîé íîòàöèè, êîòîðàÿ íå ïîäâåäåò âíå çàâèñèìîñòè îò ðåàëèçàöèè, èñïîëüçóþùåé ïàìÿòü èëè
âû÷èñëåíèÿ.
Õîòÿ âíà÷àëå ìîæåò ïîêàçàòüñÿ, ÷òî ïðèíöèï
óíèôèöèðîâàííîãî äîñòóïà íàïðàâëåí ëèøü íà ðå-
øåíèå ïðîáëåì, ñâÿçàííûõ ñ ïðèíÿòîé íîòàöèåé, â äåéñòâèòåëüíîñòè îí çàäàåò ïðàâèëî ïðîåêòèðîâàíèÿ, âëèÿþùåå íà ìíîãèå àñïåêòû ÎÎ-ðàçðàáîòêè ÏÎ. Ïðèíöèï ñëåäóåò èç êðèòåðèÿ íåïðåðûâíîñòè;
åãî ìîæíî ðàññìàòðèâàòü è êàê ÷àñòíûé ñëó÷àé ïðàâèëà ñêðûòèÿ èíôîðìàöèè.
Îòêðûò-Çàêðûò
Ëþáîé ìåòîä ìîäóëüíîé äåêîìïîçèöèè äîëæåí óäîâëåòâîðÿòü ïðèíöèïó ñåìàôîðà
îòêðûò-çàêðûò :
Ìîäóëè äîëæíû èìåòü âîçìîæíîñòü áûòü êàê îòêðûòûìè, òàê è çàêðûòûìè.
Ïðîòèâîðå÷èå ÿâëÿåòñÿ ëèøü êàæóùèìñÿ, ïîñêîëüêó òåðìèíû ñîîòâåòñòâóþò ðàçíûì öåëåâûì
óñòàíîâêàì:
• Ìîäóëü íàçûâàþò îòêðûòûì, åñëè îí åùå äîñòóïåí äëÿ ðàñøèðåíèÿ. Íàïðèìåð, èìååòñÿ âîçìîæíîñòü ðàñøèðèòü ìíîæåñòâî îïåðàöèé â íåì èëè äîáàâèòü ïîëÿ ê åãî ñòðóêòóðàì äàííûõ.
• Ìîäóëü íàçûâàþò çàêðûòûì, åñëè îí äîñòóïåí äëÿ èñïîëüçîâàíèÿ äðóãèìè ìîäóëÿìè. Ýòî
îçíà÷àåò, ÷òî ìîäóëü (åãî èíòåðôåéñ - ñ òî÷êè çðåíèÿ ñêðûòèÿ èíôîðìàöèè) óæå èìååò ñòðîãî îïðåäåëåííîå îêîí÷àòåëüíîå îïèñàíèå. Íà óðîâíå ðåàëèçàöèè çàêðûòîå ñîñòîÿíèå ìîäóëÿ
îçíà÷àåò, ÷òî ìîäóëü ìîæíî êîìïèëèðîâàòü, ñîõðàíÿòü â áèáëèîòåêå è äåëàòü åãî äîñòóïíûì
äëÿ èñïîëüçîâàíèÿ äðóãèìè ìîäóëÿìè (åãî êëèåíòàìè). Íà ýòàïå ïðîåêòèðîâàíèÿ èëè ñïåöèôèêàöèè çàêðûòèå ìîäóëÿ îçíà÷àåò, ÷òî îí îäîáðåí ðóêîâîäñòâîì, âíåñåí â îôèöèàëüíûé
ðåïîçèòîðèé óòâåðæäåííûõ ïðîãðàììíûõ ýëåìåíòîâ ïðîåêòà - áàçó ïðîåêòà (project baseline),
è åãî èíòåðôåéñ îïóáëèêîâàí â èíòåðåñàõ àâòîðîâ äðóãèõ ìîäóëåé.
Åäèíñòâåííûé âûáîð
Ïîñëåäíèé èç ïÿòè ïðèíöèïîâ ìîäóëüíîñòè ìîæíî ñ÷èòàòü ñëåäñòâèåì êàê ïðèíöèïà îòêðûò-çàêðûò,
òàê è ïðàâèëà ñêðûòèÿ èíôîðìàöèè.
 ëþáîì òàêîì ñëó÷àå íåîáõîäèìî äîïóñêàòü âîçìîæíîñòü òîãî, ÷òî ñïèñîê âàðèàíòîâ, çàäàííûõ
è èçâåñòíûõ íà íåêîòîðîì ýòàïå ðàçðàáîòêè ïðîãðàììû, ìîæåò â ïîñëåäóþùåì áûòü èçìåíåí ïóòåì äîáàâëåíèÿ èëè óäàëåíèÿ âàðèàíòîâ. ×òîáû îáåñïå÷èòü ðåàëèçàöèþ òàêîãî ïîäõîäà ê ïðîöåññó
ðàçðàáîòêè ïðîãðàììíîãî îáåñïå÷åíèÿ, íóæíî íàéòè ñïîñîá çàùèòèòü ñòðóêòóðó ïðîãðàììû îò âîçäåéñòâèÿ ïîäîáíûõ èçìåíåíèé. Îòñþäà ñëåäóåò
ïðèíöèï åäèíñòâåííîãî âûáîðà :
Âñÿêèé ðàç, êîãäà ñèñòåìà ïðîãðàììíîãî îáåñïå÷åíèÿ äîëæíà ïîääåðæèâàòü ìíîæåñòâî
àëüòåðíàòèâ, èõ ïîëíûé ñïèñîê äîëæåí áûòü èçâåñòåí òîëüêî îäíîìó ìîäóëþ ñèñòåìû.
Òðåáîâàíèå òîãî, ÷òîáû ñïèñîê âûáîðà áûë èçâåñòåí ëèøü îäíîìó ìîäóëþ, îáåñïå÷èâàåò ïîäãîòîâêó ê ïîñëåäóþùèì èçìåíåíèÿì: ïðè äîáàâëåíèè âàðèàíòîâ ïîíàäîáèòñÿ ïðîèçâåñòè îáíîâëåíèå
òîëüêî òîãî ìîäóëÿ, â êîòîðîì ñîäåðæèòñÿ ýòà èíôîðìàöèÿ - òàêîâà ñóùíîñòü åäèíñòâåííîãî âûáîðà.
À âñå îñòàëüíûå ìîäóëè, â ÷àñòíîñòè - åãî êëèåíòû, ñìîãóò ïðîäîëæàòü ñâîþ ðàáîòó êàê îáû÷íî.
3.4 Êëþ÷åâûå êîíöåïöèè
• Âûáîð íàäëåæàùåé ñòðóêòóðû ìîäóëÿ ÿâëÿåòñÿ êëþ÷îì ê äîñòèæåíèþ öåëåé åãî âîçìîæíîãî
ïîâòîðíîãî èñïîëüçîâàíèÿ è ðàñøèðÿåìîñòè.
• Ìîäóëè ñëóæàò êàê äëÿ äåêîìïîçèöèè ïðîãðàììíîãî îáåñïå÷åíèÿ (ïðîåêòèðîâàíèå ñâåðõó âíèç),
òàê è äëÿ åãî êîìïîçèöèè (ñíèçó-ââåðõ).
• Ïðèíöèïû ìîäóëüíîñòè ïðèìåíèìû êàê ê ñïåöèôèêàöèè è ïðîåêòèðîâàíèþ, òàê è ê ðåàëèçàöèè
ÏÎ.
• Âñåîáúåìëþùåå îïðåäåëåíèå ìîäóëüíîñòè äîëæíî îáúåäèíÿòü ðàçëè÷íûå òî÷êè çðåíèÿ; ðàçíûå
òðåáîâàíèÿ èíîãäà îêàçûâàþòñÿ âçàèìíî ïðîòèâîðå÷èâûìè, íàïðèìåð äåêîìïîçèöèÿ (ñòèìóëèðóþùàÿ ìåòîäû ïðîåêòèðîâàíèÿ ñâåðõó-âíèç) è êîìïîçèöèÿ (ñïîñîáñòâóþùàÿ èñïîëüçîâàíèþ
ìåòîäà ñíèçó-ââåðõ).
• Óïðàâëåíèå êîëè÷åñòâîì è ôîðìîé ñâÿçåé ìåæäó ìîäóëÿìè ÿâëÿåòñÿ îñíîâîé ðàçðàáîòêè õîðîøåé ìîäóëüíîé àðõèòåêòóðû.
• Äëÿ äîëãîñðî÷íîé öåëîñòíîñòè ñòðóêòóð ìîäóëüíîé ñèñòåìû òðåáóåòñÿ ñêðûòèå èíôîðìàöèè,
÷òî ïðèâîäèò ê íåîáõîäèìîñòè ñòðîãîãî ðàçäåëåíèÿ èíòåðôåéñà è ðåàëèçàöèè.
• Óíèôèöèðîâàííûé äîñòóï îñâîáîæäàåò êëèåíòîâ îò çíàíèÿ âûáîðà âíóòðåííèõ ïðåäñòàâëåíèé,
ðåàëèçîâàííûõ â ìîäóëÿõ-ïîñòàâùèêàõ.
• Çàêðûòûì ÿâëÿåòñÿ òàêîé ìîäóëü, êîòîðûé ìîæåò èñïîëüçîâàòüñÿ, áëàãîäàðÿ çíàíèþ åãî èíòåðôåéñà, ìîäóëÿìè-êëèåíòàìè.
• Îòêðûòûì ÿâëÿåòñÿ òàêîé ìîäóëü, êîòîðûé åùå ìîæíî ðàñøèðÿòü.
• Äëÿ ýôôåêòèâíîãî ðóêîâîäñòâà ïðîåêòîì ñëåäóåò ïîääåðæèâàòü ìîäóëè, ÿâëÿþùèåñÿ îäíîâðåìåííî êàê îòêðûòûìè, òàê è çàêðûòûìè. Íî òðàäèöèîííûå ïîäõîäû ê ðàçðàáîòêå è ïðîãðàììèðîâàíèþ íå äàþò òàêîé âîçìîæíîñòè.
• Ïðèíöèï Åäèíñòâåííîãî Âûáîðà ïðåäïèñûâàåò îãðàíè÷èâàòü ðàñïðîñòðàíåíèå ïîëíîé èíôîðìàöèè îáî âñåõ âàðèàíòàõ íåêîòîðîãî ïîíÿòèÿ.
Êîíòðîëüíûå âîïðîñû
Begin Quiz
1. Âåðíî ëè, ÷òî ðàçëè÷èÿ ìåæäó ïðàâèëàìè, êðèòåðèÿìè è ïðèíöèïàìè ìîäóëüíîñòè ñîñòîÿò â
òîì, ÷òî
ïðàâèëà ìîäóëüíîñòè ñëåäóåò âûïîëíÿòü ïðè ðàçðàáîòêå ÏÎ
ìåõàíèçìû ÎÎ ñëåäóåò ïðîåêòèðîâàòü â ñîîòâåòñòâèè ñ ïðèíöèïàìè
ðàçðàáàòûâàåìàÿ ñèñòåìà äîëæíà óäîâëåòâîðÿòü êðèòåðèÿì ìîäóëüíîñòè
ìåæäó ïðàâèëàìè, êðèòåðèÿìè è ïðèíöèïàìè íåò ðàçëè÷èé ýòî ñèíîíèìè÷íûå ïîíÿòèÿ
2. Âåðíî ëè, ÷òî ðàçëè÷èÿ ìåæäó ïðàâèëàìè, êðèòåðèÿìè è ïðèíöèïàìè ìîäóëüíîñòè ñîñòîÿò â
òîì, ÷òî
êðèòåðèè ÿâëÿþòñÿ âçàèìíî íåçàâèñèìûìè
ïðàâèëà ñëåäóþò èç êðèòåðèåâ
ïðèíöèïû ñëåäóþò èç ïðàâèë
êðèòåðèè ñëåäóþò èç ïðèíöèïîâ
3. Ê ïðèíöèïàì ìîäóëüíîñòè îòíîñÿòñÿ
äåêîìïîçèöèÿ
ñëàáàÿ ñâÿçíîñòü
åäèíñòâåííûé âûáîð
ïðèíöèï ëèíãâèñòè÷åñêèõ åäèíèö
4. Ê êðèòåðèÿì ìîäóëüíîñòè îòíîñÿòñÿ
ñëàáàÿ ñâÿçíîñòü èíòåðôåéñîâ
óíèôèöèðîâàííûé äîñòóï
íåïðåðûâíîñòü
åäèíñòâåííûé âûáîð
5. Ê ïðàâèëàì äëÿ îáåñïå÷åíèÿ ìîäóëüíîñòè îòíîñÿòñÿ
ñêðûòèå èíôîðìàöèè
íåïðåðûâíîñòü
ÿâíûå èíòåðôåéñû
êîìïîçèöèÿ
6. Ïðèíöèï Îòêðûò-Çàêðûò ïðåäïîëàãàåò, ÷òî
ìîäóëü ÿâëÿåòñÿ ëèáî îòêðûòûì, ëèáî çàêðûòûì
ìîäóëü âñåãäà äîëæåí áûòü îòêðûòûì äëÿ èçìåíåíèé
óæå ðàáîòàþùèé ìîäóëü âñåãäà äîëæåí áûòü çàêðûòûì
ÎÎ-ìåõàíèçìû (íàñëåäîâàíèå) ïîçâîëÿåò ïîñòðîèòü ñèñòåìó, óäîâëåòâîðÿþùåìó ýòîìó ïðèíöèïó
7. Ïðàâèëî ïðÿìîãî îòîáðàæåíèÿ òðåáóåò, ÷òîáû
ìîäóëüíàÿ ñòðóêòóðà ÏÎ íåïîñðåäñòâåííî îòîáðàæàëà ñòðóêòóðó ìîäåëè ïðåäìåòíîé îáëàñòè
ìîäóëüíàÿ ñòðóêòóðà ÏÎ íåïîñðåäñòâåííî îòîáðàæàëà ñòðóêòóðó ïðåäìåòíîé îáëàñòè
ìîäóëüíàÿ ñòðóêòóðà ÏÎ íåïîñðåäñòâåííî îòîáðàæàëà ñòðóêòóðó ñïåöèôèêàöèé
8. Ñèñòåìà, óäîâëåòâîðÿþùàÿ êðèòåðèþ äåêîìïîçèöèè
ìîæåò áûòü ðàçáèòà íà îòíîñèòåëüíî íåçàâèñèìûå ïîäñèñòåìû, äîïóñêàþùèå ñàìîñòîÿòåëüíóþ ðàçðàáîòêó
ìîæåò áûòü ðàçáèòà íà ïîëíîñòüþ íåçàâèñèìûå ïîäñèñòåìû, äîïóñêàþùèå ñàìîñòîÿòåëüíóþ
ðàçðàáîòêó
ìîæåò áûòü ðàçðàáîòàíà ñïîñîáîì ïðîåêòèðîâàíèÿ "ñâåðõó-âíèç"
äîïóñêàåò ìíîãîêðàòíîå ïðèìåíåíèå ïðèåìà äåêîìïîçèöèè
9. Êðèòåðèé íåïðåðûâíîñòè òðåáóåò, ÷òîáû
ðàçðàáîòêà êëàññîâ ñèñòåìû âåëàñü íåïðåðûâíî
ìîäóëè ñèñòåìû ìîæíî áûëî íåïðåðûâíî îòêðûâàòü è çàêðûâàòü
ìàëûì èçìåíåíèÿì ñïåöèôèêàöèè ñèñòåìû ñîîòâåòñòâîâàëî ìàëîå èçìåíåíèå åå ðåàëèçàöèè
åñëè îáúåì òåêñòà èçìåíåíèé â ñïåöèôèêàöèè èìååò ðàçìåð â N ñëîâ, òî îáúåì êîäà âíåñåííûõ
èçìåíåíèé, âûðàæåííûé â áàéòàõ, äîëæåí èìåòü ïîðÿäîê O(N )
10. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ?
ìèíèìàëüíîå ÷èñëî ñâÿçåé ñèñòåìû, ñîñòîÿùåé èç n ìîäóëåé ðàâíî n
íàëè÷èå îáùåãî áëîêà äàííûõ ýòî ñâèäåòåëüñòâî âûïîëíåíèÿ ïðàâèëà ñëàáîé ñâÿçíîñòè
èíòåðôåéñîâ
ïðàâèëî ñêðûòèÿ èíòåðôåéñîâ óòâåðæäàåò, ÷òî îïèñàíèå ìîäóëÿ äîëæíî ñîäåðæàòü ëèøü
îïèñàíèå íåêîòîðûõ ñâîéñòâ è ìåòîäîâ ìîäóëÿ
ðàçðàáîò÷èê ìîäóëÿ äîëæåí ñòðåìèòüñÿ ê òîìó, ÷òîáû âñÿ èíôîðìàöèÿ î ìîäóëå ñîäåðæàëàñü
â ñàìîì ìîäóëå
11. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ?
âñÿêîå îáùåíèå äâóõ ìîäóëåé A è B ìåæäó ñîáîé äîëæíî áûòü î÷åâèäíûì è îòðàæàòüñÿ â
òåêñòå A è/èëè B
èñòî÷íèêîì ìåæìîäóëüíîé ñâÿçè ìîæåò áûòü ñîâìåñòíîå èñïîëüçîâàíèå äàííûõ
íà ýòàïàõ ïðîåêòèðîâàíèÿ è ðàçðàáîòêè äîëæíû èñïîëüçîâàòüñÿ ðàçëè÷íûå ÿçûêè
ïðîãðàììíîå îáåñïå÷åíèå è äîêóìåíòàöèÿ ê íåìó äîëæíû ðàçðàáàòûâàòüñÿ íåçàâèñèìî
ïðèíöèï Îòêðûò-Çàêðûò ïðîòèâîðå÷èâ è óäîâëåòâîðèòü åìó ðåàëüíî íåâîçìîæíî
12. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ?
âûáîð íàäëåæàùåé ñòðóêòóðû ìîäóëÿ ÿâëÿåòñÿ êëþ÷îì ê äîñòèæåíèþ öåëåé åãî âîçìîæíîãî
ïîâòîðíîãî èñïîëüçîâàíèÿ è ðàñøèðÿåìîñòè
ïðèíöèïû ìîäóëüíîñòè ïðèìåíèìû íà ýòàïàõ ñïåöèôèêàöèè è ïðîåêòèðîâàíèÿ, íî íå ïðèìåíèìû ê ðåàëèçàöèè ÏÎ
ñêðûòèå èíôîðìàöèè ïðèâîäèò ê íåîáõîäèìîñòè ñòðîãîãî ðàçäåëåíèÿ èíòåðôåéñà è ðåàëèçàöèè
äëÿ ýôôåêòèâíîãî ðóêîâîäñòâà ïðîåêòîì ñëåäóåò ïîääåðæèâàòü ìîäóëè, ÿâëÿþùèåñÿ îäíîâðåìåííî êàê îòêðûòûìè, òàê è çàêðûòûìè
End Quiz
Íàáðàíî áàëëîâ
4 Ïîäõîäû ê ïîâòîðíîìó èñïîëüçîâàíèþ
 ýòîé ëåêöèè áóäóò ðàññìîòðåíû íåêîòîðûå èç ïðîáëåì, íàïðàâëåííûõ íà øèðîêîìàñøòàáíîå âíåäðåíèå ïîâòîðíîãî èñïîëüçîâàíèÿ ïðîãðàììíûõ êîìïîíåíòîâ.
4.1 Öåëè ïîâòîðíîãî èñïîëüçîâàíèÿ
Ïðåæäå âñåãî, ñëåäóåò ïîíÿòü, ïî÷åìó òàê âàæíî óëó÷øàòü âîçìîæíîñòè ïîâòîðíîãî èñïîëüçîâàíèÿ
ÏÎ.
Îæèäàåìûå ïðåèìóùåñòâà
Ïîâòîðíîå èñïîëüçîâàíèå ìîæåò îáåñïå÷èòü ïðîãðåññ íà ñëåäóþùèõ íàïðàâëåíèÿõ:
• Ñâîåâðåìåííîñòü (timeliness) (â òîì ñìûñëå, êîòîðûé îïðåäåëåí ïðè îáñóæäåíèè ïîêàçàòåëåé
êà÷åñòâà: áûñòðîòà äîâåäåíèÿ ïðîåêòîâ äî çàâåðøåíèÿ è ïðîäóêöèè äî ðûíêà). Ïðè èñïîëüçîâàíèè óæå ñóùåñòâóþùèõ êîìïîíåíòîâ íóæíî ìåíüøå ðàçðàáàòûâàòü, à, ñëåäîâàòåëüíî, ÏÎ
ñîçäàåòñÿ áûñòðåå.
• Ñîêðàùåíèå îáúåìà ðàáîò ïî ñîïðîâîæäåíèþ ÏÎ (decreased maintenance eort). Åñëè êòî-òî
ðàçðàáîòàë ÏÎ, òî îí æå îòâå÷àåò è çà åãî ïîñëåäóþùåå ðàçâèòèå. Èçâåñòåí ïàðàäîêñ êîìïå-
òåíòíîãî ðàçðàáîò÷èêà ÏÎ: ÷åì áîëüøå âû ðàáîòàåòå, òåì áîëüøå ðàáîòû âû ñåáå ñîçäàåòå.
Äîâîëüíûå ïîëüçîâàòåëè âàøåé ïðîäóêöèè íà÷íóò ïðîñèòü äîáàâëåíèÿ íîâûõ ôóíêöèîíàëüíûõ âîçìîæíîñòåé, ïåðåíîñà íà íîâûå ïëàòôîðìû. Åñëè íå íàäåÿòüñÿíà äÿäþ, òî åäèíñòâåííîå ðåøåíèå ïàðàäîêñà - ñòàòü íåêîìïåòåíòíûì ðàçðàáîò÷èêîì, - ÷òîáû íèêòî áîëüøå íå áûë
çàèíòåðåñîâàí â âàøåé ïðîäóêöèè. Â ýòîé êíèãå ïîäîáíîå ðåøåíèå íå ïîîùðÿåòñÿ.
• Íàäåæíîñòü. Ïîëó÷àÿ êîìïîíåíòû îò ïîñòàâùèêà ñ õîðîøåé ðåïóòàöèåé, âû èìååòå îïðåäåëåííóþ ãàðàíòèþ, ÷òî ðàçðàáîò÷èêè ïðåäïðèíÿëè âñå íóæíûå ìåðû, âêëþ÷àÿ âñåñòîðîííåå
òåñòèðîâàíèå è äðóãèå ìåòîäû êîíòðîëÿ êà÷åñòâà.  áîëüøèíñòâå ñëó÷àåâ ìîæíî îæèäàòü, ÷òî
êòî-òî óæå èñïûòàë ýòè êîìïîíåíòû äî âàñ è îáíàðóæèë âñå âîçìîæíî îñòàâàâøèåñÿ îøèáêè. Çàìåòüòå, âîâñå íå ïðåäïîëàãàåòñÿ, ÷òî ðàçðàáîò÷èêè êîìïîíåíòîâ óìíåå âàñ. Äëÿ íèõ
ñîçäàâàåìûå êîìïîíåíòû - áóäü òî ãðàôè÷åñêèå ìîäóëè, èíòåðôåéñû áàç äàííûõ, àëãîðèòìû
ñîðòèðîâêè - ýòî ñëóæåáíàÿ îáÿçàííîñòü, öåëü ðàáîòû. Äëÿ âàñ ýòî ëèøü âòîðîñòåïåííàÿ, ðóòèííàÿ ðàáîòà, ïîñêîëüêó âàøåé öåëüþ ÿâëÿåòñÿ ñîçäàíèå íåêîòîðîé ïðèêëàäíîé ñèñòåìû â
âàøåé ñîáñòâåííîé îáëàñòè äåÿòåëüíîñòè.
• Ýôôåêòèâíîñòü. Ôàêòîðû, ñïîñîáñòâóþùèå âîçìîæíîñòè ïîâòîðíîãî èñïîëüçîâàíèÿ ÏÎ, ïîáóæäàþò ðàçðàáîò÷èêîâ êîìïîíåíòîâ ïîëüçîâàòüñÿ íàèëó÷øèìè àëãîðèòìàìè è ñòðóêòóðàìè
äàííûõ, èçâåñòíûìè â èõ êîíêðåòíîé ñôåðå äåÿòåëüíîñòè. Îäíàêî â êîìàíäå, ðàçðàáàòûâàþùåé áîëüøîé ïðèêëàäíîé ïðîåêò, òðóäíî îæèäàòü íàëè÷èÿ ñïåöèàëèñòîâ ïî êàæäîé ïðîáëåìå,
çàòðàãèâàåìîé â ýòîì ïðîåêòå. Ïðè ðàçðàáîòêå áîëüøîãî ïðîåêòà íåâîçìîæíî îïòèìèçèðîâàòü
âñå åãî äåòàëè. Ñëåäóåò ñòðåìèòüñÿ ê äîñòèæåíèþ íàèëó÷øèõ ðåøåíèé â ñâîåé îáëàñòè çíàíèé,
à â îñòàëüíîì èñïîëüçîâàòü ïðîôåññèîíàëüíûå ðàçðàáîòêè.
• Ñîâìåñòèìîñòü. Åñëè èñïîëüçîâàòü õîðîøóþ ñîâðåìåííóþ ÎÎ-áèáëèîòåêó, òî åå ñòèëü ïîâëèÿåò, çà ñ÷åò åñòåñòâåííîãîïðîöåññà äèôôóçèè, íà ñòèëü ðàçðàáîòêè âñåãî ÏÎ. Ýòî ñóùåñòâåííî
ïîìîãàåò ïîâûñèòü êà÷åñòâî ïðîãðàììíîãî ïðîäóêòà.
• Èíâåñòèðîâàíèå. Ñîçäàíèå ïîâòîðíî èñïîëüçóåìîãî ÏÎ ïîçâîëÿåò ñáåðå÷ü ïëîäû çíàíèé è
îòêðûòèé ëó÷øèõ ðàçðàáîò÷èêîâ, ïðåâðàùàÿ âðåìåííûå ðåñóðñû â ïîñòîÿííûå.
Ïîòðåáèòåëè è ïðîèçâîäèòåëè ïîâòîðíî èñïîëüçóåìûõ ïðîãðàìì
 ïðèâåäåííîì âûøå ñïèñêå ïðåèìóùåñòâ ìîæíî âûäåëèòü äâå ñèòóàöèè - èñïîëüçîâàíèå ïðîôåññèîíàëüíûõ èëè ñîáñòâåííûõ êîìïîíåíòîâ. Ïåðâûå ÷åòûðå ýëåìåíòà ñïèñêà îïèñûâàþò ñèòóàöèþ
èñïîëüçîâàíèÿ ñóùåñòâóþùèõ, ïðîôåññèîíàëüíî ðàçðàáîòàííûõ êîìïîíåíòîâ. Ïîñëåäíèé ýëåìåíò
ñïèñêà õàðàêòåðèçóåò ïîâòîðíîå èñïîëüçîâàíèå ñîáñòâåííîãî ïðîãðàììíîãî ïðîäóêòà. Ýëåìåíò ñïèñêà - ñîâìåñòèìîñòü - îòíîñèòñÿ ê îáîèì ñëó÷àÿì.
Òàêîå ðàçãðàíè÷åíèå äîñòîèíñòâ îòðàæàåò äâà àñïåêòà ïîâòîðíîãî èñïîëüçîâàíèÿ: òî÷êó çðåíèÿ
ïîòðåáèòåëÿ, ïîëüçóþùåãîñÿ ïðîäóêöèåé ðàçðàáîò÷èêîâ êîìïîíåíò, è òî÷êó çðåíèÿ ïðîèçâîäèòåëÿ,
îáåñïå÷èâàþùåãî âîçìîæíîñòü ïîâòîðíîãî èñïîëüçîâàíèÿ ñâîèõ ðàçðàáîòîê.
Äëÿ ðàçðàáîò÷èêîâ ÏÎ, åùå íå èìåþùèõ áîëüøîãî îïûòà, ñëåäóåò áûòü ïîòðåáèòåëÿìè êîìïîíåíòîâ. Ïðèíöèïèàëüíî íåâîçìîæíî ñðàçó ïðèñòóïàòü ê ïðîèçâîäñòâó ïîâòîðíî èñïîëüçóåìûõ ïðîãðàìì. Åäèíñòâåííî âîçìîæíûé ïóòü ñòàòü ïðîèçâîäèòåëåì - ñîñòîèò â èçó÷åíèè è êîïèðîâàíèè óæå
ñóùåñòâóþùèõ õîðîøèõ îáðàçöîâ. Òàêîé ïîäõîä ñðàçó ïðèíåñåò ñâîè ïîëåçíûå ïëîäû, ïîñêîëüêó â
ñâîèõ ðàçðàáîòêàõ âû âîñïîëüçóåòåñü äîñòîèíñòâàìè ýòèõ êîìïîíåíòîâ.
4.2 ×òî ñëåäóåò ïîâòîðíî èñïîëüçîâàòü?
Ïåðâûé âîçíèêàþùèé âîïðîñ - íà êàêîì óðîâíå ñëåäóåò îñóùåñòâëÿòü ïîâòîðíîå èñïîëüçîâàíèå:
ïåðñîíàëà, ñïåöèôèêàöèé, ïðîåêòîâ, èõ îáðàçöîâ, èñõîäíîãî êîäà, êîìïîíåíòîâ èëè àáñòðàêòíûõ
ìîäóëåé.
Ïîâòîðíîå èñïîëüçîâàíèå ïåðñîíàëà
Íàèáîëåå ïðîñòî ïîâòîðíî èñïîëüçîâàòü ðàçðàáîò÷èêîâ, ÷òî øèðîêî ïðàêòèêóåòñÿ â ïðîìûøëåííîñòè. Ïåðåâîäÿ ðàçðàáîò÷èêîâ ÏÎ ñ îäíîãî ïðîåêòà íà äðóãîé, ôèðìû èçáåãàþò ïîòåðè íàêîïëåííîãî
èìè ðàíåå îïûòà è îáåñïå÷èâàþò åãî äîñòîéíîå ïðèìåíåíèå â íîâûõ ðàçðàáîòêàõ.
Ââèäó âûñîêîé òåêó÷åñòè ïðîãðàììèñòñêèõ êàäðîâ âîçìîæíîñòè òàêîãî ïîäõîäà îãðàíè÷åíû.
Ïîâòîðíîå èñïîëüçîâàíèå ïðîåêòîâ è ñïåöèôèêàöèé
Ýòîò ïîäõîä ÿâëÿåòñÿ, ïî ñóùåñòâó, áîëåå îðãàíèçîâàííîé âåðñèåé ïðåäûäóùåãî - ïîâòîðíîãî èñïîëüçîâàíèÿ çíàíèé, óìåíèé è îïûòà. Êàê ïîêàçàëî îáñóæäåíèå âîïðîñà î äîêóìåíòàöèè, ñàìî ïðåäñòàâëåíèå ïðîåêòà êàê íåçàâèñèìîãî ïðîãðàììíîãî ïðîäóêòà, èìåþùåãî ñîáñòâåííûé æèçíåííûé öèêë,
íåçàâèñèìûé îò ñîîòâåòñòâóþùåé ðåàëèçàöèè, êàæåòñÿ ñîìíèòåëüíûì, ïîñêîëüêó òðóäíî ãàðàíòèðîâàòü, ÷òî ïðîåêò è åãî ðåàëèçàöèÿ áóäóò îñòàâàòüñÿ ñîâìåñòèìûìè â ïðîöåññå èçìåíåíèÿ ñèñòåìû
ÏÎ.
Òàêèì îáðàçîì, åñëè ïîâòîðíî èñïîëüçîâàòü òîëüêî ïðîåêò, òî âîçíèêàåò ðèñê ïîâòîðíîãî èñïîëüçîâàíèÿ íåïðàâèëüíî ðàáîòàþùèõ èëè óæå âûøåäøèõ èç óïîòðåáëåíèÿ ýëåìåíòîâ.
Ýòè çàìå÷àíèÿ ìîæíî îòíåñòè è ê äðóãîìó ñìåæíîìó âèäó ïîâòîðíîãî èñïîëüçîâàíèÿ: ïîâòîðíîìó
èñïîëüçîâàíèþ ñïåöèôèêàöèé.
Îáðàçöû ïðîåêòîâ (design patterns)
Îïðåäåëåíèå 17. Îáðàçåö - ýòî àðõèòåêòóðíûé ïðèíöèï, ïðèìåíèìûé âî ìíîãèõ ïðèêëàäíûõ îáëàñòÿõ; ñëåäóÿ îáðàçöó ìîæíî ïîñòðîèòü ðåøåíèå íåêîòîðîé ïðîáëåìû.
Ïîâòîðíîå èñïîëüçîâàíèå èñõîäíîãî òåêñòà
Íåñìîòðÿ íà ïîëåçíîñòü ïîâòîðíîãî èñïîëüçîâàíèÿ ïåðñîíàëà, ïðîåêòîâ è ñïåöèôèêàöèé, çäåñü íå
ðåàëèçóåòñÿ êëþ÷åâàÿ öåëü ïîâòîðíîãî èñïîëüçîâàíèÿ. Åñëè ìû õîòåëè áû íàéòè ïðîãðàììèñòñêèé
ýêâèâàëåíò ïîâòîðíî èñïîëüçóåìûõ äåòàëåé èç äðóãèõ òåõíè÷åñêèõ äèñöèïëèí, òî ýòî îçíà÷àëî áû
íåîáõîäèìîñòü ïîâòîðíî èñïîëüçîâàòü òîòõëàì, èç êîòîðîãî ôàêòè÷åñêè ñîñòîèò íàøà ïðîãðàììíàÿ
ïðîäóêöèÿ: èñïîëíÿåìûå ïðîãðàììû.
Ñóùåñòâóþò ýêîíîìè÷åñêèå è ïñèõîëîãè÷åñêèå ïðåïÿòñòâèÿ íà ïóòè ê ðàñïðîñòðàíåíèþ èñõîäíûõ
êîäîâ. Áîëåå ñåðüåçíûìè îãðàíè÷åíèÿì ÿâëÿþòñÿ:
• Îòîæäåñòâëåíèå ïîâòîðíî èñïîëüçóåìîãî ÏÎ ñ ïîâòîðíî èñïîëüçóåìûì èñõîäíûì òåêñòîì (source)
èñêëþ÷àåò âîçìîæíîñòü ñêðûòèÿ èíôîðìàöèè. Ñëåäóåò èìåòü â âèäó, ÷òî ïîâòîðíîå èñïîëüçîâàíèå äåéñòâèòåëüíî áîëüøèõ ïðîåêòîâ íåâîçìîæíî, åñëè íå ïðåäïðèíÿòü ñèñòåìàòè÷åñêèõ
óñèëèé ïî çàùèòå ïîâòîðíûõ ïîëüçîâàòåëåé îò íåîáõîäèìîñòè çíàíèÿ áåñ÷èñëåííûõ äåòàëåé.
•  ñëîæíûõ ñèñòåìàõ ìíîãèå åå ÷àñòè ìîãóò íå î÷åâèäíûì îáðàçîì çàâèñåòü îò äðóãèõ. Ýòî
÷àñòî çàòðóäíÿåò ïîâòîðíîå èñïîëüçîâàíèå îòäåëüíûõ ýëåìåíòîâ, ïðèâîäÿ ê íåîáõîäèìîñòè
ïîâòîðíî èñïîëüçîâàòü è âñå îñòàëüíîå.
Óäîâëåòâîðÿþùàÿ òðåáîâàíèÿì ìîäóëüíîñòè ôîðìà ïîâòîðíîãî èñïîëüçîâàíèÿ äîëæíà óñòðàíèòü
ýòè îãðàíè÷åíèÿ, ïîääåðæèâàÿ àáñòðàêöèþ è îáåñïå÷èâàÿ ìåëêîñòðóêòóðíóþ ðåàëèçàöèþ ïîâòîðíîãî èñïîëüçîâàíèÿ.
Ïîâòîðíîå èñïîëüçîâàíèå àáñòðàêòíûõ ìîäóëåé
Âñå ïðåäûäóùèå ïîäõîäû, íåñìîòðÿ íà èõ îãðàíè÷åííóþ ïðèìåíèìîñòü, îñâåòèëè âàæíûå àñïåêòû
ïðîáëåìû ïîâòîðíîãî èñïîëüçîâàíèÿ:
• Ïîâòîðíîå èñïîëüçîâàíèå ïåðñîíàëà íåîáõîäèìî, íî íåäîñòàòî÷íî. Íàèëó÷øèå ïîâòîðíî èñïîëüçóåìûå êîìïîíåíòû áåñïîëåçíû ïðè îòñóòñòâèè õîðîøî ïîäãîòîâëåííûõ ðàçðàáîò÷èêîâ,
êîòîðûå îáëàäàþò äîñòàòî÷íûì îïûòîì, ÷òîáû ðàñïîçíàòü ñèòóàöèþ, â êîòîðîé ìîæåò ïîìî÷ü
èñïîëüçîâàíèå óæå ñóùåñòâóþùèõ êîìïîíåíòîâ.
• Äëÿ ïîâòîðíîãî èñïîëüçîâàíèÿ ïðîåêòîâ íåîáõîäèìû íå òîëüêî ãîòîâûå ðåøåíèÿ êîíêðåòíûõ
çàäà÷, íî è äîñòàòî÷íî âûñîêèé êîíöåïòóàëüíûé óðîâåíü è óíèâåðñàëüíîñòü ïîâòîðíî èñïîëüçóåìûõ êîìïîíåíòîâ. Êëàññû, ñ êîòîðûìè ìû âñòðåòèìñÿ ïðè îáñóæäåíèè ÎÎ-òåõíîëîãèè, ìîãóò
ðàññìàòðèâàòüñÿ è êàê ìîäóëè-ïðîåêòû, òàê è êàê ìîäóëè-ðåàëèçàöèè.
• Âîçìîæíîñòü ïîâòîðíîãî èñïîëüçîâàíèÿ èñõîäíîãî êîäà ñëóæèò íàïîìèíàíèåì î òîì, ÷òî ÏÎ
â êîíå÷íîì ñ÷åòå îïðåäåëÿåòñÿ òåêñòàìè ïðîãðàìì. Ðàçóìíàÿ ïîëèòèêà â îáëàñòè ïîâòîðíîãî
èñïîëüçîâàíèÿ äîëæíà ïðèâîäèòü ê ñîçäàíèþ ïîâòîðíî èñïîëüçóåìûõ ïðîãðàììíûõ ýëåìåíòîâ.
Îáñóæäåíèå ïîçâîëèëî ñóçèòü îáëàñòü ïîèñêà ïîäõîäÿùèõ åäèíèö ïîâòîðíîãî èñïîëüçîâàíèÿ. Òàêîé åäèíèöåé äîëæåí áûòü ïðîãðàììíûé ýëåìåíò (êîëëåêöèÿ ýëåìåíòîâ). Îí äîëæåí áûòü ìîäóëåì ïðèåìëåìîãî ðàçìåðà, óäîâëåòâîðÿþùèì òðåáîâàíèÿì ìîäóëüíîñòè èç ïðåäûäóùåé ëåêöèè. Â
÷àñòíîñòè, åãî ñâÿçè äîëæíû áûòü ñòðîãî îãðàíè÷åíû, ÷òîáû îáëåã÷èòü âîçìîæíîñòü íåçàâèñèìîãî
ïîâòîðíîãî èñïîëüçîâàíèÿ. Èíôîðìàöèÿ, õàðàêòåðèçóþùàÿ âîçìîæíîñòè ìîäóëÿ, è ñîñòàâëÿþùàÿ
ïåðâè÷íóþ äîêóìåíòàöèþ äëÿ ïðîãðàììèñòîâ, ïîâòîðíî åãî èñïîëüçóþùèõ (reusers), äîëæíà áûòü
àáñòðàêòíîé: â ñîîòâåòñòâèè ñ ïðèíöèïîì ñêðûòèÿ èíôîðìàöèè îíà äîëæíà îñâåùàòü ëèøü ñâîéñòâà, ñóùåñòâåííûå äëÿ êëèåíòîâ, à íå îïèñûâàòü âñå äåòàëè ìîäóëÿ (êàê ýòî äåëàåòñÿ â èñõîäíîì
êîäå).
Òåðìèí àáñòðàêòíûé ìîäóëü áóäåò ïðèìåíÿòüñÿ ê òàêèì ïîâòîðíî èñïîëüçóåìûì åäèíèöàì (units
of reuse), âõîäÿùèì â ñîñòàâ íåïîñðåäñòâåííî ïðèìåíÿåìûõ ÏÎ, äîñòóï èç âíåøíåãî ìèðà ê êîòîðûì
ìîæåò îñóùåñòâëÿòüñÿ ÷åðåç îïèñàíèå, ñîäåðæàùåå ëèøü ïîäìíîæåñòâî ñâîéñòâ êàæäîé åäèíèöû.
4.3 Ïîâòîðÿåìîñòü ïðè ðàçðàáîòêå ÏÎ
 ïîèñêå èäåàëà àáñòðàêòíîãî ìîäóëÿ ñëåäóåò ðàññìîòðåòü ñóòü ïðîöåññà êîíñòðóèðîâàíèÿ ÏÎ. Íàáëþäàÿ çà ðàçðàáîòêîé, íåëüçÿ íå îáðàòèòü âíèìàíèÿ íà ïåðèîäè÷åñêè ïîâòîðÿþùèåñÿ äåéñòâèÿ â
ýòîì ïðîöåññå. Âíîâü è âíîâü ïðîãðàììèñòûñïëåòàþò ïðîãðàììó èç ìíîæåñòâà ñòàíäàðòíûõ ýëåìåíòîâ: ñîðòèðîâêà, ïîèñê, ñ÷èòûâàíèå, çàïèñü, ñðàâíåíèå, îáõîä ïî äåðåâó, - âñå ïîâòîðÿåòñÿ.
Ïñèõîëîãè÷åñêèì ïðåïÿòñòâèåì ïîâòîðíîãî èñïîëüçîâàíèÿ ÿâëÿåòñÿ èçâåñòíûé ñèíäðîì:Ïðèäóìàíî
Íå Íàìè (Not Invented Here èëèNIH). Ãîâîðÿò, ÷òî ðàçðàáîò÷èêè ÏÎ ÿâëÿþòñÿ èíäèâèäóàëèñòàìè,
ïðåäïî÷èòàþùèìè âñå âûïîëíÿòü ñàìè, íå ïîëàãàÿñü íà ÷óæóþ ðàáîòó.
Íî íà ïðàêòèêå ýòî íå ïîäòâåðæäàåòñÿ. Ðàçðàáîò÷èêè ÏÎ ñêëîííû ê áåñïîëåçíîé ðàáîòå íå áîëåå
äðóãèõ ñïåöèàëèñòîâ. Åñëè èìååòñÿ õîðîøåå, øèðîêî èçâåñòíîå è ëåãêîäîñòóïíîå ïîâòîðíî èñïîëüçóåìîå ðåøåíèå, òî îíî áóäåò èñïîëüçîâàíî.
Ðàññìîòðèì òèïè÷íûé ñëó÷àé ëåêñè÷åñêîãî è ñèíòàêñè÷åñêîãî àíàëèçà. Íàìíîãî ïðîùå ñîçäàòü
ïðîãðàììó ãðàììàòè÷åñêîãî àíàëèçà äëÿ êîìàíäíîãî ÿçûêà èëè ïðîñòîãî ÿçûêà ïðîãðàììèðîâàíèÿ,
èñïîëüçóÿ ïðîãðàììíûå ãåíåðàòîðû ãðàììàòè÷åñêîãî ðàçáîðà (parser generators), íàïðèìåð êîìáèíàöèþ èçâåñòíûõ ïðîãðàìì Lex-Yacc, à íå ñîçäàâàÿ âñå ñ íóëÿ. Âûâîä î÷åâèäåí: òàì, ãäå èíñòðóìåíòàëüíûå ñðåäñòâà èìåþòñÿ, êâàëèôèöèðîâàííûå ðàçðàáîò÷èêè ÏÎ ïîâñåìåñòíî èõ èñïîëüçóþò.
Òàêèì îáðàçîì, îáåñïå÷èòü âûñîêîå êà÷åñòâî ïðè ñîçäàíèè ïîâòîðíî èñïîëüçóåìûõ êîìïîíåíòîâ
ñóùåñòâåííî âàæíåå, ÷åì äëÿ äðóãèõ âèäîâ ÏÎ.
Îáîçíà÷èì ÷åðåç N ñòîèìîñòü óíèêàëüíîãî ðåøåíèÿ, R - ðåøåíèÿ, îñíîâàííîãî íà ïîâòîðíî èñïîëüçóåìûõ êîìïîíåíòàõ. Çíà÷åíèå R íèêîãäà íå áóäåò ðàâíî íóëþ: ñþäà âîéäóò çàòðàòû íà îáó÷åíèå, çàòðàòû íà âêëþ÷åíèå êîìïîíåíòîâ ñèñòåìó, ïîíàäîáèòüñÿ ñîçäàòü èíòåðôåéñ âûçîâà. Òàê ÷òî
äàæå åñëè ýêîíîìèÿ íà ïîâòîðíîì èñïîëüçîâàíèè è äðóãèå âûãîäû r = (N − R)/N îò ïîâòîðíîãî
èñïîëüçîâàíèÿ ïîòåíöèàëüíî íåâåëèêè, òî ïðèäåòñÿ âñå æå óáåäèòü âîçìîæíûõïîâòîðíûõ ïîëüçîâàòåëåé â òîì, ÷òî ðàäè âûñîêîãî êà÷åñòâà ïîâòîðíî èñïîëüçóåìîãî ðåøåíèÿ ñòîèò îòêàçàòüñÿ îò
æåëàíèÿ ïîëíîãî êîíòðîëÿ íàä âñåìè ýëåìåíòàìè ñèñòåìû.
Ôèðìû ïî ðàçðàáîòêå ÏÎ è èõ ñòðàòåãèè
Ó ôèðìû ïî ðàçðàáîòêå ÏÎ âñåãäà ñóùåñòâóåò èñêóøåíèå ñîçäàâàòü ðåøåíèÿ, ïðåäíàìåðåííî íå
óäîâëåòâîðÿþùèå êðèòåðèÿì ïîâòîðíîãî èñïîëüçîâàíèÿ, èç îïàñåíèÿ íå ïîëó÷èòü ñëåäóþùèé çàêàç, - ïîñêîëüêó åñëè âîçìîæíîñòè óæå ïðèîáðåòåííîãî ðåøåíèÿ îêàæóòñÿ èçëèøíå øèðîêèìè, òî
ïîêóïàòåëþ ñëåäóþùèé çàêàç íå ïîòðåáóåòñÿ!
Òåõíîëîãè÷åñêàÿ ñîñòàâëÿþùàÿ (engineering part) â ðàçðàáîòêå ÏÎ íå èäåíòè÷íà òàêîé æå ñîñòàâëÿþùåé â èíäóñòðèè ìàññîâîãî ïðîèçâîäñòâà; ÷åëîâå÷åñêèé ôàêòîð áóäåò, âåðîÿòíî, ïî-ïðåæíåìó
èãðàòü êëþ÷åâóþ ðîëü â ïðîöåññå êîíñòðóèðîâàíèÿ ÏÎ.
Öåëü ïîâòîðíîãî èñïîëüçîâàíèÿ ñîñòîèò íå â òîì, ÷òîáû çàìåíèòü ëþäåé èíñòðóìåíòàëüíûìè
ñðåäñòâàìè (à ýòî ÷àñòî, íåñìîòðÿ íà âñÿ÷åñêèå óòâåðæäåíèÿ, ïðîèñõîäèò ñ äðóãèìè îòðàñëÿìè
ïðîèçâîäñòâà), à â èçìåíåíèè ñîîòíîøåíèÿ ìåæäó òåì, ÷òî ñëåäóåò ïîðó÷èòü ëþäÿì, à ÷òî - èíñòðóìåíòàëüíûì ñðåäñòâàì. Òàê ÷òî äëÿ ôèðìû, ïðèîáðåòøåé èçâåñòíîñòü çà ñ÷åò ñâîèõ êîíñóëüòàíòîâ,
ýòè íîâîââåäåíèÿ íå òàê óæ ïëîõè.  ÷àñòíîñòè:
• Âî ìíîãèõ ñëó÷àÿõ ðàçðàáîò÷èêè, ïðèìåíÿþùèå ïîâòîðíî èñïîëüçóåìûå êîìïîíåíòû, ìîãóò
ïî-ïðåæíåìó óñïåøíî ïîëüçîâàòüñÿ ïîìîùüþ ñïåöèàëèñòîâ, êîòîðûå ïîñîâåòóþò, êàê íàèëó÷øèì îáðàçîì ïðèìåíÿòü ýòè êîìïîíåíòû. Òåì ñàìûì ñîõðàíÿåòñÿ ñóùåñòâåííàÿ ðîëü ôèðì ïî
ïîñòàâêàì ÏÎ è èõ êîíñóëüòàíòîâ.
• Êàê áóäåò ïîêàçàíî íèæå, âîçìîæíîñòü ïîâòîðíîãî èñïîëüçîâàíèÿ íåîòäåëèìà îò ðàñøèðÿåìîñòè: õîðîøèå ïîâòîðíî èñïîëüçóåìûå êîìïîíåíòû áóäóò îñòàâàòüñÿ îòêðûòûìè äëÿ àäàïòàöèè ê êîíêðåòíûì îáñòîÿòåëüñòâàì. Êîíñóëüòàíòû ôèðìû, ðàçðàáîòàâøåé ñîîòâåòñòâóþùóþ
áèáëèîòåêó ïðîãðàìì, èìåþò èäåàëüíóþ âîçìîæíîñòü âûïîëíÿòü íàñòðîéêó êîìïîíåíòîâ äëÿ
îòäåëüíûõ çàêàç÷èêîâ. Òàê ÷òî ïðîäàæà êîìïîíåíòîâ è ïðîäàæà óñëóã íå îáÿçàòåëüíî ÿâëÿþòñÿ âçàèìíî èñêëþ÷àþùèìè âèäàìè äåÿòåëüíîñòè; òîðãîâëÿ êîìïîíåíòàìè ìîæåò ñëóæèòü
îñíîâîé äëÿ òîðãîâëè óñëóãàìè.
• Õîðîøàÿ ïîâòîðíî èñïîëüçóåìàÿ áèáëèîòåêà ìîæåò èãðàòü ñòðàòåãè÷åñêóþ ðîëü â ïîëèòèêå
ïðåóñïåâàþùåé ôèðìû ïî ïðîèçâîäñòâó ÏÎ, äàæå åñëè ôèðìà ïðîäàåò ðåøåíèÿ, à íå áèáëèîòåêó, èñïîëüçóÿ åå ëèøü äëÿ âíóòðåííèõ öåëåé. Òàêàÿ áèáëèîòåêà ìîæåò äàòü ôèðìå êîíêóðåíòíîå ïðåèìóùåñòâî â áîëåå áûñòðîé è äåøåâîé ðàçðàáîòêå íåñòàíäàðòíûõ ðåøåíèé, óäîâëåòâîðÿþùèõ òðåáîâàíèÿì çàêàç÷èêîâ, ÷åì ìîãëè áû ñäåëàòü êîíêóðåíòû, íå îïèðàþùèåñÿ íà
òàêóþ çàðàíåå çàãîòîâëåííóþ îñíîâó.
Îðãàíèçàöèÿ äîñòóïà ê êîìïîíåíòàì
Âîò ÷òî ãîâîðÿò ñêåïòèêè: ïðîãðåññ â ïðîèçâîäñòâå ïîâòîðíî èñïîëüçóåìûõ ÏÎ ïðèâåäåò ê òîìó,
÷òî ðàçðàáîò÷èêè îêàæóòñÿçàâàëåííûìè íàñòîëüêî áîëüøèì êîëè÷åñòâîì êîìïîíåíòîâ è ýòî òàê
óñëîæíèò èõ æèçíü, ÷òî ëó÷øå áû ýòèõ êîìïîíåíòîâ íå áûëî.
Ýòî âûñêàçûâàíèå ñëåäóåò ðàññìàòðèâàòü êàê ïðåäóïðåæäåíèå ðàçðàáîò÷èêàì ïîâòîðíî èñïîëüçóåìûõ ÏÎ î òîì, ÷òî ëó÷øèå â ìèðå ïîâòîðíî èñïîëüçóåìûå êîìïîíåíòû áåñïîëåçíû, åñëè íèêòî íå
çíàåò îá èõ ñóùåñòâîâàíèè, èëè åñëè äëÿ èõ ïîëó÷åíèÿ ïðèäåòñÿ çàòðàòèòü ñëèøêîì ìíîãî âðåìåíè
è óñèëèé. Äëÿ ïðàêòè÷åñêîãî óñïåõà ìåòîäîâ ïîâòîðíîãî èñïîëüçîâàíèÿ òðåáóåòñÿ ñîçäàíèå ñîîòâåòñòâóþùèõ áàç äàííûõ, ñîäåðæàùèõ êîìïîíåíòû, çàïðîñ ê êîòîðûì ïîçâîëÿë áû áûñòðî âûÿñíèòü,
óäîâëåòâîðÿåò ëè íóæíûì ïîòðåáíîñòÿì êàêîé-ëèáî èç ñóùåñòâóþùèõ êîìïîíåíòîâ.
Äîëæíû áûòü äîñòóïíû è ñåòåâûå óñëóãè, ïîçâîëÿþùèå îñóùåñòâèòü çàêàç è íåìåäëåííóþ äîñòàâêó ïî ñåòè âûáðàííûõ êîìïîíåíòîâ.
Äîñòèæåíèå ýòèõ öåëåé òðåáóåò ðåøåíèÿ òåõíè÷åñêèõ è îðãàíèçàöèîííûõ ïðîáëåì. Èíäåêñèðîâàíèå, ïîèñê è äîñòàâêà ïîâòîðíî èñïîëüçóåìûõ êîìïîíåíòîâ - ýòî òåõíè÷åñêèå ïðîáëåìû, ðåøàåìûå
èçâåñòíûìè ñðåäñòâàìè, â ÷àñòíîñòè ìåòîäàìè, îñíîâàííûìè íà èñïîëüçîâàíèè áàç äàííûõ. Î÷åâèäíî, ñïðàâëÿòüñÿ ñ ïðîãðàììíûìè êîìïîíåíòàìè íè÷óòü íå ñëîæíåå, ÷åì ñ äàííûìè î çàêàç÷èêàõ,
èíôîðìàöèåé îá àâèàðåéñàõ èëè ñ áèáëèîòå÷íûìè êíèãàìè.
Ôîðìàòû äëÿ ðàñïðîñòðàíåíèÿ ïîâòîðíî èñïîëüçóåìûõ êîìïîíåíòîâ
Åùå îäíîé çàäà÷åé, îõâàòûâàþùåé êàê òåõíè÷åñêèå, òàê è îðãàíèçàöèîííûå ïðîáëåìû, ÿâëÿåòñÿ
âûáîð ïðåäñòàâëåíèÿ äëÿ ðàñïðîñòðàíåíèÿ: èñõîäíûé òåêñò èëè äâîè÷íûé ôîðìàò? Ýòî ñïîðíûé
âîïðîñ, è ìû îãðàíè÷èìñÿ ðàññìîòðåíèåì òîëüêî íåñêîëüêèõ äîâîäîâ ñ îáåèõ ñòîðîí.
Ðàçðàáîò÷èêè êîììåð÷åñêîãî ÏÎ ÷àñòî ðàñïðîñòðàíÿþò ëèøü îïèñàíèå èíòåðôåéñà (ñîîòâåòñòâóþùàÿ êðàòêàÿ ôîðìà (short form) ðàññìàòðèâàåòñÿ â îäíîé èç ïîñëåäóþùèõ ëåêöèé) è èñïîëíÿåìûé
êîä. Òåì ñàìûì ðàçðàáîò÷èêè çàùèùàþò ñåêðåòû ïðîèçâîäñòâà è ñâîè èíâåñòèöèè.
Äâîè÷íûé êîä è â ñàìîì äåëå ÿâëÿåòñÿ ïðåäïî÷òèòåëüíîé ôîðìîé ðàñïðîñòðàíåíèÿ êîììåð÷åñêèõ ïðèêëàäíûõ ïðîãðàìì, îïåðàöèîííûõ ñèñòåì è äðóãèõ èíñòðóìåíòàëüíûõ ñðåäñòâ, â òîì ÷èñëå
êîìïèëÿòîðîâ, èíòåðïðåòàòîðîâ è ñðåä ðàçðàáîòêè äëÿ ÎÎ-ÿçûêîâ.
Äëÿ èçãîòîâèòåëÿ ïðîãðàììíîãî êîìïîíåíòà ïîëüçà îò ðàñïðîñòðàíåíèÿ èñõîäíîãî òåêñòà ñîñòîèò
â òîì, ÷òî ýòî îáëåã÷àåò ïåðåíîñ ïðîãðàìì (porting eorts). Ìîæíî èçáåæàòü óòîìèòåëüíîé è ìàëîðåíòàáåëüíîé äåÿòåëüíîñòè ïî àäàïòàöèè ÏÎ ê ìíîæåñòâó íåñîâìåñòèìûõ ïëàòôîðì, ñóùåñòâóþùèõ
â ñîâðåìåííîì êîìïüþòåðíîì ìèðå, ðàññ÷èòûâàÿ íà òî, ÷òî ðàçðàáîò÷èêè ÎÎ-êîìïèëÿòîðîâ è ïðîãðàììíûõ ñðåä âûïîëíÿò ýòó ðàáîòó çà âàñ.
4.4 Ïÿòü òðåáîâàíèé ê ìîäóëüíûì ñòðóêòóðàì
Êàê æå íàéòè òàêèå ìîäóëüíûå ñòðóêòóðû, êîòîðûå ïîçâîëÿò ñîçäàòü êîìïîíåíòû, íåïîñðåäñòâåííî
ãîòîâûå ê ïîâòîðíîìó èñïîëüçîâàíèþ, è, â òî æå âðåìÿ, äîïóñêàþùèå âîçìîæíîñòü èõ àäàïòàöèè?
Ðàññìîòðèì ïðèìåð ïîèñêà äàííûõ â òàáëèöå ñðàâíèìûõ ñ îáðàçöîì. Íåñîìíåííî, àëãîðèòì òàáëè÷íîãî ïîèñêà â îáùåì âèäå âñåãäà âûãëÿäèò îäèíàêîâî: íà÷àòü ñ íåêîòîðîé ïîçèöèè â òàáëèöå t,
çàòåì ïðèñòóïèòü ê ïîñëåäîâàòåëüíîìó ïðîñìîòðó òàáëèöû, âñÿêèé ðàç ïðîâåðÿÿ, ÿâëÿåòñÿ ëè èñêîìûì ýëåìåíò â òåêóùåé ïîçèöèè è, åñëè ýòî íå òàê, òî ïåðåõîäèòü ê ñëåäóþùåé ïîçèöèè. Ïðîöåññ
çàâåðøàåòñÿ, åñëè íàéäåí íóæíûé ýëåìåíò, ëèáî ïðîâåðêà âñåõ ýëåìåíòîâ îêàçàëàñü áåçóñïåøíîé.
Òàêàÿ îáùàÿ ñõåìà ïðèìåíèìà ê ìíîãèì âîçìîæíûì ñëó÷àÿì ïðåäñòàâëåíèÿ äàííûõ è àëãîðèòìàì
äëÿ òàáëè÷íîãî ïîèñêà, â òîì ÷èñëå â ìàññèâàõ (îòñîðòèðîâàííûõ èëè íå îòñîðòèðîâàííûõ), ñâÿçíûõ
ñïèñêàõ (îòñîðòèðîâàííûõ èëè íå îòñîðòèðîâàííûõ), ïîñëåäîâàòåëüíûõ ôàéëàõ, äâîè÷íûõ äåðåâüÿõ,
Á-äåðåâüÿõ è ðàçëè÷íûõ õåø-òàáëèöàõ.
Ýòî íåôîðìàëüíîå îïèñàíèå ìîæíî ïðåâðàòèòü â ñëåäóþùóþ ôóíêöèþ íà ÿçûêå Python:
def find(table, x):
for element in table:
if equal(element, x):
return element
return None
Ïðèìåð ïðèìåíåíèÿ äàííîé ôóíêöèè:
>>> equal = lambda x, y: (x-y) % 5 == 0
>>> find(range(15), 6)
1
>>> find(range(0, 15, 5), 6)
>>>
Çàìåòèì ïðè ýòîì ìîæíî áûëî èñïîëüçîâàòü â êà÷åñòâå table, êðîìå ñïèñêîâ, òàêèå êîíñòðóêöèè
ÿçûêà êàê ñïèñêè, êîðòåæè, ôàéë, ñëîâàðè è äðóãîé ëþáîé èòåðèðóåìûé òèï.
Çàäà÷à òàáëè÷íîãî ïîèñêà è øàáëîí ïîäïðîãðàììû nd èëëþñòðèðóþò æåñòêèå òðåáîâàíèÿ, ïðåäúÿâëÿåìûå ê ëþáîìó ðåøåíèþ. Ìîæíî âîñïîëüçîâàòüñÿ ýòèì ïðèìåðîì äëÿ âûÿñíåíèÿ, ÷òî æå ñëåäóåò
ïðåäïðèíÿòü äëÿ ïåðåõîäà îò îáíàðóæåíèÿ îòíîñèòåëüíî íå÷åòêîé îáùíîñòè âàðèàíòîâ ê ðåàëüíîìó
íàáîðó ïîâòîðíî èñïîëüçóåìûõ ìîäóëåé. Òàêîé àíàëèç âûÿâëÿåò ïÿòü âàæíûõ ïðîáëåì:
• Èçìåí÷èâîñòü òèïîâ (Type Variation).
• Ãðóïïèðîâàíèå ïîäïðîãðàìì (Routine Grouping).
• Èçìåí÷èâîñòü ðåàëèçàöèé (Implementation Variation).
• Íåçàâèñèìîñòü ïðåäñòàâëåíèé (Representation Independence).
• Ôàêòîðèçàöèÿ îáùåãî ïîâåäåíèÿ (Factoring Out Common Behaviors).
Èçìåí÷èâîñòü Òèïîâ (Type Variation)
Ôóíêöèÿ nd ïðåäïîëàãàåò, ÷òî òàáëèöà ñîäåðæèò îáúåêòû òèïà ê êîòîðîìó ïðèìåíèìà ôóíêöèÿ
equal. Ïîâòîðíî èñïîëüçóåìûé ìîäóëü ïîèñêà äîëæåí áûòü ïðèìåíèì êî ìíîãèì ðàçëè÷íûì òèïàì ýëåìåíòîâ áåç òîãî ÷òîáû ïîëüçîâàòåëè âûíóæäåíû áûëè ïðîèçâîäèòüâðó÷íóþ èçìåíåíèÿ â
òåêñòå ïðîãðàììû. Äðóãèìè ñëîâàìè, íåîáõîäèìî ñðåäñòâî äëÿ îïèñàíèÿ ìîäóëåé, â êîòîðûõ òèïû
âûñòóïàþò â ðîëè ïàðàìåòðîâ (type-parameterized), èëè êîðî÷å - ðîäîâûõ (ïîëèìîðôíûõ) ìîäóëåé.
Óíèâåðñàëüíîñòü èëè ïîëèìîðôíîñòü (genericity) (ñïîñîáíîñòü ìîäóëåé áûòü ðîäîâûìè) îêàæåòñÿ
âàæíîé ÷àñòüþ ÎÎ-ìåòîäà.
Ãðóïïèðîâàíèå Ïîäïðîãðàìì (Routine Grouping)
Øàáëîí ïîäïðîãðàììû nd, äàæå åñëè åãî ïîëíîñòüþ äåòàëèçèðîâàòü è ââåñòè ïàðàìåòðèçàöèþ
òèïà, âñå åùå íå áóäåò ïðèãîäåí â êà÷åñòâå ïîâòîðíî èñïîëüçóåìîãî êîìïîíåíòà. Ïîèñê â òàáëèöå çàâèñèò îò òîãî, êàê òàáëèöà ñîçäàâàëàñü, êàê â íåå âêëþ÷àþòñÿ ýëåìåíòû, êàê îíè óäàëÿþòñÿ.
Îòäåëüíî âçÿòàÿ ïðîãðàììà ïîèñêà - ýòî åùå íå ìîäóëü ïîâòîðíîãî èñïîëüçîâàíèÿ. Ñàìîäîñòàòî÷íûé, ïîâòîðíî èñïîëüçóåìûé ìîäóëü äîëæåí âêëþ÷àòü ìíîæåñòâî ïîäïðîãðàìì, îáåñïå÷èâàþùèõ
êàæäóþ èç óïîìÿíóòûõ îïåðàöèé - ñîçäàíèå, âêëþ÷åíèå, óäàëåíèå, ïîèñê.
Ýòà èäåÿ ëåæèò â îñíîâå ôîðìèðîâàíèÿ ìîäóëÿ êàêïàêåòà.
Èçìåí÷èâîñòü Ðåàëèçàöèé (Implementation Variation)
Øàáëîí nd ÿâëÿåòñÿ âåñüìà îáùèì; è, êàê ìû óæå óáåäèëèñü, íà ïðàêòèêå èìååòñÿ øèðîêèé âûáîð
ñîîòâåòñòâóþùèõ ñòðóêòóð äàííûõ è àëãîðèòìîâ. Íåëüçÿ îæèäàòü, ÷òî îäèí ìîäóëü ñìîæåò îáåñïå÷èòü ðàáîòó â ñòîëü ðàçíîîáðàçíûõ óñëîâèÿõ, - îí îêàçàëñÿ áû ïðîñòî îãðîìíûì. Äëÿ îõâàòà âñåõ
âîçìîæíûõ ðåàëèçàöèé òðåáóåòñÿ ñåìåéñòâî ìîäóëåé.
Îáùàÿ ìåòîäèêà ñîçäàíèÿ è ïðèìåíåíèÿ ïîâòîðíî èñïîëüçóåìûõ ìîäóëåé äîëæíà ïîääåðæèâàòü
èäåþ ñåìåéñòâà ìîäóëåé.
Íåçàâèñèìîñòü Ïðåäñòàâëåíèé
Îáùàÿ ñòðóêòóðà ïîâòîðíî èñïîëüçóåìîãî ìîäóëÿ äîëæíà ïîçâîëÿòü ìîäóëÿì-êëèåíòàì îïðåäåëÿòü
ñâîè äåéñòâèÿ ïðè îòñóòñòâèè ñâåäåíèé î ðåàëèçàöèè ìîäóëÿ. Ýòî òðåáîâàíèå íàçûâàåòñÿ Íåçàâèñèìîñòüþ Ïðåäñòàâëåíèé.
Ðåøåíèå ñîñòîèò â òîì, ÷òîáû îáåñïå÷èòü àâòîìàòè÷åñêèé âûáîð, îñóùåñòâëÿåìûé ñèñòåìîé èñïîëíåíèÿ. Òàêîâà áóäåò ðîëü äèíàìè÷åñêîãî ñâÿçûâàíèÿ (dynamic binding), êëþ÷åâîé ñîñòàâëÿþùåé
ÎÎ-ïîäõîäà.
Ôàêòîðèçàöèÿ Îáùåãî Ïîâåäåíèÿ
Åñëè òðåáîâàíèå Íåçàâèñèìîñòè Ïðåäñòàâëåíèé îòðàæàåò ïîçèöèþ êëèåíòà - èãíîðèðîâàíèå âíóòðåííèõ äåòàëåé è âàðèàíòîâ ðåàëèçàöèè - òî ïîñëåäíåå òðåáîâàíèå îòðàæàåò ïîçèöèþ ðàçðàáîò÷èêîâ
ïîâòîðíî èñïîëüçóåìûõ êëàññîâ. Èõ öåëü â ïîëó÷åíèè ïðåèìóùåñòâ îò ëþáîé îáùíîñòè (commonality),
êîòîðàÿ ìîæåò ñóùåñòâîâàòü â ñåìåéñòâå èëè ïîäñåìåéñòâå ðåàëèçàöèé.
Ìíîãîîáðàçèå ðåàëèçàöèé, èìåþùåå ìåñòî â íåêîòîðûõ ïðîáëåìíûõ îáëàñòÿõ, òðåáóåò, êàê óæå
îòìå÷àëîñü, ðåøåíèÿ, îñíîâàííîãî íà ñåìåéñòâå ìîäóëåé. ×àñòî ýòî ñåìåéñòâî íàñòîëüêî âåëèêî, ÷òî
åñòåñòâåííî ïîèñêàòü ñîîòâåòñòâóþùèå ïîäñåìåéñòâà.  ñëó÷àå òàáëè÷íîãî ïîèñêà ïåðâàÿ ïîïûòêà
êëàññèôèêàöèè ìîæåò ïðèâåñòè ê òðåì îáøèðíûì ïîäñåìåéñòâàì:
• Òàáëèöû, îðãàíèçóåìûå ïî íåêîòîðîé ñõåìå õåøèðîâàíèÿ.
• Òàáëèöû, îðãàíèçóåìûå êàê íåêîòîðàÿ ðàçíîâèäíîñòü äåðåâüåâ.
• Òàáëèöû, îðãàíèçóåìûå ïîñëåäîâàòåëüíî.
Êàæäàÿ èç ýòèõ êàòåãîðèé îõâàòûâàåò ìíîãî âàðèàíòîâ, íî â áîëüøèíñòâå ñëó÷àåâ ìîæíî íàéòè
ñóùåñòâåííóþ îáùíîñòü ìåæäó ýòèìè âàðèàíòàìè. Ðàññìîòðèì, íàïðèìåð, ñåìåéñòâî ïîñëåäîâàòåëüíûõ ðåàëèçàöèé - òàêèõ, â êîòîðûõ ýëåìåíòû ñîõðàíÿþòñÿ è îòûñêèâàþòñÿ â ïîðÿäêå èõ ïåðâîíà÷àëüíîãî âêëþ÷åíèÿ â òàáëèöó.
Ðèñ. 4.1: Íåêîòîðûå âîçìîæíûå ðåàëèçàöèè òàáëèöû
4.5 Òðàäèöèîííûå ìîäóëüíûå ñòðóêòóðû
Íàðÿäó ñ òðåáîâàíèÿìè ê ìîäóëüíîñòè, èçëîæåííûìè â ïðåäûäóùåé ëåêöèè, ïÿòü òðåáîâàíèé èçìåí÷èâîñòè òèïîâ, ãðóïïèðîâàíèÿ ïîäïðîãðàìì, èçìåí÷èâîñòè ðåàëèçàöèé, íåçàâèñèìîñòè ïðåäñòàâëåíèé è ôàêòîðèçàöèè îáùåãî ïîâåäåíèÿ îïðåäåëÿþò, ÷åãî ñëåäóåò îæèäàòü îò íàøèõ ïîâòîðíî èñïîëüçóåìûõ êîìïîíåíòîâ - àáñòðàêòíûõ ìîäóëåé.
Ïîäïðîãðàììû
Êëàññè÷åñêèé ïîäõîä ê ïîâòîðíîìó èñïîëüçîâàíèþ ñîñòîèò â òîì, ÷òîáû ñîçäàâàòü áèáëèîòåêè ïîäïðîãðàìì. Çäåñü òåðìèí ïîäïðîãðàììà (routine) îçíà÷àåò ïðîãðàììíûé ýëåìåíò, êîòîðûé ìîæåò
áûòü âûçâàí äðóãèìè ýëåìåíòàìè äëÿ âûïîëíåíèÿ íåêîòîðîãî àëãîðèòìà, èñïîëüçóÿ íåêîòîðûå âõîäíûå äàííûå, ñîçäàâàÿ íåêîòîðûå âûõîäíûå äàííûå, è, âîçìîæíî, ìîäèôèöèðóÿ äðóãèå äàííûå. Âûçûâàþùèé ýëåìåíò ïåðåäàåò ñâîè âõîäíûå äàííûå (à èíîãäà - âûõîäíûå äàííûå è ìîäèôèöèðóåìûå
äàííûå) â âèäå ôàêòè÷åñêèõ àðãóìåíòîâ (actual arguments) . Ïîäïðîãðàììà ìîæåò òàêæå âîçâðàùàòü
âûõîäíûå äàííûå â âèäå ðåçóëüòàòà; â ýòîì ñëó÷àå îíà íàçûâàåòñÿ ôóíêöèåé.
Áèáëèîòåêè ïîäïðîãðàìì óñïåøíî èñïîëüçîâàëèñü â ðàçëè÷íûõ ïðèêëàäíûõ îáëàñòÿõ, â ÷àñòíîñòè, äëÿ ÷èñëåííûõ ðàñ÷åòîâ, ãäå ïðèìåíåíèå îòëè÷íûõ áèáëèîòåê ïðèâåëî ê ïåðâûì ñîîáùåíèÿì
îá óñïåõàõ ïîâòîðíîãî èñïîëüçîâàíèÿ. Äåêîìïîçèöèþ ñèñòåì íà ïîäïðîãðàììû, ôóíêöèîíàëüíóþ
äåêîìïîçèöèþ, îáåñïå÷èâàåò òàêæå ìåòîä íèñõîäÿùåãî (ñâåðõó âíèç) ïðîãðàììèðîâàíèÿ. Ïîäõîä,
îñíîâàííûé íà èñïîëüçîâàíèè áèáëèîòåê ïîäïðîãðàìì, õîðîøî ðàáîòàåò â ñëó÷àÿõ, êîãäà ìîæíî
îïðåäåëèòü ìíîæåñòâî (âîçìîæíî - áîëüøîå) îòäåëüíûõ çàäà÷, ïðè íàëè÷èè ñëåäóþùèõ îãðàíè÷åíèé:
• Êàæäàÿ çàäà÷à äîïóñêàåò ïðîñòóþ ñïåöèôèêàöèþ. Òî÷íåå, âîçìîæíî îõàðàêòåðèçîâàòü êàæäóþ îòäåëüíóþ çàäà÷ó íåáîëüøèì íàáîðîì âõîäíûõ è âûõîäíûõ ïàðàìåòðîâ.
• Çàäà÷è ÷åòêî îòëè÷àþòñÿ îäíà îò äðóãîé, ïîñêîëüêó ïîäõîä, îñíîâàííûé íà ïîäïðîãðàììàõ,
íå ïîçâîëÿåò âîñïîëüçîâàòüñÿ âîçìîæíîé ñêîëüêî-íèáóäü ñóùåñòâåííîé èõ îáùíîñòüþ - çà èñêëþ÷åíèåì ïîâòîðíîãî èñïîëüçîâàíèÿ íåêîòîðûõ êîíñòðóêöèé.
• Îòñóòñòâóþò ñëîæíûå ñòðóêòóðû äàííûõ, êîòîðûå ïðèøëîñü áû ðàñïðåäåëÿòü ìåæäó èñïîëüçóþùèìè èõ ïîäïðîãðàììàìè.
Ïàêåòû
 ñåìèäåñÿòûå ãîäû äâàäöàòîãî âåêà, â ñâÿçè ñ ðàçâèòèåì èäåé ñêðûòèÿ èíôîðìàöèè è àáñòðàêöèè
äàííûõ, âîçíèêëà íåîáõîäèìîñòü â ôîðìå ìîäóëÿ, áîëåå ñîâåðøåííîì, ÷åì ïîäïðîãðàììà. Ïîÿâèëîñü
íåñêîëüêî ÿçûêîâ ïðîåêòèðîâàíèÿ è ïðîãðàììèðîâàíèÿ, íàèáîëåå èçâåñòíûå èç íèõ: CLU, Modula-2 è
Ada. Â íèõ ïðåäëàãàåòñÿ ñõîäíàÿ ôîðìà ìîäóëÿ, íàçûâàåìîãî â ÿçûêå Ada ïàêåòîì, CLU - êëàñòåðîì,
Modula - ìîäóëåì.
Ïàêåòû - ýòî åäèíèöû ïðîãðàììíîé äåêîìïîçèöèè, îáëàäàþùèå ñëåäóþùèìè ñâîéñòâàìè:
1.  ñîîòâåòñòâèè ñ ïðèíöèïîì Ëèíãâèñòè÷åñêèõ Ìîäóëüíûõ Åäèíèö,ïàêåò ýòî êîíñòðóêöèÿ
ÿçûêà, òàê ÷òî êàæäûé ïàêåò èìååò èìÿ è ñèíòàêñè÷åñêè ÷åòêî îïðåäåëåííóþ îáëàñòü.
2. Îïèñàíèå êàæäîãî ïàêåòà ñîäåðæèò ðÿä îáúÿâëåíèé ñâÿçàííûõ ñ íèì ýëåìåíòîâ, òàêèõ êàê
ïîäïðîãðàììû è ïåðåìåííûå, êîòîðûå â äàëüíåéøåì áóäóò íàçûâàòüñÿ êîìïîíåíòàìè (features)
ïàêåòà.
3. Êàæäûé ïàêåò ìîæåò òî÷íî îïðåäåëÿòü ïðàâà äîñòóïà, îãðàíè÷èâàþùèå èñïîëüçîâàíèå åãî
êîìïîíåíòîâ äðóãèìè ïàêåòàìè. Äðóãèìè ñëîâàìè, ìåõàíèçì ïàêåòîâ ïîääåðæèâàåò ñêðûòèå
èíôîðìàöèè.
4. Â êîìïèëèðóåìîì ÿçûêå (òàêîì, êîòîðûé ìîæåò áûòü èñïîëüçîâàí äëÿ ðåàëèçàöèè, à íå òîëüêî
äëÿ ñïåöèôèêàöèè è ïðîåêòèðîâàíèÿ) ïîääåðæèâàåòñÿ íåçàâèñèìàÿ êîìïèëÿöèÿ ïàêåòîâ.
Áëàãîäàðÿ ñâîéñòâó 3, ïàêåòû ìîæíî ðàññìàòðèâàòü êàê àáñòðàêòíûå ìîäóëè. Èõ ãëàâíûì âêëàäîì â ïðîãðàììèðîâàíèå ÿâëÿåòñÿ ñâîéñòâî 2, óäîâëåòâîðÿþùåå òðåáîâàíèþ Ãðóïïèðîâàíèÿ Ïîäïðîãðàìì. Ïàêåò ìîæåò ñîäåðæàòü ëþáîå êîëè÷åñòâî ñâÿçàííûõ ñ íèì îïåðàöèé, òàêèõ êàê ñîçäàíèå
òàáëèöû, âêëþ÷åíèå, ïîèñê è óäàëåíèå ýëåìåíòîâ.
Ïàêåòû: îöåíêà
Ïî ñðàâíåíèþ ñ ïîäïðîãðàììàìè, ìåõàíèçì ïàêåòîâ ïðèâîäèò ê ñóùåñòâåííîìó ñîâåðøåíñòâîâàíèþ
ðàçáèåíèÿ ñèñòåìû ÏÎ íà àáñòðàêòíûå ìîäóëè. Ñîáðàòü íóæíûå êîìïîíåíòûïîä îäíîé êðûøåé
êðàéíå ïîëåçíî êàê äëÿ ïîñòàâùèêîâ, òàê è äëÿ êëèåíòîâ:
• Àâòîð ìîäóëÿ-ïîñòàâùèêà ìîæåò õðàíèòü â îäíîì ìåñòå è ñîâìåñòíî êîìïèëèðîâàòü âñå ýëåìåíòû, îòíîñÿùèåñÿ ê íåêîòîðîìó çàäàííîìó ïîíÿòèþ. Ýòî îáëåã÷àåò îòëàäêó è èçìåíåíèÿ.
 îòëè÷èå îò ýòîãî, ïðè èñïîëüçîâàíèè îòäåëüíûõ ñàìîñòîÿòåëüíûõ ïîäïðîãðàìì âñåãäà åñòü
îïàñíîñòü çàáûòü ïðîèçâåñòè îáíîâëåíèå íåêîòîðûõ ïîäïðîãðàìì ïðè èçìåíåíèÿõ ïðîåêòà èëè
ðåàëèçàöèè; íàïðèìåð, ìîæíî îáíîâèòü new, put è has, íî çàáûòü îáíîâèòü remove.
• Äëÿ àâòîðîâ ìîäóëåé-êëèåíòîâ íåñîìíåííî ëåã÷å íàéòè è èñïîëüçîâàòü ìíîæåñòâî âçàèìîñâÿçàííûõ êîìïîíåíòîâ, åñëè âñå îíè ñîáðàíû â îäíîì ìåñòå.
Ïðåèìóùåñòâî ïàêåòîâ ïî ñðàâíåíèþ ñ ïîäïðîãðàììàìè îñîáåííî î÷åâèäíî â òàêèõ ñëó÷àÿõ, êàê
ðàññìîòðåííûé çäåñü ïðèìåð ñ òàáëèöåé, ãäå â ïàêåòå ñîáðàíû âñå îïåðàöèè, ïðèìåíèìûå ê êîíêðåòíîé ñòðóêòóðå äàííûõ.
Îäíàêî ïàêåòû âñå æå íå îáåñïå÷èâàþò ïîëíîãî ðåøåíèÿ ïðîáëåì ïîâòîðíîãî èñïîëüçîâàíèÿ. Êàê
óæå îòìå÷àëîñü, îíè îòâå÷àþò òðåáîâàíèþ Ãðóïïèðîâàíèÿ Ïîäïðîãðàìì, íî íå óäîâëåòâîðÿþò âñåì
îñòàëüíûì òðåáîâàíèÿì.  ÷àñòíîñòè, îíè íå îáåñïå÷èâàþò âîçìîæíîñòè ôàêòîðèçàöèè îáùåãî ïîâåäåíèÿ -âûíåñåíèÿ çà ñêîáêè îáùèõ êîìïîíåíòîâ. Êîíå÷íî, áëàãîäàðÿ ñêðûòèþ èíôîðìàöèè, êëèåíòàì íåçà÷åì èíòåðåñîâàòüñÿ ýòèì âûáîðîì. Íî áèáëèîòåêà ïîâòîðíî èñïîëüçóåìûõ êîìïîíåíòîâ
äîëæíà áóäåò ñîäåðæàòü ìîäóëè äëÿ ìíîãèõ ðàçëè÷íûõ ðåàëèçàöèé. Âîçíèêàþùóþ ïðè ýòîì ñèòóàöèþ íåòðóäíî ïðåäâèäåòü: òèïè÷íàÿ áèáëèîòåêà ïàêåòîâ áóäåò ïðåäëàãàòü ìàññó ïîõîæèõ, íî âîâñå íå
èäåíòè÷íûõ, ìîäóëåé äëÿ çàäàííîé ïðèêëàäíîé îáëàñòè, íàïðèìåð, äëÿ ðàáîòû ñ òàáëèöàìè, íî áåç
êàêîãî-ëèáî ó÷åòà èõ îáùíîñòè. Îáåñïå÷èâàÿ âîçìîæíîñòü ïîâòîðíîãî èñïîëüçîâàíèÿ äëÿ êëèåíòîâ,
òàêàÿ ìåòîäèêà ïðèíîñèò â æåðòâó âîçìîæíîñòü ïîâòîðíîãî èñïîëüçîâàíèÿ ñî ñòîðîíû ïîñòàâùèêîâ.
4.6 Ïåðåãðóçêà è óíèâåðñàëüíîñòü
Äâà òåõíè÷åñêèõ ïðèåìà - ïåðåãðóçêà (overloading) è óíèâåðñàëüíîñòü (genericity) ïðåäëàãàþò ñâîè
ðåøåíèÿ, íàïðàâëåííûå íà äîñòèæåíèå áîëüøåé ãèáêîñòè îïèñàííûõ âûøå ìåõàíèçìîâ. Ðàññìîòðèì,
÷òî æå îíè ìîãóò äàòü.
Ñèíòàêñè÷åñêàÿ ïåðåãðóçêà
Ïåðåãðóçêà - ýòî ñâÿçûâàíèå ñ îäíèì èìåíåì áîëåå îäíîãî ñîäåðæàíèÿ. Íàèáîëåå ÷àñòî ïåðåãðóæàþòñÿ èìåíà ïåðåìåííûõ: ïî÷òè âî âñåõ ÿçûêàõ ïðîãðàììèðîâàíèÿ ðàçëè÷íûå ïî ñìûñëó ïåðåìåííûå
ìîãóò èìåòü îäíî è òî æå èìÿ, åñëè îíè ïðèíàäëåæàò ðàçëè÷íûì ìîäóëÿì (ðàçëè÷íûì áëîêàì - â
ÿçûêå Algol è ïîäîáíûõ åìó).
Äëÿ ýòîãî îáñóæäåíèÿ áîëåå ñóùåñòâåííîé ÿâëÿåòñÿ ïåðåãðóçêà ïîäïðîãðàìì, ÷àñòíûì ñëó÷àåì
êîòîðîé ÿâëÿåòñÿ ïåðåãðóçêà îïåðàòîðîâ, êîòîðàÿ ïîçâîëÿåò èñïîëüçîâàòü îäèíàêîâûå èìåíà äëÿ
íåñêîëüêèõ ïîäïðîãðàìì. Òàêàÿ âîçìîæíîñòü ïî÷òè âñåãäà èìååò ìåñòî äëÿ àðèôìåòè÷åñêèõ îïåðàòîðîâ: îäíà è òà æå çàïèñü, a + b, îçíà÷àåò ðàçëè÷íûå âèäû ñëîæåíèÿ, â çàâèñèìîñòè îò òèïîâ a
è b (öåëûå, âåùåñòâåííûå ñ îáû÷íîé òî÷íîñòüþ, âåùåñòâåííûå ñ óäâîåííîé òî÷íîñòüþ). Íà÷èíàÿ ñ
ÿçûêà Algol 68, â êîòîðîì äîïóñêàëàñü ïåðåãðóçêà îñíîâíûõ îïåðàòîðîâ, íåêîòîðûå ÿçûêè ïðîãðàììèðîâàíèÿ ðàñïðîñòðàíèëè âîçìîæíîñòü ïåðåãðóçêè íà îïåðàöèè, îïðåäåëÿåìûå ïîëüçîâàòåëåì, è
íà îáû÷íûå ïîäïðîãðàììû.
Ñåìàíòè÷åñêàÿ ïåðåãðóçêà (ïðåäâàðèòåëüíîå ïðåäñòàâëåíèå)
Îïèñàííóþ ôîðìó ïåðåãðóçêè ïîäïðîãðàìì ìîæíî íàçâàòü ñèíòàêñè÷åñêîé ïåðåãðóçêîé.  ÎÎïîäõîäå áóäåò ïðåäëîæåíà íàìíîãî áîëåå èíòåðåñíàÿ ìåòîäèêà, äèíàìè÷åñêîå ñâÿçûâàíèå, îòâå÷àþùàÿ öåëÿì Íåçàâèñèìîñòè Ïðåäñòàâëåíèé. Äèíàìè÷åñêîå ñâÿçûâàíèå ìîæíî íàçâàòü ñåìàíòè÷åñêîé
ïåðåãðóçêîé.
4.7 Êëþ÷åâûå êîíöåïöèè
• Äëÿ ðàçðàáîòêè ÏÎ õàðàêòåðíà ïîâòîðÿþùàÿñÿ äåÿòåëüíîñòü, âêëþ÷àþùàÿ ÷àñòîå èñïîëüçîâàíèå îáùèõ îáðàçöîâ (common patterns). Íî èìåþòñÿ ñóùåñòâåííûå âàðèàöèè òîãî, êàê èñïîëüçóþòñÿ è êîìáèíèðóþòñÿ ýòè îáðàçöû, òàê ïðèìèòèâíûå ïîïûòêè ðàáîòàòü ñ êîìïîíåíòàìè,
èìåþùèìèñÿ â íàëè÷èè, òåðïÿò íåóäà÷ó.
• Ïðè ïðàêòè÷åñêîì âíåäðåíèè ïîâòîðíîãî èñïîëüçîâàíèÿ âîçíèêàþò ýêîíîìè÷åñêèå, ïñèõîëîãè÷åñêèå è îðãàíèçàöèîííûå ïðîáëåìû. Ïîñëåäíèå ñâÿçàíû, â ÷àñòíîñòè, ñ íåîáõîäèìîñòüþ
ñîçäàíèÿ ìåõàíèçìîâ èíäåêñàöèè, õðàíåíèÿ è ïîèñêà áîëüøîãî ÷èñëà ïîâòîðíî èñïîëüçóåìûõ
êîìïîíåíòîâ. Áîëåå âàæíûìè ÿâëÿþòñÿ òåõíè÷åñêèå ïðîáëåìû: îáùåïðèíÿòûå ïðåäñòàâëåíèÿ
î ìîäóëÿõ íåäîñòàòî÷íû äëÿ ñåðüåçíîé ïîääåðæêè ïîâòîðíîãî èñïîëüçîâàíèÿ.
• Îñíîâíûì çàòðóäíåíèåì ïðè îñóùåñòâëåíèè ïîâòîðíîãî èñïîëüçîâàíèÿ ÿâëÿåòñÿ íåîáõîäèìîñòü ñî÷åòàòü ïîâòîðíîå èñïîëüçîâàíèå ñ ðàñøèðÿåìîñòüþ. Äèëåììà -ïîâòîðíî èñïîëüçîâàòü
èëè ïåðåäåëàòü íåïðèåìëåìà. Õîðîøåå ðåøåíèå äîëæíî îáåñïå÷èòü âîçìîæíîñòü ñîõðàíèòü
îäíè ñâîéñòâà ïîâòîðíî èñïîëüçóåìîãî ìîäóëÿ è àäàïòèðîâàòü äðóãèå.
• Ïðîñòûå ïîäõîäû ê ðåøåíèþ ïðîáëåìû: ïîâòîðíîå èñïîëüçîâàíèå ïåðñîíàëà, ïîâòîðíîå èñïîëüçîâàíèå ïðîåêòîâ, ïîâòîðíîå èñïîëüçîâàíèå èñõîäíîãî êîäà, áèáëèîòåêè ïîäïðîãðàìì ïðèâåëè
ê íåêîòîðîìó óñïåõó, íî íå ïîçâîëèëè ïîëíîñòüþ ðåàëèçîâàòü ïîòåíöèàëüíûå äîñòîèíñòâà ïîâòîðíîãî èñïîëüçîâàíèÿ.
• Êîìïîíåíòîì ïðîãðàììû, ïðèãîäíûì äëÿ ïîâòîðíîãî èñïîëüçîâàíèÿ, ÿâëÿåòñÿ àáñòðàêòíûé
ìîäóëü, îáåñïå÷èâàþùèé èíêàïñóëÿöèþ ôóíêöèîíàëüíûõ âîçìîæíîñòåé ñ ïîìîùüþ õîðîøî
îïðåäåëåííîãî èíòåðôåéñà.
• Ïàêåòû îáåñïå÷èâàþò ëó÷øóþ ðåàëèçàöèþ ìåòîäà èíêàïñóëÿöèè, ÷åì ïîäïðîãðàììû, ïîñêîëüêó â íèõ îáúåäèíÿþòñÿ ñòðóêòóðà äàííûõ è ñâÿçàííûå ñ íåé îïåðàöèè.
• Äâà ìåòîäà ïîçâîëÿþò ïîâûñèòü ãèáêîñòü ïàêåòîâ: ïåðåãðóçêà ïîäïðîãðàìì è óíèâåðñàëüíîñòü.
• Ïåðåãðóçêà ïîäïðîãðàìì ÿâëÿåòñÿ ñèíòàêñè÷åñêèì ñðåäñòâîì, êîòîðîå íå ðåøàåò âàæíûõ ïðîáëåì ïîâòîðíîãî èñïîëüçîâàíèÿ, íî çàòðóäíÿåò ÷èòàáåëüíîñòü òåêñòîâ ïðîãðàìì.
• Óíèâåðñàëüíîñòü ñïîñîáñòâóåò ïîâòîðíîìó èñïîëüçîâàíèþ, íî ðåøàåò ëèøü ïðîáëåìó èçìåí÷èâîñòè òèïîâ.
• ×òî æå íàì òðåáóåòñÿ: òåõíèêà, ïîìîãàþùàÿ ïîñòàâùèêó ó÷åñòü îáùíîñòü â ãðóïïàõ âçàèìîñâÿçàííûõ ðåàëèçàöèé ñòðóêòóð äàííûõ; è òåõíèêà, èçáàâëÿþùàÿ êëèåíòîâ îò íåîáõîäèìîñòè
çíàòü î òîì, êàêîé âàðèàíò ðåàëèçàöèè âûáðàí ïîñòàâùèêîì.
Êîíòðîëüíûå âîïðîñû
Begin Quiz
1. Ïîâòîðíîå èñïîëüçîâàíèå
óìåíüøàåò âðåìÿ ðàçðàáîòêè
ïîçâîëÿåò îòêàçàòüñÿ îò îáðàáîòêè èñêëþ÷èòåëüíûõ ñèòóàöèé
ïîâûøàåò íàäåæíîñòü ïðèëîæåíèÿ
ñíèæàåò íàäåæíîñòü ïðèëîæåíèÿ
2. Ïî÷åìó ÏÈÊ (Ïîâòîðíî Èñïîëüçóåìûé Êîìïîíåíò) ñòîèò èñïîëüçîâàòü?
èìïîðòíûé òîâàð âñåãäà ëó÷øå
÷àùå âñåãî, ïî ýêîíîìè÷åñêèì ïðè÷èíàì
çà÷àñòóþ ïî ïðè÷èíàì ýôôåêòèâíîñòè
äëÿ óäîâëåòâîðåíèÿ ïðèâû÷åê ïîëüçîâàòåëÿ
3. Íóæíî ëè ñîçäàâàòü ÏÈÊ â ïðîöåññå ðàçðàáîòêè ñèñòåìû?
âñåãäà äà, ïîñêîëüêó ýòî óäåøåâëÿåò è óáûñòðÿåò ïðîöåññ åå ñîçäàíèÿ
âñåãäà íåò, ïîñêîëüêó ýòî óäîðîæàåò è çàìåäëÿåò ïðîöåññ åå ñîçäàíèÿ
âñåãäà äà, ïðè íàëè÷èè áîëüøîãî îïûòà
òîëüêî ïðè íàëè÷èè áîëüøîãî îïûòà è ýêîíîìè÷åñêèõ ïðåäïîñûëîê
4. Êëàññ ïîâåäåíèÿ - ýòî?
êëàññ, îïèñûâàþùèé ïîâåäåíèå ïîëüçîâàòåëåé ñèñòåìû
àáñòðàêòíûé êëàññ
îòëîæåííûé êëàññ
êëàññ, äëÿ êîòîðîãî çàäàíà ÷àñòè÷íàÿ ðåàëèçàöèÿ, íî íåêîòîðûå îñîáåííîñòè îñòàâëåíû äëÿ
ðåàëèçàöèè ðàçëè÷íûìè ïîòîìêàìè
5. ×òî ïðåäñòàâëÿåò ñîáîé íàèáîëåå ïðèåìëåìûé îáðàçåö, ïîëåçíûé äëÿ ïîâòîðíîãî èñïîëüçîâàíèÿ?
ñöåíàðèé ðåøåíèÿ ïðîáëåìû
ñïåöèôèêàöèþ ïðîáëåìû
îïèñàíèå àëãîðèòìà
êîìïîíåíò ÏÎ
6. ×òî ìîæíî ïîâòîðíî èñïîëüçîâàòü?
ïåðñîíàë
ñïåöèôèêàöèè
òåêñò
ïðîãðàììíûé êîä
7. Ïîâòîðíî èñïîëüçîâàòü èëè ïåðåäåëûâàòü
ïîâòîðíî èñïîëüçîâàòü ñëåäóåò ëèøü òîò êîìïîíåíò, êîòîðûé ïîëíîñòüþ ñîîòâåòñòâóåò ïîòðåáíîñòÿì
åñëè êîìïîíåíò ëèøü ÷àñòè÷íî óäîâëåòâîðÿåò ïîòðåáíîñòÿì, åãî ñëåäóåò ïåðåäåëàòü
ñëåäóåò èñïîëüçîâàòü îáúåêòíûé èíñòðóìåíòàðèé (íàñëåäîâàíèå, îáåðòûâàíèå), óäîâëåòâîðÿþùèé êðèòåðèþ Îòêðûò-Çàêðûò, äîïóñêàþùèé ðàñøèðÿåìîñòü è ïîâòîðíîå èñïîëüçîâàíèå
8. Ïåðåãðóçêà ìîæåò áûòü?
ñòàòè÷åñêîé
äèíàìè÷åñêîé
ýêñòðàîðäèíàðíîé
ìíîãîêðàòíîé
9. Ðîëü óíèâåðñàëüíîñòè â ïîâòîðíîì èñïîëüçîâàíèè â òîì, ÷òî?
ïîçâîëÿåò ñïðàâèòüñÿ ñ ïðîáëåìîé èçìåí÷èâîñòè òèïîâ
ïîçâîëÿåò ñïðàâèòüñÿ ñ ïðîáëåìîé èçìåí÷èâîñòè ðåàëèçàöèé
ïîçâîëÿåò ñïðàâèòüñÿ ñ ïðîáëåìîé íåçàâèñèìîñòè ïðåäñòàâëåíèé
âçàèìîçàâèñèìîñòè îïåðàöèé
10. Ïðîáëåìà èçìåí÷èâîñòè ðåàëèçàöèé äëÿ êëàññîâ ïîâåäåíèÿ ñîñòîèò â òîì, ÷òî?
ðåàëèçàöèÿ ñ òå÷åíèåì âðåìåíè èçìåíÿåòñÿ
êëàññ ïîâåäåíèÿ ìîæåò íå ôèêñèðîâàòü ñòðóêòóðó äàííûõ, òàê ÷òî ðåàëèçàöèÿ çàâèñèò îò
äàëüíåéøåãî âûáîðà ñòðóêòóðû äàííûõ
êëàññ ïîâåäåíèÿ ìîæåò íå ôèêñèðîâàòü ñïåöèôèêàöèþ, òàê ÷òî ðåàëèçàöèÿ çàâèñèò îò äàëüíåéøåãî óòî÷íåíèÿ ñïåöèôèêàöèè
êëàññ ïîâåäåíèÿ ìîæåò íå ôèêñèðîâàòü àëãîðèòì, òàê ÷òî ðåàëèçàöèÿ çàâèñèò îò äàëüíåéøåãî
âûáîðà àëãîðèòìà
11. Ïðîáëåìû ïîâòîðíîãî èñïîëüçîâàíèÿ ñâÿçàíû ñ?
èçìåí÷èâîñòüþ òèïîâ
âàðèàöèåé ïðåäñòàâëåíèé
âçàèìîçàâèñèìîñòüþ îïåðàöèé
íåïðåðûâíîñòüþ ïðåäñòàâëåíèé
12. Ôîðìàòîì ðàñïðîñòðàíåíèÿ ÏÈÊ, äîïóñêàþùèì ðàñøèðåíèÿ, ÿâëÿåòñÿ
èñõîäíûé òåêñò íà ÿçûêå ïðîãðàììèðîâàíèÿ
äâîè÷íûé êîä èñïîëíÿåìîãî ìîäóëÿ
êîä íà ïðîìåæóòî÷íîì ÿçûêå
äâîè÷íûé êîä èñïîëíÿåìîãî ìîäóëÿ è îïèñàíèå èíòåðôåéñà
13. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ?
óíèâåðñàëüíîñòü ðåøàåò âñå ïðîáëåìû ïîâòîðíîãî èñïîëüçîâàíèÿ
ïåðåãðóçêà ìåòîäà ÿâëÿåòñÿ ñèíòàêñè÷åñêèì ñðåäñòâîì; îíà íå ðåøàåò âàæíûõ ïðîáëåì ïîâòîðíîãî èñïîëüçîâàíèÿ è çàòðóäíÿåò ÷èòàáåëüíîñòü òåêñòîâ ïðîãðàìì
ðåøåíèå ïðîáëåìû "ïîâòîðíî èñïîëüçîâàòü èëè ïåðåäåëàòü"äîëæíî ïîçâîëÿòü ñîõðàíÿòü îäíè
ñâîéñòâà ïîâòîðíî èñïîëüçóåìîãî ìîäóëÿ è àäàïòèðîâàòü äðóãèå
îáðàçöû, îïèñàííûå â ëèòåðàòóðå, ÷àñòè÷íî ðåøàþò ïðîáëåìó ïîâòîðíîãî èñïîëüçîâàíèÿ
14. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ?
ìåòîä íèñõîäÿùåãî ïðîåêòèðîâàíèÿ îáåñïå÷èâàåò äåêîìïîçèöèþ ñèñòåìû íà ïîäïðîãðàììû
ïàêåòû ìîæíî ðàññìàòðèâàòü êàê àáñòðàêòíûå ìîäóëè
çíàêè îïåðàöèé ìîãóò áûòü ïåðåãðóæåííûìè
ñèíäðîìû NIH è HIN ïðåïÿòñòâóþò ïîâòîðíîìó èñïîëüçîâàíèþ
15. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ?
íà ñîçäàíèå ÏÈÊ òðåáóþòñÿ äîïîëíèòåëüíûå çàòðàòû
ïîäïðîãðàììû óäîâëåòâîðÿþò âñåì ïîòðåáíîñòÿì ïîâòîðíîãî èñïîëüçîâàíèÿ
ïàêåòû óäîâëåòâîðÿþò âñåì ïîòðåáíîñòÿì ïîâòîðíîãî èñïîëüçîâàíèÿ
äèíàìè÷åñêîå ñâÿçûâàíèå ÿâëÿåòñÿ ôîðìîé
End Quiz
Íàáðàíî áàëëîâ
5 Ê îáúåêòíîé òåõíîëîãèè
5.1 Ôóíêöèîíàëüíàÿ äåêîìïîçèöèÿ
Âíà÷àëå ìû ðàññìîòðèì äîñòîèíñòâà è îãðàíè÷åíèÿ òðàäèöèîííîãî ïîäõîäà, èñïîëüçóþùåãî ôóíêöèè â êà÷åñòâå îñíîâû àðõèòåêòóðû ïðîãðàììíûõ ñèñòåì.
Íåïðåðûâíîñòü
Êëþ÷åâîé ïðîáëåìîé ïðè îòâåòå íà âîïðîñ: âîêðóã ÷åãî ñëåäóåò ñòðóêòóðèðîâàòü ñèñòåìû: âîêðóã
ôóíêöèé èëè âîêðóã äàííûõ? ÿâëÿåòñÿ ïðîáëåìà ðàñøèðÿåìîñòè, áîëåå òî÷íî - öåëü, íàçâàííàÿ
íåïðåðûâíîñòüþ â ïðåäøåñòâóþùèõ ëåêöèÿõ. Êàê âû ïîìíèòå, ìåòîä ïðîåêòèðîâàíèÿ óäîâëåòâîðÿåò
ýòîìó êðèòåðèþ, åñëè îí ïðèâîäèò ê óñòîé÷èâîé àðõèòåêòóðå, îáåñïå÷èâàþùåé îáúåì èçìåíåíèé â
ïðîåêòå, ñîðàçìåðíûé îáúåìó èçìåíåíèé â ñïåöèôèêàöèè.
Îáåñïå÷åíèå íåïðåðûâíîñòè - ýòî ãëàâíàÿ çàáîòà ïðè ðàññìîòðåíèè ðåàëüíîãî æèçíåííîãî öèêëà
ïðîãðàììíûõ ñèñòåì, âêëþ÷àþùåãî íå òîëüêî ïðîèçâîäñòâî ïðèåìëåìîé ïåðâîíà÷àëüíîé âåðñèè, íî
è ýâîëþöèþ ñèñòåìû íà ïðîòÿæåíèè äîëãîãî âðåìåíè. Áîëüøèíñòâî ñèñòåì ïîäâåðãàþòñÿ ìíîãî÷èñëåííûì èçìåíåíèÿì ïîñëå èõ ïåðâîíà÷àëüíîé ïîñòàâêè. Ïîýòîìó âñÿêàÿ ìîäåëü ðàçðàáîòêè ÏÎ,
êîòîðàÿ ðàññìàòðèâàåò òîëüêî ïåðèîä, ïðåäøåñòâóþùèé ýòîé ïîñòàâêå, è èãíîðèðóþùàÿ ïîñëåäóþùóþ ýðó èçìåíåíèé è ïåðåñìîòðîâ, âåñüìà äàëåêà îò ðåàëüíîé æèçíè.
×òîáû îöåíèòü êà÷åñòâî àðõèòåêòóðû (è ïîðîäèâøåãî åå ìåòîäà), íóæíî ïîíÿòü íå òîëüêî òî,
íàñêîëüêî ïðîñòî áûëî èçíà÷àëüíî ïîëó÷èòü ýòó àðõèòåêòóðó, íå ìåíåå âàæíî âûÿñíèòü, íàñêîëüêî
ëåãêî åå ìîæíî èçìåíèòü.
Òðàäèöèîííûì îòâåòîì íà ýòîò âîïðîñ áûëà ôóíêöèîíàëüíàÿ äåêîìïîçèöèÿ ñâåðõó âíèç, êðàòêî
îïðåäåëåííàÿ â îäíîé èç ïðåäûäóùèõ ëåêöèé. Íàñêîëüêî õîðîøî ðàçðàáîòêà ñâåðõó âíèç îòâå÷àåò
òðåáîâàíèÿì ìîäóëüíîñòè?
Ïðîåêòèðîâàíèå ñâåðõó âíèç
Òàì áûë òàêæå âåñüìà èçîáðåòàòåëüíûé àðõèòåêòîð, ïðèäóìàâøèé íîâûé ñïîñîá ïîñòðîéêè äîìîâ.
Ïîñòðîéêà äîëæíà áûëà íà÷èíàòüñÿ ñ êðûøè è êîí÷àòüñÿ ôóíäàìåíòîì. Îí îïðàâäûâàë ìíå ýòîò
ñïîñîá ññûëêîé íà ïðèåìû äâóõ ìóäðûõ íàñåêîìûõ - ï÷åëû è ïàóêà.
Äæîíàòàí Ñâèôò, Ïóòåøåñòâèÿ Ãóëëèâåðà
Ïðè ïîäõîäå ñâåðõó âíèç ñèñòåìà ñòðîèòñÿ ñ ïîìîùüþ ïîñëåäîâàòåëüíûõ óòî÷íåíèé. Ýòîò ïðîöåññ
íà÷èíàåòñÿ ñ ñàìîãî îáùåãî óòâåðæäåíèÿ îá åå àáñòðàêòíîé ôóíêöèè, òàêîãî êàê
[C0]
"Îòòðàíñëèðîâàòü ÑÈ-ïðîãðàììó â ìàøèííûé êîä"
[P0]
'Îáðàáîòàòü êîìàíäó ïîëüçîâàòåëÿ"
è ïðîäîëæàåòñÿ ïóòåì ïîñëåäîâàòåëüíûõ øàãîâ óòî÷íåíèÿ. Íà êàæäîì øàãå óðîâåíü àáñòðàêöèè
ïîëó÷àåìûõ ýëåìåíòîâ äîëæåí óìåíüøàòüñÿ, êàæäàÿ îïåðàöèÿ íà íåì ðàçëàãàåòñÿ íà êîìïîçèöèþ
îäíîé èëè íåñêîëüêèõ áîëåå ïðîñòûõ îïåðàöèé. Íàïðèìåð, ñëåäóþùèé øàã â ïåðâîì ïðèìåðå (òðàíñëÿòîð ñ ÑÈ) ìîæåò ïðèâåñòè ê äåêîìïîçèöèè
[C1]
"Ïðî÷åñòü ïðîãðàììó è ïîðîäèòü ïîñëåäîâàòåëüíîñòü ëåêñåì"
"Ðàçîáðàòü ïîñëåäîâàòåëüíîñòü ëåêñåì è ïîñòðîèòü
àáñòðàêòíîå ñèíòàêñè÷åñêîå äåðåâî"
"Ñíàáäèòü äåðåâî ñåìàíòè÷åñêîé èíôîðìàöèåé"
"Ñãåíåðèðîâàòü ïî ïîëó÷åííîìó äåðåâó êîä"
èëè, èñïîëüçóÿ äðóãóþ ñòðóêòóðó (è ñäåëàâ óïðîùàþùåå ïðåäïîëîæåíèå, ÷òî ÑÈ-ïðîãðàììà - ýòî
ïîñëåäîâàòåëüíîñòü îïðåäåëåíèé ôóíêöèé):
[C'1]
from
"Èíèöèàëèçèðîâàòü ñòðóêòóðû äàííûõ"
until
"Îïðåäåëåíèÿ âñåõ ôóíêöèé îáðàáîòàíû"
loop
"Ïðî÷åñòü îïðåäåëåíèå ñëåäóþùåé ôóíêöèè"
"Ñãåíåðèðîâàòü ÷àñòè÷íûé êîä"
end
"Çàïîëíèòü ïåðåêðåñòíûå ññûëêè"
 ëþáîì ñëó÷àå ðàçðàáîò÷èê äîëæåí íà êàæäîì øàãå ïðîâåðÿòü îñòàâøèåñÿ íå ïîëíîñòüþ óòî÷íåííûìè ýëåìåíòû (òàêèå êàê ×èòàòü ïðîãðàììó... è Îïðåäåëåíèÿ âñåõ ôóíêöèé îáðàáîòàíû) è
ðàñêðûâàòü èõ, èñïîëüçóÿ òîò æå ïðîöåññ óòî÷íåíèÿ äî òåõ ïîð, ïîêà âñå íå îêàæåòñÿ íà äîñòàòî÷íîì
íèçêîì óðîâíå àáñòðàêöèè, äîïóñêàþùåì íåïîñðåäñòâåííóþ ðåàëèçàöèþ.
Ïðîöåññ óòî÷íåíèÿ ñâåðõó âíèç ìîæíî ïðåäñòàâèòü êàê ïîñòðîåíèå äåðåâà. Âåðøèíû ïðåäñòàâëÿþò
ýëåìåíòû äåêîìïîçèöèè, âåòâè ïîêàçûâàþò îòíîøåíèå B åñòü óòî÷íåíèå A.
Ðèñ. 5.1: Ðàçðàáîòêà ñâåðõó âíèç: ñòðóêòóðà äåðåâà
Ó ìåòîäà ïðîåêòèðîâàíèÿ ñâåðõó âíèç èìååòñÿ ðÿä äîñòîèíñòâ. Îí ëîãè÷åí, õîðîøî îðãàíèçóåò
äèñöèïëèíó ìûøëåíèÿ, ïîääàåòñÿ ýôôåêòèâíîìó èçó÷åíèþ, ïîîùðÿåò ñèñòåìàòè÷åñêîå ïðîåêòèðîâàíèå ñèñòåì, ïîìîãàåò ðàçðàáîò÷èêó íàéòè ïóòè ïðåîäîëåíèÿ áîëüøèõ ñëîæíîñòåé, âîçíèêàþùèõ
îáû÷íî íà íà÷àëüíîé ñòàäèè ðàçðàáîòêè ñèñòåì.
Íèñõîäÿùèé ïîäõîä ìîæåò áûòü âåñüìà ïîëåçåí ïðè ðàçðàáîòêå îòäåëüíûõ àëãîðèòìîâ. Îäíàêî ó íåãî åñòü ðÿä îãðàíè÷åíèé, êîòîðûå äåëàþò ñîìíèòåëüíûì èñïîëüçîâàíèå ýòîãî ïîäõîäà ïðè
ïðîåêòèðîâàíèè öåëûõ ñèñòåì:
• Ñîìíèòåëüíîé ÿâëÿåòñÿ ñàìà èäåÿ îõàðàêòåðèçîâàòü âñþ ñèñòåìó ïîñðåäñòâîì òîëüêî îäíîé
ôóíêöèè.
• Èñïîëüçóÿ â êà÷åñòâå îñíîâû äåêîìïîçèöèè ñèñòåìû íà ìîäóëè ñâîéñòâà, êîòîðûå ñêëîííû
ïîäâåðãàòüñÿ íàèáîëüøèì èçìåíåíèÿì, ýòîò ìåòîä íå ñïîñîáåí ó÷åñòü ýâîëþöèîííóþ ïðèðîäó
Ðèñ. 5.2: Ñòðóêòóðà ïðîñòîé ñèñòåìû ðàñ÷åòà çàðïëàòû
ïðîãðàììíûõ ñèñòåì.
Íå òîëüêî îäíà ãëàâíàÿ ôóíêöèÿ
Ïðè ýâîëþöèè ñèñòåìû òî, ÷òî âíà÷àëå âîñïðèíèìàëîñü êàê åå ãëàâíàÿ ôóíêöèÿ, ñ òå÷åíèåì âðåìåíè
ìîæåò ñòàòü ìåíåå âàæíûì.
Ðàññìîòðèì òèïè÷íóþ ñèñòåìó ðàñ÷åòà çàðïëàòû. Ïðè ôîðìóëèðîâêå íà÷àëüíûõ òðåáîâàíèé çàêàç÷èê ìîã ïðåäñòàâèòü ëèøü òî, ÷òî ñëåäóåò èç åå íàçâàíèÿ: ñèñòåìó äëÿ ãåíåðàöèè ÷åêîâ íà çàðïëàòó ïî ñîîòâåòñòâóþùèì äàííûì. Åãî ïðåäñòàâëåíèå ñèñòåìû, ÿâíîå èëè íåÿâíîå, ìîãëî îêàçàòüñÿ
âåðñèåé ñëåäóþùåé ñõåìû, âîçìîæíî, ÷óòü áîëåå àìáèöèîçíîå:
Ýòà ñèñòåìà ïîëó÷àåò íåêîòîðûå âõîäíûå äàííûå (òàêèå êàê ÷àñû ðàáîòû ñëóæàùåãî è íåêîòîðóþ
èíôîðìàöèþ î íåì) è ïðîèçâîäèò íåêîòîðûå âûõîäíûå äàííûå (÷åêè è ò. ï.). Ýòî ïðîñòàÿ ôóíêöèîíàëüíàÿ ñïåöèôèêàöèÿ, â ñòðîãîì ñìûñëå ñëîâà ôóíêöèîíàëüíûé. Îíà îïðåäåëÿåò ïðîãðàììó
êàê ìåõàíèçì äëÿ âûïîëíåíèÿ îäíîé ôóíêöèè - ïëàòèòü çàðïëàòó ñëóæàùèì. Ôóíêöèîíàëüíûé ìåòîä ïðîåêòèðîâàíèÿ ñâåðõó âíèç ïðåäíàçíà÷åí êàê ðàç äëÿ òàêèõ ñòðîãî î÷åð÷åííûõ ïðîáëåì, êîãäà
çàäàíèå ñîñòîèò â âû÷èñëåíèè îäíîé ôóíêöèè - âåðøèíû êîíñòðóèðóåìîé ñèñòåìû.
Ïðåäïîëîæèì, îäíàêî, ÷òî ðàçðàáîòêà íàøåé ïëàòåæíîé ñèñòåìû áëàãîïîëó÷íî çàâåðøåíà è ïðî-
ãðàììà âûïîëíÿåò âñþ íåîáõîäèìóþ ðàáîòó. Ñêîðåå âñåãî, íà ýòîì ðàçðàáîòêà íå ïðåêðàòèòñÿ. Õîðîøèå ñèñòåìû èìåþò ïðîòèâíóþ ïðèâû÷êó âîçáóæäàòü â ñâîèõ ïîëüçîâàòåëÿõ ìíîæåñòâî èäåé î
äðóãèõ âåùàõ, êîòîðûå îíè ìîãóò äåëàòü. Êàê ðàçðàáîò÷èêó ñèñòåìû âàì áûëî ñêàçàíî âíà÷àëå, ÷òî
âñå, ÷òî âû äîëæíû ñäåëàòü - ýòî ñãåíåðèðîâàòü ÷åêè è ïàðó âñïîìîãàòåëüíûõ âûõîäíûõ äàííûõ. Íî
çàòåì ïðîñüáû î ðàñøèðåíèÿõ íà÷èíàþò ïîïàäàòü íà âàø ñòîë îäíà çà äðóãîé: Ìîæåò ëè ïðîãðàììà
ñîáèðàòü íåêîòîðóþ äîïîëíèòåëüíóþ ñòàòèñòèêó? ß ãîâîðèë âàì, ÷òî â ñëåäóþùåì êâàðòàëå ìû
ñîáèðàåìñÿ íà÷àòü ïëàòèòü íåêîòîðûì ñëóæàùèì åæåìåñÿ÷íî, à íåêîòîðûì - äâàæäû â ìåñÿö, íå òàê
ëè? È, ìåæäó ïðî÷èì, ìíå íóæåí åæåìåñÿ÷íûé ñóììàðíûé îò÷åò äëÿ àäìèíèñòðàöèè è åùå îäèí
åæåêâàðòàëüíûé äëÿ àêöèîíåðîâ. Áóõãàëòåðàì òðåáóåòñÿ îòäåëüíûé îò÷åò äëÿ íà÷èñëåíèÿ íàëîãîâ. Êñòàòè, ïðàâèëüíî ëè âû õðàíèòå èíôîðìàöèþ î çàðïëàòå? Î÷åíü õîòåëîñü áû ïðåäîñòàâèòü
ïåðñîíàëó èíòåðàêòèâíûé äîñòóï ê íåé. Íå ïîíèìàþ, ïî÷åìó òðóäíî äîáàâèòü òàêóþ ôóíêöèþ?
Ïðîöåññ èçìåíåíèé ïðîèñõîäèò íåïðåðûâíî. Íîâàÿ ñèñòåìà âñå åùå ÿâëÿåòñÿ âî ìíîãèõ îòíîøåíèÿõ
òîé æå, ÷òî è ñòàðàÿ: âñå åùå ïëàòåæíîé ñèñòåìîé, ïðîãðàììîé äëÿ ÿäåðíîé ôèçèêè, êîìïèëÿòîðîì.
Íî èñõîäíàÿ ãëàâíàÿ ôóíêöèÿ, êîòîðàÿ âíà÷àëå âûãëÿäåëà ñàìîé âàæíîé, ÷àñòî ñòàíîâèòñÿ ïðîñòî
îäíîé èç ôóíêöèé ñèñòåìû, à èíîãäà è ñîâñåì èñ÷åçàåò, ñòàíîâÿñü íåíóæíîé.
Åñëè ïðè àíàëèçå è ïðîåêòèðîâàíèè èñïîëüçóåòñÿ ìåòîä äåêîìïîçèöèè, îñíîâàííûé íà ôóíêöèè,
òî ñòðóêòóðà ñèñòåìû áóäåò âûòåêàòü èç èñõîäíîãî ïîíèìàíèÿ ðàçðàáîò÷èêàìè ãëàâíîé ôóíêöèè
ñèñòåìû. Ïðè ýòîì äîáàâëåíèå âñÿêîé íîâîé ôóíêöèè, äàæå åñëè îíî êàæåòñÿ çàêàç÷èêó ïðîñòûì,
ìîæåò ðàçðóøèòü âñþ ñòðóêòóðó ñèñòåìû. Ïîýòîìó î÷åíü âàæíî íàéòè â êà÷åñòâå êðèòåðèÿ äåêîìïîçèöèè ñâîéñòâà ìåíåå èçìåí÷èâûå, ÷åì ãëàâíàÿ ôóíêöèÿ ñèñòåìû.
Èíòåðôåéñû è ïðîåêòèðîâàíèå ÏÎ
Àðõèòåêòóðà ñèñòåìû äîëæíà îñíîâûâàòüñÿ íà ñîäåðæàíèè, à íå íà ôîðìå. Íî ïðîåêòèðîâàíèå ñâåðõó âíèç ñòðåìèòñÿ èñïîëüçîâàòü â êà÷åñòâå îñíîâû äëÿ ñòðóêòóðû ñàìûé ïîâåðõíîñòíûé àñïåêò
ñèñòåìû - åå âíåøíèé èíòåðôåéñ.
Òàêîé óïîð íà âíåøíèé èíòåðôåéñ íåèçáåæåí äëÿ ìåòîäà, êëþ÷åâîé âîïðîñ êîòîðîãî: ×òî ñèñòåìà
áóäåò äåëàòü äëÿ êîíå÷íîãî ïîëüçîâàòåëÿ? Îòâåò íà íåãî îáÿçàòåëüíî áóäåò àêöåíòèðîâàòüñÿ íà
ñàìûõ âíåøíèõ àñïåêòàõ.
Èíòåðôåéñ ïîëüçîâàòåëÿ, êàê ïðàâèëî, îêàçûâàåòñÿ îäíèì èç íàèáîëåå èçìåí÷èâûõ êîìïîíåíòîâ,
ïîñêîëüêó òðóäíî ïîëó÷èòü ïðàâèëüíûé èíòåðôåéñ ñ ïåðâîé ïîïûòêè. Äîâîëüíî ÷àñòî óäàåòñÿ ïîñòðîèòü èíòåðôåéñ îòäåëüíî îò äðóãèõ êîìïîíåíò ñèñòåìû, èñïîëüçóÿ îäèí èç ìíîæåñòâà äîñòóïíûõ
ñåãîäíÿ èíñòðóìåíòîâ ðåàëèçàöèè ýëåãàíòíûõ è äðóæåñòâåííûõ èíòåðôåéñîâ, îñíîâàííûõ íà ÎÎìåòîäàõ.  òàêèõ ñëó÷àÿõ èíòåðôåéñ ïîëüçîâàòåëÿ ïî÷òè íå îêàçûâàåò âëèÿíèÿ íà ïðîåêòèðîâàíèå
âñåé ñèñòåìû.
Ïðîèçâîäñòâî è îïèñàíèå
Îäíà èç ïðè÷èí ïåðâîíà÷àëüíîé ïðèâëåêàòåëüíîñòè èäåé ïðîåêòèðîâàíèÿ ñâåðõó âíèç çàêëþ÷àåòñÿ â
òîì, ÷òî ýòîò ñòèëü ìîæåò áûòü óäîáåí äëÿ îáúÿñíåíèÿ êàæäîãî øàãà ðàçðàáîòêè. Íî òî, ÷òî õîðîøî
äëÿ äîêóìåíòàöèè ñóùåñòâóþùåé ðàçðàáîòêè, íå îáÿçàòåëüíî ÿâëÿåòñÿ íàèëó÷øèì ñïîñîáîì äëÿ åå
ïðîâåäåíèÿ.
Ñâåðõó âíèç - ýòî ðàçóìíûé ñïîñîá îïèñàíèÿ óæå ïîëíîñòüþ ïîíÿòûõ âåùåé. Íî ýòî íåïîäõîäÿùèé ñïîñîá äëÿ ïðîåêòèðîâàíèÿ, ðàçðàáîòêè èëè îòêðûòèÿ ÷åãî-ëèáî íîâîãî. Çäåñü èìååòñÿ áëèçêàÿ
ïàðàëëåëü ñ ìàòåìàòèêîé.  ó÷åáíèêàõ ïî ìàòåìàòèêå åå îòäåëüíûå äèñöèïëèíû îïèñûâàþòñÿ â ëîãè÷åñêîì ïîðÿäêå: êàæäàÿ ñôîðìóëèðîâàííàÿ è äîêàçàííàÿ òåîðåìà èñïîëüçóåòñÿ ïðè äîêàçàòåëüñòâå
ïîñëåäóþùèõ òåîðåì. Íî íà ñàìîì äåëå ýòè òåîðåìû íå ñîçäàâàëèñü èëè îòêðûâàëèñü óêàçàííûìè
ñïîñîáàìè èëè â óêàçàííîì ïîðÿäêå. . . Åñëè ó ðàçðàáîò÷èêà ñèñòåìû èëè ïðîãðàììû â ãîëîâå óæå
èìååòñÿ ÿñíîå ïðåäñòàâëåíèå îá îêîí÷àòåëüíîì ðåçóëüòàòå, òî îí ìîæåò ïðèìåíèòü ìåòîä ñâåðõó
âíèç, ÷òîáû îïèñàòü íà áóìàãå òî, ÷òî èìååòñÿ ó íåãî â ãîëîâå. Èìåííî ïîýòîìó ëþäè ìîãóò ñ÷èòàòü,
÷òî îíè ïðîåêòèðóþò è ðàçðàáàòûâàþò ñâåðõó âíèç è äåëàþò ýòî âåñüìà óñïåøíî: îíè ñìåøèâàþò
ñïîñîá îïèñàíèÿ ñ ìåòîäîì ðàçðàáîòêè. Êîãäà íà÷èíàåòñÿ ýòàï ñâåðõó âíèç, çàäà÷à óæå ðåøåíà è
îñòàëîñü óòî÷íèòü ëèøü íåêîòîðûå äåòàëè.
Ïðîåêòèðîâàíèå ñâåðõó âíèç: îáùàÿ îöåíêà
Ïðîâåäåííîå îáñóæäåíèå ôóíêöèîíàëüíîãî ïðîåêòèðîâàíèÿ ñâåðõó âíèç ïîêàçûâàåò, ÷òî ýòîò ìåòîä
ïëîõî ïðèñïîñîáëåí äëÿ ðàçðàáîòêè âàæíûõ ñèñòåì. Îí îñòàåòñÿ ïîëåçíîé ïàðàäèãìîé äëÿ íåáîëüøèõ ïðîãðàìì è îòäåëüíûõ àëãîðèòìîâ, îí òàêæå ïîëåçåí äëÿ îïèñàíèÿ õîðîøî ïîíÿòíûõ àëãîðèòìîâ, îñîáåííî â ó÷åáíèêàõ ïî ïðîãðàììèðîâàíèþ. Íî îí íå ìàñøòàáèðóåì è íå ãîäèòñÿ äëÿ áîëüøèõ
ïðàêòè÷åñêèõ ïðîãðàììíûõ ñèñòåì.
5.2 Äåêîìïîçèöèÿ, îñíîâàííàÿ íà îáúåêòàõ
Èñïîëüçîâàíèå îáúåêòîâ (èëè, áîëåå òî÷íî, êàê áóäåò âèäíî äàëåå, - òèïîâ îáúåêòîâ) êàê êëþ÷à äëÿ
ðàçáèåíèÿ ñèñòåìû íà ìîäóëè îñíîâàíî íà ñîäåðæàòåëüíûõ öåëÿõ, â ÷àñòíîñòè, íà ðàñøèðÿåìîñòè,
âîçìîæíîñòè ïîâòîðíîãî èñïîëüçîâàíèÿ è ñîâìåñòèìîñòè.
Äîâîäû â ïîëüçó ïðèìåíåíèÿ îáúåêòîâ áóäóò äîâîëüíî êðàòêèìè, òàê êàê ýòîò âîïðîñ áûë óæå
ðàíåå ðàññìîòðåí: ìíîãèå èç àðãóìåíòîâ ïðîòèâ îñíîâàííîãî íà ôóíêöèÿõ ïðîåêòèðîâàíèÿ ñâåðõó
âíèç åñòåñòâåííî ïðåâðàùàþòñÿ â ñâèäåòåëüñòâà â ïîëüçó îñíîâàííîãî íà îáúåêòàõ ïðîåêòèðîâàíèÿ
ñíèçó ââåðõ.
Ýòè ñâèäåòåëüñòâà, òåì íå ìåíåå, íå äîëæíû ïðèâåñòè ê ïîëíîìó îòêàçó îò ôóíêöèé. Êàê áûëî
îòìå÷åíî â íà÷àëå ëåêöèè, íèêàêîé ïîäõîä ê ñîçäàíèþ ÏÎ íå ìîæåò áûòü ïîëíûì, åñëè îí íå ó÷èòûâàåò îáå ñòîðîíû - ôóíêöèè è îáúåêòû. Ïîýòîìó íàì íóæíî è â ÎÎ-ìåòîäå ñîõðàíèòü íàäëåæàùåå
ìåñòî äëÿ ôóíêöèé, äàæå åñëè îíè â ðåçóëüòèðóþùåé àðõèòåêòóðå ñèñòåìû áóäóò ïîä÷èíåíû îáúåêòàì. Ïîíÿòèå àáñòðàêòíîãî òèïà äàííûõ ïðåäîñòàâèò íàì îïðåäåëåíèå îáúåêòîâ, â êîòîðîì äëÿ
ôóíêöèé çàðåçåðâèðîâàíî ïîäõîäÿùåå ìåñòî.
Ðàñøèðÿåìîñòü
Òàê êàê ôóíêöèè ñèñòåìû èìåþò òåíäåíöèþ èçìåíÿòüñÿ â òå÷åíèå åå æèçíè, òî âîçíèêàåò âîïðîñ
î ïîèñêå áîëåå ñòàáèëüíîé õàðàêòåðèñòèêè åå ñóùåñòâåííûõ ñâîéñòâ, êîòîðàÿ ìîãëà áû ðóêîâîäèòü
íàøèì âûáîðîì ìîäóëåé è ñîîòâåòñòâîâàëà áû öåëè íåïðåðûâíîñòè.
Òèïû îáúåêòîâ, ñ êîòîðûìè ðàáîòàåò ñèñòåìà, ÿâëÿþòñÿ áîëåå ïåðñïåêòèâíûìè êàíäèäàòàìè. ×òî
áû íè ñëó÷èëîñü ñ èñïîëüçîâàííîé â ïðèìåðå âûøå ñèñòåìîé ðàñ÷åòà çàðïëàòû, îíà âñå ðàâíî áóäåò
ìàíèïóëèðîâàòü îáúåêòàìè, ïðåäñòàâëÿþùèìè ñëóæàùèõ, øòàòíûå ðàñïèñàíèÿ ñ çàðïëàòàìè, èíñòðóêöèè êîìïàíèè, òàáåëü ó÷åòà ðàáî÷åãî âðåìåíè, ÷åêè. ×òî áû íè ñëó÷èëîñü ñ êîìïèëÿòîðîì èëè
äðóãèì ñðåäñòâîì îáðàáîòêè ÿçûêà, îí âñå åùå áóäåò ìàíèïóëèðîâàòü èñõîäíûìè òåêñòàìè, ïîñëåäîâàòåëüíîñòÿìè ëåêñåì, äåðåâüÿìè ðàçáîðà, àáñòðàêòíûìè ñèíòàêñè÷åñêèìè äåðåâüÿìè, öåëåâûì
êîäîì. ×òî áû íè ñëó÷èëîñü ñ ñèñòåìîé, ðåàëèçóþùåé ìåòîä êîíå÷íûõ ýëåìåíòîâ, îíà ïî-ïðåæíåìó
áóäåò ìàíèïóëèðîâàòü ìàòðèöàìè, êîíå÷íûìè ýëåìåíòàìè è ñåòêàìè.
Âîçìîæíîñòü ïîâòîðíîãî èñïîëüçîâàíèÿ
Îáñóæäåíèå âîçìîæíîñòè ïîâòîðíîãî èñïîëüçîâàíèÿ ïîêàçàëî, ÷òî ïðîöåäóðà (ýëåìåíò ôóíêöèîíàëüíîé äåêîìïîçèöèè) îáû÷íî íåäîñòàòî÷íà êàê åäèíèöà äëÿ ïîâòîðíîãî èñïîëüçîâàíèÿ.
Îòñþäà ïîÿâèëàñü èäåÿ, ÷òî â ýòîé çàäà÷å ìîäóëåì, äîñòàòî÷íî õîðîøî äîïóñêàþùèì ïîâòîðíîå
èñïîëüçîâàíèå, äîëæíà áûòü ñîâîêóïíîñòü òàêèõ îïåðàöèé. Íî åñëè ïîïûòàòüñÿ ïîíÿòü, êàêàÿ êîíöåïöèÿ âñå ýòè îïåðàöèè îáúåäèíÿåò, òî ìû îáíàðóæèì òèï îáúåêòîâ, ê êîòîðûì îíè ïðèìåíÿþòñÿ
- òàáëèöû.
Òàêèå ïðèìåðû ïîäñêàçûâàþò, ÷òî òèïû îáúåêòîâ, ïîëíîñòüþ ñíàáæåííûå ñâÿçàííûìè ñ íèìè
îïåðàöèÿìè, è áóäóò ñòàáèëüíûìè åäèíèöàìè äëÿ ïîâòîðíîãî èñïîëüçîâàíèÿ.
Ñîâìåñòèìîñòü
Äðóãîé ïîêàçàòåëü êà÷åñòâà ÏÎ, ñîâìåñòèìîñòü, áûë îïðåäåëåí êàê ëåãêîñòü, ñ êîòîðîé ïðîãðàììíûå
ïðîäóêòû (â äàííîì îáñóæäåíèè - ìîäóëè) ìîæíî êîìáèíèðîâàòü ìåæäó ñîáîé.
Åñëè ñòðóêòóðû äàííûõ íå ïðîåêòèðîâàëèñü ñ ýòîé öåëüþ, òî èìåþùèå ê íèì äîñòóï äåéñòâèÿ
êîìáèíèðîâàòü î÷åíü ñëîæíî. Ïî÷åìó áû òîãäà íå ïîïðîáîâàòü êîìáèíèðîâàòü öåëèêîì ñòðóêòóðû
äàííûõ?
Îáúåêòíî-îðèåíòèðîâàííîå êîíñòðóèðîâàíèå ÏÎ
Ó íàñ óæå íàêîïëåíî äîñòàòî÷íî îñíîâàíèé, ÷òîáû ïîïûòàòüñÿ îïðåäåëèòü ÎÎ-êîíñòðóèðîâàíèå ÏÎ.
Ýòî áóäåò ëèøü ïåðâûé íàáðîñîê, áîëåå êîíêðåòíîå îïðåäåëåíèå ïîñëåäóåò â ñëåäóþùåé ëåêöèè.
ÎÎ-êîíñòðóèðîâàíèå ÏÎ - ýòî ìåòîä ðàçðàáîòêè ÏÎ, êîòîðûé ñòðîèò àðõèòåêòóðó âñÿêîé ïðîãðàììíîé ñèñòåìû íà ìîäóëÿõ, âûâåäåííûõ èç òèïîâ îáúåêòîâ, ñ êîòîðûìè ñèñòåìà ðàáîòàåò (à íå
íà îäíîé èëè íåñêîëüêèõ ôóíêöèÿõ, êîòîðûå îíà äîëæíà ïðåäîñòàâëÿòü).
Âîïðîñû
Ïðèâåäåííîå âûøå îïðåäåëåíèå ïîñëóæèò îòïðàâíîé òî÷êîé äëÿ îáñóæäåíèÿ ÎÎ-ìåòîäà. Îíî íå
òîëüêî äàåò îòâåò íà íåêîòîðûå îòíîñÿùèåñÿ ê ÎÎ-ïðîåêòèðîâàíèþ âîïðîñû, íî è ïîáóæäàåò çàäàòü
ìíîãî íîâûõ âîïðîñîâ òàêèõ, êàê:
• Êàê íàõîäèòü ðåëåâàíòíûå òèïû îáúåêòîâ?
• Êàê îïèñûâàòü òèïû îáúåêòîâ?
• Êàê îïèñûâàòü âçàèìîîòíîøåíèÿ òèïîâ îáúåêòîâ è èõ áëèçîñòü?
• Êàê èñïîëüçîâàòü òèïû îáúåêòîâ äëÿ ñòðóêòóðèðîâàíèÿ ÏÎ?
5.3 Êëþ÷åâûå êîíöåïöèè
• Àðõèòåêòóðó ñèñòåìû ìîæíî ïîëó÷èòü èñõîäÿ èç ôóíêöèé èëè èç òèïîâ îáúåêòîâ.
• Îïèñàíèå, îñíîâàííîå íà òèïàõ îáúåêòîâ, ñ òå÷åíèåì âðåìåíè îáåñïå÷èâàåò ëó÷øóþ óñòîé÷èâîñòü è ëó÷øèå âîçìîæíîñòè äëÿ ïîâòîðíîãî èñïîëüçîâàíèÿ, ÷åì îïèñàíèå, îñíîâàííîå íà
àíàëèçå ôóíêöèé ñèñòåìû.
• Êàê ïðàâèëî, íååñòåñòâåííî ñ÷èòàòü, ÷òî çàäà÷à ñèñòåìû ñîñòîèò â ðåàëèçàöèè òîëüêî îäíîé
ôóíêöèè. Ó ðåàëüíîé ñèñòåìû îáû÷íî èìååòñÿ íå îäíà âåðøèíà è åå ëó÷øå îïèñûâàòü êàê
ñèñòåìó, ïðåäîñòàâëÿþùóþ ìíîæåñòâî óñëóã.
• Íà ðàííèõ ñòàäèÿõ ïðîåêòèðîâàíèÿ è ðàçðàáîòêè ñèñòåìû íå íóæíî óäåëÿòü ìíîãî âíèìàíèÿ
îãðàíè÷åíèÿì íà ïîðÿäîê äåéñòâèé. Ìíîãèå âðåìåííûå ñîîòíîøåíèÿ ìîãóò áûòü îïèñàíû áîëåå
àáñòðàêòíî â âèäå ëîãè÷åñêèõ îãðàíè÷åíèé.
• Ôóíêöèîíàëüíîå ïðîåêòèðîâàíèå ñâåðõó âíèç íå ïîäõîäèò äëÿ ïðîãðàììíûõ ñèñòåì ñ äîëãèì
æèçíåííûì öèêëîì, âêëþ÷àþùèì èõ èçìåíåíèÿ è ïîâòîðíîå èñïîëüçîâàíèå.
• Ïðè ÎÎ-êîíñòðóèðîâàíèè ÏÎ ñòðóêòóðà ñèñòåìû îñíîâûâàåòñÿ íà òèïàõ îáúåêòîâ, ñ êîòîðûìè
îíà ðàáîòàåò.
• Ïðè ÎÎ-ðàçðàáîòêå ïåðâîíà÷àëüíûé âîïðîñ íå â òîì, ÷òî ñèñòåìà äåëàåò, à â òîì, ñ êàêèìè òèïàìè îáúåêòîâ îíà ýòî äåëàåò. Ðåøåíèå î òîì, êàêàÿ ôóíêöèÿ ÿâëÿåòñÿ ñàìîé âåðõíåé ôóíêöèåé
ñèñòåìû (è èìååòñÿ ëè òàêîâàÿ), îòêëàäûâàåòñÿ íà ïîñëåäíèå ýòàïû ïðîöåññà ïðîåêòèðîâàíèÿ.
• ×òîáû ïðîåêòèðóåìîå ÏÎ áûëî ðàñøèðÿåìûì è äîïóñêàëî ïîâòîðíîå èñïîëüçîâàíèå, ÎÎ-êîíñòðóèðîâ
äîëæíî âûâîäèòü àðõèòåêòóðó èç äîñòàòî÷íî àáñòðàêòíûõ îïèñàíèé îáúåêòîâ.
Êîíòðîëüíûå âîïðîñû
Begin Quiz
1. Íà êàêîé îñíîâå ñëåäóåò ñòðîèòü ìîäóëü?
ïðîöåññîðîâ
îáúåêòîâ
ôóíêöèé
ñïåöèôèêàöèé
2. Ôóíêöèîíàëüíàÿ äåêîìïîçèöèÿ èìååò ñëåäóþùèå äîñòîèíñòâà
ñèñòåìà ñòðîèòñÿ íà îñíîâå õîðîøî ïîíÿòíûõ ïîñëåäîâàòåëüíûõ óòî÷íåíèé
óðîâåíü àáñòðàêöèè íà êàæäîì øàãå óòî÷íåíèÿ óìåíüøàåòñÿ
ïîçâîëÿåò ñïðàâèòüñÿ ñî ñëîæíîñòüþ èñõîäíîé çàäà÷è
âûäåëÿåò ãëàâíóþ ôóíêöèþ ñèñòåìû
3. Ôóíêöèîíàëüíàÿ äåêîìïîçèöèÿ èìååò ñëåäóþùèå îãðàíè÷åíèÿ
ðåàëüíàÿ ñèñòåìà èìååò øèðîêèé ñïåêòð ñåðâèñîâ, ñðåäè êîòîðûõ òðóäíî âûäåëèòü ãëàâíóþ
ôóíêöèþ
íå ñïîñîáñòâóåò ïîääåðæêå ðàñøèðÿåìîñòè
ïëîõî ñîãëàñóåòñÿ ñ ïðåäûäóùèìè âåðñèÿìè
íå ïîääåðæèâàåò ñàìîäîêóìåíòèðîâàíèå
4. Ïîðÿäîê âûïîëíåíèÿ ìîäóëåé íóæíî óñòàíàâëèâàòü
êàê ìîæíî ðàíüøå
êàê ìîæíî ïîçæå
ñ ïîìîùüþ ëîãè÷åñêèõ îãðàíè÷åíèé
5. ÎÎ-êîíñòðóèðîâàíèå ýòî?
ìåòîä ðàçðàáîòêè, ñòðîÿùèé àðõèòåêòóðó ïðîãðàììíîé ñèñòåìû íà ìîäóëÿõ, âûâåäåííûõ èç
òèïîâ îáúåêòîâ
ìåòîä ðàçðàáîòêè, ñòðîÿùèé àðõèòåêòóðó ïðîãðàììíîé ñèñòåìû íà ôóíêöèÿõ, êîòîðûå ýòà
ñèñòåìà ðåàëèçóåò
ìåòîä ðàçðàáîòêè, â êîòîðîì ôóíêöèè ïîä÷èíåíû îáúåêòàì
ìåòîä ðàçðàáîòêè, â êîòîðîì îáúåêòû ïîä÷èíåíû ôóíêöèÿì
6. Ïðîåêòèðîâàíèå èíòåðôåéñà ïîëüçîâàòåëÿ
äîëæíî âûïîëíÿòüñÿ íà ñàìûõ ðàííèõ ýòàïàõ ÎÎ-ïðîåêòèðîâàíèÿ
äîëæíî âûïîëíÿòüñÿ íà ïîçäíèõ ýòàïàõ ÎÎ-ïðîåêòèðîâàíèÿ
â ïðîöåññå ïðîåêòèðîâàíèÿ êàæäîãî êëàññà
ïîñëå çàâåðøåíèÿ ïðîåêòèðîâàíèÿ îñíîâíûõ êëàññîâ
7. Ôóíêöèîíàëüíàÿ äåêîìïîçèöèÿ ïðè ïðîåêòèðîâàíèè ñâåðõó-âíèç
îáåñïå÷èâàåò õîðîøåå ñîîòâåòñòâèå ïðîåêòà åãî íà÷àëüíîé ñïåöèôèêàöèè
ñïîñîáñòâóåò ïîâòîðíîìó èñïîëüçîâàíèþ
çàòðóäíÿåò ñâÿçü ñ ïðåäûäóùèìè âåðñèÿìè ïðîåêòà
îáëåã÷àåò ïîíèìàíèå êàæäîãî øàãà äåêîìïîçèöèè
8. Ïðè ïðîåêòèðîâàíèè ñèñòåìû òèïîâ ìîæíî èñïîëüçîâàòü?
ïîâòîðíî èñïîëüçóåìûå îáúåêòû
îáúåêòû ôèçè÷åñêîé ðåàëüíîñòè, ê êîòîðîé ïðèìåíÿåòñÿ ÏÎ
îáúåêòû, îïèñàííûå â ëèòåðàòóðå
îáúåêòû ñîëíå÷íîé ñèñòåìû
9. Äåâèç ÎÎ-ðàçðàáîòêè
íå ñïðàøèâàé âíà÷àëå, êòî â ñèñòåìå ýòî äåëàåò; ñïðîñè, ÷òî ñèñòåìà äåëàåò
íå ñïðàøèâàé âíà÷àëå, êòî â ñèñòåìå ýòî äåëàåò; ñïðîñè, çà÷åì îí ýòî äåëàåò
íå ñïðàøèâàé âíà÷àëå, ÷òî ñèñòåìà äåëàåò; ñïðîñè, êòî â ñèñòåìå ýòî äåëàåò
íå ñïðàøèâàé âíà÷àëå, ÷òî ñèñòåìà äåëàåò; ñïðîñè, íàñêîëüêî õîðîøî îíà ýòî äåëàåò
10. Ãëàâíàÿ ôóíêöèÿ ïðîåêòà
íàèáîëåå ñòàáèëüíàÿ è íåèçìåííàÿ ÷àñòü ïðîåêòà
ìîæåò ìåíÿòüñÿ â ïðîöåññå ðàçðàáîòêè
ó ïðîåêòà ìîæåò âîîáùå íå ñóùåñòâîâàòü ãëàâíîé ôóíêöèè
ïðîåêò ìîæåò èìåòü íåñêîëüêî ãëàâíûõ ôóíêöèé
11. Ãëàâíûé âîïðîñ, êîòîðûé ñëåäóåò çàäàâàòü ïðè ïðîåêòèðîâàíèè ñèñòåìû - ýòî?
÷òî çà ôóíêöèè âûïîëíÿåò ñèñòåìà
êòî âûïîëíÿåò ôóíêöèè ñèñòåìû
çà÷åì âûïîëíÿòü ôóíêöèè ñèñòåìû
êàêîâà ñòîèìîñòü âûïîëíåíèÿ ôóíêöèé ñèñòåìû
12. Ïðè îïèñàíèè òèïîâ îáúåêòîâ ñëåäóåò ðóêîâîäñòâîâàòüñÿ òðåáîâàíèÿìè
íåçàâèñèìîñòè îïèñàíèé îò ñïåöèôèêàöèé
íåçàâèñèìîñòè îïèñàíèé îò ïðåäñòàâëåíèé
ïåðâîî÷åðåäíîãî çàäàíèÿ ñòðóêòóðû äàííûõ
íàõîæäåíèÿ äëÿ îïèñàíèÿ ôóíêöèé ïîäõîäÿùåãî ìåñòà â àðõèòåêòóðå ñèñòåìû
13. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
ïîäõîä ñâåðõó-âíèç õîðîøî ïîäõîäèò äëÿ îïèñàíèÿ ðàçðàáîòêè
ïðè ÎÎ-ïîäõîäå ïðîåêòèðóþòñÿ îáúåêòû è íå ðàññìàòðèâàþòñÿ ôóíêöèè
ïðè ïðîåêòèðîâàíèè ìîäóëüíîé ñòðóêòóðû îáúåêòû ñòàáèëüíåå ôóíêöèé
àðõèòåêòóðó ñèñòåìû ìîæíî ïîëó÷èòü èñõîäÿ èç ôóíêöèé èëè èç òèïîâ îáúåêòîâ
14. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
âû÷èñëåíèå âêëþ÷àåò òðè âèäà èíãðåäèåíòîâ: ïîòîêè óïðàâëåíèÿ, ôóíêöèè è äàííûå
íà ðàííèõ ñòàäèÿõ ïðîåêòèðîâàíèÿ è ðàçðàáîòêè ñèñòåìû íóæíî óäåëÿòü ìíîãî âíèìàíèÿ
îãðàíè÷åíèÿì íà ïîðÿäîê äåéñòâèé
åñòåñòâåííî ñ÷èòàòü, ÷òî çàäà÷à ñèñòåìû ñîñòîèò â ðåàëèçàöèè òîëüêî îäíîé ôóíêöèè
ìåæäó òèïàìè îáúåêòîâ ìîãóò ñóùåñòâîâàòü äâà âèäà îòíîøåíèé: áûòü êëèåíòîì è íàñëåäîâàíèå
15. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
â êëàññè÷åñêîé îáúåêòíîé òåõíîëîãèè èìåþòñÿ òîëüêî äâà îòíîøåíèÿ ìåæäó òèïàìè îáúåêòîâ:
áûòü êëèåíòîì è áûòü íàñëåäíèêîì
îòíîøåíèå íàñëåäîâàíèÿ ïîêðûâàåò ìíîãî÷èñëåííûå ôîðìû ñïåöèàëèçàöèè
îïèñàíèå, îñíîâàííîå íà àíàëèçå ôóíêöèé ñèñòåìû ñ òå÷åíèåì âðåìåíè îáåñïå÷èâàåò ëó÷øóþ
óñòîé÷èâîñòü è ëó÷øèå âîçìîæíîñòè äëÿ ïîâòîðíîãî èñïîëüçîâàíèÿ, ÷åì îïèñàíèå, îñíîâàííîå
íà òèïàõ îáúåêòîâ
ôóíêöèîíàëüíîå ïðîåêòèðîâàíèå ñâåðõó âíèç íå ïîäõîäèò äëÿ ïðîãðàììíûõ ñèñòåì ñ äîëãèì
æèçíåííûì öèêëîì, âêëþ÷àþùèì èõ èçìåíåíèÿ è ïîâòîðíîå èñïîëüçîâàíèå
End Quiz
Íàáðàíî áàëëîâ
6 Àáñòðàêòíûå òèïû äàííûõ (ÀÒÄ)
×òîáû îáúåêòû èãðàëè ëèäèðóþùóþ ðîëü â àðõèòåêòóðå ÏÎ, íóæíî èõ àäåêâàòíî îïèñûâàòü. Â ýòîé
ëåêöèè ïîêàçûâàåòñÿ, êàê ýòî äåëàòü.
Ýòî îòêðûëî ìíå ãëàçà, ÿ íà÷àë ïîíèìàòü, ÷òî çíà÷èò èñïîëüçîâàòü èíñòðóìåíò, íàçûâàåìûé àëãåáðîé. ×åðò âîçüìè, íèêòî íèêîãäà íå ãîâîðèë ìíå íè÷åãî ïîäîáíîãî ðàíüøå. Ìñüå Äþïþè
[ó÷èòåëü ìàòåìàòèêè] ïðîèçíîñèë íàïûùåííûå ôðàçû îá ýòîì ïðåäìåòå, íî íè ðàçó íå ñêàçàë
ýòèõ ïðîñòûõ ñëîâ: ýòî ðàçäåëåíèå òðóäà, êîòîðîå, êàê è âñÿêîå äðóãîå ðàçäåëåíèå òðóäà ïðîèçâîäèò ÷óäåñà è ïîçâîëÿåò óìó ñêîíöåíòðèðîâàòü âñå ñâîè ñèëû òîëüêî íà îäíîé ñòîðîíå îáúåêòîâ,
òîëüêî íà îäíîì èç èõ êà÷åñòâ.
Íàñêîëüêî äðóãèì ýòî ïðåäñòàëî áû ïåðåä íàìè, åñëè áû ìñüå Äþïþè ñêàçàë íàì: "Ýòîò ñûð
ìÿãêèé èëè òâåðäûé, îí áåëûé, îí ñèíèé, îí ñòàðûé, îí ìîëîäîé, îí òâîé, îí ìîé, îí ëåãêèé èëè
îí òÿæåëûé. Èç âñåõ åãî ìíîãî÷èñëåííûõ êà÷åñòâ äàâàéòå ðàññìàòðèâàòü òîëüêî âåñ. Êàêèì íè
áûë ýòîò âåñ, äàâàéòå íàçîâåì åãî A. À òåïåðü, íå äóìàÿ áîëüøå î âåñå, äàâàéòå ïðèìåíÿòü ê À
âñå, ÷òî ìû çíàåì î êîëè÷åñòâå."
Òàêàÿ ïðîñòàÿ âåùü, íî äî ñèõ ïîð íèêòî íå ãîâîðèë íàì î íåé â ýòîé îòäàëåííîé ïðîâèíöèè...
Ñòåíäàëü, "Æèçíü Àíðè Áðþëàðà"
6.1 Êðèòåðèè
×òîáû ïîëó÷èòü íàäëåæàùèå îïèñàíèÿ îáúåêòîâ, íàø ìåòîä äîëæåí óäîâëåòâîðÿòü òðåì óñëîâèÿì:
• Îïèñàíèÿ äîëæíû áûòü òî÷íûìè è íåäâóñìûñëåííûìè.
• Îíè äîëæíû áûòü ïîëíûìè - èëè, ïî êðàéíåé ìåðå, èìåòü â êàæäîì êîíêðåòíîì ñëó÷àå íóæíóþ
íàì ïîëíîòó (íåêîòîðûå äåòàëè ìîæíî íàìåðåííî îïóñêàòü).
• Îíè íå äîëæíû áûòü èçëèøíå ñïåöèôèöèðîâàíû.
Ïîñëåäíèé ïóíêò äåëàåò îòâåò íåòðèâèàëüíûì.  êîíöå êîíöîâ, ëåãêî ñäåëàòü îïèñàíèå òî÷íûì,
íåäâóñìûñëåííûì è ïîëíûì, åñëè ìû ãîòîâû "âûäàòü âñå ñåêðåòû óêàçàâ âñå äåòàëè îáúåêòíîãî
ïðåäñòàâëåíèÿ. Íî òàêîå îïèñàíèå, êàê ïðàâèëî, áóäåò âêëþ÷àòü ÷åðåñ÷óð ìíîãî èíôîðìàöèè äëÿ
àâòîðîâ ïðîãðàìì, êîòîðûì òðåáóåòñÿ äîñòóï ê òàêèì îáúåêòàì.
Ýòî çàìå÷àíèÿ ïîõîæè íà êîììåíòàðèè, êîòîðûå ïðèâåëè ê ïîíÿòèþ ñêðûòèÿ èíôîðìàöèè. Òàì
äåëî áûëî â òîì, ÷òî, ïðåäîñòàâëÿÿ â êà÷åñòâå ïåðâè÷íîãî èñòî÷íèêà èíôîðìàöèè èñõîäíûé êîä
ìîäóëÿ (ýëåìåíòû, ñâÿçàííûå ñ ðåàëèçàöèåé) àâòîðàì êëèåíòñêèõ ïðîãðàìì, çàâèñÿùèõ îò ýòîãî
ìîäóëÿ, ìû ìîæåì îêóíóòü èõ â ïîòîê äåòàëåé, êîòîðûé ïîìåøàåò èì ñîñðåäîòî÷èòüñÿ íà ñâîåé
ñîáñòâåííîé ðàáîòå è çàòðóäíèò ïåðñïåêòèâó ðàçâèòèÿ ïðîåêòà. Çäåñü íàñ îæèäàåò òà æå îïàñíîñòü,
÷òî è â ñëó÷àå, êîãäà ìû ïîçâîëÿåì ìîäóëÿì èñïîëüçîâàòü íåêîòîðóþ ñòðóêòóðó äàííûõ íà îñíîâàíèè èíôîðìàöèè, êîòîðàÿ îòíîñèòñÿ ê ïðåäñòàâëåíèþ ýòîé ñòðóêòóðû, à íå ê åå ñóùåñòâåííûì
ñâîéñòâàì.
Ðàçëè÷íûå ðåàëèçàöèè
×òîáû ëó÷øå ïîíÿòü âñþ âàæíîñòü îïèñàíèé àáñòðàêòíûõ òèïîâ äàííûõ, èññëåäóåì ãëóáæå ïîòåíöèàëüíûå ïîñëåäñòâèÿ èñïîëüçîâàíèÿ ôèçè÷åñêîé ðåàëèçàöèè â êà÷åñòâå îñíîâû îïèñàíèÿ îáúåêòîâ.
Óäîáíûì è õîðîøî èçó÷åííûì ïðèìåðîì ÿâëÿåòñÿ îïèñàíèå îáúåêòîâ òèïà ñòåê. Îáúåêò ñòåê
ñëóæèò äëÿ òîãî, ÷òîáû íàêàïëèâàòü è äîñòàâàòü äðóãèå îáúåêòû â ðåæèìå "ïîñëåäíèì ïðèøåë ïåðâûì óøåë"("LIFO"), ýëåìåíò, âñòàâëåííûé â ñòåê ïîñëåäíèì, áóäåò èçâëå÷åí èç íåãî ïåðâûì.
Ñòåê ïîâñåìåñòíî èñïîëüçóåòñÿ â èíôîðìàòèêå è âî ìíîãèõ ïðîãðàììíûõ ñèñòåìàõ, â ÷àñòíîñòè,
êîìïèëÿòîðû è èíòåðïðåòàòîðû óñûïàíû ðàçíûìè âèäàìè ñòåêîâ.
Ïðåäñòàâëåíèÿ ñòåêîâ
Ñóùåñòâóåò íåñêîëüêî ôèçè÷åñêèõ ïðåäñòàâëåíèé ñòåêîâ:
Ýòîò ðèñóíîê èëëþñòðèðóåò òðè íàèáîëåå ïîïóëÿðíûõ ïðåäñòàâëåíèÿ ñòåêîâ. Äëÿ óäîáñòâà ññûëîê
äàäèì êàæäîìó èç íèõ ñâîå èìÿ:
ÌÀÑÑÈÂ_ÂÂÅÐÕ ïðåäñòàâëÿåò ñòåê ïîñðåäñòâîì ìàññèâà representation è öåëîãî ÷èñëà count,
ñ äèàïàçîíîì çíà÷åíèé îò 0 (äëÿ ïóñòîãî ñòåêà) äî capacity - ðàçìåðà ìàññèâà representation,
ýëåìåíòû ñòåêà õðàíÿòñÿ â ìàññèâå è èíäåêñèðóþòñÿ îò 1 äî count.
ÌÀÑÑÈÂ_ÂÍÈÇ ïîõîæ íà ÌÀÑÑÈÂ_ÂÂÅÐÕ, íî ýëåìåíòû ïîìåùàþòñÿ â êîíåö ñòåêà, à íå â
íà÷àëî. Çäåñü ÷èñëî, íàçûâàåìîå free, ÿâëÿåòñÿ èíäåêñîì âåðõíåé ñâîáîäíîé ïîçèöèè â ñòåêå
èëè 0, åñëè âñå ïîçèöèè â ìàññèâå çàíÿòû è èçìåíÿåòñÿ â äèàïàçîíå îò capacity äëÿ ïóñòîãî
ñòåêà äî 0 äëÿ çàïîëíåííîãî. Ýëåìåíòû ñòåêà õðàíÿòñÿ â ìàññèâå è èíäåêñèðóþòñÿ îò capacity
äî free+1.
ÑÏÈÑÎ×ÍÎÅ ïðè ñïèñî÷íîì ïðåäñòàâëåíèè êàæäûé ýëåìåíò ñòåêà õðàíèòñÿ â ÿ÷åéêå ñ äâóìÿ ïîëÿìè: item, ñîäåðæàùåì ñàì ýëåìåíò, è previous, ñîäåðæàùåì óêàçàòåëü íà ÿ÷åéêó ñ ïðåäûäóùèì ýëåìåíòîì. Äëÿ ýòîãî ïðåäñòàâëåíèÿ íóæåí òàêæå óêàçàòåëü last íà ÿ÷åéêó, ñîäåðæàùóþ
âåðøèíó ñòåêà.
Ðèñ. 6.1: Òðè âîçìîæíûõ ïðåäñòàâëåíèÿ ñòåêîâ
Äëÿ ïðåäñòàâëåíèé ñ ïîìîùüþ ìàññèâîâ ÌÀÑÑÈÂ_ÂÂÅÐÕ è ÌÀÑÑÈÂ_ÂÍÈÇ êîìàíäû óâåëè÷èâàþò èëè óìåíüøàþò óêàçàòåëü íà âåðøèíó (count èëè free) è ïðèñâàèâàþò x ñîîòâåòñòâóþùåìó
ýëåìåíòó ìàññèâà. Òàê êàê ýòè ïðåäñòàâëåíèÿ ïîääåðæèâàþò ñòåêè ñ íå áîëåå ÷åì capacity ýëåìåíòàìè, òî êîððåêòíûå ðåàëèçàöèè äîëæíû ñîäåðæàòü çàùèùàþùèå îò ïåðåïîëíåíèÿ òåñòû ñîîòâåòñòâóþùåãî âèäà:
if count " capacity then ...
if free " 0 then ...,
(íà ðèñóíêå îíè äëÿ ïðîñòîòû îïóùåíû).
Äëÿ ïðåäñòàâëåíèÿ ÑÏÈÑÎ×ÍÎÅ âòàëêèâàíèå ýëåìåíòà òðåáóåò ÷åòûðåõ äåéñòâèé:
• ñîçäàíèÿ íîâîé ÿ÷åéêè n (çäåñü îíî âûïîëíÿåòñÿ ñ ïîìîùüþ ïðîöåäóðû Ïàñêàëÿ new, êîòîðàÿ
âûäåëÿåò ïàìÿòü äëÿ íîâîãî îáúåêòà);
• ïðèñâàèâàíèÿ x ïîëþ item íîâîé ÿ÷åéêè;
• ïðèñîåäèíåíèÿ íîâîé ÿ÷åéêè ê âåðøèíå ñòåêà ïóòåì ïðèñâîåíèÿ åå ïîëþ previous òåêóùåãî
çíà÷åíèÿ óêàçàòåëÿ last;
• èçìåíåíèÿ last òàê, ÷òîáû îí ññûëàëñÿ íà òîëüêî ÷òî ñîçäàííóþ ÿ÷åéêó.
Õîòÿ ýòè ïðåäñòàâëåíèÿ âñòðå÷àþòñÿ ÷àùå âñåãî, ñóùåñòâóåò è ìíîãî äðóãèõ ïðåäñòàâëåíèé ñòåêîâ.
Íàïðèìåð, åñëè âàì íóæíû äâà ñòåêà ñ îäíîòèïíûìè ýëåìåíòàìè è ïàìÿòü äëÿ èõ ïðåäñòàâëåíèÿ
îãðàíè÷åíà, òî ìîæíî èñïîëüçîâàòü îäèí ìàññèâ ñ äâóìÿ ìåòêàìè âåðøèí count êàê â ïðåäñòàâëåíèè
ÌÀÑÑÈÂ_ÂÂÅÐÕ è free êàê â ÌÀÑÑÈÂ_ÂÍÈÇ. Ïðè ýòîì îäèí ñòåê áóäåò ðàñòè ââåðõ, à äðóãîé
- âíèç. Óñëîâèåì ïîëíîãî çàïîëíåíèÿ ýòîãî ïðåäñòàâëåíèÿ ÿâëÿåòñÿ ðàâåíñòâî count=
free.
Ðèñ. 6.2: Ïðåäñòàâëåíèå äâóõ ñòåêîâ ëèöîì ê ëèöó
Ïðåèìóùåñòâî òàêîãî ïðåäñòàâëåíèÿ ñîñòîèò â óìåíüøåíèè ðèñêà ïåðåïîëíèòü ïàìÿòü: ïðè äâóõ
n, ïðåäñòàâëÿþùèõ ñòåêè ñïîñîáîì ÌÀÑÑÈÂ_ÂÂÅÐÕ èëè ÌÀÑÑÈÂ_ÂÍÈÇ,
ïàìÿòü èñ÷åðïàåòñÿ, êàê òîëüêî ëþáîé èç ñòåêîâ äîñòèãíåò n ýëåìåíòîâ. À â ñëó÷àå îäíîãî ìàññèâà
ðàçìåðà 2n, ñîäåðæàùåãî äâà ñòåêà ëèöîì ê ëèöó, ðàáîòà ïðîäîëæàåòñÿ äî òåõ ïîð, ïîêà èõ îáùàÿ
äëèíà íå ïðåâûñèò 2n, ÷òî ìåíåå âåðîÿòíî, åñëè ñòåêè ðàñòóò íåçàâèñèìî äðóã îò äðóãà.
ìàññèâàõ ðàçìåðà
Êàæäîå èç ýòèõ è äðóãèå âîçìîæíûå ïðåäñòàâëåíèÿ ïîëåçíû â ðàçíûõ ñèòóàöèÿõ. Âûáîð îäíîãî
èç íèõ â êà÷åñòâå ýòàëîíà äëÿ îïðåäåëåíèÿ ñòåêà áûë áû òèïè÷íûì ïðèìåðîì èçëèøíåé ñïåöèôèêàöèè. Ïî÷åìó ìû äîëæíû, íàïðèìåð, ïðåäïî÷åñòü ÌÀÑÑÈÂ_ÂÂÅÐÕ ïðåäñòàâëåíèþ ÑÏÈÑÎ×ÍÎÅ?
Áîëüøèíñòâî âèäèìûõ ñâîéñòâ ïðåäñòàâëåíèÿ ÌÀÑÑÈÂ_ÂÂÅÐÕ - ìàññèâ, ÷èñëî count, âåðõíÿÿ
ãðàíèöà - íåñóùåñòâåííû äëÿ ïîíèìàíèÿ ïðåäñòàâëÿåìîé èìè ñòðóêòóðû.
Îïàñíîñòü èçëèøíåé ñïåöèôèêàöèè
Ïî÷åìó òàê ïëîõî èñïîëüçîâàòü êîíêðåòíîå ïðåäñòàâëåíèå â êà÷åñòâå ñïåöèôèêàöèè?
Ìîæíî íàïîìíèòü ðåçóëüòàòû èçó÷åíèÿ Ëèíöåì (Lientz) è Ñâåíñîíîì (Swanson) ñòîèìîñòè ñîïðîâîæäåíèÿ. Áûëî óñòàíîâëåíî, ÷òî áîëåå 17% ñòîèìîñòè ÏÎ ïðèõîäèòñÿ íà èçìåíåíèÿ â ôîðìàòàõ
äàííûõ. ßñíî, ÷òî ìåòîä, êîòîðûé ñòàâèò àíàëèç è ïðîåêòèðîâàíèå â çàâèñèìîñòü îò ôèçè÷åñêîãî
ïðåäñòàâëåíèÿ ñòðóêòóð äàííûõ, íå îáåñïå÷èò ðàçðàáîòêó äîñòàòî÷íî ãèáêîãî ÏÎ.
Ïîýòîìó ïðè èñïîëüçîâàíèè îáúåêòîâ èëè òèïîâ îáúåêòîâ â êà÷åñòâå îñíîâû äëÿ àðõèòåêòóðû
ñèñòåìû òðåáóåòñÿ íàéòè ëó÷øèé ñïîñîá îïèñàíèÿ, ÷åì êîíêðåòíîå ïðåäñòàâëåíèå.
6.2 Ê àáñòðàêòíîìó âçãëÿäó íà îáúåêòû
Êàê íàì ñîõðàíèòü ïîëíîòó, òî÷íîñòü è îäíîçíà÷íîñòü, íå çàïëàòèâ çà ýòî èçëèøíåé ñïåöèôèêàöèåé?
Èñïîëüçîâàíèå îïåðàöèé
Ïðåäñòàâëåíèÿ ñòåêà ïðè âñåõ èõ ðàçëè÷èÿõ îáúåäèíÿåò òî, ÷òî îíè îïèñûâàþò ñòðóêòóðó "õðàíåíèÿ"(ò.å. ñòðóêòóðó, èñïîëüçóåìóþ äëÿ õðàíåíèÿ äðóãèõ îáúåêòîâ), ê êîòîðîé ïðèìåíÿþòñÿ îïðåäåëåííûå îïåðàöèè, îáëàäàþùèå îïðåäåëåííûìè ñâîéñòâàìè. Ñîñðåäîòî÷èâøèñü íå íà âûáîðå êîíêðåòíîãî ïðåäñòàâëåíèÿ ñòðóêòóðû, à íà ýòèõ îïåðàöèÿõ è ñâîéñòâàõ, ìîæíî ïîëó÷èòü äîñòàòî÷íî
àáñòðàêòíîå, íî, òåì íå ìåíåå, ïîëåçíîå, îïèñàíèå ïîíÿòèÿ ñòåê.
Îáû÷íî äëÿ ñòåêîâ ðàññìàòðèâàþòñÿ ñëåäóþùèå îïåðàöèè:
• Êîìàíäà âòàëêèâàíèÿ íåêîòîðîãî ýëåìåíòà íà âåðøèíó ñòåêà. Íàçîâåì ýòó îïåðàöèþ put.
• Êîìàíäà óäàëåíèÿ âåðõíåãî ýëåìåíòà ñòåêà. Íàçîâåì åå remove.
Òàáëèöà 6.1: Èìåíà îïåðàöèé íàä ñòåêîì
Ñòàíäàðòíîå èìÿ îïåðàöèè íàä ñòåêîì
Èìÿ, èñïîëüçóåìîå çäåñü
Push (âòîëêíóòü)
Put (ïîìåñòèòü)
Pop (âûòîëêíóòü)
Remove (óäàëèòü)
Top (âåðøèíà)
Item (ýëåìåíò)
New (íîâûé)
Make (ñîçäàòü)
• Çàïðîñ ýëåìåíòà, íàõîäÿùåãîñÿ íà âåðøèíå ñòåêà (åñëè ñòåê íå ïóñò). Íàçîâåì åãî item.
• Çàïðîñ íà ïðîâåðêó ïóñòîòû ñòåêà. (Îí ïîçâîëèò êëèåíòàì çàðàíåå ïðîâåðèòü âîçìîæíîñòü
îïåðàöèé remove è item.)
Êðîìå òîãî, íàì ïîíàäîáèòñÿ îïåðàöèÿ-êîíñòðóêòîð äëÿ ñîçäàíèÿ ïóñòîãî ñòåêà. Íàçîâåì åå make.
×òîáû ñäåëàòü ãëàâíûé øàã â íàïðàâëåíèè àáñòðàêöèè äàííûõ, íóæíî ñòàòü íà ïðîòèâîïîëîæíóþ
òî÷êó çðåíèÿ: çàáûòü íà íåêîòîðîå âðåìÿ î êîíêðåòíîì ïðåäñòàâëåíèè è âçÿòü â êà÷åñòâå îïðåäåëåíèÿ ñòðóêòóðû äàííûõ îïåðàöèè ñàìè ïî ñåáå. Èíà÷å ãîâîðÿ, ñòåê - ýòî ëþáàÿ ñòðóêòóðà, ê êîòîðîé
êëèåíòû ìîãóò ïðèìåíÿòü ïåðå÷èñëåííûå âûøå îïåðàöèè.
Ñîãëàñîâàííîñòü èìåí
Çà÷åì èñïîëüçîâàòü òåðìèíîëîãèþ, îòëè÷àþùóþñÿ îò îáùåïðèíÿòîé? Ïðè÷èíà - â æåëàíèè äîñòè÷ü
áîëåå âûñîêîãî óðîâíÿ ïîíèìàíèÿ ñòðóêòóð äàííûõ - îñîáåííî "êîíòåéíåðîâ êîòîðûå èñïîëüçóþòñÿ
äëÿ õðàíåíèÿ îáúåêòîâ.
Ñòåêè ýòî ïðîñòî îäèí èç âèäîâ êîíòåéíåðîâ, òî÷íåå îíè îòíîñÿòñÿ ê êàòåãîðèè êîíòåéíåðîâ,
êîòîðûå ìîæíî íàçâàòü ðàñïðåäåëèòåëÿìè. Ðàñïðåäåëèòåëü ïðåäîñòàâëÿåò ñâîèì êëèåíòàì ìåõàíèçì
äëÿ õðàíåíèÿ (put), èçâëå÷åíèÿ (item) è óäàëåíèÿ (remove) îáúåêòîâ, íî íå äàåò èì âîçìîæíîñòè
óïðàâëÿòü òåì, êàêîé îáúåêò áóäåò èçâëåêàòüñÿ èëè óäàëÿòüñÿ. Íàïðèìåð, ìåòîä äîñòóïà LIFO,
èñïîëüçóåìûé â ñòåêàõ, ïîçâîëÿåò èçâëåêàòü èëè óäàëÿòü òîëüêî òîò ýëåìåíò, êîòîðûé áûë ñîõðàíåí
ïîñëåäíèì. Äðóãîé âèä ðàñïðåäåëèòåëåé - î÷åðåäü, êîòîðàÿ èñïîëüçóåò ìåòîä äîñòóïà "ïåðâûì â,
ïåðâûì èç"(FIFO): ýëåìåíòû äîáàâëÿþòñÿ â îäèí êîíåö î÷åðåäè, à èçâëåêàþòñÿ è óäàëÿþòñÿ - ñ
äðóãîãî êîíöà. Ïðèìåð êîíòåéíåðà, íå ÿâëÿþùåãîñÿ ðàñïðåäåëèòåëåì, - ýòî ìàññèâ, â íåì âû ñàìè
âûáèðàåòå öåëî÷èñëåííûå íîìåðà ïîçèöèé, â êîòîðûå âñòàâëÿþòñÿ èëè èç êîòîðûõ èçâëåêàþòñÿ
îáúåêòû.
Ïîñêîëüêó ñõîæåñòü ðàçíûõ âèäîâ êîíòåéíåðîâ (ðàñïðåäåëèòåëåé, ìàññèâîâ è ò.ï.) áîëåå âàæíà,
÷åì ðàçëè÷èÿ ìåæäó òåì, êàê îíè õðàíÿò, èçâëåêàþò èëè óäàëÿþò îáúåêòû, ýòà êíèãà òâåðäî ïðèäåðæèâàåòñÿ ñòàíäàðòèçîâàííîé òåðìèíîëîãèè, êîòîðàÿ ñãëàæèâàåò ðàçëè÷èÿ ìåæäó âàðèàíòàìè
ñòðóêòóð äàííûõ è, íàîáîðîò, ïîä÷åðêèâàåò èõ îáùíîñòü. Ïîýòîìó áàçèñíàÿ îïåðàöèÿ èçâëå÷åíèÿ
ýëåìåíòà áóäåò âñåãäà íàçûâàòüñÿ item, áàçèñíàÿ îïåðàöèÿ óäàëåíèÿ ýëåìåíòà áóäåò âñåãäà íàçûâàòüñÿ remove, è ò.ä.
Ôîðìàëèçàöèÿ ñïåöèôèêàöèé
Ïðèâåäåííûå ñîäåðæàòåëüíûå îïèñàíèÿ ÿâíî íåäîñòàòî÷íû - put âòàëêèâàåò ýëåìåíò íà "âåðøèíó"ñòåêà, remove âûòàëêèâàåò ýëåìåíò, íàõîäÿùèéñÿ íà âåðøèíå. Íàì íóæíî òî÷íî çíàòü, êàê êëèåíòû ìîãóò èñïîëüçîâàòü ýòè îïåðàöèè è ÷òî îíè äëÿ ýòîãî äîëæíû äåëàòü.
Ñïåöèôèêàöèÿ ÀÒÄ ïðåäîñòàâèò ýòó èíôîðìàöèþ. Îíà ñîñòîèò èç ÷åòûðåõ ðàçäåëîâ, ðàçúÿñíÿåìûõ â ñëåäóþùèõ ðàçäåëàõ:
• ÒÈÏÛ
• ÔÓÍÊÖÈÈ
• ÀÊÑÈÎÌÛ
• ÏÐÅÄÓÑËÎÂÈß
Äëÿ ñïåöèôèêàöèè ÀÒÄ â ýòèõ ðàçäåëàõ áóäóò èñïîëüçîâàòüñÿ ïðîñòàÿ ìàòåìàòè÷åñêàÿ íîòàöèÿ.
Ñïåöèôèöèðîâàíèå òèïîâ
 ðàçäåëå ÒÈÏÛ óêàçûâàþòñÿ ñïåöèôèöèðóåìûå òèïû.  îáùåì ñëó÷àå, ìîæåò îêàçàòüñÿ óäîáíûì
îïðåäåëÿòü îäíîâðåìåííî íåñêîëüêî ÀÒÄ, õîòÿ â íàøåì ïðèìåðå èìååòñÿ ëèøü îäèí òèï STACK(ÑÒÅÊ).
Ìåæäó ïðî÷èì, ÷òî òàêîå òèï? Îòâåò íà ýòîò âîïðîñ îáúåäèíèò âñå ïîëîæåíèÿ, ðàçâèâàåìûå äàëåå â
ýòîé ëåêöèè: òèï - ýòî ñîâîêóïíîñòü îáúåêòîâ, õàðàêòåðèçóåìàÿ ôóíêöèÿìè, àêñèîìàìè è ïðåäóñëîâèÿìè. Íå áóäåò áîëüøîé îøèáêîé ðàññìàòðèâàòü ïîêà òèï êàê ìíîæåñòâî îáúåêòîâ â ìàòåìàòè÷åñêîì ñìûñëå ñëîâà "ìíîæåñòâî òèï STACK êàê ìíîæåñòâî âñåõ âîçìîæíûõ ñòåêîâ, òèï INTEGER
êàê ìíîæåñòâî âñåõ öåëûõ ÷èñåë è ò.ä.
Îäíàêî ïðè ýòîì íå äîëæíî áûòü íèêàêîé ïóòàíèöû: ÀÒÄ, òàêîé êàê STACK, - ýòî íå îáúåêò (îäèí
êîíêðåòíûé ñòåê), à ñîâîêóïíîñòü îáúåêòîâ (ìíîæåñòâî âñåõ ñòåêîâ). Íàïîìíèì, â ÷åì ñîñòîèò íàøà
ãëàâíàÿ öåëü: íàéòè ïîäõîäÿùóþ îñíîâó äëÿ ìîäóëåé íàøèõ ïðîãðàììíîé ñèñòåì. Î÷åâèäíî, íå
èìååò ñìûñëà äåëàòü îñíîâîé äëÿ ìîäóëÿ îäèí êîíêðåòíûé îáúåêò - îäèí ñòåê, îäèí ñàìîëåò, îäèí
ñ÷åò â áàíêå. ÎÎ-ïðîåêòèðîâàíèå äàñò íàì âîçìîæíîñòü ñòðîèòü ìîäóëè, îòðàæàþùèå ñâîéñòâà âñåõ
ñòåêîâ, âñåõ ñàìîëåòîâ, âñåõ áàíêîâñêèõ ñ÷åòîâ, èëè, ïî êðàéíåé ìåðå, çíà÷èòåëüíîé èõ ÷àñòè.
Îáúåêò, ïðèíàäëåæàùèé ìíîæåñòâó îáúåêòîâ, îïèñûâàåìûõ ñïåöèôèêàöèåé ÀÒÄ, íàçûâàåòñÿ ýêçåìïëÿðîì ýòîãî ÀÒÄ. Íàïðèìåð, êîíêðåòíûé ñòåê, îáëàäàþùèé ñâîéñòâàìè àáñòðàêòíîãî òèïà
äàííûõ STACK, áóäåò ýêçåìïëÿðîì ÀÒÄ STACK. Ïîíÿòèå ýêçåìïëÿðà ïðîõîäèò ÷åðåç âñå ÎÎïðîåêòèðîâàíèå è ïðîãðàììèðîâàíèå, è áóäåò èãðàòü âàæíóþ ðîëü â îáúÿñíåíèè ïîâåäåíèÿ ïðîãðàìì
âî âðåìÿ èñïîëíåíèÿ.
 ðàçäåëå ÒÈÏÛ ïðîñòî ïåðå÷èñëÿþòñÿ òèïû, ââîäèìûå â äàííîé ñïåöèôèêàöèè. Çäåñü:
• Òèïû
STACK[G]
Òàêèì îáðàçîì, íàøà ñïåöèôèêàöèÿ îòíîñèòñÿ ê îäíîìó àáñòðàêòíîìó òèïó äàííûõ - STACK, çàäàþùåìó ñòåêè îáúåêòîâ ïðîèçâîëüíîãî òèïà G.
Óíèâåðñàëèçàöèÿ (Genericity)
 îïèñàíèè STACK[G] èìåíåì G îáîçíà÷åí ïðîèçâîëüíûé, íå îïðåäåëÿåìûé òèï. G íàçûâàåòñÿ ôîðìàëüíûì ðîäîâûì ïàðàìåòðîì äëÿ òèïîâ ýëåìåíòîâ ÀÒÄ STACK, à ñàì STACK íàçûâàåòñÿ ðîäîâûì
èëè óíèâåðñàëüíûì ÀÒÄ. Ìåõàíèçì, äîïóñêàþùèé òàêèå ïàðàìåòðèçîâàííûå ñïåöèôèêàöèè, èçâåñòåí êàê óíèâåðñàëèçàöèÿ, ìû óæå ñòàëêèâàëèñü ñ àíàëîãè÷íûì ïîíÿòèåì â îáçîðå êîíñòðóêöèé
ïàêåòîâ.
Ïåðå÷èñëåíèå ôóíêöèé
Âñëåä çà ðàçäåëîì ÒÈÏÛ èäåò ðàçäåë ÔÓÍÊÖÈÈ, â êîòîðîì ïåðå÷èñëÿþòñÿ îïåðàöèè, ïðèìåíÿåìûå ê ýêçåìïëÿðàì äàííîãî ÀÒÄ. Êàê óæå ãîâîðèëîñü, ýòè îïåðàöèè áóäóò ãëàâíûìè êîìïîíåíòàìè
îïðåäåëåíèÿ òèïà, ñ èõ ïîìîùüþ îïèñûâàåòñÿ, ÷òî ìîãóò ïðåäëîæèòü åãî ýêçåìïëÿðû, à íå òî, ÷åì
îíè ÿâëÿþòñÿ.
Íèæå ïðèâåäåí ðàçäåë ÔÓÍÊÖÈÈ äëÿ àáñòðàêòíîãî òèïà äàííûõ STACK. Åñëè âû ðàçðàáîò÷èê
ÏÎ, òî ýòîò ñòèëü îïèñàíèÿ âàì çíàêîì: ñòðîêè ýòîãî ðàçäåëà íàïîìèíàþò äåêëàðàöèè òèïèçèðîâàííûõ ÿçûêîâ ïðîãðàììèðîâàíèÿ. Ñòðîêà äëÿ îïåðàöèè new ïîõîæà íà îáúÿâëåíèå ïåðåìåííîé,
îñòàëüíûå - íà çàãîëîâêè ïðîöåäóð.
• Ôóíêöèè
put: STACK [G] × G → STACK [G]
remove: STACK [G] 6→ STACK [G]
item: STACK [G] 6→ G
empty: STACK [G] → BOOLEAN
new: STACK [G]
 êàæäîé ñòðîêå ââîäèòñÿ îïðåäåëåííàÿ ìàòåìàòè÷åñêàÿ ôóíêöèÿ, ìîäåëèðóþùàÿ ñîîòâåòñòâóþùóþ îïåðàöèþ íàä ñòåêîì. Íàïðèìåð, ôóíêöèÿ put ïðåäñòàâëÿåò îïåðàöèþ, êîòîðàÿ âòàëêèâàåò
ýëåìåíò íà âåðøèíó ñòåêà.
Ïî÷åìó ôóíêöèè? Áîëüøàÿ ÷àñòü ïðîãðàììèñòîâ íå ïîñ÷èòàåò òàêóþ îïåðàöèþ êàê put ôóíêöèåé.
Êîãäà âî âðåìÿ ðàáîòû ïðîãðàììíîé ñèñòåìû îïåðàöèÿ put ïðèìåíÿåòñÿ ê ñòåêó, îíà, êàê ïðàâèëî,
èçìåíÿåò ýòîò ñòåê, äîáàâëÿÿ ê íåìó ýëåìåíò. Âñëåäñòâèå ýòîãî â ïðèâåäåííîé âûøå êëàññèôèêàöèè
îïåðàöèé put áûëà "êîìàíäîé îïåðàöèåé, êîòîðàÿ ìîæåò ìîäèôèöèðîâàòü îáúåêòû. (Äâå äðóãèå
êàòåãîðèè îïåðàöèé - ýòî êîíñòðóêòîðû è çàïðîñû).
Îäíàêî ñïåöèôèêàöèÿ ÀÒÄ - ýòî ìàòåìàòè÷åñêàÿ ìîäåëü è â åå îñíîâàíèè äîëæíû áûòü êîððåêòíûå ìàòåìàòè÷åñêèå ìåòîäû.  ìàòåìàòèêå ïîíÿòèå êîìàíäû èëè, áîëåå îáùî, èçìåíåíèå ÷åãî-ëèáî
êàê òàêîâîå îòñóòñòâóåò: âû÷èñëåíèå êâàäðàòíîãî êîðíÿ èç ÷èñëà 2 íå èçìåíÿåò ñàìî ýòî ÷èñëî. Ìàòåìàòè÷åñêèå âûðàæåíèÿ ïðîñòî îïðåäåëÿþò îäíè ìàòåìàòè÷åñêèå îáúåêòû â òåðìèíàõ íåêîòîðûõ
äðóãèõ ìàòåìàòè÷åñêèõ îáúåêòîâ.  îòëè÷èå îò âû÷èñëåíèÿ ïðîãðàììû íà êîìïüþòåðå, îíè íèêîãäà
íå èçìåíÿþò íèêàêèå ìàòåìàòè÷åñêèå îáúåêòû. Íî ïîñêîëüêó ìû íóæäàåìñÿ â íåêîòîðîì ìàòåìàòè÷åñêîì îáúåêòå äëÿ ìîäåëèðîâàíèÿ îïåðàöèé êîìïüþòåðà, òî ïîíÿòèå ôóíêöèè ïðåäñòàâëÿåòñÿ
íàèáîëåå áëèçêèì ïðèáëèæåíèåì. Ôóíêöèÿ - ýòî ìåõàíèçì äëÿ ïîëó÷åíèÿ íåêîòîðîãî ðåçóëüòàòà,
ïðèíàäëåæàùåãî íåêîòîðîìó ðåçóëüòèðóþùåìó ìíîæåñòâó ïî ëþáîìó äîïóñòèìîìó âõîäó, ïðèíàäëåæàùåìó íåêîòîðîìó èñõîäíîìó ìíîæåñòâó.
Ðèñ. 6.3: Ïðèìåíåíèå ôóíêöèè put
Ñïåöèôèêàöèè àáñòðàêòíûõ òèïîâ äàííûõ èñïîëüçóþò èìåííî ýòî ïîíÿòèå. Íàïðèìåð, îïåðàöèÿ
put îïðåäåëÿåòñÿ êàê
put: STACK [G] × G → STACK [G]
è îçíà÷àåò, ÷òî put áóäåò áðàòü äâà àðãóìåíòà: STACK ýêçåìïëÿðîâ òèïà G è ýêçåìïëÿð òèïà G è
âîçâðàùàòü â êà÷åñòâå ðåçóëüòàòà íîâûé STACK [G]. (Áîëåå ôîðìàëüíî, ìíîæåñòâîì îïðåäåëåíèÿ
ôóíêöèè put ÿâëÿåòñÿ ìíîæåñòâî STACK [G] × G, ÿâëÿþùååñÿ äåêàðòîâûì ïðîèçâåäåíèåì ìíîæåñòâ
STACK [G] è G, ò.å. ìíîæåñòâîì ïàð < s, x >, â êîòîðûõ ïåðâûé ýëåìåíò s ïðèíàäëåæèò STACK [G]
, à âòîðîé ýëåìåíò x ïðèíàäëåæèò G.) Âîò ðèñóíîê, èëëþñòðèðóþùèé ýòî:
ÀÒÄ èìåþò äåëî òîëüêî ñ ìàòåìàòè÷åñêèìè ôóíêöèÿìè, ó êîòîðûõ íåò íèêàêèõ ïîáî÷íûõ ýôôåêòîâ è êîòîðûå, íà ñàìîì äåëå, íè÷åãî íå èçìåíÿþò.
Èç íàøåãî îáñóæäåíèÿ ñëåäóþò ðîëè îïåðàöèé, ìîäåëèðóåìûõ êàæäîé èç ôóíêöèé ñïåöèôèêàöèè
STACK:
• Ôóíêöèÿ put âîçâðàùàåò íîâîå ñîñòîÿíèå ñòåêà ñ îäíèì íîâûì ýëåìåíòîì, ïîìåùåííûì íà åãî
âåðøèíó. Ðèñóíîê íà ïðåäûäóùåé ñòðàíèöå èëëþñòðèðóåò îïåðàöèþ put(s,
íàä ñòåêîì s è ýëåìåíòîì x.
x), âûïîëíÿåìóþ
• Ôóíêöèÿ remove âîçâðàùàåò íîâîå ñîñòîÿíèå ñòåêà ñ âûòîëêíóòûì âåðõíèì ýëåìåíòîì, åñëè
òàêîâîé áûë. Êàê è put, ýòà ôóíêöèÿ ïðè ïðîåêòèðîâàíèè è ðåàëèçàöèè äîëæíà ïðåâðàùàòüñÿ
â êîìàíäó (îïåðàöèþ, èçìåíÿþùóþ îáúåêò, îáû÷íî ðåàëèçóåìóþ êàê ïðîöåäóðà). Ìû óâèäèì
äàëåå, êàê ó÷åñòü âîçìîæíîñòü ïóñòîãî ñòåêà, ñ âåðøèíû êîòîðîãî íå÷åãî óäàëÿòü.
• Ôóíêöèÿ item âîçâðàùàåò âåðõíèé ýëåìåíò ñòåêà, åñëè òàêîâîé èìååòñÿ.
• Ôóíêöèÿ empty âûÿâëÿåò ïóñòîòó ñòåêà, åå ðåçóëüòàòîì ÿâëÿåòñÿ ëîãè÷åñêîå çíà÷åíèå (èñòèíà èëè ëîæü). Ïðåäïîëàãàåòñÿ, ÷òî ÀÒÄ BOOLEAN, çàäàþùèé ëîãè÷åñêèå çíà÷åíèÿ, îïðåäåëåí
îòäåëüíî.
• Ôóíêöèÿ new ñîçäàåò ïóñòîé ñòåê.
 ðàçäåëå ÔÓÍÊÖÈÈ ýòè ôóíêöèè îïðåäåëÿþòñÿ íå ïîëíîñòüþ, ââîäÿòñÿ òîëüêî èõ ñèãíàòóðû ñïèñêè òèïîâ èõ àðãóìåíòîâ è ðåçóëüòàòà. Ñèãíàòóðà ôóíêöèè put
STACK [G] × G → STACK [G]
ïîêàçûâàåò, ÷òî put áåðåò â êà÷åñòâå àðãóìåíòà ïàðó âèäà <s,x>, â êîòîðîé s - ýêçåìïëÿð òèïà
STACK [G], à x - ýêçåìïëÿð òèïà G, è âîçâðàùàåò â êà÷åñòâå ðåçóëüòàòà ýêçåìïëÿð òèïà STACK
[G]. Âîîáùå ãîâîðÿ, ìíîæåñòâî çíà÷åíèé ôóíêöèè (åãî òèï óêàçûâàåòñÿ â ñèãíàòóðå ïðàâåå ñòðåëêè,
çäåñü ýòî STACK [G]) ìîæåò ñàìî áûòü äåêàðòîâûì ïðîèçâåäåíèåì. Ýòî ìîæíî èñïîëüçîâàòü ïðè
îïèñàíèè îïåðàöèé, âîçâðàùàþùèõ äâà èëè áîëåå ðåçóëüòàòîâ.
 ñèãíàòóðå ôóíêöèé remove è item âìåñòî îáû÷íîé ñòðåëêè èñïîëüçóåòñÿ ïåðå÷åðêíóòàÿ ñòðåëêà
. Ýòî îçíà÷àåò, ÷òî ýòè ôóíêöèè ïðèìåíèìû íå êî âñåì ýëåìåíòàì ìíîæåñòâà âõîäîâ. Îïèñàíèå
ôóíêöèè new âûãëÿäèò ïðîñòî êàê
new: STACK
áåç âñÿêîé ñòðåëêè â ñèãíàòóðå. Çäåñü àðãóìåíòû íå íóæíû, ïîñêîëüêó new äîëæíà âñåãäà âîçâðàùàòü îäèí è òîò æå ðåçóëüòàò - ïóñòîé ñòåê. Ïîýòîìó äëÿ ïðîñòîòû ìû óáðàëè çäåñü ñòðåëêó.
Ðåçóëüòàò ïðèìåíåíèÿ ýòîé ôóíêöèè (ò. å. ïóñòîé ñòåê) áóäåò çàïèñûâàòüñÿ new.
Êàòåãîðèè ôóíêöèé
 àëüòåðíàòèâíîé òåðìèíîëîãèè ýòè òðè êàòåãîðèè íàçûâàþòñÿ "êîíñòðóêòîð "àêñåññîð"è "ìîäèôèêàòîð". Çäåñü ìû ïðèäåðæèâàåìñÿ òåðìèíîâ, áîëåå íåïîñðåäñòâåííî ñâÿçàííûõ ñ èíòåðïðåòàöèåé
ôóíêöèé ÀÒÄ êàê ìîäåëåé îïåðàöèé íàä ïðîãðàììíûìè îáúåêòàìè.
• Ôóíêöèÿ, â ñèãíàòóðå êîòîðîé T ïîÿâëÿåòñÿ ëèøü ñïðàâà îò ñòðåëêè, íàïðèìåð new, ÿâëÿåòñÿ
ôóíêöèåé-êîíñòðóêòîðîì. Îíà ìîäåëèðóåò îïåðàöèþ, ñîçäàþùóþ ýêçåìïëÿðû T èç ýêçåìïëÿðîâ äðóãèõ òèïîâ èëè âîîáùå íå èñïîëüçóþùóþ àðãóìåíòîâ, íàïðèìåð êàê â ñëó÷àå êîíñòàíòíîãî êîíñòðóêòîðà new.
• Òàêèå ôóíêöèè êàê item è empty, ó êîòîðûõ T ïîÿâëÿåòñÿ òîëüêî ñëåâà îò ñòðåëêè, ÿâëÿþòñÿ
ôóíêöèÿìè-çàïðîñàìè. Îíè ìîäåëèðóþò îïåðàöèè, êîòîðûå óñòàíàâëèâàþò ñâîéñòâà T, âûðàæåííûå â òåðìèíàõ ýêçåìïëÿðîâ äðóãèõ òèïîâ (â íàøèõ ïðèìåðàõ - ýòî BOOLEAN è ïàðàìåòð
òèïà G).
• Òàêèå ôóíêöèè êàê put è remove, ó êîòîðûõ T ïîÿâëÿåòñÿ ñ îáåèõ ñòîðîí ñòðåëêè, ÿâëÿþòñÿ
ôóíêöèÿìè-êîìàíäàìè. Îíè ìîäåëèðóþò îïåðàöèè, êîòîðûå ïî ñóùåñòâóþùèì ýêçåìïëÿðàì
T è, âîçìîæíî, ýêçåìïëÿðàì äðóãèõ òèïîâ âûäàþò íîâûå ýêçåìïëÿðû òèïà T.
Ðàçäåë ÀÊÑÈÎÌÛ
Ïîñêîëüêó âñÿêîå ÿâíîå îïðåäåëåíèå çàñòàâëÿåò âûáèðàòü íåêîòîðîå ïðåäñòàâëåíèå, îáðàòèìñÿ ê
íåÿâíûì îïðåäåëåíèÿì. Ïðè ýòîì âîçäåðæèìñÿ îò îïðåäåëåíèÿ çíà÷åíèé ôóíêöèé â ñïåöèôèêàöèè
ÀÒÄ è âìåñòî ýòîãî îïèøåì ñâîéñòâà ýòèõ çíà÷åíèé - âñå èõ ñóùåñòâåííûå ñâîéñòâà, íî òîëüêî ýòè
ñâîéñòâà.
Îíè ôîðìóëèðóþòñÿ â ðàçäåëå ÀÊÑÈÎÌÛ (AXIOMS). Äëÿ òèïà STACK îí âûãëÿäèò ñëåäóþùèì
îáðàçîì.
• Àêñèîìû
Äëÿ âñåõ x: G, s: STACK [G],
A1 item (put (s, x)) = x
A2 remove (put (s, x)) = s
A3 empty (new)
A4 not empty (put (s, x))
Ïåðâûå äâå àêñèîìû âûðàæàþò îñíîâíûå ñâîéñòâà ñòåêîâ (ïîñëåäíèì ïðèøåë - ïåðâûì óøåë) LIFO.
×òîáû ïîíÿòü èõ, ïðåäïîëîæèì, ÷òî ó íàñ åñòü ñòåê s è ýêçåìïëÿð x, è îïðåäåëèì s' êàê ðåçóëüòàò
put(s, x) , ò. å. êàê ðåçóëüòàò âòàëêèâàíèÿ x â s. Ïðèñïîñîáèì îäèí èç ïðåäûäóùèõ ðèñóíêîâ:
Çäåñü àêñèîìà A1, ãîâîðèò î òîì, ÷òî âåðøèíîé s' ÿâëÿåòñÿ x - ïîñëåäíèé ýëåìåíò, êîòîðûé ìû
âòîëêíóëè, à àêñèîìà A2 îáúÿñíÿåò, ÷òî ïðè óäàëåíèè âåðõíåãî ýëåìåíòà s' ìû ñíîâà ïîëó÷àåì òîò
æå ñòåê s, êîòîðûé áûë äî âòàëêèâàíèÿ x. Ýòè äâå àêñèîìû äàþò ëàêîíè÷íîå îïèñàíèå ãëàâíîãî
ñâîéñòâà ñòåêîâ â ÷èñòî ìàòåìàòè÷åñêèõ òåðìèíàõ áåç âñÿêîé ïîìîùè èìïåðàòèâíûõ ðàññóæäåíèé
èëè ññûëîê íà ñâîéñòâà ïðåäñòàâëåíèé.
Àêñèîìû A3 è A4 ãîâîðÿò î òîì, êîãäà ñòåê ïóñò, à êîãäà - íåò: ñòåê, ïîëó÷åííûé â ðåçóëüòàòå
ðàáîòû êîíñòðóêòîðà new ïóñòîé, à âñÿêèé ñòåê, ïîëó÷åííûé ïîñëå âòàëêèâàíèÿ ýëåìåíòà â óæå
ñóùåñòâóþùèé ñòåê (ïóñòîé èëè íåïóñòîé) íå ÿâëÿåòñÿ ïóñòûì.
Ðèñ. 6.4: Ïðèìåíåíèå ôóíêöèè put
Ýòè àêñèîìû, êàê è îñòàëüíûå, ÿâëÿþòñÿ ïðåäèêàòàìè (â ñìûñëå ëîãèêè), âûðàæàþùèìè èñòèííîñòü íåêîòîðûõ ñâîéñòâ äëÿ âñåõ âîçìîæíûõ çíà÷åíèé s è x.
Äâå èëè òðè âåùè, êîòîðûå ìû çíàåì î ñòåêàõ
Ñïåöèôèêàöèè ÀÒÄ ÿâëÿþòñÿ íåÿâíûìè. Èìåþòñÿ äâà âèäà "íåÿâíîñòè":
• Ìåòîä ÀÒÄ îïðåäåëÿåò íåÿâíî íåêîòîðîå ìíîæåñòâî îáúåêòîâ, çàäàâàÿ ïðèìåíèìûå ê íèì
ôóíêöèè. Èç ýòîãî îïðåäåëåíèÿ íèêîãäà íå ñëåäóåò, ÷òî â íåì ïåðå÷èñëåíû âñå îïåðàöèè; ÷àñòî,
íà ïóòè ê ïðåäñòàâëåíèþ, áóäóò äîáàâëåíû è äðóãèå.
• Ñàìè ôóíêöèè òàêæå îïðåäåëÿþòñÿ íåÿâíî. Âìåñòî ÿâíûõ îïðåäåëåíèé èñïîëüçóþòñÿ àêñèîìû,
çàäàþùèå ñâîéñòâà ýòèõ ôóíêöèé. Çäåñü òîæå íè÷åãî íå óòâåðæäàåòñÿ î ïîëíîòå: êîãäà âû, â
êîíöå êîíöîâ, äîéäåòå äî ðåàëèçàöèè ýòèõ ôóíêöèé, îíè ïðèîáðåòóò äîïîëíèòåëüíûå ñâîéñòâà.
Ýòà íåÿâíîñòü ÿâëÿåòñÿ êëþ÷åâûì àñïåêòîì àáñòðàêòíûõ òèïîâ äàííûõ è, êàê ñëåäñòâèå, - èõ
áóäóùèõ àíàëîãîâ â ïîñòðîåíèè ÎÎ-ÏÎ - êëàññîâ. Êîãäà ìû îïðåäåëÿåì àáñòðàêòíûé òèï äàííûõ
èëè êëàññ, ìû âñåãäà ñîîáùàåì êîå-÷òî îá ýòîì òèïå èëè êëàññå, ïðîñòî ïåðå÷èñëÿÿ òå èõ ñâîéñòâà,
êîòîðûå çíàåì, è áåðåì èõ â êà÷åñòâå îïðåäåëåíèÿ. Ïðè ýòîì íèêîãäà íå ïðåäïîëàãàåòñÿ, ÷òî äðóãèõ
ïðèìåíèìûõ ñâîéñòâ íåò.
Íåÿâíîñòü òàêæå ïðåäïîëàãàåò îòêðûòîñòü îïðåäåëåíèé: âñåãäà ìîæíî äîáàâèòü íîâûå ñâîéñòâà
ÀÒÄ èëè êëàññà. Îñíîâíûì ìåõàíèçìîì äëÿ âûïîëíåíèÿ òàêèõ ðàñøèðåíèé áåç ðàçðóøåíèÿ óæå
ñóùåñòâóþùåãî ïåðâîíà÷àëüíîãî îïðåäåëåíèÿ ÿâëÿåòñÿ íàñëåäîâàíèå.
×àñòè÷íûå ôóíêöèè
Ñïåöèôèêàöèÿ âñÿêîãî ðåàëèñòè÷íîãî ïðèìåðà, äàæå òàêîãî ïðîñòîãî êàê ñòåêè, íåîáõîäèìî ñòàëêèâàåòñÿ ñ ïðîáëåìàìè íå âñþäó îïðåäåëåííûõ îïåðàöèé: íåêîòîðûå îïåðàöèè ïðèìåíèìû íå êî âñåì
âîçìîæíûì ýëåìåíòàì èñõîäíûõ ìíîæåñòâ. Íàïðèìåð, ýòî èìååò ìåñòî äëÿ ôóíêöèé remove è item:
íåëüçÿ óäàëèòü ýëåìåíò èç ïóñòîãî ñòåêà, è ó ïóñòîãî ñòåêà íåò âåðõíåãî ýëåìåíòà.
Ðåøåíèå ýòîé ïðîáëåìû, èñïîëüçîâàííîå â ïðèâåäåííîé âûøå ñïåöèôèêàöèè, ñîñòîèò â òîì, ÷òîáû
îïðåäåëèòü ýòè ôóíêöèè êàê ÷àñòè÷íûå. Ôóíêöèÿ èç èñõîäíîãî ìíîæåñòâà X â ðåçóëüòèðóþùåå
ìíîæåñòâî Y ÿâëÿåòñÿ
÷àñòè÷íîé, åñëè îíà îïðåäåëåíà íå äëÿ âñåõ ýëåìåíòîâ X. Ôóíêöèÿ, íå
ïîëíîé.
ÿâëÿþùàÿñÿ ÷àñòè÷íîé, íàçûâàåòñÿ
 ñïåöèôèêàöèè ÀÒÄ STACK ýòè èäåè èñïîëüçîâàíû äëÿ ñòåêîâ ïðè îáúÿâëåíèè remove è item
êàê ÷àñòè÷íûõ ôóíêöèé â ðàçäåëå ÔÓÍÊÖÈÈ - ýòî óêàçàíî ñ ïîìîùüþ ïåðå÷åðêíóòûõ ñòðåëîê â
èõ ñèãíàòóðå. Ïðè ýòîì âîçíèêàåò íîâàÿ ïðîáëåìà, îáñóæäàåìàÿ â ñëåäóþùåì ïóíêòå: êàê çàäàâàòü
îáëàñòè òàêèõ ôóíêöèé?
 íåêîòîðûõ ñëó÷àÿõ ôóíêöèþ put òîæå æåëàòåëüíî îïèñûâàòü êàê ÷àñòè÷íóþ, íàïðèìåð, ýòî
òðåáóåòñÿ â òàêèõ ðåàëèçàöèÿõ êàê ÌÀÑÑÈÂ_ÂÂÅÐÕ è ÌÀÑÑÈÂ_ÂÍÈÇ, êîòîðûå ïîääåðæèâàþò
âûïîëíåíèå ëèøü êîíå÷íîãî ÷èñëà ïîäðÿä èäóùèõ îïåðàöèé put äëÿ êàæäîãî çàäàííîãî ñòåêà. Ýòî íà
ñàìîì äåëå ïîëåçíîå óïðàæíåíèå - ïðèñïîñîáèòü ñïåöèôèêàöèþ STACK ê òîìó, ÷òîáû îíà îïèñûâàëà
îãðàíè÷åííûå ñòåêè êîíå÷íîãî îáúåìà, ïîñêîëüêó â ïðèâåäåííîì âûøå âèäå îíà íå ñîäåðæèò íèêàêèõ
îãðàíè÷åíèé íà ðàçìåðû ñòåêîâ.
Ýòî áóäåò íîâûì ïðèìåíåíèåì ÷àñòè÷íûõ ôóíêöèé, îòðàæàþùèì îãðàíè÷åíèÿ ðåàëèçàöèè. Â
îòëè÷èå îò ýòîãî, îáúÿâëåíèå ôóíêöèé remove è item êàê ÷àñòè÷íûõ îòðàæàåò àáñòðàêòíîå ñâîéñòâî
ýòèõ îïåðàöèé, îòíîñÿùååñÿ êî âñåì ðåàëèçàöèÿì.
Ïðåäóñëîâèÿ
Äëÿ ýòîãî âñÿêàÿ ñïåöèôèêàöèÿ ÀÒÄ, ñîäåðæàùàÿ ÷àñòè÷íûå ôóíêöèè, äîëæíà çàäàâàòü èõ îáëàñòè.
 ýòîì è ñîñòîèò ðîëü ðàçäåëà ÏÐÅÄÓÑËÎÂÈß (PRECONDITIONS). Äëÿ ÀÒÄ STACK ýòîò ðàçäåë
âûãëÿäèò òàê:
• Ïðåäóñëîâèÿ (preconditions)
remove (s: STACK [G]) require not empty (s)
item (s: STACK [G]) require not empty (s)
 íåì ó êàæäîé èç ôóíêöèé â ïóíêòå "òðåáóåò"ïåðå÷èñëÿþòñÿ óñëîâèÿ, êîòîðûì äîëæíû óäîâëåòâîðÿòü àðãóìåíòû ôóíêöèè, ÷òîáû âõîäèòü â åå îáëàñòü.
Áóëåâñêîå âûðàæåíèå, êîòîðîå îïðåäåëÿåò îáëàñòü ôóíêöèè, íàçûâàåòñÿ ïðåäóñëîâèåì ñîîòâåòñòâóþùåé ÷àñòè÷íîé ôóíêöèè.  íàøåì ñëó÷àå ïðåäóñëîâèÿ îáåèõ ôóíêöèé remove è item óòâåðæäàþò, ÷òî ñòåê äîëæåí áûòü íåïóñòûì.
Ñ òî÷êè çðåíèÿ ìàòåìàòèêè ïðåäóñëîâèå ôóíêöèè f - ýòî õàðàêòåðèñòè÷åñêàÿ ôóíêöèÿ îáëàñòè
f. Õàðàêòåðèñòè÷åñêîé ôóíêöèåé ïîäìíîæåñòâà Aìíîæåñòâà X íàçûâàåòñÿ ïîëíàÿ ôóíêöèÿ ch: X
BOOLEAN òàêàÿ, ÷òî ch(x) èñòèííà, åñëè x ïðèíàäëåæèò A, è ëîæíà â ïðîòèâíîì ñëó÷àå.
Ïîëíàÿ ñïåöèôèêàöèÿ
Ðàçäåë ÏÐÅÄÓÑËÎÂÈß (PRECONDITIONS) çàâåðøàåò ïðîñòóþ ñïåöèôèêàöèþ àáñòðàêòíîãî òèïà
äàííûõ STACK. Äëÿ óäîáñòâà ññûëîê ïîëåçíî ñîáðàòü âìåñòå ðàçíûå êîìïîíåíòû ñïåöèôèêàöèè,
ïðèâåäåííûå âûøå. Âîò ïîëíàÿ ñïåöèôèêàöèÿ.
Ñïåöèôèêàöèÿ ñòåêîâ êàê ÀÒÄ
• ÒÈÏÛ (TYPES)
STACK [G]
• ÔÓÍÊÖÈÈ (FUNCTIONS)
put: STACK [G] × G → STACK [G]
remove: STACK [G] 6→ STACK [G]
item: STACK [G] 6→ G
empty: STACK [G] → BOOLEAN
new: STACK [G]
• ÀÊÑÈÎÌÛ (AXIOMS)
Äëÿ âñåõ x: G, s: STACK [G],
A1 item (put (s, x)) = x
A2 remove (put (s, x)) = s
A3 empty (new)
A4 not empty (put (s, x))
• ÏÐÅÄÓÑËÎÂÈß (PRECONDITIONS)
remove (s: STACK [G]) require not empty (s)
item (s: STACK [G]) require not empty (s)
Ñèëà ñïåöèôèêàöèé ÀÒÄ ïðîèñòåêàåò èç èõ ñïîñîáíîñòè îòðàæàòü òîëüêî ñóùåñòâåííûå ñâîéñòâà
ñòðóêòóð äàííûõ áåç ëèøíèõ äåòàëåé. Ïðèâåäåííàÿ âûøå ñïåöèôèêàöèÿ ñòåêîâ âûðàæàåò âñå, ÷òî
íóæíî ïî ñóùåñòâó çíàòü î ïîíÿòèè ñòåêà, è íå âêëþ÷àåò íè÷åãî, ÷òî îòíîñèëîñü áû ê êàêèì-ëèáî
êîíêðåòíûì ðåàëèçàöèÿì ñòåêîâ. Ýòî âñÿ ïðàâäà î ñòåêàõ, è íè÷åãî êðîìå ïðàâäû.
Òàêèå ñïåöèôèêàöèè çàäàþò îáùóþ ìîäåëü âû÷èñëåíèé íà ñîîòâåòñòâóþùèõ ñòðóêòóðàõ äàííûõ.
Îïðåäåëåííûå â ñïåöèôèêàöèè àáñòðàêòíîãî òèïà äàííûõ ôóíêöèè ïîçâîëÿþò ñòðîèòü ñëîæíûå âûðàæåíèÿ, à àêñèîìû ÀÒÄ ïîçâîëÿþò óïðîùàòü òàêèå âûðàæåíèÿ è ïîëó÷àòü áîëåå ïðîñòûå ðåçóëüòàòû. Ñëîæíîå ñòåêîâîå âûðàæåíèå ÿâëÿåòñÿ ìàòåìàòè÷åñêèì ýêâèâàëåíòîì ïðîãðàììû, à ïðîöåññ
óïðîùåíèÿ ÿâëÿåòñÿ ìàòåìàòè÷åñêèì ýêâèâàëåíòîì âû÷èñëåíèÿ èëè âûïîëíåíèÿ ýòîé ïðîãðàììû.
Âîò ïðèìåð. Ðàññìîòðèì äëÿ ïðèâåäåííîé âûøå ñïåöèôèêàöèè ÀÒÄ STACK ñëåäóþùåå âûðàæåíèå stackexp:
item (remove (put (remove (put (put (
remove (put (put (put (new, x1), x2), x3)),
item (remove (put (put (new, x4), x5)))), x6)), x7)))
Ïî-âèäèìîìó, âûðàæåíèå stackexp áóäåò ïðîùå ïîíÿòü, åñëè ìû ïðåäñòàâèì åãî êàê ïîñëåäîâàòåëüíîñòü âñïîìîãàòåëüíûõ âûðàæåíèé:
s1 = new
s2 = put (put (put (s1, x1), x2), x3)
s3 = remove (s2)
s4 = new
s5 = put (put (s4, x4), x5)
s6 = remove (s5)
y1 = item (s6)
s7 = put (s3, y1)
s8 = put (s7, x6)
s9 = remove (s8)
s10 = put (s9, x7)
s11 = remove (s10)
stackexp = item (s11)
Êàêîé áû âàðèàíò îïðåäåëåíèÿ âû íè âûáðàëè, ïî íåìó íåñëîæíî âîññòàíîâèòü âû÷èñëåíèå, ìàòåìàòè÷åñêîé ìîäåëüþ êîòîðîãî ÿâëÿåòñÿ stackexp: ñîçäàòü íîâûé ñòåê; âòîëêíóòü â íåãî ýëåìåíòû x1,
x2, x3 (â óêàçàííîì ïîðÿäêå); óäàëèòü âåðõíèé ýëåìåíò (x3), íàçâàâ ïîëó÷èâøèéñÿ ñòåê s3; ñîçäàòü
äðóãîé ïóñòîé ñòåê è ò. ä. Ýòîò ïðîöåññ ãðàôè÷åñêè ïðåäñòàâëåí íà ðèñ.6.5.
6.3 Îò àáñòðàêòíûõ òèïîâ äàííûõ ê êëàññàì
Êëàññû
ÀÒÄ áóäóò ñëóæèòü íåïîñðåäñòâåííîé îñíîâîé ðàçáèåíèÿ ñèñòåìû íà ìîäóëè. Òî÷íåå, ÎÎ-ñèñòåìà
áóäåò ñòðîèòüñÿ (íà óðîâíå àíàëèçà, ïðîåêòèðîâàíèÿ è ðåàëèçàöèè) êàê ñîâîêóïíîñòü âçàèìîäåéñòâóþùèõ, ÷àñòè÷íî èëè ïîëíîñòüþ ðåàëèçîâàííûõ ÀÒÄ. Îñíîâíîå ïîíÿòèå çäåñü - êëàññ:
Êëàññ - ýòî àáñòðàêòíûé òèï äàííûõ, ñíàáæåííûé íåêîòîðîé (âîçìîæíî ÷àñòè÷íîé) ðåàëèçàöèåé
Ðèñ. 6.5: Ìàíèïóëÿöèè ñî ñòåêîì
Òàêèì îáðàçîì, ÷òîáû ïîëó÷èòü êëàññ, ìû äîëæíû ïîñòðîèòü ÀÒÄ è ðåøèòü, êàê åãî ðåàëèçîâûâàòü.
ÀÒÄ - ýòî ìàòåìàòè÷åñêîå ïîíÿòèå, à ðåàëèçàöèÿ - ýòî åãî âåðñèÿ, îðèåíòèðîâàííàÿ íà êîìïüþòåð.
Ïðèâåäåííîå îïðåäåëåíèå, îäíàêî, óòâåðæäàåò, ÷òî ðåàëèçàöèÿ ìîæåò áûòü ÷àñòè÷íîé. Ââåäåííûå
íèæå òåðìèíû ïîçâîëÿþò îòäåëèòü ýòîò ñëó÷àé îò ïîëíîñòüþ ðåàëèçîâàííîãî êëàññà:
ýôôåêòèâíûì (eective). Êëàññ, êîòîðûé
ðåàëèçîâàí ëèøü ÷àñòè÷íî èëè ñîâñåì íå ðåàëèçîâàí, íàçûâàåòñÿ îòëîæåííûì (deferred).
Ïîëíîñòüþ ðåàëèçîâàííûé êëàññ íàçûâàåòñÿ
Âñÿêèé êëàññ ÿâëÿåòñÿ ëèáî îòëîæåííûì, ëèáî ýôôåêòèâíûì.
×òîáû ïîëó÷èòü ýôôåêòèâíûé êëàññ, òðåáóåòñÿ ïðåäóñìîòðåòü âñå äåòàëè ðåàëèçàöèè. Äëÿ îòëîæåííîãî êëàññà ìîæíî âûáðàòü îïðåäåëåííûé óðîâåíü ðåàëèçàöèè, íî ïðè ýòîì îñòàâèòü íåêîòîðûå
àñïåêòû ðåàëèçàöèè íåçàâåðøåííûìè.  ñàìîì êðàéíåì ñëó÷àå ïðè ÷àñòè÷íîé ðåàëèçàöèè ìîæíî
âîîáùå îòêàçàòüñÿ îò ïðèíÿòèÿ êàêèõ-ëèáî ðåøåíèé î åå óòî÷íåíèè.  ýòîì ñëó÷àå ïîëó÷èâøèéñÿ
êëàññ áóäåò ïîëíîñòüþ îòëîæåííûì è áóäåò ýêâèâàëåíòåí ÀÒÄ.
Êàê ñîçäàâàòü ýôôåêòèâíûé êëàññ
Ðàññìîòðèì âíà÷àëå ýôôåêòèâíûå êëàññû. ×òî íóæíî ñäåëàòü äëÿ ðåàëèçàöèè ÀÒÄ? Ðåçóëüòèðóþùèé ýôôåêòèâíûé êëàññ áóäåò ôîðìèðîâàòüñÿ èç ýëåìåíòîâ òðåõ âèäîâ:
E1 Ñïåöèôèêàöèè ÀÒÄ (ìíîæåñòâî ôóíêöèé ñ ñîîòâåòñòâóþùèìè àêñèîìàìè è ïðåäóñëîâèÿìè, îïèñûâàþùèìè èõ ñâîéñòâà).
E2 Âûáîðà ïðåäñòàâëåíèÿ.
E3 Îòîáðàæåíèÿ èç ìíîæåñòâà ôóíêöèé (E1) â ïðåäñòàâëåíèå (E2) â âèäå ìíîæåñòâà ìåõàíèçìîâ
(èëè êîìïîíåíòîâ (features)), êàæäûé èç êîòîðûõ ðåàëèçóåò îäíó èç ôóíêöèé â òåðìèíàõ ïðåäñòàâëåíèÿ è ïðè ýòîì óäîâëåòâîðÿåò àêñèîìàì è ïðåäóñëîâèÿì. Ìíîãèå èç ýòèõ êîìïîíåíòîâ
áóäóò ìåòîäàìè - îáû÷íûìè ïðîöåäóðàìè, íî íåêîòîðûå ìîãóò ïîÿâëÿòüñÿ â êà÷åñòâå ïîëåé
äàííûõ èëè "àòðèáóòîâ"(ýòî áóäåò ïîêàçàíî â ñëåäóþùèõ ëåêöèÿõ).
Ðîëü îòëîæåííûõ êëàññîâ
 îïðåäåëåíèè ýôôåêòèâíîãî êëàññà äîëæíà ïðèñóòñòâîâàòü ïîëíàÿ èíôîðìàöèÿ î ðåàëèçàöèè
(ïóíêòû E2 è E3). Åñëè îíà õîòü â ÷åì-òî íåïîëíà, òî êëàññ ÿâëÿåòñÿ îòëîæåííûì.
×åì áîëåå "îòëîæåííûì"ÿâëÿåòñÿ êëàññ, òåì îí áëèæå ê ÀÒÄ, îäåòîìó â íåêîòîðóþ ñèíòàêñè÷åñêóþ îäåæäó, êîòîðàÿ ñêîðåå ïîìîæåò çàâîåâàòü ïðèçíàíèå ðàçðàáîò÷èêîâ ÏÎ, ÷åì ìàòåìàòèêîâ.
Îòëîæåííûå êëàññû îñîáåííî ïîëåçíû ïðè àíàëèçå è ïðîåêòèðîâàíèè:
• Ïðè ÎÎ-ïðîåêòèðîâàíèè ìíîãèå àñïåêòû ðåàëèçàöèè áóäóò îïóùåíû, ïðîåêòèðîâàíèå äîëæíî
ñîñðåäîòà÷èâàòüñÿ íà àðõèòåêòóðíûõ ñâîéñòâàõ âûñîêîãî óðîâíÿ - íà òîì, êàêóþ ôóíêöèîíàëüíîñòü îáåñïå÷èâàåò êàæäûé ìîäóëü ñèñòåìû, à íå íà òîì, êàê îí ýòî äåëàåò.
• Ïðè ïîñòåïåííîì ïðîäâèæåíèè ê ïîëíîé ðåàëèçàöèè áóäóò äîáàâëÿòüñÿ âñå íîâûå è íîâûå åå
ñâîéñòâà äî òåõ ïîð, ïîêà íå áóäåò ïîëó÷åí ýôôåêòèâíûé êëàññ.
Íî íà ýòîì ðîëü îòëîæåííûõ êëàññîâ íå çàâåðøàåòñÿ, äàæå â ïîëíîñòüþ ðåàëèçîâàííîé ñèñòåìå
ìîæíî ÷àñòî îáíàðóæèòü ìíîãî òàêèõ êëàññîâ. Êîå-÷òî ñëåäóåò èç òîëüêî ÷òî ïåðå÷èñëåííûõ ïðèìåíåíèé: êîãäà èç îòëîæåííûõ êëàññîâ ïîëó÷àþòñÿ ýôôåêòèâíûå, òî ïîÿâëÿåòñÿ æåëàíèå ñîõðàíèòü
èõ â êà÷åñòâå ïðåäêîâ (â ñìûñëå íàñëåäîâàíèÿ) ýôôåêòèâíûõ êëàññîâ êàê æèâóþ ïàìÿòü î ïðîöåññå
àíàëèçà è ïðîåêòèðîâàíèÿ.
Î÷åíü ÷àñòî ïðè ðàçðàáîòêå ÏÎ ñ ïîìîùüþ íå ÎÎ-ïîäõîäîâ ñèñòåìà â îêîí÷àòåëüíîì âèäå íå ñîäåðæèò íèêàêèõ çàïèñåé î òåõ çíà÷èòåëüíûõ óñèëèÿõ, êîòîðûå áûëè çàòðà÷åíû íà åå ïîëó÷åíèå. Äëÿ
òåõ, êòî âûíóæäåí áóäåò îáñëóæèâàòü òàêóþ ñèñòåìó - ðàñøèðÿòü, ïåðåíîñèòü, îòëàæèâàòü - ïîíÿòü
åå áåç ýòèõ çàïèñåé áóäåò òàê æå òðóäíî, êàê òðóäíî ãåîëîãó ïîíÿòü âèäèìûé ëàíäøàôò, íå èìåÿ
äîñòóïà ê îñàäî÷íûì ñëîÿì. Îäèí èç ëó÷øèõ ñïîñîáîâ îáåñïå÷èòü íåîáõîäèìóþ äëÿ ñîïðîâîæäåíèÿ
ñèñòåìû èíôîðìàöèþ - ýòî ñîõðàíèòü îòëîæåííûå êëàññû â åå îêîí÷àòåëüíîé ôîðìå.
Ó îòëîæåííûõ êëàññîâ èìååòñÿ òàêæå ïðèìåíåíèå, ïîëíîñòüþ ñâÿçàííîå ñ ðåàëèçàöèåé. Îíè ñëóæàò äëÿ êëàññèôèêàöèè ãðóïï ñâÿçàííûõ òèïîâ îáúåêòîâ, ïðåäîñòàâëÿþò íåêîòîðûå íàèáîëåå âàæíûå ìíîãîêðàòíî èñïîëüçóåìûå ìîäóëè âûñîêîãî óðîâíÿ, ôèêñèðóþò îáùèå ñâîéñòâà ïîâåäåíèÿ ìíîãèõ âàðèàíòîâ è èãðàþò êëþ÷åâóþ ðîëü (âìåñòå ñ ïîëèìîðôèçìîì è äèíàìè÷åñêèì ñâÿçûâàíèåì) â
îáåñïå÷åíèè äåöåíòðàëèçàöèè è ðàñøèðÿåìîñòè ïðîãðàììíîé àðõèòåêòóðû.
Àáñòðàêòíûå òèïû äàííûõ è ñêðûòèå èíôîðìàöèè
Îñîáåííî èíòåðåñíûì ñëåäñòâèåì ÎÎ-ïîëèòèêè, â êîòîðîé ìîäóëè îñíîâàíû íà ðåàëèçàöèÿõ ÀÒÄ
(êëàññàõ), ÿâëÿåòñÿ òî, ÷òî îíà äàåò ÿñíûé îòâåò íà âîïðîñ, êîòîðûé îñòàëñÿ íåðåøåííûì ïðè îáñóæäåíèè ñêðûòèÿ èíôîðìàöèè: êàê íàì ñëåäóåò ðàçäåëÿòü îáùåäîñòóïíûå è ñêðûòûå ñâîéñòâà ìîäóëÿ âèäèìóþ è íåâèäèìóþ ÷àñòè àéñáåðãà? Åñëè ìîäóëü ÿâëÿåòñÿ êëàññîì, ïîëó÷åííûì èç ÀÒÄ, òî îòâåò
ÿñåí. Èç òðåõ ÷àñòåé, âîâëå÷åííûõ â ýòó ýâîëþöèþ, E1- ñïåöèôèêàöèÿ ÀÒÄ, ÿâëÿåòñÿ îòêðûòîé, à E2
è E3 - âûáîð ïðåäñòàâëåíèÿ è ðåàëèçàöèÿ ôóíêöèé ÀÒÄ â òåðìèíàõ ýòîãî ïðåäñòàâëåíèÿ - äîëæíû
áûòü çàêðûòûìè (ñåêðåòíûìè). Êîãäà ìû íà÷íåì ñòðîèòü êëàññû, òî ñòîëêíåìñÿ åùå ñ ÷åòâåðòîé
÷àñòüþ, òàêæå ñåêðåòíîé, - âñïîìîãàòåëüíûìè ñâîéñòâàìè, íåîáõîäèìûìè òîëüêî äëÿ âíóòðåííèõ
íóæä ýòèõ ïðîãðàìì.
Òàêèì îáðàçîì, èñïîëüçîâàíèå àáñòðàêòíûõ òèïîâ äàííûõ â êà÷åñòâå èñòî÷íèêà ìîäóëåé äàåò íàì
ïðàêòè÷íîå, îäíîçíà÷íîå óêàçàíèå äëÿ ïðèìåíåíèÿ ñêðûòèÿ èíôîðìàöèè â íàøèõ ïðîåêòàõ.
Êîíñòðóèðîâàíèå îáúåêòíî-îðèåíòèðîâàííîãî ÏÎ
Ìû óæå äàâàëè îïðåäåëåíèå êîíñòðóèðîâàíèÿ ÎÎ-ÏÎ: áóäó÷è âåñüìà îáùèì, îíî ïðåäñòàâëÿåò ìåòîä ñëåäóþùèì îáðàçîì: "îñíîâûâàòü àðõèòåêòóðó âñÿêîé ïðîãðàììíîé ñèñòåìû íà ìîäóëÿõ,
ïîëó÷åííûõ èç òèïîâ îáúåêòîâ, ñ êîòîðûìè îïåðèðóåò ñèñòåìà". Ïðèäåðæèâàÿñü ðàìîê ýòîãî îïðå-
Ðèñ. 6.6: ÀÒÄ âèä ìîäóëÿ ïðè ñêðûòèè èíôîðìàöèè
äåëåíèÿ, ìû ìîæåì äîïîëíèòü åãî òåïåðü áîëåå òåõíè÷åñêèì îïðåäåëåíèåì:
Êîíñòðóèðîâàíèå ÎÎ-ÏÎ - ýòî ïîñòðîåíèå ïðîãðàììíîé ñèñòåìû êàê ñòðóêòóðèðîâàííîé ñîâîêóïíîñòè ðåàëèçàöèé (âîçìîæíî ÷àñòè÷íûõ) àáñòðàêòíûõ òèïîâ äàííûõ.
Ýòî îïðåäåëåíèå áóäåò íàøèì ðàáî÷èì îïðåäåëåíèåì. Âñå åãî êîìïîíåíòû ÿâëÿþòñÿ âàæíûìè:
• Â îñíîâå ëåæèò ïîíÿòèå àáñòðàêòíîãî òèïà äàííûõ.
• Äëÿ êîíñòðóèðîâàíèÿ ïðîãðàìì íàì íóæíû íå ñàìè ïî ñåáå ÀÒÄ (êàê ìàòåìàòè÷åñêîå ïîíÿòèå),
à ðåàëèçàöèè ÀÒÄ - ïðîãðàììèñòñêîå ïîíÿòèå.
• Ïðè ýòîì ýòè ðåàëèçàöèè íå îáÿçàíû áûòü ïîëíûìè, îãîâîðêà "âîçìîæíî ÷àñòè÷íûå"ïîçâîëÿåò
èñïîëüçîâàòü è îòëîæåííûå êëàññû, âêëþ÷àÿ, êàê êðàéíèé ñëó÷àé, ïîëíîñòüþ îòëîæåííûé
êëàññ áåç êàêîé-ëèáî ðåàëèçàöèè.
• Ñèñòåìà ïðåäñòàâëÿåò ñîáîé ñîâîêóïíîñòü êëàññîâ áåç âûäåëåíèÿ êàêîãî-ëèáî ãëàâíîãî èëè
îòâåòñòâåííîãî êëàññà èëè ãîëîâíîé ïðîãðàììû.
• Ýòà ñîâîêóïíîñòü ÿâëÿåòñÿ ñòðóêòóðèðîâàííîé áëàãîäàðÿ äâóì îòíîøåíèÿì ìåæäó êëàññàìè:
"áûòü êëèåíòîì"è íàñëåäîâàíèþ.
6.4 Êëþ÷åâûå êîíöåïöèè
• Òåîðèÿ àáñòðàêòíûõ òèïîâ äàííûõ (ÀÒÄ) ïðèìèðÿåò íåîáõîäèìîñòü â òî÷íîñòè è ïîëíîòå ñïåöèôèêàöèé ñ æåëàíèåì èçáåæàòü ëèøíèõ äåòàëåé â ñïåöèôèêàöèè.
• Ñïåöèôèêàöèÿ àáñòðàêòíîãî òèïà äàííûõ ÿâëÿåòñÿ ôîðìàëüíûì ìàòåìàòè÷åñêèì îïèñàíèåì,
à íå òåêñòîì ïðîãðàììû. Îíà àïïëèêàòèâíà, ò.å. íå âêëþ÷àåò â ÿâíîì âèäå èçìåíåíèé.
• ÀÒÄ ìîæåò áûòü ðîäîâûì, è îí çàäàåòñÿ ôóíêöèÿìè, àêñèîìàìè è ïðåäóñëîâèÿìè. Àêñèîìû
è ïðåäóñëîâèÿ âûðàæàþò ñåìàíòèêó äàííîãî òèïà è âàæíû äëÿ ïîëíîãî è îäíîçíà÷íîãî åãî
îïèñàíèÿ.
• ×àñòè÷íûå ôóíêöèè îáðàçóþò óäîáíóþ ìàòåìàòè÷åñêóþ ìîäåëü äëÿ îïèñàíèÿ íå âñþäó îïðåäåëåííûõ îïåðàöèé. Ó êàæäîé ÷àñòè÷íîé ôóíêöèè èìååòñÿ ïðåäóñëîâèå, çàäàþùåå óñëîâèå,
ïðè êîòîðîì îíà áóäåò âûäàâàòü ðåçóëüòàò äëÿ çàäàííîãî êîíêðåòíîãî àðãóìåíòà.
• ÎÎ-ñèñòåìà - ýòî ñîâîêóïíîñòü êëàññîâ. Êàæäûé êëàññ îñíîâàí íà íåêîòîðîì àáñòðàêòíîì òèïå
äàííûõ è çàäàåò ÷àñòè÷íóþ èëè ïîëíóþ ðåàëèçàöèþ ýòîãî ÀÒÄ.
• Êëàññ ÿâëÿåòñÿ ýôôåêòèâíûì, åñëè îí ïîëíîñòüþ ðåàëèçîâàí, â ïðîòèâíîì ñëó÷àå îí íàçûâàåòñÿ îòëîæåííûì.
• Êëàññû äîëæíû ðàçðàáàòûâàòüñÿ â íàèáîëåå îáùåì âèäå, äîïóñêàþùåì ïîâòîðíîå èñïîëüçîâàíèå; ïðîöåññ èõ îáúåäèíåíèÿ â ñèñòåìó ÷àñòî èäåò ñíèçó-ââåðõ.
• Àáñòðàêòíûå òèïû äàííûõ ÿâëÿþòñÿ ñêîðåå íåÿâíûìè, ÷åì ÿâíûìè îïèñàíèÿìè. Ýòà íåÿâíîñòü,
êîòîðàÿ òàêæå îçíà÷àåò îòêðûòîñòü, ïåðåíîñèòñÿ íà âåñü ÎÎ-ìåòîä.
• Íå ñóùåñòâóåò ôîðìàëüíîãî îïðåäåëåíèÿ èíòóèòèâíî ÿñíîãî ïîíÿòèÿ "ïîëíîòû"ñïåöèôèêàöèè
àáñòðàêòíîãî òèïà äàííûõ. Ñòðîãî îïðåäåëÿåìîå ïîíÿòèå äîñòàòî÷íîé ïîëíîòû êàê ïðàâèëî
îáåñïå÷èâàåò óäîâëåòâîðèòåëüíûé îòâåò. Õîòÿ íå ñóùåñòâóåò ìåòîäà, óñòàíàâëèâàþùåãî äîñòàòî÷íóþ ïîëíîòó ïðîèçâîëüíîé ñïåöèôèêàöèè, ÷àñòî óäàåòñÿ åå äîêàçàòü äëÿ êîíêðåòíûõ
ñïåöèôèêàöèé; ïðèâåäåííîå â ýòîé ëåêöèè äîêàçàòåëüñòâî äîñòàòî÷íîé ïîëíîòû äëÿ ñïåöèôèêàöèè ñòåêîâ ìîæåò ñëóæèòü îáðàçöîì è äëÿ äðóãèõ ñëó÷àåâ.
Êîíòðîëüíûå âîïðîñû
Begin Quiz
1. Êàêèìè êðèòåðèÿìè ñëåäóåò ðóêîâîäñòâîâàòüñÿ ïðè îïèñàíèè òèïîâ îáúåêòîâ?
îïèñàíèÿ äîëæíû áûòü ïîëíîñòüþ ñïåöèôèöèðîâàíû
îïèñàíèÿ íå äîëæíû áûòü èçëèøíå ñïåöèôèöèðîâàíû
îïèñàíèÿ äîëæíû áûòü òî÷íûìè è íåäâóñìûñëåííûìè
îïèñàíèÿ ìîãóò áûòü íåòî÷íûìè
2. Ñïåöèôèêàöèÿ ÀÒÄ âêëþ÷àåò ðàçäåëû
òèïîâ
ôóíêöèé
àêñèîì
ïðåäóñëîâèé
3. Â îïèñàíèè ÀÒÄ ôóíêöèè ðàçäåëÿþòñÿ íà ñëåäóþùèå êàòåãîðèè
çàïðîñû
îòâåòû
êîíñòðóêòîðû
êîìàíäû
4. Ïðè îïèñàíèè ÀÒÄ ìîæíî?
óêàçûâàòü ðîäîâûå ïàðàìåòðû
çàäàâàòü ðîäèòåëüñêèé êëàññ
çàäàâàòü ðåàëèçàöèþ ôóíêöèé
çàäàâàòü ïðåäñòàâëåíèå äàííûõ
5. Ðàñïðåäåëèòåëü - ýòî?
ñèñòåìíûé àäìèíèñòðàòîð, ðàñïðåäåëÿþùèé çàäàíèÿ ìåæäó èñïîëíèòåëÿìè
ñïåöèàëüíûé âèä êîíòåéíåðà äàííûõ, â êîòîðîì êëèåíò óïðàâëÿåò ðàçìåùåíèåì ýëåìåíòîâ
ñïåöèàëüíûé âèä êîíòåéíåðà äàííûõ, â êîòîðîì ðàçìåùåíèå ýëåìåíòîâ îïðåäåëÿåòñÿ âíóòðåííåé äèñöèïëèíîé
6. Â îñíîâå ñïåöèôèêàöèè äîëæíî ëåæàòü
êîíêðåòíîå ïðåäñòàâëåíèå äàííûõ
ðåàëèçàöèÿ ôóíêöèé, âûïîëíÿåìûõ íàä äàííûìè
íàáîð ôóíêöèé, çàäàííûõ èõ ñèãíàòóðîé è èõ ôîðìàëüíûìè ñâîéñòâàìè
íàáîð èíòåðôåéñîâ äëÿ ðàáîòû ïîëüçîâàòåëÿ ñ îáúåêòàìè
7. Êàêèå îïðåäåëåíèÿ, ñâÿçàííûå ñ ïîíÿòèåì êëàññ, ÿâëÿþòñÿ êîððåêòíûìè?
êëàññ - ýòî àáñòðàêòíûé òèï äàííûõ, ñíàáæåííûé íåêîòîðîé (âîçìîæíî ÷àñòè÷íîé) ðåàëèçàöèåé
êëàññ íàçûâàåòñÿ ýôôåêòèâíûì, åñëè ïðè åãî ðåàëèçàöèè èñïîëüçóþòñÿ ýôôåêòèâíûå àëãîðèòìû
êëàññ íàçûâàåòñÿ àáñòðàêòíûì, åñëè åãî ðåàëèçàöèÿ çàäàíà ëèøü ÷àñòè÷íî
êëàññ íàçûâàåòñÿ îòëîæåííûì, åñëè åãî ðåàëèçàöèÿ çàäàíà ëèøü ÷àñòè÷íî
8. Ñòåê ìîæåò áûòü ïðåäñòàâëåí?
ìàññèâîì, ðàñòóùèì ââåðõ
íàáîðîì ïðîñòûõ ïåðåìåííûõ
ìàññèâîì, ðàñòóùèì âíèç
îäíîñâÿçíûì ñïèñêîì
9. Ñïåöèôèêàöèÿ
çàäàåò ìíîæåñòâî ïðàâèëüíî ïîñòðîåííûõ âûðàæåíèé
ìîæåò áûòü íåïîëíîé
ìîæåò áûòü ïðîòèâîðå÷èâîé
âûðàæåíèÿ, ñòðîÿùèåñÿ íà îñíîâå ÀÒÄ, ìîãóò áûòü íåêîððåêòíûìè
10. ÀÒÄ, êëàññû è ñêðûòèå èíôîðìàöèè
âñå, ÷òî âõîäèò â ÀÒÄ, íèêîãäà íå ñêðûâàåòñÿ è ïðåäñòàâëÿåò èíòåðôåéñ êëàññà
ïðåäñòàâëåíèå äàííûõ íèêîãäà íå ñêðûâàåòñÿ
ðåàëèçàöèÿ äàííûõ îáû÷íî ñêðûâàåòñÿ
àêñèîìû ÀÒÄ âñåãäà ñêðûâàþòñÿ
11. ×òîáû ÀÒÄ ïðåâðàòèòü â ýôôåêòèâíûé êëàññ íåîáõîäèìî?
âûáðàòü ïðåäñòàâëåíèå äàííûõ
îòîáðàçèòü ìíîæåñòâî ôóíêöèé ÀÒÄ â êîìïîíåíòû êëàññà
â ñîîòâåòñòâèè ñ âûáðàííûì ïðåäñòàâëåíèåì çàäàòü ðåàëèçàöèþ êîìïîíåíòîâ, óäîâëåòâîðÿþùóþ àêñèîìàì
ïðîâåñòè ôîðìàëüíîå äîêàçàòåëüñòâî ñîîòâåòñòâèÿ ðåàëèçàöèè è àêñèîì ÀÒÄ
12. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
äëÿ ïîëó÷åíèÿ ýôôåêòèâíîãî êëàññà òðåáóåòñÿ ïðåäóñìîòðåòü âñå äåòàëè ðåàëèçàöèè
îïèñàíèå ÀÒÄ îñíîâàíî íà îïèñàíèè ôóíêöèé, ïðèìåíÿåìûõ ê äàííûì
êîíñòðóèðîâàíèå ÎÎ ÏÎ ýòî ïîñòðîåíèå ïðîãðàììíîé ñèñòåìû êàê ñòðóêòóðèðîâàííîé ñîâîêóïíîñòè ðåàëèçàöèé (âîçìîæíî ÷àñòè÷íûõ) àáñòðàêòíûõ òèïîâ äàííûõ
ñèñòåìà ïðåäñòàâëÿåò ñîáîé ñîâîêóïíîñòü êëàññîâ, áåç âûäåëåíèÿ êàêîãî-ëèáî ãëàâíîãî èëè
îòâåòñòâåííîãî êëàññà èëè ãîëîâíîé ïðîãðàììû
13. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
äëÿ êîíñòðóèðîâàíèÿ ïðîãðàìì íóæíû íå ñàìè ïî ñåáå ÀÒÄ (êàê ìàòåìàòè÷åñêîå ïîíÿòèå),
à ðåàëèçàöèè ÀÒÄ ïðîãðàììèñòñêîå ïîíÿòèå
çàäàíèå ñïåöèôèêàöèé ñîîòâåòñòâóåò ýòàïó àíàëèçà ñèñòåìû
çàäàíèå ïðåäñòàâëåíèé ñîîòâåòñòâóåò ýòàïó ïðîåêòèðîâàíèÿ ñèñòåìû
çàäàíèå ðåàëèçàöèé ôóíêöèé ñîîòâåòñòâóåò ýòàïó ðåàëèçàöèè ñèñòåìû
14. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
ñïåöèôèêàöèÿ àáñòðàêòíîãî òèïà äàííûõ ÿâëÿåòñÿ òåêñòîì ïðîãðàììû
ÀÒÄ íå ìîæåò áûòü ðîäîâûì
ÎÎ-ñèñòåìà ýòî ñîâîêóïíîñòü êëàññîâ. Êàæäûé êëàññ îñíîâàí íà íåêîòîðîì àáñòðàêòíîì
òèïå äàííûõ è çàäàåò ÷àñòè÷íóþ èëè ïîëíóþ ðåàëèçàöèþ ýòîãî ÀÒÄ
êëàññ ÿâëÿåòñÿ ýôôåêòèâíûì, åñëè îí ïîëíîñòüþ ðåàëèçîâàí, â ïðîòèâíîì ñëó÷àå îí íàçûâàåòñÿ îòëîæåííûì
End Quiz
Íàáðàíî áàëëîâ
7 Ñòàòè÷åñêèå ñòðóêòóðû
7.1 Êëàññû, à íå îáúåêòû - ïðåäìåò îáñóæäåíèÿ
Êàêîâà öåíòðàëüíàÿ êîíöåïöèÿ îáúåêòíîé òåõíîëîãèè? Íåîáõîäèìî äâàæäû ïîäóìàòü, ïðåæäå ÷åì
îòâåòèòü "îáúåêò". Îáúåêòû ïîëåçíû, íî â íèõ íåò íè÷åãî íîâîãî.
Ñ òåõ ïîð, êàê ñòðóêòóðû èñïîëüçóþòñÿ â Cobol, ñ òåõ ïîð, êàê â Pascal ñóùåñòâóþò çàïèñè, ñ
òåõ ïîð êàê ïðîãðàììèñò íàïèñàë íà C ïåðâîå îïðåäåëåíèå ñòðóêòóðû, ÷åëîâå÷åñòâî ðàñïîëàãàåò
îáúåêòàìè.
Îáúåêòû âàæíû ïðè îïèñàíèè âûïîëíåíèÿ ÎÎ-ñèñòåì. Íî áàçîâûì ïîíÿòèåì îáúåêòíîé òåõíîëîãèè ÿâëÿåòñÿ êëàññ. Îáðàòèìñÿ âíîâü ê åãî îïðåäåëåíèþ. (Äåòàëüíîå îáñóæäåíèå îáúåêòîâ ñîäåðæèòñÿ â ñëåäóþùåé ëåêöèè.)
Îïðåäåëåíèå êëàññà:
Êëàññ - ýòî àáñòðàêòíûé òèï äàííûõ, ïîñòàâëÿåìûé ñ âîçìîæíî ÷àñòè÷íîé ðåàëèçàöèåé.
Àáñòðàêòíûå òèïû äàííûõ (ÀÒÄ) ÿâëÿþòñÿ ìàòåìàòè÷åñêèì ïîíÿòèåì, ïðèãîäíûì íà ýòàïå ïîäãîòîâêè ñïåöèôèêàöèè - â ïðîöåññå àíàëèçà. Ïîíÿòèå êëàññà, ïðåäóñìàòðèâàÿ ÷àñòè÷íóþ èëè ïîëíóþ ðåàëèçàöèþ, îáåñïå÷èâàåò íåîáõîäèìóþ ñâÿçü ñ ðàçðàáîòêîé ÏÎ íà ýòàïàõ ïðîåêòèðîâàíèÿ è
ïðîãðàììèðîâàíèÿ. Íàïîìíèì, êëàññ íàçûâàåòñÿ ýôôåêòèâíûì, åñëè åãî ðåàëèçàöèÿ ïîëíà, è îòëîæåííûì - ïðè ÷àñòè÷íîé ðåàëèçàöèè.
Àíàëîãè÷íî ÀÒÄ, êëàññ ýòî òèï, îïèñûâàþùèé ìíîæåñòâî âîçìîæíûõ ñòðóêòóð äàííûõ, íàçû-
âàåìûõ ýêçåìïëÿðàìè (instances) êëàññà. Ýêçåìïëÿðû ÀÒÄ ÿâëÿþòñÿ àáñòðàêöèÿìè - ýëåìåíòàìè
ìàòåìàòè÷åñêîãî ìíîæåñòâà. Ýêçåìïëÿð êëàññà êîíêðåòåí - ýòî ñòðóêòóðà äàííûõ, ðàçìåùàåìàÿ â
ïàìÿòè êîìïüþòåðà è îáðàáàòûâàåìàÿ ïðîãðàììîé.
Íàïðèìåð, åñëè îïðåäåëèòü êëàññ STACK, âçÿâ çà îñíîâó ñïåöèôèêàöèþ ÀÒÄ èç ïðåäûäóùåé ëåêöèè è äîáàâèâ èíôîðìàöèþ, íåîáõîäèìóþ äëÿ àäåêâàòíîãî ïðåäñòàâëåíèÿ, òî ýêçåìïëÿðàìè êëàññà
áóäóò ñòðóêòóðû äàííûõ - êîíêðåòíûå ñòåêè. Äðóãèì ïðèìåðîì ÿâëÿåòñÿ êëàññ POINT, ìîäåëèðóþùèé òî÷êó íà ïëîñêîñòè. Åñëè äëÿ ïðåäñòàâëåíèÿ òî÷êè âûáðàíà äåêàðòîâà ñèñòåìà êîîðäèíàò, òî
êàæäûé ýêçåìïëÿð POINT ïðåäñòàâëÿåò ñîáîé çàïèñü ñ ïîëÿìè x, y - àáñöèññîé òî÷êè è åå îðäèíàòîé.
Òåðìèí "îáúåêò"ïîÿâëÿåòñÿ êàê ïîáî÷íûé ïðîäóêò îïðåäåëåíèÿ "êëàññà". Îáúåêò ýòî ïðîñòî ýêçåìïëÿð íåêîòîðîãî êëàññà.
Ïðîãðàììíûå òåêñòû, îïèñûâàþùèå ñîçäàâàåìóþ ñèñòåìó, ñîäåðæàò îïðåäåëåíèÿ êëàññîâ. Îáúåêòû ñîçäàþòñÿ òîëüêî â ïðîöåññå âûïîëíåíèÿ ïðîãðàìì.
Íàñòîÿùàÿ ëåêöèÿ ïîñâÿùåíà îñíîâíûì ïðèåìàì ñîçäàíèÿ ïðîãðàììíûõ ýëåìåíòîâ è îáúåäèíåíèÿ
èõ â ñèñòåìû, èìåííî ïîýòîìó â öåíòðå âíèìàíèÿ - êëàññû.  ñëåäóþùåé ëåêöèè áóäóò ðàññìîòðåíû ñòðóêòóðû ïåðèîäà âûïîëíåíèÿ, ïîðîæäàåìûå ÎÎ-ñèñòåìîé, ÷òî ïîòðåáóåò èçó÷åíèÿ íåêîòîðûõ
îñîáåííîñòåé ðåàëèçàöèè è áîëåå äåòàëüíîãî ðàññìîòðåíèÿ ïðèðîäû îáúåêòîâ.
7.2 Ðîëü êëàññîâ
Çàòðàòèâ íåìíîãî âðåìåíè íà óñòðàíåíèå àáñóðäíûõ, íî ðàñïðîñòðàíåííûõ è âðåäíûõ çàáëóæäåíèé,
ìîæíî âåðíóòüñÿ ê ðàññìîòðåíèþ öåíòðàëüíûõ ñâîéñòâ êëàññîâ è âûÿñíèòü, â ÷àñòíîñòè, ïî÷åìó
îíè ñòîëü âàæíû â îáúåêòíîé òåõíîëîãèè.
Ìåòàêëàññ - ýòî êëàññ, ýêçåìïëÿðû êîòîðîãî ñàìè ÿâëÿþòñÿ êëàññàìè
Äëÿ ïîíèìàíèÿ ÎÎ-ïîäõîäà íåîáõîäèìî ÿñíî ïðåäñòàâëÿòü, ÷òî êëàññû âûïîëíÿþò äâå ôóíêöèè,
êîòîðûå äî ïîÿâëåíèÿ ÎÎ-òåõíîëîãèé âñåãäà áûëè ðàçäåëåíû. Êëàññ îäíîâðåìåííî ÿâëÿåòñÿ ìîäóëåì
è òèïîì.
Ìîäóëè è òèïû
Ñðåäñòâà, èñïîëüçóåìûå ïðè ðàçðàáîòêå ÏÎ, - ÿçûêè ïðîãðàììèðîâàíèÿ, ïðîåêòèðîâàíèÿ, ñïåöèôèêàöèé, ãðàôè÷åñêèå ñèñòåìû îáîçíà÷åíèé äëÿ àíàëèçà, - âñåãäà âêëþ÷àëè â ñåáÿ êàê âîçìîæíîñòü
ïðèìåíåíèÿ ìîäóëåé, òàê è ñèñòåìó òèïîâ.
Ìîäóëè - ýòî ñòðóêòóðíûå åäèíèöû, èç êîòîðûõ ñîñòîèò ïðîãðàììà. Ðàçëè÷àþòñÿ âèäû ìîäóëåé,
òàêèå êàê ïîäïðîãðàììû è ïàêåòû. Íåçàâèñèìî îò êîíêðåòíîãî âûáîðà òîé èëè èíîé ìîäóëüíîé
ñòðóêòóðû, ìîäóëü âñåãäà ðàññìàòðèâàåòñÿ êàê ñèíòàêñè÷åñêàÿ êîíöåïöèÿ. Îòñþäà ñëåäóåò, ÷òî ðàçáèåíèå íà ìîäóëè âëèÿåò ëèøü íà ôîðìó çàïèñè èñõîäíûõ òåêñòîâ ïðîãðàìì, íî íå îïðåäåëÿåò èõ
ôóíêöèîíàëüíîñòü. Â ñàìîì äåëå, ïðèíöèïèàëüíî ìîæíî íàïèñàòü ïðîãðàììó Ada â âèäå åäèíñòâåííîãî ïàêåòà, èëè ïðîãðàììó Pascal êàê åäèíóþ îñíîâíóþ ïðîãðàììó. Áåçóñëîâíî, òàêîé ïîäõîä íå
ðåêîìåíäóåòñÿ, è ëþáîé êîìïåòåíòíûé ïðîãðàììèñò áóäåò èñïîëüçîâàòü ìîäóëüíûå âîçìîæíîñòè
ÿçûêà äëÿ äåëåíèÿ ïðîãðàììû íà îáîçðèìûå è óïðàâëÿåìûå ÷àñòè. Íî åñëè âçÿòü ñóùåñòâóþùóþ
ïðîãðàììó, íàïðèìåð íà Ïàñêàëå, òî âñåãäà ìîæíî ñîáðàòü âîåäèíî âñå ìîäóëè è ïîëó÷èòü ðàáîòîñïîñîáíóþ ïðîãðàììó ñ ýêâèâàëåíòíîé ñåìàíòèêîé. (Ïðèñóòñòâèå ðåêóðñèâíûõ ïîäïðîãðàìì äåëàåò
ýòîò ïðîöåññ ìåíåå òðèâèàëüíûì, íî íå îêàçûâàåò ïðèíöèïèàëüíîãî âëèÿíèÿ íà äàííóþ äèñêóññèþ.)
Òàêèì îáðàçîì, äåëåíèå íà ìîäóëè äèêòóåòñÿ ïðèíöèïàìè óïðàâëåíèÿ ïðîåêòàìè, à íå âíóòðåííåé
íåîáõîäèìîñòüþ.
Êîíöåïöèÿ òèïîâ íà ïåðâûé âçãëÿä ñîâåðøåííî èíàÿ. Òèï ÿâëÿåòñÿ ñòàòè÷åñêèì îïèñàíèåì âïîëíå
îïðåäåëåííûõ äèíàìè÷åñêèõ îáúåêòîâ - ýëåìåíòîâ äàííûõ, êîòîðûå îáðàáàòûâàþòñÿ âî âðåìÿ âûïîëíåíèÿ ïðîãðàììíîé ñèñòåìû. Íàáîð òèïîâ îáû÷íî ñîäåðæèò ïðåäîïðåäåëåííûå òèïû, òàêèå êàê
INTEGER èëè CHARACTER, à òàêæå ïîëüçîâàòåëüñêèå òèïû: çàïèñè (ñòðóêòóðû), óêàçàòåëè, ìíî-
æåñòâà (â Pascal), ìàññèâû è äðóãèå. Ïîíÿòèå òèïà ÿâëÿåòñÿ ñåìàíòè÷åñêîé êîíöåïöèåé, è êàæäûé
òèï íåïîñðåäñòâåííî âëèÿåò íà âûïîëíåíèå ïðîãðàììíîé ñèñòåìû, òàê êàê îïèñûâàåò ôîðìó îáúåêòîâ, êîòîðûå ñèñòåìà ñîçäàåò è êîòîðûìè îíà ìàíèïóëèðóåò.
Êëàññ êàê ìîäóëü è êàê òèï
 íå ÎÎ-ïîäõîäàõ êîíöåïöèè ìîäóëÿ è òèïà ñóùåñòâóþò íåçàâèñèìî äðóã îò äðóãà. Íàèáîëåå çàìå÷àòåëüíûì ñâîéñòâîì êëàññà ÿâëÿåòñÿ îäíîâðåìåííîå èñïîëüçîâàíèå îáåèõ êîíöåïöèé â ðàìêàõ
åäèíîé ëèíãâèñòè÷åñêîé êîíñòðóêöèè. Êëàññ ÿâëÿåòñÿ ìîäóëåì èëè åäèíèöåé ïðîãðàììíîé äåêîìïîçèöèè, íî îäíîâðåìåííî êëàññ ýòî òèï (èëè øàáëîí òèïà â òåõ ñëó÷àÿõ, êîãäà ïîääåðæèâàåòñÿ
ïàðàìåòðèçàöèÿ).
Ìîùü ÎÎ-ìåòîäà, âî ìíîãîì, ñëåäñòâèå ýòîãî îòîæäåñòâëåíèÿ. Íàñëåäîâàíèå, â ÷àñòíîñòè, ìîæåò
áûòü ïîëíîñòüþ ïîíÿòî, òîëüêî ïðè ðàññìîòðåíèè åãî êàê ìîäóëüíîãî ðàñøèðåíèÿ, òàê è, îäíîâðåìåííî, óòî÷íåíèÿ ñïåöèàëèçàöèè òèïà.
Êàê ïðàêòè÷åñêè ñîåäèíèòü äâå ñòîëü ðàçëè÷íûå íà ïåðâûé âçãëÿä êîíöåïöèè? Ïîñëåäóþùàÿ
äèñêóññèÿ è ïðèìåðû ïîçâîëÿò îòâåòèòü íà ýòîò âîïðîñ.
7.3 Óíèôèöèðîâàííàÿ ñèñòåìà òèïîâ
Âàæíûì àñïåêòîì ÎÎ-ïîäõîäà ÿâëÿåòñÿ ïðîñòîòà è óíèâåðñàëüíîñòü ñèñòåìû òèïîâ, êîòîðàÿ ñòðîèòñÿ íà îñíîâå ôóíäàìåíòàëüíîãî ïðèíöèïà.
Îáúåêòíûé ïðèíöèï:
Êàæäûé îáúåêò ÿâëÿåòñÿ ýêçåìïëÿðîì íåêîòîðîãî êëàññà
Îáúåêòíûé ïðèíöèï áóäåò ðàñïðîñòðàíÿòüñÿ íå òîëüêî íà ñîñòàâíûå îáúåêòû, îïðåäåëÿåìûå ðàçðàáîò÷èêàìè (òàêèå êàê ñòðóêòóðû äàííûõ, ñîäåðæàùèå íåñêîëüêî ïîëåé), íî è íà áàçîâûå îáúåê-
òû - öåëûå è äåéñòâèòåëüíûå ÷èñëà, áóëåâû çíà÷åíèÿ è ñèìâîëû, êîòîðûå áóäóò ðàññìàòðèâàòüñÿ
êàê ýêçåìïëÿðû ïðåäîïðåäåëåííûõ áèáëèîòå÷íûõ êëàññîâ (INTEGER, REAL, DOUBLE, BOOLEAN,
CHARACTER).
Íà ïåðâûé âçãëÿä ïîäîáíîå ñòðåìëåíèå ïðåâðàòèòü ëþáîå ñêîëü óãîäíî ïðîñòîå çíà÷åíèå â ýêçåìïëÿð íåêîòîðîãî êëàññà ìîæåò ïîêàçàòüñÿ ïðåóâåëè÷åííûì è äàæå ýêñòðàâàãàíòíûì.  êîíöå
êîíöîâ, ìàòåìàòèêè è èíæåíåðû â òå÷åíèå ìíîãèõ ëåò óñïåøíî èñïîëüçóþò öåëûå è äåéñòâèòåëüíûå ÷èñëà, íå ïîäîçðåâàÿ î òîì, ÷òî îíè ðàáîòàþò ñ ýêçåìïëÿðàìè êëàññîâ. Îäíàêî íàñòîé÷èâîå
òðåáîâàíèå ê óíèôèêàöèè âïîëíå îêóïàåòñÿ ïî ðÿäó ïðè÷èí.
• Âñåãäà æåëàòåëüíî èìåòü ïðîñòóþ è óíèâåðñàëüíóþ ñõåìó, íåæåëè ìíîæåñòâî ÷àñòíûõ ñëó÷àåâ.
Ïðåäëàãàåìàÿ ñèñòåìà òèïîâ ïîëíîñòüþ îïèðàåòñÿ íà ïîíÿòèå êëàññà.
• Îïèñàíèå áàçîâûõ òèïîâ êàê àáñòðàêòíûõ ñòðóêòóð äàííûõ è äàëåå êàê êëàññîâ ÿâëÿåòñÿ ïðîñòûì è åñòåñòâåííûì. Íåòðóäíî ïðåäñòàâèòü, íàïðèìåð, îïðåäåëåíèå êëàññà INTEGER ñ ôóíêöèîíàëüíîñòüþ âêëþ÷àþùåé àðèôìåòè÷åñêèå îïåðàöèè, òàêèå êàê "+ îïåðàöèè ñðàâíåíèÿ, òàêèå êàê ="è àññîöèèðîâàííûå ñâîéñòâà, ñëåäóþùèå èç ñîîòâåòñòâóþùèõ ìàòåìàòè÷åñêèõ àêñèîì.
• Îïðåäåëåíèå áàçîâûõ òèïîâ êàê êëàññîâ ïîçâîëÿåò èñïîëüçîâàòü âñå âîçìîæíîñòè ÎÎ, ãëàâíûì
îáðàçîì íàñëåäîâàíèå è ðîäîâûå ñðåäñòâà. Åñëè áàçîâûå òèïû íå áóäóò êëàññàìè, òî ïðèäåòñÿ
ââîäèòü ðÿä îãðàíè÷åíèé è ðàññìàòðèâàòü ÷àñòíûå ñëó÷àè.
7.4 Ïðîñòîé êëàññ
×òî ïðåäñòàâëÿåò ñîáîé êëàññ ìîæíî âûÿñíèòü, èçó÷àÿ ïðîñòîé, íî òèïè÷íûé ïðèìåð, êîòîðûé
äåìîíñòðèðóåò ôóíäàìåíòàëüíûå ñâîéñòâà, ïðèìåíèìûå ïðàêòè÷åñêè êî âñåì êëàññàì.
Ðèñ. 7.1: Òî÷êà è åå êîîðäèíàòû
Êîìïîíåíòû
Ïðèìåð èñïîëüçóåò ïðåäñòàâëåíèå òî÷êè â äâóìåðíîé ãðàôè÷åñêîé ñèñòåìå:
Äëÿ îïðåäåëåíèÿ òèïà POINT êàê àáñòðàêòíîãî òèïà äàííûõ ïîòðåáóåòñÿ ÷åòûðå ôóíêöèè-çàïðîñà:
x, y, ρ, θ. (Â òåêñòàõ ïîäïðîãðàìì äëÿ äâóõ ïîñëåäíèõ ôóíêöèé áóäóò èñïîëüçîâàòüñÿ èìåíà rho è
theta). Ôóíêöèÿ x âîçâðàùàåò àáñöèññó òî÷êè (ãîðèçîíòàëüíóþ êîîðäèíàòó), y - îðäèíàòó (âåðòèêàëüíóþ êîîðäèíàòó), ρ - ðàññòîÿíèå îò íà÷àëà êîîðäèíàò, θ - ïîëÿðíûé óãîë, îòñ÷èòûâàåìûé îò
ãîðèçîíòàëüíîé îñè. Çíà÷åíèÿ x è y ÿâëÿþòñÿ äåêàðòîâûìè, à ρ è θ - ïîëÿðíûìè êîîðäèíàòàìè òî÷êè. Äðóãîé ïîëåçíîé ôóíêöèåé ÿâëÿåòñÿ distance, âîçâðàùàþùàÿ ðàññòîÿíèå ìåæäó äâóìÿ òî÷êàìè.
Äàëåå ñïåöèôèêàöèÿ ÀÒÄ áóäåò ñîäåðæàòü òàêèå êîìàíäû, êàê translate (ïåðåìåùåíèå òî÷êè íà
çàäàííîå ðàññòîÿíèå ïî ãîðèçîíòàëè è âåðòèêàëè), rotate (ïîâîðîò íà îïðåäåëåííûé óãîë âîêðóã
íà÷àëà êîîðäèíàò) è scale (óìåíüøåíèå èëè óâåëè÷åíèå ðàññòîÿíèÿ äî íà÷àëà êîîðäèíàò â çàäàííîå
÷èñëî ðàç).
7.5 Êëþ÷åâûå êîíöåïöèè
• Ôóíäàìåíòàëüíàÿ êîíöåïöèÿ îáúåêòíîé òåõíîëîãèè îñíîâàíà íà ïîíÿòèè êëàññà. Êëàññ ýòî
àáñòðàêòíûé òèï äàííûõ, ÷àñòè÷íî èëè ïîëíîñòüþ ðåàëèçîâàííûé.
• Êëàññ ìîæåò èìåòü ýêçåìïëÿðû, íàçûâàåìûå îáúåêòàìè.
• Íåëüçÿ ïóòàòü îáúåêòû (äèíàìè÷åñêèå ýëåìåíòû) ñ êëàññàìè (ñòàòè÷åñêèì îïèñàíèåì ñâîéñòâ,
îáùèõ äëÿ ìíîæåñòâà îáúåêòîâ âðåìåíè âûïîëíåíèÿ).
• Ïðè ïîñëåäîâàòåëüíîì ïîäõîäå ê îáúåêòíîé òåõíîëîãèè êàæäûé îáúåêò ÿâëÿåòñÿ ýêçåìïëÿðîì
êëàññà.
• Êëàññ îäíîâðåìåííî ñëóæèò ìîäóëåì è òèïîì. Îðèãèíàëüíîñòü è ìîùü ÎÎ-ìîäåëè ñëåäóåò
÷àñòè÷íî èç èíòåãðàöèè ýòèõ ïîíÿòèé.
• Êëàññ õàðàêòåðèçóåòñÿ êîìïîíåíòàìè, âêëþ÷àÿ àòðèáóòû, ïðåäñòàâëÿþùèå ïîëÿ â ýêçåìïëÿðàõ êëàññà, è ïîäïðîãðàììû, ïðåäñòàâëÿþùèå âû÷èñëåíèÿ ñ ó÷àñòèåì äàííûõ ýêçåìïëÿðîâ.
Ïîäïðîãðàììà ìîæåò áûòü ôóíêöèåé âîçâðàùàþùåé ðåçóëüòàò èëè ïðîöåäóðîé, åñëè ðåçóëüòàò íå âîçâðàùàåòñÿ.
• Áàçîâûì ìåõàíèçìîì ÎÎ-âû÷èñëåíèé ÿâëÿåòñÿ âûçîâ êîìïîíåíòîâ (îáðàùåíèå ê êîìïîíåíòàì)
êëàññà. Âûçîâ êîìïîíåíòà ïðèìåíÿåò êîìïîíåíò ê ýêçåìïëÿðó êëàññà (âîçìîæíî ñ àðãóìåíòàìè).
• Ïðè âûçîâå èìåíîâàííûõ êîìïîíåíòîâ èñïîëüçóåòñÿ òî÷å÷íàÿ íîòàöèÿ, à ïðè âûçîâå êîìïîíåíòîïåðàöèé - èíôèêñíàÿ èëè ïðåôèêñíàÿ íîòàöèÿ.
• Êàæäàÿ îïåðàöèÿ îòíîñèòåëüíà ê "òåêóùåìó ýêçåìïëÿðó"êëàññà.
• Äëÿ êëèåíòîâ êëàññà (äðóãèõ êëàññîâ, êîòîðûå èñïîëüçóþò åãî êîìïîíåíòû) àòðèáóò íè÷åì
íå îòëè÷àåòñÿ îò ôóíêöèè áåç àðãóìåíòîâ, â ñîîòâåòñòâèè ñ ïðèíöèïîì óíèôèöèðîâàííîãî
äîñòóïà.
• Èñïîëíÿåìûé àíñàìáëü êëàññîâ íàçûâàåòñÿ ñèñòåìîé. Ñèñòåìà ñîäåðæèò êîðíåâîé êëàññ è âñå
êëàññû, êîòîðûå íåîáõîäèìû êîðíåâîìó ïðÿìî èëè êîñâåííî ÷åðåç êëèåíòñêèå îòíîøåíèÿ èëè
íàñëåäîâàíèå. Âûïîëíåíèå ñèñòåìû ñâîäèòñÿ ê ñîçäàíèþ ýêçåìïëÿðà êîðíåâîãî êëàññà è âûçîâó
ïðîöåäóðû ñîçäàíèÿ äëÿ äàííîãî ýêçåìïëÿðà.
• Ñèñòåìû èìåþò äåöåíòðàëèçîâàííóþ àðõèòåêòóðó. Ïîðÿäîê äåéñòâèé íåñóùåñòâåíåí äëÿ ðàçðàáîòêè.
• Ìåõàíèçì ñêðûòèÿ èíôîðìàöèè òðåáóåò ãèáêîñòè. Íàðÿäó ñ íåîãðàíè÷åííûì äîñòóïîì è ïîëíûì ñêðûòèåì ìîæåò ïîòðåáîâàòüñÿ ýêñïîðò òîëüêî äëÿ ÷àñòè êëèåíòîâ. Àòðèáóòû ìîãóò áûòü
äîñòóïíû òîëüêî äëÿ ÷òåíèÿ, äëÿ ÷òåíèÿ è îãðàíè÷åííîé ìîäèôèêàöèè è â ðåæèìå ïîëíîãî
äîñòóïà.
• Ýêñïîðò àòðèáóòà îçíà÷àåò äîñòóï ê íåìó òîëüêî äëÿ ÷òåíèÿ. Ìîäèôèêàöèÿ òðåáóåò âûçîâà
ñîîòâåòñòâóþùåé ýêñïîðòèðîâàííîé ïðîöåäóðû.
• Ìîäóëüíûé ñòèëü ÎÎ-ðàçðàáîòîê òðåáóåò áîëüøîãî ÷èñëà íåáîëüøèõ ïîäïðîãðàìì. Ïîòåíöèàëüíàÿ îïàñíîñòü ñíèæåíèÿ ïðîèçâîäèòåëüíîñòè ìîæåò áûòü äîñòèãíóòà ïóòåì âñòðàèâàíèÿ
ýòèõ ïîäïðîãðàìì îïòèìèçèðóþùèì êîìïèëÿòîðîì. Îòâåòñòâåííîñòü çà ïîèñê òàêèõ ôðàãìåíòîâ ñëåäóåò âîçëîæèòü íà êîìïèëÿòîð, à íå íà ðàçðàáîò÷èêîâ.
Êîíòðîëüíûå âîïðîñû
Begin Quiz
1. Êëàññ - ýòî?
ñòàòè÷åñêàÿ ñòðóêòóðà
ïðîãðàììíûé òåêñò
äèíàìè÷åñêàÿ ñòðóêòóðà, ñîçäàâàåìàÿ â ìîìåíò âûïîëíåíèÿ
ÀÒÄ ñ çàäàííîé ðåàëèçàöèåé (âîçìîæíî ÷àñòè÷íîé)
2. Ìåòàêëàññ - ýòî?
áîëüøîé êëàññ
ñèíîíèì ïîíÿòèÿ àáñòðàêòíûé êëàññ
êëàññ, ýêçåìïëÿðû êîòîðîãî ñàìè ÿâëÿþòñÿ êëàññàìè
êëàññ, îáúåêòû êîòîðîãî ñàìè ÿâëÿþòñÿ êëàññàìè
3. Îáúåêò - ýòî?
ñòàòè÷åñêàÿ ñòðóêòóðà
ïðîãðàììíûé òåêñò
äèíàìè÷åñêàÿ ñòðóêòóðà, ñîçäàâàåìàÿ â ìîìåíò âûïîëíåíèÿ
ýêçåìïëÿð êëàññà
4. Ìåòîä êëàññà - ýòî?
êîìïîíåíò êëàññà
ïðîöåäóðà èëè ôóíêöèÿ
ïîëå êëàññà
÷àñòü ñòðóêòóðû äàííûõ, ïðåäñòàâëÿþùåé îáúåêò
5. Ìîäóëü ýòî?
ñåìàíòè÷åñêîå ïîíÿòèå
ñèíòàêñè÷åñêîå ïîíÿòèå
êëàññ â ÎÎ-ïîäõîäå
ñòðóêòóðíûé àðõèòåêòóðíûé ýëåìåíò, èç íàáîðà êîòîðûõ ñòðîÿòñÿ ïðîãðàììû
6. Ôóíêöèÿ âñåãäà
âîçâðàùàåò ðåçóëüòàò
èìååò àðãóìåíòû
òðåáóåò âû÷èñëåíèé
âîçâðàùàåò çíà÷åíèå àòðèáóòà
7. Òåêóùèé îáúåêò ýòî?
öåëü âûçîâà â îáúåêòíûõ âû÷èñëåíèÿõ
öåëü íåêâàëèôèöèðîâàííîãî âûçîâà â îáúåêòíûõ âû÷èñëåíèÿõ
îáúåêò, ñîçäàâàåìûé â ìîìåíò "áîëüøîãî âçðûâà"
ñëó÷àéíî âûáèðàåìûé îáúåêò èç ìíîæåñòâà îáúåêòîâ, ñîçäàííûõ â ïðîöåññå âû÷èñëåíèÿ
8. Àòðèáóò êëàññà - ýòî?
êîìïîíåíò êëàññà
ìåòîä êëàññà
ïîëå êëàññà
÷àñòü ñòðóêòóðû äàííûõ, ïðåäñòàâëÿþùåé îáúåêò
9. Òèï - ýòî?
ñåìàíòè÷åñêîå ïîíÿòèå
ñèíòàêñè÷åñêîå ïîíÿòèå
êëàññ â ÎÎ-ïîäõîäå
ìíîæåñòâî îáúåêòîâ, íàä êîòîðûìè îïðåäåëåíî çàäàííîå ìíîæåñòâî îïåðàöèé
10. Ñîçäàíèå çàêîí÷åííîé ïðîãðàììíîé ñèñòåìû ïðåäïîëàãàåò
ñîçäàíèå ìíîæåñòâà êëàññîâ
âûáîð êîðíåâîãî êëàññà
çàìûêàíèå ñèñòåìû ïî îòíîøåíèþ ê êîðíåâîìó êëàññó
âûáîð êîðíåâîé ïðîöåäóðû ñîçäàíèÿ
11. Êëèåíòó êëàññà äîëæíû áûòü äîñòóïíû
âñå êîìïîíåíòû êëàññà-ïîñòàâùèêà
òîëüêî êîìïîíåíòû, ýêñïîðòèðóåìûå äàííîìó êëèåíòó
âñå êîìïîíåíòû, ýêñïîðòèðóåìûå ëþáîìó èç êëèåíòîâ
âñå êîìïîíåíòû, çà èñêëþ÷åíèåì òåõ, ÷òî ýêñïîðòèðóþòñÿ íàñëåäíèêàì êëàññà
12. Ñîãëàñíî ïðèíöèïó óíèôèöèðîâàííîãî äîñòóïà êëèåíò íå ìîæåò îòëè÷èòü
âûçîâ àòðèáóòà îò âûçîâà ìåòîäà
âûçîâ àòðèáóòà îò âûçîâà ôóíêöèè
âûçîâ ôóíêöèè îò âûçîâà ïðîöåäóðû
âûçîâ àòðèáóòà îò âûçîâà ôóíêöèè áåç àðãóìåíòîâ
13. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
äëÿ êàæäîãî âûçîâà äîëæíà áûòü ÿâíî óêàçàíà åãî öåëü
ñóùíîñòü è îáúåêò ýòî ñèíîíèìè÷íûå ïîíÿòèÿ
àòðèáóòû äîñòóïíû òîëüêî äëÿ ÷òåíèÿ
ñåëåêòèâíûé ýêñïîðò ïîçâîëÿåò ãðóïïå êîíöåïòóàëüíî ñâÿçàííûõ êëàññîâ îáåñïå÷èòü äðóã
äðóãó äîñòóï êî âñåì ñâîèì êîìïîíåíòàì, ñêðûâ èõ îò îñòàëüíîãî ìèðà
End Quiz
Íàáðàíî áàëëîâ
8 Äèíàìè÷åñêèå ñòðóêòóðû: îáúåêòû
8.1 Îáúåêòû
 ïðîöåññå âûïîëíåíèÿ ÎÎ-ñèñòåìà ñîçäàåò íåêîòîðîå ÷èñëî îáúåêòîâ. Îðãàíèçàöèÿ ýòèõ îáúåêòîâ è îòíîøåíèÿ ìåæäó íèìè îïðåäåëÿþò êîíñòðóêöèþ âðåìåíè âûïîëíåíèÿ. Ðàññìîòðèì ñâîéñòâà
îáúåêòîâ.
×òî òàêîå îáúåêò?
Îïðåäåëåíèå: îáúåêò
Îáúåêò - ýòî ýêçåìïëÿð íåêîòîðîãî êëàññà
Âî âðåìÿ âûïîëíåíèÿ ïðîãðàììíàÿ ñèñòåìà, ñîäåðæàùàÿ êëàññ C, ìîæåò â ðàçíûõ òî÷êàõ, èñïîëüçóÿ ïðîöåäóðû ñîçäàíèÿ èëè êëîíèðîâàíèÿ, ñîçäàâàòü ýêçåìïëÿðû C, - ñòðóêòóðû äàííûõ, ñîîòâåòñòâóþùèå îáðàçöó, çàäàííîìó êëàññîì C. Íàïðèìåð, ýêçåìïëÿð êëàññà POINT ïðåäñòàâëÿåò ñîáîé
ñòðóêòóðó äàííûõ, ñîñòîÿùóþ èç äâóõ ïîëåé, ñîîòâåòñòâóþùèõ àòðèáóòàì x è y êëàññà. Ýêçåìïëÿðû
âñåõ âîçìîæíûõ êëàññîâ ñîñòàâëÿþò ìíîæåñòâî îáúåêòîâ ñèñòåìû.
Ýòî îôèöèàëüíîå îïðåäåëåíèå â ìèðå ÎÎ-ÏÎ. Íî â ïîâñåäíåâíîì ÿçûêå òåðìèí "îáúåêò"èìååò
ãîðàçäî áîëåå øèðîêèé ñìûñë. Ëþáàÿ ïðîãðàììíàÿ ñèñòåìà ñâÿçàíà ñ îïðåäåëåííîé âíåøíåé ñèñòåìîé, êîòîðàÿ ìîæåò ñîäåðæàòü "îáúåêòû": òî÷êè, ëèíèè, ïîâåðõíîñòè è òåëà â ãðàôè÷åñêîé ñèñòåìå;
ñîòðóäíèêîâ è èõ îêëàäû â ñèñòåìå ðàñ÷åòà çàðàáîòíîé ïëàòû è ò.ä.  òàêèõ ñèòóàöèÿõ, êàê ïðàâèëî, ðåàëüíûì îáúåêòàì ñîîòâåòñòâóþò ïðîãðàììíûå îáúåêòû. Ïðèìåðîì ìîæåò ñëóæèòü êëàññ
EMPLOYEE â ñèñòåìå ðàñ÷åòà çàðïëàòû, ýêçåìïëÿðû êîòîðîãî ÿâëÿþòñÿ êîìïüþòåðíûìè ìîäåëÿìè ñîòðóäíèêîâ.
Íî íå ñòîèò ïåðåîöåíèâàòü "ðåàëüíîñòü"ñëîâà "îáúåêò". Â íàóêå è òåõíèêå ñóùåñòâóåò áîëüøîé
ðèñê â çàèìñòâîâàíèè ñëîâ åñòåñòâåííîãî ÿçûêà è ïðèäàíèÿ èì ñïåöèàëüíîãî ñìûñëà. Òåðìèí "îáúåêò"íàñòîëüêî ïåðåãðóæåí ïîâñåäíåâíûì ñìûñëîì, ÷òî òåõíè÷åñêîå åãî èñïîëüçîâàíèå ìîæåò ñòàòü
èñòî÷íèêîì íåäîðàçóìåíèé.  ÷àñòíîñòè:
• Íå âñå êëàññû ñîîòâåòñòâóþò òèïàì ïðîáëåìíîé îáëàñòè. Ìíîãèå êëàññû, ââåäåííûå â èíòåðåñàõ ïðîåêòèðîâàíèÿ è ðåàëèçàöèè, íå èìåþò äâîéíèêîâ â ìîäåëèðóåìîé ñèñòåìå. Èìåííî ýòè
êëàññû íà ïðàêòèêå ìîãóò èìåòü íàèáîëüøåå çíà÷åíèå è èìåííî èõ òðóäíåå âñåãî ñïðîåêòèðîâàòü.
• Íåêîòîðûå êîíöåïöèè ïðîáëåìíîé îáëàñòè åñòåñòâåííî ïðèâîäÿò ê êëàññàì, õîòÿ â ïðîáëåìíîé
îáëàñòè íå ñóùåñòâóåò ðåàëüíûõ îáúåêòîâ, êîòîðûå ìîæíî áûëî áû ïîñòàâèòü â ñîîòâåòñòâèå
ýêçåìïëÿðàì ýòèõ êëàññîâ. Ïðèìåðàìè ìîãóò áûòü êëàññ STATE, îïèñûâàþùèé ñîñòîÿíèå ñèñòåìû, èëè êëàññ COMMAND.
Êîãäà ñëîâî "îáúåêò"èñïîëüçóåòñÿ â ýòîì ïîñîáèè, òî èç êîíòåêñòà ÿñíî, â îáùåì èëè òåõíè÷åñêîì ñìûñëå èñïîëüçóåòñÿ ýòîò òåðìèí.  òåõ ñëó÷àÿõ, êîãäà ýòó ðàçíèöó íåîáõîäèìî ïîä÷åðêíóòü,
èñïîëüçóåòñÿ óòî÷íåíèå - ïðîãðàììíûé îáúåêò èëè âíåøíèé îáúåêò.
Áàçîâàÿ ôîðìà
Ïóñòü O - îáúåêò. Ïî îïðåäåëåíèþ îí ÿâëÿåòñÿ ýêçåìïëÿðîì íåêîòîðîãî êëàññà. Òî÷íåå, îí ÿâëÿåòñÿ
ïðÿìûì ýêçåìïëÿðîì (direct instance) òîëüêî îäíîãî êëàññà, íàïðèìåð C.
Ñ ó÷åòîì íàñëåäîâàíèÿ O áóäåò òîãäà êîñâåííûì ýêçåìïëÿðîì äðóãèõ êëàññîâ, - ïðåäêîâ C. Ýòî
òåìà äàëüíåéøåãî îáñóæäåíèÿ; â äàííîé äèñêóññèè äîñòàòî÷íî ïîíÿòèÿ ïðÿìîãî ýêçåìïëÿðà. Âåçäå,
ãäå íå ìîæåò âîçíèêíóòü íåäîðàçóìåíèé, ñëîâî "ïðÿìîé"áóäåò îïóùåíî.
Êëàññ C íàçûâàåòñÿ ïîðîæäàþùèì êëàññîì (generating class) èëè ïðîñòî ãåíåðàòîðîì (generator)
îáúåêòà O. Çàìåòüòå, C- ïðîãðàììíûé òåêñò, à O - ñòðóêòóðà äàííûõ âðåìåíè âûïîëíåíèÿ, ïîÿâëÿþùàÿñÿ â ðåçóëüòàòå ðàáîòû ðàññìîòðåííûõ íèæå ìåõàíèçìîâ ñîçäàíèÿ îáúåêòîâ.
×àñòü êîìïîíåíòîâ C ÿâëÿåòñÿ àòðèáóòàìè. Ýòè àòðèáóòû ïîëíîñòüþ îïðåäåëÿþò ôîðìó îáúåêòà,
ïðåäñòàâëÿþùåãî ñîáîé ïðîñòî íàáîð ïîëåé, ïî îäíîìó íà êàæäûé àòðèáóò.
Ðàññìîòðèì êëàññ POINT. Èñõîäíûé òåêñò èìååò âèä:
class Point:
def __init(self, x=0.0, y=0.0):
self.x = x
self.y = y
... Îáúÿâëåíèÿ ïîäïðîãðàìì ...
Äàííûé êëàññ èìååò äâà àòðèáóòà x è y òèïà Float, ñëåäîâàòåëüíî, åãî ýêçåìïëÿð - ýòî îáúåêò ñ
äâóìÿ ïîëÿìè, ñîäåðæàùèìè çíà÷åíèÿ ýòîãî òèïà:
Ïðîñòûå ïîëÿ
Îáà àòðèáóòà êëàññà POINT îòíîñÿòñÿ ê òèïó Float. Ñëåäîâàòåëüíî, ñîîòâåòñòâóþùèå ïîëÿ ïðÿìîãî
ýêçåìïëÿðà POINT ñîäåðæàò äåéñòâèòåëüíûå ÷èñëà.
Ýòî ïðèìåð ïîëåé, ñîîòâåòñòâóþùèõ àòðèáóòàì îäíîãî èç "áàçîâûõ"òèïîâ. Ôîðìàëüíî ýòè òèïû
îïðåäåëåíû êàê êëàññû, à èõ ýêçåìïëÿðû ïðèíèìàþò çíà÷åíèÿ èç ïðåäîïðåäåëåííûõ äèàïàçîíîâ. Ê
áàçîâûì (ïðåäîïðåäåëåííûì, âñòðîåííûì)òèïàì êîíêðåòíîãî ÿçûêà ïðîãðàììèðîâàíèÿ.
Ññûëêè
×àùå âñåãî íàì íåîáõîäèìû îáúåêòû ñ ïîëÿìè, ïðåäñòàâëÿþùèìè äðóãèå îáúåêòû. Ìîæíî ââåñòè
ïîíÿòèå ïîäîáúåêòà. Ìîæíî â êà÷åñòâå ðåøåíèÿ ïðåääëîæèòü â êàæäîì ýêçåìïëÿðå îáüåêòà äóáëèðîâàòü èíôîðìàöèþ â âèäå ïîäîáúåêòà. Ïðè÷èíû íåïðèåìëåìîñòè òàêîãî ðåøåíèÿ:
• Ðàñõîäóåòñÿ äîïîëíèòåëüíàÿ ïàìÿòü. Ìîæíî ïðèâåñòè â êà÷åñòâå áîëåå õàðàêòåðíîãî ïðèìåðà
ñîâîêóïíîñòü îáúåêòîâ, ïðåäñòàâëÿþùèõ ëþäåé. Êàæäûé îáúåêò â êà÷åñòâå ïîäîáúåêòà ñîäåðæèò èíôîðìàöèþ î ñòðàíå ãðàæäàíñòâà. Î÷åâèäíî, ÷òî ÷èñëåííîñòü íàñåëåíèÿ íàìíîãî
ïðåâûøàåò ÷èñëî ñòðàí.
• Áîëåå âàæíî, ÷òî òàêàÿ òåõíèêà íå îáåñïå÷èâàåò ðàçäåëåíèÿ èíôîðìàöèè. Âïîëíå åñòåñòâåííî
æåëàíèå, ÷òîáû âíåñåíèå èçìåíåíèé â ïîäîáúåêò ïîâëåêëî çà ñîáîé àâòîìàòè÷åñêîå îáíîâëåíèå
ýòîé èíôîðìàöèè äëÿ âñåõ îáúåêòîâ.
Ëó÷øèì ÿâëÿåòñÿ ðåøåíèå ìñïîëüçîâàíèå ññûëêè â êà÷åñòâå ïîäîáúåêòà.
Îïðåäåëåíèå: ññûëêà
Ññûëêà ýòî çíà÷åíèå âðåìåíè âûïîëíåíèÿ. Îíà ìîæåò áûòü ïóñòîé (None) èëè ïðèñîåäèíåííîé.
Ïðèñîåäèíåííàÿ ññûëêà îäíîçíà÷íî èäåíòèôèöèðóåò îáúåêò (ïðèñîåäèíåíà ê êîíêðåòíîìó îáúåêòó).
Êîíöåïöèÿ ññûëêè äîëæíà, áåçóñëîâíî, èìåòü àíàëîã ïðè ðåàëèçàöèè. Ïðîãðàììèðîâàíèå íà óðîâíå
ìàøèííîãî êîäà èñïîëüçóåò àäðåñàöèþ, ìíîãèå ÿçûêè ïðîãðàììèðîâàíèÿ ñîäåðæàò ïîíÿòèå óêàçàòåëÿ. Ïîíÿòèå ññûëêè ÿâëÿåòñÿ áîëåå àáñòðàêòíûì. Õîòÿ ññûëêà, â êîíå÷íîì èòîãå, ìîæåò áûòü
ïðåäñòàâëåíà àäðåñîì, íå ñëåäóåò èç ýòîãî èñõîäèòü. Ññûëêà ìîæåò ñîäåðæàòü àäðåñ íàðÿäó ñ äðóãîé èíôîðìàöèåé.
Èäåíòè÷íîñòü îáúåêòîâ
Ïîíÿòèå ññûëêè ïðèâîäèò ê êîíöåïöèè èäåíòè÷íîñòè îáúåêòîâ. Êàæäûé îáúåêò, ñîçäàííûé â ïðîöåññå âûïîëíåíèÿ ÎÎ-ñèñòåìû, óíèêàëåí è èäåíòèôèöèðóåòñÿ íåçàâèñèìî îò çíà÷åíèé åãî ïîëåé.
Âîçìîæíû äâå ñèòóàöèè:
I1 Äâà ðàçëè÷íûõ îáúåêòà ìîãóò èìåòü àáñîëþòíî îäèíàêîâûå ïîëÿ
I2 Íàïðîòèâ, ïîëÿ äàííîãî îáúåêòà ìîãóò èçìåíÿòüñÿ â ïðîöåññå âûïîëíåíèÿ ñèñòåìû, íî ýòî íå
âëèÿåò íà èäåíòèôèêàöèþ îáúåêòà.
Ññûëêà íà ñåáÿ
Íè÷òî íå ïðåïÿòñòâóåò îáúåêòó O1 â îïðåäåëåííûé ìîìåíò âûïîëíåíèÿ ñèñòåìû ñîäåðæàòü ññûëêó,
ïðèñîåäèíåííóþ ê ñàìîìó O1. Òàêàÿ ññûëêà íà ñåáÿ ìîæåò áûòü êîñâåííîé.
Òàêèå öèêëû â äèíàìè÷åñêèõ ñòðóêòóðàõ âîçìîæíû, òîëüêî åñëè êëèåíòñêèå îòíîøåíèÿ ìåæäó
ñîîòâåòñòâóþùèìè êëàññàìè òàêæå ñîäåðæàò ïðÿìûå èëè êîñâåííûå öèêëû.
8.2 Îáúåêòû êàê ñðåäñòâî ìîäåëèðîâàíèÿ
Ðàññìîòðåííûå ïðèåìû ïîçâîëÿþò ïðîäâèíóòüñÿ â ïîíèìàíèè âîçìîæíîñòåé ÎÎ-ïîäõîäà êàê ñðåäñòâà ìîäåëèðîâàíèÿ. Âàæíî, â ÷àñòíîñòè, ïðîÿñíèòü äâà àñïåêòà: ðàññìîòðåòü ðàçëè÷íûå ìèðû,
ñâÿçàííûå ñ ðàçðàáîòêîé ÏÎ è îòíîøåíèÿ ìåæäó ÏÎ è âíåøíåé ðåàëüíîñòüþ.
×åòûðå ìèðà ïðîãðàììíîé ðàçðàáîòêè
Èç ïðåäøåñòâóþùåé äèñêóññèè ñëåäóåò, ÷òî êîãäà ìû ãîâîðèì îá ÎÎ-ðàçðàáîòêå, ñëåäóåò ðàçëè÷àòü ÷åòûðå îòäåëüíûõ ìèðà:
• Ìîäåëèðóåìóþ ñèñòåìó, - âíåøíþþ ïî îòíîøåíèþ ê ïðîãðàììíîé ñèñòåìå, îïèñûâàåìóþ òèïàìè îáúåêòîâ è èõ àáñòðàêòíûìè îòíîøåíèÿìè.
• ×àñòíóþ êîíêðåòèçàöèþ âíåøíåé ñèñòåìû, ñîñòîÿùóþ èç îáúåêòîâ ñ ôèêñèðîâàííûìè îòíîøåíèÿìè.
• Ïðîãðàììíóþ ñèñòåìó, ñîñòîÿùóþ èç êëàññîâ, ñâÿçàííûõ ÎÎ-îòíîøåíèÿìè ("áûòü êëèåíòîì "áûòü
íàñëåäíèêîì").
• Îáúåêòíóþ ñòðóêòóðó â òîì âèäå, â êîòîðîì îíà ñóùåñòâóåò â ïðîöåññå âûïîëíåíèÿ ïðîãðàììíîé ñèñòåìû, òî åñòü ìíîæåñòâî ïðîãðàììíûõ îáúåêòîâ, ñâÿçàííûõ ññûëêàìè.
Ñîîòíîøåíèÿ ìåæäó ýòèìè ìèðàìè ïðåäñòàâëåíû íà ðèñ.8.1.
È íà ïðîãðàììíîì è íà âíåøíåì óðîâíå (íèæíÿÿ è âåðõíÿÿ ÷àñòè ðèñóíêà) âàæíî ðàçãðàíè÷èòü
îáùèå ïîíÿòèÿ è èõ êîíêðåòíûå ðåàëèçàöèè (êëàññû è àáñòðàêòíûå îòíîøåíèÿ ñëåâà, îáúåêòû è îòíîøåíèÿ ýêçåìïëÿðîâ ñïðàâà). Äàííûé ìîìåíò óæå îáñóæäàëñÿ â äèñêóññèè î ñðàâíèòåëüíîé ðîëè
êëàññîâ è îáúåêòîâ â ïðåäûäóùåé ëåêöèè. Ïðèìåíèòåëüíî ê îòíîøåíèÿì íåîáõîäèìî îòëè÷àòü àáñòðàêòíûå îòíîøåíèÿ loved_one îò ìíîæåñòâà ñâÿçåé loved_one, ñóùåñòâóþùèõ ìåæäó ýëåìåíòàìè
êîíêðåòíîãî ìíîæåñòâà îáúåêòîâ.
Ýòî ðàçëè÷èå íåâûðàçèìî íè â ñòàíäàðòíûõ ìàòåìàòè÷åñêèõ îïðåäåëåíèÿõ ïîíÿòèÿ "îòíîøåíèå íè
â ïðîãðàììèñòñêîé òåðìèíîëîãèè, íàïðèìåð â òåîðèè ðåëÿöèîííûõ áàç äàííûõ. Åñëè îãðàíè÷èòüñÿ
áèíàðíûìè îòíîøåíèÿìè, òî è â ìàòåìàòèêå è â òåîðèè áàç äàííûõ îòíîøåíèå îïðåäåëÿåòñÿ êàê
ìíîæåñòâî ïàð â ôîðìå <x, y>, ãäå x è y ÿâëÿþòñÿ ýëåìåíòàìè çàäàííûõ ìíîæåñòâ TX è TY. Â
òåðìèíàõ ïðîãðàììèðîâàíèÿ âñå x îòíîñÿòñÿ ê òèïó TX, à âñå y - ê òèïó TY. Áóäó÷è ïðèãîäíûìè
äëÿ ìàòåìàòèêîâ, ýòè îïðåäåëåíèÿ íå ïîäõîäÿò äëÿ öåëåé ìîäåëèðîâàíèÿ, ïîñêîëüêó íå ïîçâîëÿþò
ðàçëè÷àòü àáñòðàêòíûå îòíîøåíèÿ è îòíîøåíèÿ êîíêðåòíûõ ýêçåìïëÿðîâ. Ïðè ìîäåëèðîâàíèè ñè-
Ðèñ. 8.1: Ôîðìû è èõ ýêçåìïëÿðû
ñòåìû îòíîøåíèå "ëþáèò"èìååò ñâîè îáùèå è àáñòðàêòíûå ñâîéñòâà, ñîâåðøåííî íå çàâèñÿùèå îò
çàïèñè òîãî, êòî êîãî ëþáèò â êîíêðåòíîé ãðóïïå ëþäåé â íåêîòîðûé ìîìåíò âðåìåíè.
8.3 Ðàáîòà ñ îáúåêòàìè è ññûëêàìè
Âåðíåìñÿ ê áîëåå ïðèçåìëåííûì ïðîáëåìàì è ðàññìîòðèì, êàê ïðîãðàììíûå ñèñòåìû ðàáîòàþò ñ
îáúåêòàìè, êàê ñîçäàþò è èñïîëüçóþò ãèáêèå ñòðóêòóðû äàííûõ.
Äèíàìè÷åñêîå ñîçäàíèå è ïîâòîðíîå ñâÿçûâàíèå
×òî íå áûëî ïîêàçàíî ïðè îïèñàíèè ñòðóêòóðû îáúåêòîâ ïåðèîäà âûïîëíåíèÿ, òàê ýòî â âûñøåé ñòåïåíè äèíàìè÷íàÿ ïðèðîäà íàñòîÿùåé ÎÎ-ìîäåëè. Ñòàòè÷åñêàÿ è îðèåíòèðîâàííàÿ íà ñòåêè ïîëèòèêà
óïðàâëåíèÿ îáúåêòàìè õàðàêòåðíà äëÿ ÿçûêîâ óðîâíÿ Fortran è Pascal ñîîòâåòñòâåííî. Ïðîòèâîïîëîæíîé ÿâëÿåòñÿ ïîëèòèêà â íàñòîÿùåì ÎÎ-îêðóæåíèè, ïîçâîëÿþùàÿ ñîçäàâàòü îáúåêòû â ïåðèîä
âûïîëíåíèÿ, êîãäà â íèõ âîçíèêàåò ïîòðåáíîñòü. Êàêîìó îáðàçöó (òèïó) ñîîòâåòñòâóþò ñîçäàâàåìûå
îáúåêòû, êàê ïðàâèëî, íåâîçìîæíî ïðåäñêàçàòü ïðè ñòàòè÷åñêîé ïðîâåðêå ïðîãðàììíîãî òåêñòà.
 íà÷àëüíîì ñîñòîÿíèè, êàê îïèñàíî â ïðåäûäóùåé ëåêöèè, ñîçäàåòñÿ åäèíñòâåííûé êîðíåâîé îáúåêò. Çàòåì ñèñòåìà ïîâòîðíî âûïîëíÿåò îïåðàöèè ñîçäàíèÿ íîâûõ îáúåêòîâ, ñâÿçûâàåò èçíà÷àëüíî
ïóñòûå ññûëêè ñ ýòèìè îáúåêòàìè, äåëàåò ðàíåå ïðèñîåäèíåííûå ññûëêè ïóñòûìè èëè ïðèñîåäèíÿåò
èõ ê äðóãèì îáúåêòàì. Äèíàìè÷åñêàÿ è íåïðåäñêàçóåìàÿ ïðèðîäà ýòèõ îïåðàöèé îáåñïå÷èâàåò ãèáêèé
ïîäõîä è ïîçâîëÿåò ïîääåðæèâàòü äèíàìè÷åñêèå ñòðóêòóðû äàííûõ, íåîáõîäèìûå äëÿ ðåàëèçàöèè
ñëîæíûõ àëãîðèòìîâ è ìîäåëèðîâàíèÿ áûñòðî ìåíÿþùèõñÿ ñâîéñòâ âíåøíèõ ñèñòåì.
Àãðåãèðîâàíèå
 íåêîòîðûõ îáëàñòÿõ èíôîðìàòèêè - áàçàõ äàííûõ, ìîäåëèðîâàíèè, àíàëèçå òðåáîâàíèé - ðàçðàáîòàíà êëàññèôèêàöèÿ îòíîøåíèé, èìåþùèõ ìåñòî ìåæäó ýëåìåíòàìè ìîäåëèðóåìîé ñèñòåìû.  ýòèõ
êîíòåêñòàõ ÷àñòî âñòðå÷àåòñÿ îòíîøåíèå "àãðåãèðîâàíèÿ"(aggregation), âûðàæàþùåå òîò ôàêò, ÷òî
êàæäûé îáúåêò íåêîòîðîãî òèïà ÿâëÿåòñÿ àãðåãàòîì - ñîäåðæèò â ñâîåì ñîñòàâå íîëü èëè áîëåå îáúåêòîâ, êàæäûé èç êîòîðûõ èìååò ñâîé ñîáñòâåííûé òèï. Íàïðèìåð: àâòîìîáèëü ÿâëÿåòñÿ àãðåãàòîì,
ñîäåðæàùèì ìîòîð, êóçîâ è äðóãèå äåòàëè.
8.4 Êëþ÷åâûå êîíöåïöèè
• ÎÎ-âû÷èñëåíèÿ õàðàêòåðèçóþòñÿ âûñîêî äèíàìè÷íîé ñòðóêòóðîé âðåìåíè âûïîëíåíèÿ, â êîòîðîé îáúåêòû ñîçäàþòñÿ òîëüêî ïî çàïðîñó.
• Íåêîòîðûå îáúåêòû, èñïîëüçóåìûå ÏÎ, ÿâëÿþòñÿ ìîäåëÿìè âíåøíèõ îáúåêòîâ (îáû÷íî êîñâåííûìè). Äðóãèå îáúåêòû ñëóæàò òîëüêî äëÿ öåëåé ïðîåêòèðîâàíèÿ è ðåàëèçàöèè.
• Îáúåêò ñîñòîèò èç ðÿäà çíà÷åíèé, íàçûâàåìûõ ïîëÿìè. Êàæäîå ïîëå ñîîòâåòñòâóåò àòðèáóòó
ãåíåðàòîðà îáúåêòà (êëàññà, ïðÿìûì ýêçåìïëÿðîì êîòîðîãî ÿâëÿåòñÿ îáúåêò).
• Çíà÷åíèå, â ÷àñòíîñòè ïîëå îáúåêòà, ÿâëÿåòñÿ îáúåêòîì èëè ññûëêîé.
• Ññûëêà ìîæåò áûòü ïóñòîé (void) èëè ïðèñîåäèíåííîé ê îáúåêòó. Ïðîâåðêà óñëîâèÿ x = Void
ïîçâîëÿåò îïðåäåëèòü òåêóùåå ñîñòîÿíèå ññûëêè. Êîððåêòíîå âûïîëíåíèå âûçîâà x.f (...) âîçìîæíî, åñëè x íå ïóñòàÿ ññûëêà.
• Îáúåêòíûå ñòðóêòóðû ìîãóò ñîäåðæàòü öèêëè÷åñêèå öåïî÷êè ññûëîê.
• Äëÿ ñóùíîñòåé ññûëî÷íîãî òèïà ïðèñâàèâàíèå (:=) è ïðîâåðêà ýêâèâàëåíòíîñòè (=) ÿâëÿþòñÿ
ññûëî÷íûìè îïåðàöèÿìè. Äëÿ ñóùíîñòåé ðàçâåðíóòûõ òèïîâ èñïîëüçóåòñÿ ñåìàíòèêà çíà÷åíèé.
Ñîîòâåòñòâóþùàÿ ñåìàíòèêà ðàñïðîñòðàíÿåòñÿ è íà ñìåøàííûå îïåðàíäû.
•  ðåçóëüòàòå ññûëî÷íûõ îïåðàöèé ïîÿâëÿþòñÿ äèíàìè÷åñêèå ïñåâäîíèìû. Îíè çàòðóäíÿþò
ïîëó÷åíèå âûâîäîâ î ðàáîòå ñèñòåìû ïðè àíàëèçå åå òåêñòà. Íà ïðàêòèêå áîëüøèíñòâî íåòðèâèàëüíûõ äåéñòâèé ñî ññûëêàìè ìîæíî èíêàïñóëèðîâàòü â áèáëèîòå÷íûå êëàññû.
Êîíòðîëüíûå âîïðîñû
Begin Quiz
1. Ê êàêîìó ïîíÿòèþ îòíîñÿòñÿ îïðåäåëåíèÿ: "ýêçåìïëÿð êëàññà, íàáîð ïîëåé, ïîíÿòèå ïåðèîäà
èñïîëíåíèÿ"?
ññûëêè
îáúåêòà
ñóùíîñòè
êëàññà
2. Ê êàêîìó ïîíÿòèþ îòíîñÿòñÿ âûñêàçûâàíèÿ: "ïîíÿòèå ïåðèîäà èñïîëíåíèÿ, îäíîçíà÷íî èäåíòèôèöèðóåò îáúåêò, ìîæåò áûòü ïóñòîé"?
ññûëêè
îáúåêòà
ñóùíîñòè
êëàññà
3. Ê êàêîìó ïîíÿòèþ îòíîñÿòñÿ âûñêàçûâàíèÿ: "ñòàòè÷åñêîå ïîíÿòèå, ïðèìåíèìîå ê òåêñòó, èäåíòèôèêàòîð, èìååò çíà÷åíèå â ïåðèîä âûïîëíåíèÿ"?
ññûëêè
îáúåêòà
ñóùíîñòè
êëàññà
4. Äèíàìè÷åñêàÿ ñòðóêòóðà îáúåêòîâ, ñîçäàâàåìàÿ â ïåðèîä âûïîëíåíèÿ
èìååò òó æå ñëîæíîñòü, ÷òî è ñòàòè÷åñêàÿ ñòðóêòóðà êëàññîâ
èìååò, êàê ïðàâèëî, ñëîæíîñòü, çíà÷èòåëüíî ïðåâîñõîäÿùóþ ñëîæíîñòü ñòàòè÷åñêîé ñòðóêòóðû êëàññîâ
èìååò, êàê ïðàâèëî, ñëîæíîñòü áîëåå ïðîñòóþ, ÷åì ñëîæíîñòü ñòàòè÷åñêîé ñòðóêòóðû êëàññîâ
íå èìååò íè÷åãî îáùåãî ñî ñòàòè÷åñêîé ñòðóêòóðîé êëàññîâ
5. Íà îñíîâå èçó÷åíèÿ ñòàòè÷åñêîãî òåêñòà ïðîãðàììû íåëüçÿ òî÷íî ïðåäñêàçàòü
êàêèå îáúåêòû áóäóò ñîçäàíû
êîãäà áóäóò ñîçäàíû íîâûå îáúåêòû
êàêèå ññûëêè áóäóò ïðèñîåäèíåíû ê îáúåêòàì
êîãäà ðàíåå ïðèñîåäèíåííûå ññûëêè ñòàíîâÿòñÿ ïóñòûìè
6. Ïðÿìûå èëè êîñâåííûå ññûëêè îáúåêòîâ íà ñàìèõ ñåáÿ â äèíàìè÷åñêèõ ñòðóêòóðàõ
âîçìîæíû, òîëüêî åñëè êëèåíòñêèå îòíîøåíèÿ ìåæäó ñîîòâåòñòâóþùèìè êëàññàìè òàêæå
ñîäåðæàò ïðÿìûå èëè êîñâåííûå öèêëû
âîçìîæíû òîëüêî ïðÿìûå öèêëû
âîçìîæíû, òîëüêî êîñâåííûå öèêëû
íåâîçìîæíû
7. Ýôôåêò èíñòðóêöèè ñîçäàíèÿ âèäà create x ñîñòîèò â?
ñîçäàíèè íîâîé ññûëêè
ñîçäàíèè íîâîãî îáúåêòà
èíèöèàëèçàöèè ïîëåé ñîçäàâàåìîãî îáúåêòà çíà÷åíèÿìè ïî óìîë÷àíèþ
ïðèñîåäèíåíèÿ ññûëêè çíà÷åíèÿ x ê íîâîìó îáúåêòó
8. Ïðè ññûëî÷íîì ïðèñâàèâàíèè (ëåâàÿ è ïðàâàÿ ÷àñòè ïðèñâàèâàíèÿ ÿâëÿþòñÿ ññûëêàìè)
ñîçäàåòñÿ íîâûé îáúåêò êîïèÿ îáúåêòà, ïðèñîåäèíåííîãî ê ññûëêå ïðàâîé ÷àñòè, è ññûëêà
ëåâîé ÷àñòè ïðèñîåäèíÿåòñÿ ê ýòîé êîïèè
ññûëêà ëåâîé ÷àñòè ïðèñîåäèíÿåòñÿ ê îáúåêòó, ïðèñîåäèíåííîìó ê ññûëêå ïðàâîé ÷àñòè, òîëüêî åñëè ññûëêà ëåâîé ÷àñòè èìåëà çíà÷åíèå void
ññûëêà ëåâîé ÷àñòè ðàçðûâàåò ñâÿçü ñ îáúåêòîì, ê êîòîðîìó îíà áûëà ïðèñîåäèíåíà, è ïðèñîåäèíÿåòñÿ ê îáúåêòó, ïðèñîåäèíåííîìó ê ññûëêå ïðàâîé ÷àñòè
ññûëêà ëåâîé ÷àñòè ñîõðàíÿåò ñâÿçü ñ îáúåêòîì, ê êîòîðîìó îíà áûëà ïðèñîåäèíåíà, è äîïîëíèòåëüíî ñâÿçûâàåòñÿ ñ îáúåêòîì, ïðèñîåäèíåííûì ê ññûëêå ïðàâîé ÷àñòè
9. Ïðè êëîíèðîâàíèè
ñîçäàåòñÿ êîïèÿ ñóùåñòâóþùåãî îáúåêòà
èçìåíÿåòñÿ ñîñòîÿíèå ñóùåñòâóþùåãî îáúåêòà
ïðè ãëóáîêîì êëîíèðîâàíèè ìîæåò ñîçäàâàòüñÿ íåñêîëüêî íîâûõ îáúåêòîâ
ïðè ïîâåðõíîñòíîì êëîíèðîâàíèè êîïèðóåòñÿ òîëüêî îòêðûòàÿ ÷àñòü îáúåêòà
10. Ïðèñîåäèíåíèå y ê x
èìååò ìåñòî ïðè ïðèñâàèâàíèè y:=x
èìååò ìåñòî ïðè âûçîâå ïîäïðîãðàììû, êîãäà ôîðìàëüíûé àðãóìåíò x çàìåíÿåòñÿ ôàêòè÷åñêèì y
èñïîëüçóåò x êàê öåëü
èñïîëüçóåò y êàê öåëü
11. Ïîä äèíàìè÷åñêèìè ïñåâäîíèìàìè ïîíèìàåòñÿ?
ñóùåñòâîâàíèå äâóõ èëè áîëåå îáúåêòîâ ñ îäèíàêîâûìè çíà÷åíèÿìè ïîëåé
ñóùåñòâîâàíèå äâóõ èëè áîëåå ñóùíîñòåé ñ îäèíàêîâûìè èìåíàìè
ñóùåñòâîâàíèå äâóõ èëè áîëåå ñóùíîñòåé, ïðèñîåäèíåííûõ ê îäíîìó è òîìó æå îáúåêòó
ñóùåñòâîâàíèå äâóõ èëè áîëåå îáúåêòîâ, ñâÿçàííûõ ñ îäíîé è òîé æå ñóùíîñòüþ
12. Ðàçâåðíóòûé òèï ïîçâîëÿåò?
óëó÷øèòü ýôôåêòèâíîñòü
ýêîíîìèòü ïàìÿòü
îáåñïå÷èòü ëó÷øåå ìîäåëèðîâàíèå ðåàëüíîãî ìèðà
ïîääåðæàòü áàçîâûå òèïû
13. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
áàçîâûå òèïû (BOOLEAN, CHARACTER, INTEGER, REAL, DOUBLE) îïðåäåëåíû êàê ðàçâåðíóòûå êëàññû
êàæäîå ïîëå îáúåêòà ñîîòâåòñòâóåò àòðèáóòó ãåíåðèðóþùåãî êëàññà
â ìîìåíò âûïîëíåíèÿ ñèñòåìû íå ìîãóò ñóùåñòâîâàòü ïóñòûå ññûëêè (íå ñâÿçàííûå ñ îáúåêòàìè)
îïðåäåëåíèå â êëàññå ïðîöåäóð ñîçäàíèÿ àâòîìàòè÷åñêè çàïðåùàåò èñïîëüçîâàíèå áàçîâîé
èíñòðóêöèè ñîçäàíèÿ
14. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
ðàçâåðíóòûé êëèåíò íå ìîæåò áûòü ñâîèì êëèåíòîì
âûçîâ êîìïîíåíòà äëÿ ïóñòîé ññûëêè ïðèâîäèò ê îøèáêå â ïåðèîä âûïîëíåíèÿ
ïóñòûå ññûëêè íå ñ÷èòàþòñÿ ýêâèâàëåíòíûìè
ïîëå îáúåêòà ÿâëÿåòñÿ îáúåêòîì èëè ññûëêîé
15. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
ïðè ïîðîæäàþùåì âûçîâå ñîçäàåòñÿ íîâûé îáúåêò ñ èíèöèàëèçàöèåé ïîëåé, îòëè÷íîé îò çíà÷åíèé ïî óìîë÷àíèþ
ñóùíîñòü ðàçâåðíóòîãî òèïà íå ìîæåò áûòü ïóñòîé ññûëêîé
îáúåêòíûå ñòðóêòóðû ìîãóò ñîäåðæàòü öèêëè÷åñêèå öåïî÷êè ññûëîê
â ðåçóëüòàòå ññûëî÷íîãî ïðèñâàèâàíèÿ âñåãäà ïîÿâëÿåòñÿ âèñÿ÷èé îáúåêò (äîñòóïíûé äëÿ
ñáîðùèêà ìóñîðà).
End Quiz
Íàáðàíî áàëëîâ
9 Ïðîåêòèðîâàíèå ïî êîíòðàêòó:
ïîñòðîåíèå íàäåæíîãî ÏÎ
9.1 Áàçèñíûå ìåõàíèçìû íàäåæíîñòè
Òåõíè÷åñêèå ïðèåìû, ââåäåííûå â ïðåäûäóùèõ ëåêöèÿõ, áûëè íàïðàâëåíû íà ñîçäàíèå íàäåæíîãî
ÏÎ. Äàäèì èõ êðàòêèé îáçîð - áûëî áû áåñïîëåçíî ðàññìàòðèâàòü áîëåå ïðîäâèíóòûå êîíöåïöèè
äî ïðèâåäåíèÿ â ïîðÿäîê îñíîâíûõ ìåõàíèçìîâ íàäåæíîñòè. Ïåðâûì è îïðåäåëÿþùèì ñâîéñòâîì
îáúåêòíîé òåõíîëîãèè ÿâëÿåòñÿ ïî÷òè íàâÿçûâàåìàÿ ñòðóêòóðà ïðîãðàììíîé ñèñòåìû - ïðîñòàÿ,
ìîäóëüíàÿ, ðàñøèðÿåìàÿ, - ïðîùå ãàðàíòèðóþùàÿ íàäåæíîñòü, ÷åì â ñëó÷àå "êðèâûõ"ñòðóêòóð,
âîçíèêàþùèõ ïðè ïðèìåíåíèè ðàííèõ ìåòîäîâ ðàçðàáîòêè.  ÷àñòíîñòè, óñèëèÿ ïî îãðàíè÷åíèþ
ìåæìîäóëüíîãî âçàèìîäåéñòâèÿ, ñâåäåíèÿ åãî ê ìèíèìóìó, áûëè â öåíòðå äèñêóññèè î ìîäóëüíîñòè.
Ðåçóëüòàòîì ñòàë çàïðåò îáùèõ ðèñêîâ, ñíèæàþùèõ íàäåæíîñòü, - îòêàç îò ãëîáàëüíûõ ïåðåìåííûõ,
ìåõàíèçì îãðàíè÷åííîãî âçàèìîäåéñòâèÿ ìîäóëåé, îòíîøåíèÿ íàñëåäîâàíèÿ è âëîæåííîñòè. Îáùåå
íàáëþäåíèå: ñàìûé áîëüøîé âðàã íàäåæíîñòè (è êà÷åñòâà ÏÎ â öåëîì) - ýòî ñëîæíîñòü. Ñîçäàâàÿ
íàøè ñòðóêòóðû íàñòîëüêî ïðîñòûìè, ñêîëü ýòî âîçìîæíî, ìû äîñòèãàåì íåîáõîäèìîãî, íî íå äîñòàòî÷íîãî óñëîâèÿ, ãàðàíòèðóþùåãî íàäåæíîñòü. Ïðåæíåå îáñóæäåíèå ñëóæèò ëèøü âåðíîé îòïðàâíîé
òî÷êîé â ïîñëåäóþùèõ ñèñòåìàòè÷åñêèõ óñèëèÿõ.
Çàìåòüòå, íåîáõîäèì, íî òàêæå íåäîñòàòî÷åí, ïîñòîÿííûé àêöåíò íà ñîçäàíèå ýëåãàíòíîãî è ÷è-
òàáåëüíîãî ÏÎ. Ïðîãðàììíûå òåêñòû íå òîëüêî ïèøóòñÿ, îíè åùå ÷èòàþòñÿ è ïåðåïèñûâàþòñÿ ïî
ìíîãî ðàç. ßñíîñòü è ïðîñòîòà íîòàöèè ÿçûêîâûõ êîíñòðóêöèé - îñíîâà ëþáîãî èçîùðåííîãî ïîäõîäà
ê íàäåæíîñòè.
Åùå îäíî íåîáõîäèìîå îðóæèå - àâòîìàòè÷åñêîå óïðàâëåíèå ïàìÿòüþ, â îñîáåííîñòè ñáîðêà ìóñîðà.  ëåêöèè, ïîñâÿùåííîé ýòîé òåìå, â äåòàëÿõ ïîÿñíåíî, ïî÷åìó äëÿ ëþáîé ñèñòåìû, îïåðèðóþùåé
äèíàìè÷åñêèìè ñòðóêòóðàìè äàííûõ, ñòîëü îïàñíî îïèðàòüñÿ íà óïðàâëåíèå ýòèì ïðîöåññîì âðó÷íóþ. Ñáîðêà ìóñîðà íå ðîñêîøü - ýòî êëþ÷åâîé êîìïîíåíò ÎÎ-ñðåäû, îáåñïå÷èâàþùèé íàäåæíîñòü.
Òîæå ìîæíî ñêàçàòü îá åùå îäíîì, ñî÷åòàþùåìñÿ ñ ïàðàìåòðèçàöèåé ìåõàíèçìå, - ñòàòè÷åñêîé òèïèçàöèè. Áåç ïðàâèë ñòðîãîé ñòàòè÷åñêîé òèïèçàöèè ïðèøëîñü áû ëèøü íàäåÿòüñÿ íà ñíèñõîæäåíèå
ìíîãî÷èñëåííûõ îøèáîê, âîçíèêàþùèõ â ïåðèîä âûïîëíåíèÿ.
9.2 Î êîððåêòíîñòè ÏÎ
Çàäàäèìñÿ âîïðîñîì, ÷òî îçíà÷àåò óòâåðæäåíèå - ïðîãðàììíûé ýëåìåíò êîððåêòåí? Íàáëþäåíèÿ è
ðàññóæäåíèÿ, îòâå÷àþùèå íà ýòî âîïðîñ, ìîãóò ïîêàçàòüñÿ òðèâèàëüíûìè. Íî, êàê çàìåòèë îäèí
èçâåñòíûé ó÷åíûé, òàêîâû âñå íàó÷íûå ðåçóëüòàòû, - îíè íà÷èíàþòñÿ ñ îáû÷íûõ íàáëþäåíèé è
ïðîäîëæàþòñÿ ïóòåì ïðîñòûõ ðàññóæäåíèé, íî âñå ýòî íóæíî äåëàòü óïîðíî è íàñòîé÷èâî.
Ïðåäïîëîæèì, íåêòî ïðèøåë ê âàì ñ ïðîãðàììîé èç 300 000 ñòðîê íà Ñ è ñïðàøèâàåò, êîððåêòíà
ëè îíà? Åñëè âû êîíñóëüòàíò, òî âçûùèòå âûñîêóþ ïëàòó è îòâåòüòå - "íåò". Âû, âåðîÿòíî, îêàæåòåñü
ïðàâû.
Äëÿ òîãî ÷òîáû ìîæíî áûëî äàòü ðàçóìíûé îòâåò íà ïîäîáíûé âîïðîñ, îäíîé ïðîãðàììû íåäîñòàòî÷íî, íåîáõîäèìà åùå è åå ñïåöèôèêàöèÿ, òî÷íî îïèñûâàþùàÿ, ÷òî äîëæíà äåëàòü ïðîãðàììà.
Îïåðàòîð
x:= y+1
ñàì ïî ñåáå íå ÿâëÿåòñÿ íè êîððåêòíûì, íè íå êîððåêòíûì. Ýòè ïîíÿòèÿ ïðèîáðåòàþò ñìûñë ëèøü
ïî îòíîøåíèþ ê îæèäàåìîìó ýôôåêòó ïðèñâàèâàíèÿ. Íàïðèìåð, ïðèñâàèâàíèå êîððåêòíî ïî îòíîøåíèþ ê óòâåðæäåíèþ: "Ïåðåìåííûå x è y èìåþò ðàçëè÷íûå çíà÷åíèÿ". Íî íå ãàðàíòèðóåòñÿ
åãî êîððåêòíîñòü ïî îòíîøåíèþ ê âûñêàçûâàíèþ: "ïåðåìåííàÿ x îòðèöàòåëüíà ïîñêîëüêó ðåçóëüòàò
ïðèñâàèâàíèÿ çàâèñèò îò çíà÷åíèÿ y, êîòîðîå ìîæåò áûòü ïîëîæèòåëüíûì.
Ýòè ïðèìåðû èëëþñòðèðóþò ñâîéñòâî, ñëóæàùåå îòïðàâíîé òî÷êîé â îáñóæäåíèè ïðîáëåìû êîððåêòíîñòè: ïðîãðàììíàÿ ñèñòåìà èëè åå ýëåìåíò ñàìè ïî ñåáå íè êîððåêòíû, íè íå êîððåêòíû. Êîððåêòíîñòü ïîäðàçóìåâàåòñÿ ëèøü ïî îòíîøåíèþ ê íåêîòîðîé ñïåöèôèêàöèè. Ñòðîãî ãîâîðÿ, ìû è
íå áóäåì îáñóæäàòü ïðîáëåìó êîððåêòíîñòè ïðîãðàììíûõ ýëåìåíòîâ, à ëèøü èõ ñîãëàñîâàííîñòü
(consistent) ñ çàäàííîé ñïåöèôèêàöèåé. Â íàøèõ îáñóæäåíèÿõ ìû áóäåì ïðîäîëæàòü èñïîëüçîâàòü
õîðîøî ïîíèìàåìûé òåðìèí "êîððåêòíîñòü íî âñåãäà ïðè ýòîì ïîìíèòü, ÷òî ýòîò òåðìèí íå ïðèìåíèì ê ïðîãðàììíîìó ýëåìåíòó, îí èìååò ñìûñë ëèøü äëÿ ïàðû - "ïðîãðàììíûé ýëåìåíò è åãî
ñïåöèôèêàöèÿ".
Ñâîéñòâî êîððåêòíîñòè ÏÎ
Êîððåêòíîñòü - ïîíÿòèå îòíîñèòåëüíîå.
 ýòîé ëåêöèè ìû íàó÷èìñÿ âûðàæàòü ñïåöèôèêàöèè ÷åðåç óòâåðæäåíèÿ (assertions), ÷òî ïîìîæåò
îöåíèòü êîððåêòíîñòü ðàçðàáîòàííîãî ÏÎ. Íî ïîéäåì äàëüøå è ïåðåâåðíåì ïðîáëåìó, - ðàçðàáîòêà
ñïåöèôèêàöèè ÿâëÿåòñÿ ïåðâûì, âàæíåéøèì øàãîì íà ïóòè, ãàðàíòèðóþùåì, ÷òî ÏÎ äåéñòâèòåëüíî
ñîîòâåòñòâóåò ñïåöèôèêàöèè. Ñóùåñòâåííóþ âûãîäó ìîæíî ïîëó÷èòü, êîãäà ñïåöèôèêàöèè ïèøóòñÿ
îäíîâðåìåííî ñ íàïèñàíèåì ïðîãðàììû, à ëó÷øå, äî åå íàïèñàíèÿ. Ñðåäè ñëåäñòâèé òàêîãî ïîäõîäà
ìîæíî îòìåòèòü ñëåäóþùåå.
• Ðàçðàáîòêà ÏÎ êîððåêòíîãî ñ ñàìîãî íà÷àëà, ïðîåêòèðóåìîãî òàê, ÷òîáû áûòü êîððåêòíûì.
Îäèí èç ñîçäàòåëåé ñòðóêòóðíîãî ïðîãðàììèðîâàíèÿ Õàðëàí Ä. Ìèëëñ â ñåìèäåñÿòûå ãîäû
íàïèñàë ñòàòüþ ñî çíàìåíàòåëüíûì íàçâàíèåì "Êàê ïèñàòü êîððåêòíûå ïðîãðàììû è çíàòü
ýòî". Ñëîâî "çíàòü"â äàííîì êîíòåêñòå îçíà÷àåò ñíàáæàòü ïðîãðàììó â ìîìåíò åå íàïèñàíèÿ
àðãóìåíòàìè, õàðàêòåðèçóþùèìè êîððåêòíîñòü.
• Çíà÷èòåëüíî ëó÷øåå ïîíèìàíèå ïðîáëåìû è äîñòèæåíèå åå ðåøåíèÿ.
• Óïðîùåíèå çàäà÷è ñîçäàíèÿ ïðîãðàììíîé äîêóìåíòàöèè. Êàê áóäåò ïîçæå ïîêàçàíî, óòâåðæäåíèÿ áóäóò èãðàòü âàæíóþ ðîëü â ÎÎ-ïîäõîäå ê äîêóìåíòàöèè.
• Îáåñïå÷åíèå îñíîâ äëÿ ñèñòåìàòè÷åñêîãî òåñòèðîâàíèÿ è îòëàäêè.
Îñòàâøàÿñÿ ÷àñòü ëåêöèè ïîñâÿùåíà èññëåäîâàíèþ ýòèõ âîïðîñîâ. Îäíî ïðåäóïðåæäåíèå: ÿçûêè
ïðîãðàììèðîâàíèÿ Ñ, Ñ++, Python è äðóãèå èìåþò îïåðàòîð óòâåðæäåíèÿ assert, äèíàìè÷åñêè ïðîâåðÿþùèé èñòèííîñòü çàäàííîãî óòâåðæäåíèÿ â ìîìåíò âûïîëíåíèÿ ïðîãðàììû è îñòàíàâëèâàþùèé
âû÷èñëåíèå, åñëè óòâåðæäåíèå ÿâëÿåòñÿ ëîæíûì. Ýòà êîíöåïöèÿ, õîòÿ è èìååò îòíîøåíèå ê ïðåäìåòó îáñóæäåíèÿ, íî ÿâëÿåòñÿ ëèøü ìàëîé ÷àñòüþ èñïîëüçîâàíèÿ óòâåðæäåíèé â ÎÎ-ìåòîäå. Ïîòîìó,
åñëè ïîäîáíî ìíîãèì ðàçðàáîò÷èêàì âû çíàêîìû ñ ýòèì îïåðàòîðîì, íå îáîáùàéòå âàøå çíàíèå íà
âñþ êàðòèíó, ïî÷òè âñå êîíöåïöèè ýòîé ëåêöèè, âîçìîæíî, áóäóò íîâûìè.
9.3 Âûðàæåíèå ñïåöèôèêàöèé
Îò íåôîðìàëüíûõ âûñêàçûâàíèé ïåðåéäåì ê ïðîñòîé ìàòåìàòè÷åñêîé íîòàöèè, ïðèíÿòîé â òåîðèè
ôîðìàëüíîé ïðîâåðêè ïðàâèëüíîñòè ïðîãðàìì è èìåþùåé öåííîñòü ïðè äîêàçàòåëüñòâå êîððåêòíîñòè ïðîãðàììíûõ ýëåìåíòîâ.
Ôîðìóëà êîððåêòíîñòè
Ïóñòü À - ýòî íåêîòîðàÿ îïåðàöèÿ (îïåðàòîð èëè òåëî ïðîãðàììû). Ôîðìóëà êîððåêòíîñòè (correctness
formula) - ýòî âûðàæåíèå â ôîðìå:
{P} A {Q}
Ôîðìóëà âûðàæàåò ñâîéñòâî, êîòîðîå ìîæåò áûòü èëè íå áûòü èñòèííûì:
Ñìûñë ôîðìóëû êîððåêòíîñòè {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, âñÿêèé ðàç, êîãäà îíî íà÷èíàåòñÿ
â ñîñòîÿíèè, óäîâëåòâîðÿþùåì P. Äëÿ ñèíåêóðû 1, ãäå íåò ñîñòîÿíèé, óäîâëåòâîðÿþùèõ P, íå èìååò
çíà÷åíèÿ, ÷òî äåëàåò À äàæå åñëè ïðîãðàììíûé òåêñò ïðèâîäèò ê âûïîëíåíèþ áåñêîíå÷íîãî öèêëà,
èëè ëîìàåò êîìïüþòåð. Ëþáîå À áóäåò êîððåêòíûì ïî îòíîøåíèþ ê äàííîé ñïåöèôèêàöèè. Äëÿ
ñèíåêóðû 2, îäíàêî, òðåáóåòñÿ çàâåðøåíèå ðàáîòû, äîëæíî ñóùåñòâîâàòü çàêëþ÷èòåëüíîå ñîñòîÿíèå,
íå âàæíî, ÷òî äåëàåò À, íî òî, ÷òî äåëàåòñÿ, äîëæíî áûòü âûïîëíåíî çà êîíå÷íîå âðåìÿ.
×èòàòåëè, çíàêîìûå ñ òåîðèåé, ìîãëè çàìåòèòü, ÷òî ôîðìóëà {P} A {Q} îïðåäåëÿåò òîòàëüíóþ
(total correctness) èëè ïîëíóþ êîððåêòíîñòü, âêëþ÷àþùóþ çàâåðøàåìîñòü íàðÿäó ñ ñîîòâåòñòâèåì
ñïåöèôèêàöèè. Ñâîéñòâî, óñòàíàâëèâàþùåå, ÷òî ïðîãðàììà óäîâëåòâîðÿåò ñïåöèôèêàöèè ïðè óñëîâèè åå çàâåðøåíèÿ, èçâåñòíî, êàê ÷àñòè÷íàÿ êîððåêòíîñòü.
Îáñóæäåíèå òîãî, áóäåò ëè óñèëåíèå èëè îñëàáëåíèå óòâåðæäåíèé "õîðîøåé"èëè "ïëîõîé"íîâîñòüþ,
øëî ñ ïîçèöèé ðàáîòíèêà, íàíèìàþùåãîñÿ äëÿ âûïîëíåíèÿ ðàáîòû. Îáðàòèì ñèòóàöèþ, è ðàññìîòðèì
åå ñ ïîçèöèé ðàáîòîäàòåëÿ.  ýòîì ñëó÷àå ñëàáîå ïðåäóñëîâèå ñòàíåò "õîðîøåé"íîâîñòüþ, ïîñêîëüêó
îçíà÷àåò âûïîëíåíèå ðàáîòû äëÿ áîëüøåãî ìíîæåñòâà âõîäíûõ ñëó÷àåâ; áîëåå ïðåäïî÷òèòåëüíûì
òåïåðü ÿâëÿåòñÿ ñèëüíîå ïîñòóñëîâèå, ïîñêîëüêó îíî ðàñøèðÿåò ïîëó÷åíèå âàæíûõ ðåçóëüòàòîâ. Ýòà
äâîéñòâåííîñòü êðèòåðèåâ òèïè÷íà â ðàññìîòðåíèè êîððåêòíîñòè ÏÎ. Îíà âíîâü ïîÿâèòñÿ â êà÷åñòâå
öåíòðàëüíîãî ïîíÿòèÿ ýòîé ëåêöèè ïðè îáñóæäåíèè òåìû: êîíòðàêòû ìåæäó ìîäóëÿìè - êëèåíòàìè
è ïîñòàâùèêàìè, â óñòàíîâëåíèè êîòîðûõ ïðåèìóùåñòâà, ïðèîáðåòàåìûå îäíèì ó÷àñòíèêîì, ñòàíîâÿòñÿ îáÿçàòåëüñòâàìè äëÿ äðóãîãî. Ïðîèçâîäñòâî ýôôåêòèâíîãî è íàäåæíîãî ÏÎ ïðîõîäèò ÷åðåç
ñîñòàâëåíèå êîíòðàêòîâ, ïðåäñòàâëÿþùèõ âîçìîæíûå íàèëó÷øèå êîìïðîìèññû âî âñåõ ìåæìîäóëüíûõ êîììóíèêàöèÿõ êëèåíòîâ è ïîñòàâùèêîâ.
9.4 Ââåäåíèå óòâåðæäåíèé â ïðîãðàììíûå òåêñòû
Êàê òîëüêî êîððåêòíîñòü ÏÎ îïðåäåëåíà êàê ñîãëàñîâàííîñòü ðåàëèçàöèè ñ åå ñïåöèôèêàöèåé, ñëåäóåò ïðåäïðèíÿòü øàãè ïî âêëþ÷åíèþ ñïåöèôèêàöèè â ñàì ïðîãðàììíûé ïðîäóêò. Äëÿ áîëüøèíñòâà
â ïðîãðàììèñòñêîì ñîîáùåñòâå ýòî âñå åùå íîâàÿ èäåÿ. Ïðèâû÷íî ïèñàòü ïðîãðàììû, óñòàíàâëèâàÿ
òåì ñàìûì, - êàê äåëàòü (the how); ìåíåå ïðèâû÷íî ðàññìàòðèâàòü îïèñàíèå öåëåé - ÷òî äåëàòü (the
what) - êàê ÷àñòü ïðîãðàììíîãî ïðîäóêòà.
Ñïåöèôèêàöèè áóäóò îñíîâûâàòüñÿ íà óòâåðæäåíèÿõ - âûðàæåíèÿõ, âêëþ÷àþùèõ ñóùíîñòè íàøåãî ÏÎ. Âûðàæåíèå çàäàåò ñâîéñòâî, êîòîðîìó ýòè ñóùíîñòè ìîãóò óäîâëåòâîðÿòü íà íåêîòîðûõ
ýòàïàõ âûïîëíåíèÿ ïðîãðàììû. Òèïè÷íîå óòâåðæäåíèå ìîæåò âûðàæàòü òîò ôàêò, ÷òî îïðåäåëåííîå
öåëîå èìååò ïîëîæèòåëüíîå çíà÷åíèå, èëè ÷òî íåêîòîðàÿ ññûëêà íå îïðåäåëåíà.
Áëèæàéøèì ê óòâåðæäåíèþ ìàòåìàòè÷åñêèì ïîíÿòèåì ÿâëÿåòñÿ ïðåäèêàò, õîòÿ èñïîëüçóåìûé
ÿçûê óòâåðæäåíèé îáëàäàåò ëèøü ÷àñòüþ âûðàçèòåëüíîé ñèëû ïîëíîãî èñ÷èñëåíèÿ ïðåäèêàòîâ.
Ïðåäóñëîâèÿ è ïîñòóñëîâèÿ
Ïåðâîå èñïîëüçîâàíèå óòâåðæäåíèé - ñåìàíòè÷åñêàÿ ñïåöèôèêàöèÿ ïðîãðàìì. Ïðîãðàììà - ýòî íå
ïðîñòî ÷àñòü êîäà, îíà çàäàåò ðåàëèçàöèþ ôóíêöèè, âõîäÿùåé â ñïåöèôèêàöèþ ÀÒÄ. Çàäà÷ó, âûïîëíÿåìóþ ôóíêöèåé, íåîáõîäèìî âûðàçèòü òî÷íî, êàê â èíòåðåñàõ ïðîåêòèðîâàíèÿ, òàê è êàê öåëü
ïîñëåäóþùåé ðåàëèçàöèè è ïîíèìàíèÿ ïðîãðàììíîãî òåêñòà. Äâà óòâåðæäåíèÿ ñâÿçûâàþòñÿ ñ ïðîãðàììîé - ïðåäóñëîâèå è ïîñòóñëîâèå. Ïðåäóñëîâèå óñòàíàâëèâàåò ñâîéñòâà, êîòîðûå äîëæíû âûïîëíÿòüñÿ âñÿêèé ðàç, êîãäà ïðîãðàììà âûçûâàåòñÿ; ïîñòóñëîâèå îïðåäåëÿåò ñâîéñòâà, ãàðàíòèðóåìûå
ïðîãðàììîé ïî åå çàâåðøåíèþ.
#! /usr/bin/env python
# -*- coding: utf-8 -*"""
Áèíàðíûé àëãîðèòì âîçâåäåíèÿ â ñòåïåíü
"""
def power0(a, n):
"""
ïðîñòàÿ ðåàëèçàöèÿ, èñïîëüçóåòñÿ òîëüêî äëÿ ïðîâåðêè
"""
assert n >= 0
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)
9.5 ïðèìåð Êëàññ ñòåê
Ïðåäóñëîâèÿ
Ïðåäóñëîâèÿ âûðàæàþò îãðàíè÷åíèÿ, âûïîëíåíèå êîòîðûõ íåîáõîäèìî äëÿ êîððåêòíîé ðàáîòû ôóíêöèè. Çäåñü:
• put íå ìîæåò áûòü âûçâàíà, åñëè ñòåê çàïîëíåí;
• remove è item íå ìîãóò áûòü ïðèìåíåíû ê ïóñòîìó ñòåêó.
Ïðåäóñëîâèÿ ïðèìåíÿþòñÿ êî âñåì âûçîâàì ïðîãðàììû, êàê âíóòðè êëàññà, òàê è ó êëèåíòà. Êîððåêòíàÿ ñèñòåìà íèêîãäà íå âûçîâåò ïðîãðàììó â ñîñòîÿíèè, â êîòîðîì íå âûïîëíÿåòñÿ åå ïðåäóñëîâèå.
Ïîñòóñëîâèÿ
Ïîñòóñëîâèå âûðàæàåò ñâîéñòâî ñîñòîÿíèÿ, çàâåðøàþùåãî âûïîëíåíèå ïðîãðàììû. Çäåñü:
• Ïîñëå çàâåðøåíèÿ put ñòåê íå ìîæåò áûòü ïóñò; íà åãî âåðøèíå íàõîäèòñÿ òîëüêî ÷òî âòîëêíóòûé ýëåìåíò, ÷èñëî åãî ýëåìåíòîâ óâåëè÷èëîñü íà åäèíèöó.
• Ïîñëå remove ñòåê íå ìîæåò áûòü ïîëîí, ÷èñëî åãî ýëåìåíòîâ íà åäèíèöó óìåíüøèëîñü.
Ïîñòóñëîâèå â ïðîãðàììå âûðàæàåò ãàðàíòèþ, ïðåäñòàâëåííóþ ñîçäàòåëåì ïðîãðàììû, ÷òî âûïîëíåíèå ïðîãðàììû çàâåðøàåòñÿ è ïðèâîäèò ê ñîñòîÿíèþ ñ çàäàííûìè ñâîéñòâàìè, â ïðåäïîëîæåíèè,
÷òî ïðîãðàììà áûëà çàïóùåíà â ñîñòîÿíèè, óäîâëåòâîðÿþùåì ïðåäóñëîâèþ.
9.6 Êîíòðàêòû è íàäåæíîñòü ÏÎ
Ïðåäóñëîâèå è ïîñòóñëîâèå ïðîãðàììû îïðåäåëÿþò êîíòðàêò ñî âñåìè åå êëèåíòàìè.
Ïðàâà è îáÿçàòåëüñòâà
Ñâÿçûâàÿ ñ ïðîãðàììîé r ïðåäëîæåíèÿ require pre è ensure post, êëàññ ãîâîðèò ñâîèì êëèåíòàì:
"Åñëè âû îáåùàåòå âûçâàòü r â ñîñòîÿíèè, óäîâëåòâîðÿþùåì pre, òî ÿ îáåùàþ â çàêëþ÷èòåëüíîì
ñîñòîÿíèè âûïîëíèòü post".
 îòíîøåíèÿõ ìåæäó ëþäüìè è êîìïàíèÿìè êîíòðàêò - ýòî ïèñüìåííûé äîêóìåíò, ôèêñèðóþùèé
îòíîøåíèÿ. Óäèâèòåëüíî, ÷òî â ïðîãðàììíîé èíäóñòðèè, ãäå òî÷íîñòü òàê âàæíà è äâóñìûñëåííîñòü
òàê ðèñêîâàííà, ýòà èäåÿ òàê äîëãî íå ïîÿâëÿëàñü. Ëþáîé õîðîøèé êîíòðàêò óñòàíàâëèâàåò äëÿ
îáîèõ ó÷àñòíèêîâ êàê îáÿçàòåëüñòâà, òàê è ïðèîáðåòàåìóþ âûãîäó; îáû÷íî îáÿçàòåëüñòâà îäíîãî
îáîðà÷èâàþòñÿ âûãîäîé äëÿ äðóãîãî ó÷àñòíèêà, è ýòî âçàèìíî. Âñå ýòî âåðíî è äëÿ êîíòðàêòîâ
ìåæäó êëàññàìè.
• Ïðåäóñëîâèå ñâÿçûâàåò êëèåíòà: îïðåäåëÿþòñÿ óñëîâèÿ, ïðè êîòîðûõ âûçîâ ïðîãðàììû êëèåíòîì ëåãèòèìåí. Îáÿçàòåëüñòâà êëèåíòà ïðèíîñÿò ïîëüçó ïîñòàâùèêó.
• Ïîñòóñëîâèå ñâÿçûâàåò êëàññ: ïðîãðàììà îáÿçàíà îáåñïå÷èòü óñëîâèÿ ïî åå çàâåðøåíèþ. Çäåñü
ïîëüçà êëèåíòà îáîðà÷èâàåòñÿ îáÿçàòåëüñòâàìè ïîñòàâùèêà êëàññà.
Âîçìîæíî, âû íå çàìåòèëè, ÷òî êîíòðàêò ïðîòèâîðå÷èò ìóäðîñòè, áûòóþùåé â ïðîãðàììíîé èíæåíåðèè. Ïîíà÷àëó ýòî øîêèðóåò, íî êîíòðàêò - îäèí èç ãëàâíûõ âêëàäîâ â íàäåæíîñòü ÏÎ.
Ïðàâèëî êîíòðàêòà ãîâîðèò, ÷òî ïðåäóñëîâèå äàåò ïðåèìóùåñòâî ïîñòàâùèêó, åñëè êëèåíòñêàÿ
÷àñòü êîíòðàêòà íå âûïîëíÿåòñÿ, òî êëàññ ïåðåñòàåò áûòü ñâÿçàí ïîñòóñëîâèåì.  ýòîì ñëó÷àå ïðîãðàììà ìîæåò äåëàòü âñå ÷òî óãîäíî, íàïðèìåð çàöèêëèòüñÿ, íå íàðóøàÿ ïðè ýòîì êîíòðàêò. Ýòî
òîò ñàìûé ñëó÷àé, êîãäà "çàêàç÷èê âèíîâàò".
Ïåðâîå ïðåèìóùåñòâî îò òàêîãî ñîãëàøåíèÿ â òîì, ÷òî ñòèëü ïðîãðàììèðîâàíèÿ ñóùåñòâåííî óïðîùàåòñÿ. Ðàçðàáîò÷èê êëàññà ïðè íàïèñàíèè òåëà ïðîãðàììû ñìåëî ìîæåò ïðåäïîëàãàòü, ÷òî âñå îãðàíè÷åíèÿ, çàäàííûå ïðåäóñëîâèåì, âûïîëíÿþòñÿ; åìó íåò íóæäû ïðîâåðÿòü èõ â òåëå ïðîãðàììû. Òàê
äëÿ ôóíêöèè, âû÷èñëÿþùåé êâàäðàòíûé êîðåíü:
def sqrt(x):
assert x >= 0
.....
ìîæíî ñìåëî ïðèìåíÿòü àëãîðèòì, íå ó÷èòûâàþùèé ñëó÷àé îòðèöàòåëüíîãî x, ïîñêîëüêó ýòî ïðåäóñìîòðåíî ïðåäóñëîâèåì, è îòâåòñòâåííîñòü çà åãî âûïîëíåíèå íåñóò êëèåíòû ïðîãðàììû. Ñ ïåðâîãî
âçãëÿäà ýòî ìîæåò ïîêàçàòüñÿ îïàñíûì, íî ÷èòàéòå äàëüøå. Ôàêòè÷åñêè ìåòîä Ïðîåêòèðîâàíèÿ ïî
Êîíòðàêòó èäåò äàëüøå. Ïðåäïîëîæèì, ÷òî ìû íàïèñàëè â ïðåäëîæåíèè do ïðåäûäóùåé ïðîãðàììû
ñëåäóþùèé òåêñò:
...
if x < 0:
print "Îáðàáîòàòü îøèáêó êàê-íèáóäü"
else:
print "Âûïîëíèòü íîðìàëüíîå âû÷èñëåíèå êâàäðàòíîãî êîðíÿ"
....
Çàìåòüòå, â ýòîì íå òîëüêî íåò íèêàêîé íåîáõîäèìîñòè, íî ýòî è íåïðèåìëåìî! Ýòîò ôàêò ìîæíî
îòðàçèòü â ñëåäóþùåì ìåòîäîëîãè÷åñêîì ïðàâèëå:
Ïðèíöèï Íåò-Èçáûòî÷íîñòè
Íè ïðè êàêèõ îáñòîÿòåëüñòâàõ â òåëå ïðîãðàììû íå äîëæíî ïðîâåðÿòüñÿ åå ïðåäóñëîâèå
Ýòî ïðàâèëî ïðîòèâîðå÷èò òîìó, ÷åìó ó÷àò âî ìíîãèõ ó÷åáíèêàõ ïî ïðîãðàììèðîâàíèÿ, ãäå íåîáõî-
äèìîñòü ïðîâåðîê ÷àñòî âûñòóïàåò ïîä çíàìåíàìè "çàùèòíîãî ïðîãðàììèðîâàíèÿ"(defensive programming).
Åãî èäåÿ â òîì, ÷òî äëÿ ïîëó÷åíèÿ íàäåæíîãî ÏÎ êàæäàÿ ïðîãðàììà äîëæíà çàùèùàòü ñåáÿ íàñòîëüêî, íàñêîëüêî ýòî âîçìîæíî. Ëó÷øå áîëüøå ïðîâåðîê, ÷åì íåäîñòàòî÷íî; íåëüçÿ äîâåðÿòü íåçíàêîìöàì; åùå îäíà ïðîâåðêà ìîæåò è íå ïîìîæåò, íî è íå íàâðåäèò äåëó.
Ïðîåêòèðîâàíèå ïî êîíòðàêòó óòâåðæäàåò ïðîòèâíîå: èçáûòî÷íûå ïðîâåðêè ìîãóò íàíåñòè âðåä.
Êîíå÷íî, ýòî êàæåòñÿ ñòðàííûì, íà ïåðâûé âçãëÿä. Ýòî åñòåñòâåííàÿ ðåàêöèÿ, ïîëàãàòü, ÷òî äîïîëíèòåëüíàÿ ïðîâåðêà â õóäøåì ñëó÷àå ìîæåò áûòü áåñïîëåçíîé, íî íå ìîæåò áûòü ïðè÷èíîé
íåïîëàäîê. Âîçüìåì, íàïðèìåð, ïðîãðàììó sqrt, âêëþ÷èâøóþ ïðîâåðêó x<0, õîòÿ åå êëèåíòû áûëè
ïðîèíñòðóêòèðîâàíû î íåîáõîäèìîñòè îáåñïå÷åíèÿ x>=0. ×òî â ýòîì ïëîõîãî? Ñ ìèêðîñêîïè÷åñêîé
òî÷êè çðåíèÿ, îãðàíè÷èâ íàøå âèäåíèå óçêèì ìèðêîì sqrt, êàæåòñÿ, ÷òî âêëþ÷åíèå ïðîâåðêè äåëàåò
ïðîãðàììó áîëåå óñòîé÷èâîé. Íî ìèð ñèñòåìû íå îãðàíè÷èâàåòñÿ îäíîé ïðîãðàììîé - îí ñîäåðæèò
ìíîæåñòâî ïðîãðàìì â ìíîæåñòâå êëàññîâ. Äëÿ ïîëó÷åíèÿ íàäåæíîé ñèñòåìû íåîáõîäèìî ïåðåéòè
ê ìàêðîñêîïè÷åñêîìó âèäåíèþ ïðîáëåìû, îáîáùàþùåìó âñþ àðõèòåêòóðó.
Ñ ýòîé ãëîáàëüíîé òî÷êè çðåíèÿ ïðîñòîòà ñòàíîâèòñÿ êðèòè÷åñêèì ôàêòîðîì. Ñëîæíîñòü - ãëàâíûé âðàã êà÷åñòâà. Êîãäà â ýòîò êîíöåðí ïðèâíîñÿòñÿ èçëèøíèå ïðîâåðêè, òî ýòî óæå íå ïîêàæåòñÿ
ñòîëü áåçîáèäíûì äåëîì. Ýêñòðàïîëèðóéòå íà òûñÿ÷è ïðîãðàìì â ñèñòåìå ñðåäíåãî ðàçìåðà (èëè íà
äåñÿòêè è ñîòíè òûñÿ÷ â áîëüøîé ñèñòåìå) ïðîâåðêó (if x<0 then ...), ñòîëü áåçîáèäíóþ ñ ïåðâîãî
âçãëÿäà, - âñå ýòî íà÷íåò âûãëÿäåòü ïîäîáíî ìîíñòðó áåñïîëåçíîé ñëîæíîñòè. Äîáàâëÿÿ èçáûòî÷íûå
ïðîâåðêè, äîáàâëÿåòå áîëüøå êîäà. Áîëüøå êîäà - áîëüøå ñëîæíîñòè, îòñþäà è áîëüøå èñòî÷íèêîâ
óñëîâèé, ïðèâîäÿùèõ ê òîìó, ÷òî âñå ïîéäåò íå òàê, ýòî ïðèâåäåò ê äàëüíåéøåìó ðàçðàñòàíèþ êîäà
è òàê äî áåñêîíå÷íîñòè. Åñëè ïîéòè ïî ýòîé äîðîãå, òî îïðåäåëåííî ìîæíî ñêàçàòü îäíî - ìû íèêîãäà
íå äîñòèãíåì íàäåæíîñòè. ×åì áîëüøå ïèøåì, òåì áîëüøå ïðèäåòñÿ ïèñàòü.
Ýòîò áåã ñ ïðåïÿòñòâèÿìè íå äëÿ íàñ, íàñ æäåò äðóãàÿ äîðîãà. Ïðîåêòèðîâàíèå ïî Êîíòðàêòó
ïðèãëàøàåò èäåíòèôèöèðîâàòü ñîãëàñîâàííûå óñëîâèÿ, íåîáõîäèìûå äëÿ ïðàâèëüíîãî ôóíêöèîíèðîâàíèÿ êàæäîãî êîíòðàêòà â êîîïåðàöèè êëèåíòû - ïîñòàâùèêè. Ìåòîä âûíóæäàåò äëÿ êàæäîãî ñîãëàøåíèÿ óñòàíîâèòü, êòî íåñåò îòâåòñòâåííîñòü - êëèåíò èëè ïîñòàâùèê. Îòâåò ìîæåò áûòü ðàçíûé,
÷àñòè÷íî îí îïðåäåëÿåòñÿ ñòèëåì ïðîåêòèðîâàíèÿ; ïîçæå áóäåò äàí îòâåò, êàê ýòî äåëàòü ëó÷øèì
îáðàçîì. Íî êîãäà ðåøåíèå ïðèíÿòî, íóæíî åãî ïðèäåðæèâàòüñÿ. Åñëè òðåáîâàíèÿ êîððåêòíîñòè ïîÿâëÿþòñÿ â ïðåäóñëîâèè, îïðåäåëÿÿ òåì ñàìûì îòâåòñòâåííîñòü êëèåíòà, òî â ïðîãðàììå íå äîëæíî
áûòü ñîîòâåòñòâóþùèõ ïðîâåðîê. Òðåáîâàíèÿ, íå óêàçàííûå â ïðåäóñëîâèè, äîëæíû ïðîâåðÿòüñÿ è
âûïîëíÿòüñÿ â ïðîãðàììå.
Ñëåäóåò îòìåòèòü, ÷òî èçáûòî÷íûå ïðîâåðêè øèðîêî ïðèìåíÿþòñÿ â ïðîöåññå ôóíêöèîíèðîâàíèÿ
êîìïüþòåðîâ è äðóãîé ýëåêòðîííîé àïïàðàòóðû. Ôèçè÷åñêàÿ ñèñòåìà, íîðìàëüíî ôóíêöèîíèðóþùàÿ, ñî âðåìåíåì ìîæåò òåðÿòü öåëîñòíîñòü; ïðè÷èíû ðàçíûå - èçíîñ, ðàçðûâ, âíåøíèå âîçäåéñòâèÿ.
Ïîýòîìó íîðìàëüíîé ïðàêòèêîé ÿâëÿåòñÿ, êîãäà ïîëó÷àòåëü è îòïðàâèòåëü ñèãíàëà îáà ïðîâåðÿþò
åãî öåëîñòíîñòü. Äëÿ ïðîãðàììíûõ ñèñòåì ôåíîìåíà èçíîñà íå íàáëþäàåòñÿ, íåò è íåîáõîäèìîñòè â
èçáûòî÷íûõ ïðîâåðêàõ.
Ìîæíî òàêæå çàìåòèòü, ÷òî òàê íàçûâàåìàÿ èçáûòî÷íàÿ ïðîâåðêà àïïàðàòóðû, íà ñàìîì äåëå
òàêîâîé íå ÿâëÿåòñÿ: ýòî ìîãóò áûòü ðàçëè÷íûå äîïîëíèòåëüíûå òåñòû, íàïðèìåð, ïðîâåðêà íà ÷åòíîñòü, ïðîâåðêà ðàçíûõ óñòðîéñòâ è ò.ä.
Åùå îäíèì íåäîñòàòêîì çàùèòíîãî ïðîãðàììèðîâàíèÿ ÿâëÿåòñÿ åãî ñòîèìîñòü. Ïîòåðÿ ïðîèçâîäèòåëüíîñòè - íàêàçàíèå çà èçáûòî÷íûå ïðîâåðêè. Èíîãäà ýòîãî âïîëíå äîñòàòî÷íàÿ ïðè÷èíà äëÿ
îòêàçà îò çàùèòíîãî ïðîãðàììèðîâàíèÿ, ÷òîáû íå ïèñàëîñü â ó÷åáíèêàõ. Ðàáîòà ïî óäàëåíèþ òàêèõ
ïðîâåðîê ìîæåò áûòü äîâîëüíî óòîìèòåëüíîé. Ïðèåìû, ðàññìàòðèâàåìûå â ýòîé ëåêöèè, îñòàâëÿþò
ìåñòî äîïîëíèòåëüíûì ïðîâåðêàì, íî îíè áóäóò îñíîâûâàòüñÿ íà ðàçðàáîòêå òàêîãî îêðóæåíèÿ, êîòîðîå âîçüìåò íà ñåáÿ çàáîòó î ïîäîáíûõ ïðîâåðêàõ. Ïîñëå çàâåðøåíèÿ îòëàäêè äîñòàòî÷íî áóäåò
îòêëþ÷èòü ñîîòâåòñòâóþùèé ïàðàìåòð êîìïèëÿöèè, ÷òîáû ïðîâåðêè èñ÷åçëè; â ñàìîì ïðîãðàììíîì
ïðîäóêòå îíè íå ñîäåðæàòñÿ.
Íå ãîâîðÿ óæå î ïîòåðå ïðîèçâîäèòåëüíîñòè, ïðèíöèïèàëüíîé ïðè÷èíîé îòêàçà îò çàùèòíîãî ïðîãðàììèðîâàíèÿ ÿâëÿåòñÿ íàøà öåëü - ïîëó÷åíèå ìàêñèìàëüíîé íàäåæíîñòè. Äëÿ ñèñòåì ñêîëü ëèáî
ñóùåñòâåííûõ ðàçìåðîâ íåäîñòàòî÷íî îáåñïå÷åíèå êà÷åñòâà îòäåëüíûõ ýëåìåíòîâ, - áîëåå âàæíî ãàðàíòèðîâàòü, ÷òî äëÿ êàæäîãî âçàèìîäåéñòâèÿ äâóõ ýëåìåíòîâ çàäàí ÿâíûé ñïèñîê âçàèìíûõ îáÿçàòåëüñòâ è ïðåèìóùåñòâ - êîíòðàêò.  çàêëþ÷åíèå ñôîðìóëèðóåì ïàðàäîêñ Äçåí-ñòèëÿ: ìåíüøå
ïðîâåðîê - áîëüøå íàäåæíîñòè.
Êîíòðîëüíûå âîïðîñû
Begin Quiz
1. Êîððåêòíîñòü ïðîãðàììû ýòî ïîíÿòèå
íåôîðìàëüíîå
êîòîðîå ìîæíî îïðåäåëèòü, èñïîëüçóÿ òîëüêî òåðìèíû ñàìîé ïðîãðàììû
êîòîðîå ìîæíî ôîðìàëèçîâàòü òðèàäîé Õîàðà
äëÿ ôîðìàëèçàöèè êîòîðîãî íåîáõîäèìî çàäàíèå ñïåöèôèêàöèè
2. Òðèàäà Õîàðà
óñòàíàâëèâàåò êîððåêòíîñòü ïðîãðàììû áåçîòíîñèòåëüíî êàêèõ ëèáî óñëîâèé
óñòàíàâëèâàåò êîððåêòíîñòü ïðîãðàììû ïî îòíîøåíèþ ê åå ïðåäóñëîâèþ
óñòàíàâëèâàåò êîððåêòíîñòü ïðîãðàììû ïî îòíîøåíèþ ê åå ïîñòóñëîâèþ
óñòàíàâëèâàåò êîððåêòíîñòü ïðîãðàììû ïî îòíîøåíèþ ê åå ïðåäóñëîâèþ è ïîñòóñëîâèþ
3. Óêàæèòå èñòèííûå òðèàäû Õîàðà
{x <= 100} x = -x {abs(x) <= 100}
{x <= 100} x = x+10 {x <= 110}
{x <= 100} x = -x {x >= -100}
{x <= 100} x = x-90 {abs(x) >= 10}
4. ×àñòüþ êîíòðàêòà, çàêëþ÷àåìîãî ìåæäó êëàññîì-ïîñòàâùèêîì è êëàññàìè, ÿâëÿþùèìèñÿ åãî
êëèåíòàìè, ÿâëÿåòñÿ?
ãàðàíòèÿ ïîñòàâùèêîì âûïîëíåíèÿ âñåõ ïðåäóñëîâèé ìåòîäîâ êëàññà â êàæäûé ìîìåíò âûïîëíåíèÿ êëèåíòñêîé ïðîãðàììû
ãàðàíòèÿ ïîñòàâùèêîì âûïîëíåíèÿ ïîñòóñëîâèÿ ìåòîäà êëàññà, ïðè óñëîâèè, ÷òî êëèåíò ãàðàíòèðîâàë ïðè âûçîâå ìåòîäà âûïîëíåíèÿ ïðåäóñëîâèÿ
ãàðàíòèÿ ïîñòàâùèêîì âûïîëíåíèÿ ïîñòóñëîâèé âñåõ ìåòîäîâ êëàññà â êàæäûé ìîìåíò âûïîëíåíèÿ êëèåíòñêîé ïðîãðàììû
îáÿçàòåëüíàÿ ïðîâåðêà âçàèìíûõ îáÿçàòåëüñòâ ïîñòàâùèê ïðîâåðÿåò âûïîëíèìîñòü ïðåäóñëîâèé, êëèåíò - ïîñòóñëîâèé
5. Îáùàÿ òåõíèêà êîíòðàêòîâ íåïðèìåíèìà
ê áèáëèîòå÷íûì êëàññàì
ê êëàññàì, îñóùåñòâëÿþùèì âõîä èñõîäíûõ äàííûõ
ê êëàññàì, ðåàëèçóþùèì èíòåðàêòèâíîå âçàèìîäåéñòâèå ñ êîíå÷íûì ïîëüçîâàòåëåì
ê êëàññàì, ïîëó÷àþùèì äàííûå îò âíåøíèõ èñòî÷íèêîâ
6. ×àñòüþ êîíòðàêòà, çàêëþ÷àåìîãî ìåæäó êëàññîì-ïîñòàâùèêîì è êëàññàìè, ÿâëÿþùèìèñÿ åãî
êëèåíòàìè, ÿâëÿåòñÿ ?
ãàðàíòèÿ êëèåíòàìè âûïîëíåíèÿ âñåõ ïðåäóñëîâèé ìåòîäîâ êëàññà â êàæäûé ìîìåíò âûïîëíåíèÿ êëèåíòñêîé ïðîãðàììû
ïðîâåðêà ïðåäóñëîâèÿ â ìåòîäå êëàññà â òîò ìîìåíò, êîãäà êëèåíò âûçûâàåò ýòîò ìåòîä
âûïîëíåíèå ïðåäóñëîâèÿ â êëèåíòñêîé ïðîãðàììå íåïîñðåäñòâåííî ïåðåä âûçîâîì ìåòîäà
ïðîâåðêà ïðåäóñëîâèÿ â êëèåíòñêîé ïðîãðàììå íåïîñðåäñòâåííî ïåðåä âûçîâîì ìåòîäà è ïðîâåðêà ïîñòóñëîâèÿ ñðàçó æå ïî çàâåðøåíèè ìåòîäà
7. Èíâàðèàíò êëàññà äîëæåí âûïîëíÿòüñÿ
íà ìîìåíò ñîçäàíèÿ îáúåêòà
â êàæäûé òåêóùèé ìîìåíò âûïîëíåíèÿ ìåòîäîâ êëàññà
â êëèåíòñêîé ïðîãðàììå íåïîñðåäñòâåííî ïåðåä âûçîâîì ëþáîãî ìåòîäà
â ïðîãðàììå ïîñòàâùèêà íåïîñðåäñòâåííî ïîñëå çàâåðøåíèÿ âûçîâà ëþáîãî ìåòîäà
8. Äëÿ äâóõ ñòèëåé ðàçðàáîòêè õàðàêòåðíî?
äëÿ òðåáîâàòåëüíîãî ñòèëÿ áîëåå æåñòêèå òðåáîâàíèÿ ê êëèåíòàì êëàññà
äëÿ òîëåðàíòíîãî ñòèëÿ áîëåå æåñòêèå òðåáîâàíèÿ ê ïîñòàâùèêó
ïðîôåññèîíàëüíàÿ ðàçðàáîòêà ïðåäïîëàãàåò òðåáîâàòåëüíûé ñòèëü
ïðîôåññèîíàëüíàÿ ðàçðàáîòêà ïðåäïîëàãàåò òîëåðàíòíûé ñòèëü
9. Íåâåðíîå ðåøåíèå, ïðèíÿòîå ïðè ðàçðàáîòêå ïðîãðàììíîé ñèñòåìû, êëàññèôèöèðóåòñÿ êàê
îøèáêà
äåôåêò
áàã
íåèñïðàâíîñòü
10.  ïðîèçâîäñòâåííîé ñèñòåìå ñëåäóåò ïðåäóñìîòðåòü âîçìîæíîñòü âêëþ÷åíèÿ ìîíèòîðèíãà óòâåðæäåíèé äëÿ ïðîâåðêè?
òîëüêî ïðåäóñëîâèé
ïðåäóñëîâèé, ïîñòóñëîâèé è èíâàðèàíòîâ öèêëà
âàðèàíòîâ è èíâàðèàíòîâ öèêëà
îòêëþ÷åíèÿ âñÿ÷åñêèõ ïðîâåðîê
11. Êàæäûé öèêë
èìååò åäèíñòâåííûé èíâàðèàíò
èìååò ìíîæåñòâî èíâàðèàíòîâ
èìååò èíâàðèàíò, ïîçâîëÿþùèé äîêàçàòü åãî êîððåêòíîñòü
èìååò èíâàðèàíò, ïîçâîëÿþùèé äîêàçàòü çàâåðøàåìîñòü öèêëà
12. Åñëè ïðîöåäóðû ñîçäàíèÿ êîððåêòíû (ïî èõ çàâåðøåíèþ âûïîëíÿþòñÿ âñå èíâàðèàíòû êëàññà)
è êàæäûé èç ýêñïîðòèðóåìûõ ìåòîäîâ ñîõðàíÿåò èíâàðèàíòû, òî?
ãàðàíòèðóåòñÿ âûïîëíåíèå èíâàðèàíòîâ âî âñå ñòàáèëüíûå ìîìåíòû
ýòè óñëîâèÿ åùå íå ãàðàíòèðóþò âûïîëíåíèå èíâàðèàíòîâ âî âñå ñòàáèëüíûå ìîìåíòû
ãàðàíòèðóåòñÿ âûïîëíåíèå èíâàðèàíòîâ âî âñå ñòàáèëüíûå ìîìåíòû äëÿ ïðîãðàìì áåç öèêëîâ
ãàðàíòèðóåòñÿ âûïîëíåíèå èíâàðèàíòîâ âî âñå ñòàáèëüíûå ìîìåíòû äëÿ ïðîãðàìì áåç äèíàìè÷åñêèõ ïñåâäîíèìîâ
13. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
èíâàðèàíò ðåàëèçàöèè, ÷àñòü èíâàðèàíòà êëàññà âûðàæàåò êîððåêòíîñòü ïðåäñòàâëåíèÿ
êëàññîì ñîîòâåòñòâóþùåãî ÀÒÄ
óòâåðæäåíèÿ ñëóæàò ÷åòûðåì öåëÿì: ïîìîãàþò â êîíñòðóèðîâàíèè êîððåêòíûõ ïðîãðàìì;
ïîìîãàþò â ñîçäàíèè äîêóìåíòàöèè, ïîìîãàþò â îòëàäêå, ÿâëÿþòñÿ îñíîâîé ìåõàíèçìà èñêëþ÷åíèé
âêëþ÷åíèå ôóíêöèé â ñîñòàâ óòâåðæäåíèé ïîçâîëÿåò ñîõðàíèòü àïïëèêàòèâíûé õàðàêòåð
óòâåðæäåíèé
èíâàðèàíò öèêëà èçìåíÿåò çíà÷åíèå íà êàæäîì øàãå âûïîëíåíèÿ öèêëà
14. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
êîìïîíåíò, ïîÿâëÿþùèéñÿ â ïðåäóñëîâèè ïðîãðàììû, äîëæåí áûòü äîñòóïåí êàæäîìó êëèåíòó, êîòîðîìó äîñòóïíà ñàìà ïðîãðàììà
ìåòîä ñ ïðåäóñëîâèåì False áåñïîëåçåí äëÿ êëèåíòîâ
èíâàðèàíòû êëàññà ïîçâîëÿþò âûðàæàòü òîëüêî ñâîéñòâà è îòíîøåíèÿ ìåæäó àòðèáóòàìè
êëàññà
êëàññ îïèñûâàåò âñå âîçìîæíûå ðåàëèçàöèè ÀÒÄ
15. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
óòâåðæäåíèÿ çàäàþò ñåìàíòèêó êëàññà
èíâàðèàíò êëàññà ýòî óòâåðæäåíèå, âûðàæàþùåå îáùèå ñîãëàñîâàííûå îãðàíè÷åíèÿ, ïðèìåíèìûå ê êàæäîìó ýêçåìïëÿðó êëàññà, êàê öåëîìó
äëÿ ìîäóëåé, ÷üèìè êëèåíòàìè ÿâëÿþòñÿ äðóãèå ïðîãðàììíûå ìîäóëè, òðåáîâàòåëüíûé ïîäõîä îáû÷íî ÿâëÿåòñÿ ïðàâèëüíûì âûáîðîì
ïðåäóñëîâèÿ äîëæíû îïèñûâàòüñÿ â òåðìèíàõ ðåàëèçàöèè ìåòîäà
End Quiz
Íàáðàíî áàëëîâ
10 Êîãäà êîíòðàêò íàðóøàåòñÿ:
îáðàáîòêà èñêëþ÷åíèé
10.1 Áàçèñíûå êîíöåïöèè îáðàáîòêè èñêëþ÷åíèé
Îòêàçû
Íåôîðìàëüíî èñêëþ÷åíèå ýòî àíîìàëüíîå ñîáûòèå, ïðåðûâàþùåå âûïîëíåíèå ïðîãðàììû. Äëÿ ïîëó÷åíèÿ ñîäåðæàòåëüíîãî îïðåäåëåíèÿ ïîëåçíî âíà÷àëå ðàññìîòðåòü ïîíÿòèå îòêàçà, íåïîñðåäñòâåííî
ñëåäóþùåå èç èäåè êîíòðàêòà.
Ïðîãðàììà ýòî íå ïðîèçâîëüíàÿ ïîñëåäîâàòåëüíîñòü èíñòðóêöèé, à ðåàëèçàöèÿ íåêîòîðîé ñïåöèôèêàöèè - êîíòðàêòà ïðîãðàììû. Âñÿêèé âûçîâ ïðîãðàììû äîëæåí çàâåðøàòüñÿ â ñîñòîÿíèè,
óäîâëåòâîðÿþùåì ïîñòóñëîâèþ è èíâàðèàíòó êëàññà. Íåÿâíîå ñëåäñòâèå êîíòðàêòà - ïðè âûçîâå
ïðîãðàììû íå äîëæíû ïîÿâëÿòüñÿ ïðåðûâàíèÿ îïåðàöèîííîé ñèñòåìû, ñâÿçàííûå, íàïðèìåð, ñ îáðàùåíèåì ê íåäîñòóïíûì îáëàñòÿì ïàìÿòè èëè ïåðåïîëíåíèåì ïðè âûïîëíåíèè àðèôìåòè÷åñêèõ
îïåðàöèé.
Òàêèå ñèòóàöèè áóäåì íàçûâàòü
Îïðåäåëåíèÿ: óñïåõ, îòêàç
îòêàçîì (failure).
Âûçîâ ïðîãðàììû óñïåøåí, åñëè îí çàâåðøàåòñÿ â ñîñòîÿíèè, óäîâëåòâîðÿþùåì êîíòðàêòó. Âûçîâ
çàâåðøàåòñÿ îòêàçîì, åñëè îí íå óñïåøåí.
Áóäåì èñïîëüçîâàòü òåðìèíû "îòêàç ïðîãðàììû"èëè ïðîñòî "îòêàç êàê ñîêðàùåíèÿ áîëåå òî÷íîãî
òåðìèíà "âûçîâ ïðîãðàììû, çàâåðøàþùèéñÿ îòêàçîì". Ïîíÿòíî, ÷òî ñàìà ïðîãðàììà íå ìîæåò áûòü
íè óñïåøíîé, íè äàâàòü îòêàç. Ýòè ïîíÿòèÿ ïðèìåíèìû òîëüêî ïî îòíîøåíèþ ê êîíêðåòíîìó âûçîâó.
Èñêëþ÷åíèÿ
Ïðîãðàììà ïðèâîäèò ê îòêàçó èç-çà âîçíèêíîâåíèÿ íåêîòîðûõ ñïåöèôè÷åñêèõ ñîáûòèé (àðèôìåòè÷åñêîãî ïåðåïîëíåíèÿ, íàðóøåíèÿ ñïåöèôèêàöèé), ïðåðûâàþùèõ åå âûïîëíåíèå. Òàêèå ñîáûòèÿ è
ÿâëÿþòñÿ èñêëþ÷åíèÿìè.
Îïðåäåëåíèå:
èñêëþ÷åíèå Èñêëþ÷åíèå - ñîáûòèå ïåðèîäà âûïîëíåíèÿ, êîòîðîå ìîæåò ñòàòü ïðè-
÷èíîé îòêàçà ïðîãðàììû.
Çà÷àñòóþ èñêëþ÷åíèå áóäåò ïðè÷èíîé îòêàçà. Íî ìîæíî ïðåäîòâðàòèòü îòêàç, íàïèñàâ ïðîãðàììó
òàê, ÷òî îíà áóäåò çàõâàòûâàòü âîçíèêøåå èñêëþ÷åíèå, ïûòàòüñÿ âîññòàíîâèòü ñîñòîÿíèå, äîïóñêàþùåå íîðìàëüíîå ïðîäîëæåíèå âû÷èñëåíèé. Âîò ïî÷åìó îòêàç è èñêëþ÷åíèå - ýòî ðàçíûå ïîíÿòèÿ:
êàæäûé îòêàç ýòî ñëåäñòâèå èñêëþ÷åíèÿ, íî íå êàæäîå èñêëþ÷åíèå ïðèâîäèò ê îòêàçó.
Èñòî÷íèêè èñêëþ÷åíèé
Èñêëþ÷åíèÿ ìîæíî êëàññèôèöèðîâàòü, ðàçäåëèâ èõ íà êàòåãîðèè.
Ñòàíäàðòíûå ìñêëþ÷åíèÿ ìîãóò âîçíèêàòü ïðè âûïîëíåíèè ïðîãðàììû íà Python â ðåçóëüòàòå
ñëåäóþùèõ ñèòóàöèé.
• Exception
Áàçîâûé êëàññ äëÿ âñåõ âñòðîåííûõ êëàññîâ èñêëþ÷åíèé. Àòðèáóò exception.args åãî ýêçåìïëÿðîâ ñîäåðæèò ñïèñîê àðãóìåíòîâ, êîòîðûå èñïîëüçîâàëèñü ïðè åãî èíèöèàëèçàöèè
SystemExit
Èñêëþ÷åíèÿ ýòîãî êëàññà ãåíåðèðóþòñÿ ôóíêöèåé sys.exit()
StopIteration
Âûçûâàþòñÿ ìåòîäîì next() èòåðàòîðà äëÿ ñèãíàëà, ÷òî äàëüíåéøèõ çíà÷åíèé íåò.
StandardError
Áàçîâûé êëàññ èñêëþ÷åíèé, ïðåäíàçíà÷åííûõ äëÿ ãåíåðàöèè ïðè âîçíèêíîâåíèè ñòàíäàðòíûõ îøèáîê (òî åñòü âñåõ îøèáîê, êîòîðûå ìîãóò âîçíèêíóòü ïðè èñïîëüçîâàíèè âñòðîåííûõ ñðåäñòâ ÿçûêà). Ïðîèçâîäíûé êëàññ îò êëàññà Exception
∗ KeyboardInterrupt
Ïî óìîë÷àíèþ, åñëè èíòåðïðåòàòîð ïîëó÷àåò ñèãíàë SIGINT, íàïðèìåð, ïðè ïðåðûâà-
íèè ñ êëàâèàòóðû (îáû÷íî êëàâèøàìè Ctrl-C)
∗ ImportError
Ãåíåðèðóþòñÿ, åñëè ìîäóëü ñ óêàçàííûì â èíñòðóêöèè import èìåíåì íå ìîæåò áûòü
èìïîðòèðîâàí èëè â ìîäóëå íå íàéäåíî åãî èìÿ
∗ EnvironmentError
Áàçîâûé êëàññ èñêëþ÷åíèé, ãåíåðèðóåìûõ ïðè îøèáêàõ, âîçíèêàþùèõ çà ïðåäåëàìè
èíòåðïðåòàòîðà Python; êîðòåæ àðãóìåíòîâ îøèáêè: (errno, errMsg...)
· IOError
Èñïîëüçóåòñÿ ïðè îøèáêàõ ââîäà/âûâîäà
· OSError
Èñêëþ÷åíèÿ ýòîãî êëàññà (äîñòóïíîãî òàêæå êàê os.error) â îñíîâíîì ãåíåðèðó-
þòñÿ ôóíêöèÿìè ìîäóëÿ os
∗ EOFError
Ãåíåðèðóþòñÿ íåêîòîðûìè âñòðîåííûìè ôóíêöèÿìè input(), raw_input(), åñëè äîñòèãàåòñÿ êîíåö ôàéëà è, ïðè ýòîì, èç íåãî íå ñ÷èòàíî íè áàéòà èíôîðìàöèè.
∗ RuntimeError
Ïðè îøèáêàõ âðåìåíè âûïîëíåíèÿ, êîòîðûå íå ïîïàäàþò íè â îäíó èç îïèñàííûõ âûøå
êàòåãîðèé
· NotImplementedError
Ïðè îïðåäåëåíèè àáñòðàêòíûõ ìåòîäîâ ïîëüçîâàòåëüñêèõ êëàññîâ-èíòåðôåéñîâ
∗ NameError
Èñêëþ÷åíèÿ ýòîãî êëàññà ãåíåðèðóþòñÿ, åñëè èñïîëüçóåìîå â ïðîãðàììå ëîêàëüíîå
èëè ãëîáàëüíîå èìÿ íå íàéäåíî
· UnboundLocalError
Èñïîëüçóåòñÿ â ñëó÷àå, åñëè âû íåÿâíî ññûëàåòåñü íà ãëîáàëüíóþ ïåðåìåííóþ (íå
èñïîëüçîâàâ ïðåäâàðèòåëüíî èíñòðóêöèþ global), à çàòåì ïûòàåòåñü óäàëèòü åå
èëè ïðèñâîèòü åé íîâîå çíà÷åíèå
∗ AttributeError
Èñêëþ÷åíèÿ ýòîãî êëàññà ãåíåðèðóþòñÿ â ñëó÷àÿõ, êîãäà íåâîçìîæíî ïîëó÷èòü çíà÷åíèå àòðèáóòà ñ îïðåäåëåííûì èìåíåì, óäàëèòü åãî èëè ïðèñâîèòü åìó íîâîå çíà÷åíèå
∗ SyntaxError
Èñïîëüçóåòñÿ ñèíòàêñè÷åñêèì àíàëèçàòîðîì ïðè îáíàðóæåíèè ñèíòàêñè÷åñêèõ îøèáîê
· IndentationError
Ïðè ñèíòàêñè÷åñêèõ îøèáêàõ ñ îòñòóïàìè
· TabError
Ïðè ñèíòàêñè÷åñêèõ îøèáêàõ ñ îòñòóïàìè
∗ TypeError
Ãåíåðèðóþòñÿ, êàêàÿ-ëèáî îïåðàöèÿ ïðèìåíÿåòñÿ ê îáúåêòó íåñîîòâåòñòâóþùåãî òèïà
∗ AssertionError
Èñêëþ÷åíèÿ ýòîãî êëàññà ãåíåðèðóþòñÿ, åñëè íå âûïîëíÿåòñÿ óñëîâèå, óêàçàííîå â
èíñòðóêöèè assert
∗ LookupError
Áàçîâûé êëàññ èñêëþ÷åíèé, ãåíåðèðóåìûõ, åñëè ïîñëåäîâàòåëüíîñòü èëè îòîáðàæåíèå
íå ñîäåðæèò ýëåìåíòà ñ çàäàííûì èíäåêñîì èëè êëþ÷îì
· IndexError
Èñïîëüçóåòñÿ â ñëó÷àÿõ, êîãäà èíäåêñ, èñïîëüçóåìûé äëÿ ïîëó÷åíèÿ ýëåìåíòà ïîñëåäîâàòåëüíîñòè, âûõîäèò çà ïðåäåëû äèàïàçîíà
· KeyError
Èñêëþ÷åíèÿ ýòîãî êëàññà ãåíåðèðóþòñÿ, åñëè â îòîáðàæåíèè íå íàéäåíà çàïèñü ñ
óêàçàííûì êëþ÷îì
∗ ArithmeticError
Áàçîâûé êëàññ èñêëþ÷åíèé, ãåíåðèðóåìûõ ïðè âîçíèêíîâåíèè àðèôìåòè÷åñêèõ îøèáîê
· OverflowError Èñïîëüçóåòñÿ, êîãäà ðåçóëüòàò àðèôìåòè÷åñêîé îïåðàöèè ñëèøêîì
áîëüøîé, ÷òîáû åãî ìîæíî áûëî ïðåäñòàâèòü â ðàìêàõ èñïîëüçóåìîãî òèïà
· ZeroDivisionError Èñïîëüçóåòñÿ, åñëè âòîðîé îïåðàíä îïåðàòîðîâ äåëåíèÿ è ïîëó÷åíèÿ îñòàòêà îò äåëåíèÿ ðàâåí íóëþ.
· FloatingPointError Èñêëþ÷åíèÿ ýòîãî êëàññà ãåíåðèðóþòñÿ, åñëè âîçíèêàþò ïðîáëåìû ñ âûïîëíåíèåì îïåðàöèè ñ ïëàâàþùåé òî÷êîé
∗ ValueError
Ãåíåðèðóþòñÿ, êàêàÿ-ëèáî îïåðàöèÿ ïðèìåíÿåòñÿ ê îáúåêòó ïðàâèëüíîãî òèïà, íî èìåþùåãî íåñîîòâåòñòâóþùåå çíà÷åíèå, è ñèòóàöèÿ íå ìîæåò áûòü îïèñàíà áîëåå òî÷íî ñ
ïîìîùüþ èñêëþ÷åíèÿ äðóãîãî òèïà (íàïðèìåð, TypeError).
· UnicodeError
Ïðè îøèáêàõ êîäèðîâàíèÿ, ñâÿçàííîãî ñ unicode
∗ ReferenceError
Ïðè ïîïûòêå äîñòóïà ê îáúåêòó ñáîðùèêó ìóñîðà ñ íåäîñòàòî÷íûìè ïîëíîìî÷èÿìè
äëÿ ñâÿçè
∗ SystemError
Ãåíåðèðóþòñÿ â ñëó÷àå îáíàðóæåíèÿ âíóòðåííèõ îøèáîê
∗ MemoryError
Èñïîëüçóåòñÿ, åñëè äëÿ âûïîëíåíèÿ îïåðàöèè íå õâàòàåò ïàìÿòè
∗ Warning
Áàçîâûé êëàññ äëÿ ïðåäóïðåæäåíèé (ñì. ìîäóëü warning)
· UserWarning
Ïðåäóïðåæäåíèå, ãåíåðèðóåìîå êîäîì ïîëüçîâàòåëÿ
· PendingDeprecationWarning
Ïðåäóïðåäëåíèå î êîäå, êîòîðûé â áóäóùåì áóäåò óïðàçäí¼í
· DeprecationWarning
Ïðåäóïðåæäåíèå îá óïðàçäí¼ííîì êîäå
· SyntaxWarning
Ïðåäóïðåæäåíèå î âûçûâàþùåì ñîìíåíèÿ ñèíòàêñèñå
· RuntimeWarning
Ïðåäóïðåæäåíèå î ñòðàííîì ïîâåäåíèè âî âðåìÿ ðàáîòû
Ïðèìåð îáðàáîòêè èñêëþ÷èòåëüíîé ñèòóàöèè ïðè ðàáîòå ñ áàçîé äàííûõ
import psycopg2 as db
def rounding(n):
return int(round(n+0.5))
conn = db.connect(database="CA&NT", user="postgres")
db.threadsafety=2
curs = conn.cursor()
try:
sql = """
DELETE FROM tblÇàÿâêèÄîï USING tblÇàÿâêè
WHERE tblÇàÿâêèÄîï.FK_Çàÿâêà = tblÇàÿâêè.PK_Çàÿâêà AND
tblÇàÿâêè.FK_Ó÷åáíûéÃîä = 1;
"""
curs.execute(sql)
except db.DatabaseError, x:
print "Îøèáêà: ", x
conn.rollback()
conn.commit()
conn.close()
Îáùèé âèä îáðàáîòêè èñêëþ÷åíèé íà ÿçûêå Python
try:
#çäåñü êîä, êîòîðûé ìîæåò âûçâàòü èñêëþ÷åíèå
raise ExceptionType("message")
except (Òèï èñêëþ÷åíèÿ1, Òèï èñêëþ÷åíèÿ2, ...), Ïåðåìåííàÿ:
#Êîä â áëîêå âûïîëíÿåòñÿ, åñëè òèï èñêëþ÷åíèÿ ñîâïàäàåò ñ îäíèì èç òèïîâ
#(Òèï èñêëþ÷åíèÿ1, Òèï èñêëþ÷åíèÿ2, . . . ) èëè ÿâëÿåòñÿ íàñëåäíèêîì îäíîãî
#èç ýòèõ òèïîâ.
#Ïîëó÷åííîå èñêëþ÷åíèå äîñòóïíî â íåîáÿçàòåëüíîé Ïåðåìåííîé.
except (Òèï èñêëþ÷åíèÿ3, Òèï èñêëþ÷åíèÿ4, ...), Ïåðåìåííàÿ:
#êîëè÷åñòâî áëîêîâ except íå îãðàíè÷åííî
raise #Ñãåíåðèðîâàòü èñêëþ÷åíèå "ïîâåðõ" ïîëó÷åííîãî
except:
#Áóäåò âûïîëíåíî ïðè ëþáîì èñêëþ÷åíèè, íå îáðàáîòàííîì òèïèçèðîâàííûìè áëîêàìè except
else:
#Êîä áëîêà âûïîëíÿåòñÿ, åñëè íå áûëî ïîéìàíî èñêëþ÷åíèé.
nally:
#áóäåò èñïîëíåííî â ëþáîì ñëó÷àå, âîçìîæíî ïîñëå ñîîòâåòñòâóþùåãî
#áëîêà except èëè else
Êëþ÷åâûå êîíöåïöèè
• Îáðàáîòêà èñêëþ÷åíèé - ýòî ìåõàíèçì, ïîçâîëÿþùèé ñïðàâèòüñÿ ñ íåîæèäàííûìè óñëîâèÿìè,
âîçíèêøèìè â ïåðèîä âûïîëíåíèÿ.
• Îòêàç - ýòî íåâîçìîæíîñòü âî âðåìÿ âûïîëíåíèÿ ïðîãðàììû âûïîëíèòü ñâîé êîíòðàêò.
• Ïðîãðàììà ïîëó÷àåò èñêëþ÷åíèå â ðåçóëüòàòå: îòêàçà âûçâàííîé åþ ïðîãðàììû, íàðóøåíèÿ
óòâåðæäåíèé, ñèãíàëîâ àïïàðàòóðû èëè îïåðàöèîííîé ñèñòåìû îá àíîìàëèÿõ, âîçíèêøèõ â
õîäå èõ ðàáîòû.
• Ïðîãðàììíàÿ ñèñòåìà ìîæåò âêëþ÷àòü òàêæå èñêëþ÷åíèÿ, ñïðîåêòèðîâàííûå ðàçðàáîò÷èêîì.
• Ïðîãðàììà èìååò äâà ñïîñîáà ñïðàâèòüñÿ ñ èñêëþ÷åíèÿìè - Ïîâòîðåíèå âû÷èñëåíèé è Îðãàíèçîâàííàÿ Ïàíèêà. Ïðè Ïîâòîðåíèè òåëî ïðîãðàììû âûïîëíÿåòñÿ çàíîâî. Îðãàíèçîâàííàÿ
Ïàíèêà îçíà÷àåò îòêàç è ôîðìèðîâàíèå èñêëþ÷åíèÿ ó âûçûâàþùåé ïðîãðàììû.
• Áàçèñíûé ìåõàíèçì îáðàáîòêè èñêëþ÷åíèé, âêëþ÷àåìûé â ÿçûê, äîëæåí îñòàâàòüñÿ ïðîñòûì,
åñëè òîëüêî ïîîùðÿòü ïðÿìóþ öåëü îáðàáîòêè èñêëþ÷åíèé - Îðãàíèçîâàííóþ Ïàíèêó èëè Ïîâòîðåíèå.
Êîíòðîëüíûå âîïðîñû
Begin Quiz
1. Îòêàç
ïîíÿòèå, ñâÿçàííîå ñ âûçîâîì ïðîãðàììû, - âûçîâ, çàêàí÷èâàþùèéñÿ â ñîñòîÿíèè, íàðóøàþùåì êîíòðàêò
íå ìîæåò âîçíèêíóòü äëÿ êîððåêòíûõ ïðîãðàìì
ïîíÿòèå, ïðîòèâîïîëîæíîå ïîíÿòèþ óñïåõ
âñÿêîå èñêëþ÷åíèå ïðèâîäèò ê îòêàçó
2. Óñïåõ
ïîíÿòèå, ñâÿçàííîå ñ âûçîâîì ïðîãðàììû, - âûçîâ, çàêàí÷èâàþùèéñÿ â ñîñòîÿíèè, óäîâëåòâîðÿþùåìó êîíòðàêòó
ìîæåò âîçíèêíóòü äëÿ íåêîððåêòíûõ ïðîãðàìì
ïîíÿòèå, ïðîòèâîïîëîæíîå ïîíÿòèþ îòêàç
âñÿêîå èñêëþ÷åíèå îçíà÷àåò íåâîçìîæíîñòü äîñòèæåíèÿ óñïåõà
3. Èñêëþ÷åíèå
ïðèâîäèò ê ïðåðûâàíèþ íîðìàëüíîãî ïðîöåññà âû÷èñëåíèé
ìîæåò ñëóæèòü ïðè÷èíîé îòêàçà
ìîæåò ïðèâåñòè â êîíå÷íîì ñ÷åòå ê óñïåõó
âîçíèêàåò âñåãäà, êîãäà â ïðîãðàììå åñòü îøèáêà
4.  ñëó÷àå, êîãäà îáðàáîòêà èñêëþ÷åíèÿ çàâåðøàåòñÿ îòêàçîì â îáðàáîò÷èêå èñêëþ÷åíèÿ
ìîæíî íå âûïîëíÿòü íèêàêèõ äåéñòâèé
ñëåäóåò îñâîáîäèòü çàíÿòûå ðåñóðñû
ñëåäóåò âîññòàíîâèòü ñîñòîÿíèå, óäîâëåòâîðÿþùåå èíâàðèàíòó
îáåñïå÷èòü ïîÿâëåíèå èñêëþ÷åíèÿ ó âûçûâàþùåé ïðîãðàììû
5. Äèñöèïëèíèðîâàííàÿ îáðàáîòêà èñêëþ÷åíèÿ äîëæíà çàâåðøàòüñÿ îäíîé èç ñëåäóþùèõ ñèòóàöèé
îòêàçîì
ïîâòîðåíèåì ðàáîòû òåëà ìåòîäà
óâåäîìëåíèåì î âîçíèêøåì èñêëþ÷åíèè è ïðîäîëæåíèåì ðàáîòû
èñïðàâëåíèåì ñèòóàöèè è âîçâðàùåíèåì â òî÷êó âîçíèêíîâåíèÿ èñêëþ÷åíèÿ
6. Êëàññ Exception
ïîçâîëÿåò êëàññèôèöèðîâàòü èñêëþ÷åíèÿ
ñîçäàâàòü ñîáñòâåííûå èñêëþ÷åíèÿ
îðãàíèçîâàòü ðàçáîð ñëó÷àåâ ïðè îáðàáîòêå èñêëþ÷åíèÿ
íå ìîæåò èìåòü íàñëåäíèêîâ
7. Îðãàíèçîâàííàÿ ïàíèêà
ýòî îäèí èç äâóõ íîðìàëüíûõ ñïîñîáîâ çàâåðøåíèÿ ðàáîòû îáðàáîò÷èêà èñêëþ÷åíèÿ
ïîäðàçóìåâàåò îòêàç äëÿ âûçâàííîãî ìåòîäà
çàâåðøàåò ðàáîòó âûçâàííîãî ìåòîäà è âñåãî ïðèëîæåíèÿ
îçíà÷àåò, ÷òî ïðèëîæåíèå ðàáîòàåò íåêîððåêòíî
8. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
îáðàáîòêà èñêëþ÷åíèé ýòî ìåõàíèçì, ïîçâîëÿþùèé ñïðàâèòüñÿ ñ íåîæèäàííûìè óñëîâèÿìè,
âîçíèêøèìè â ïåðèîä âûïîëíåíèÿ
ïðîãðàììà ïîëó÷àåò èñêëþ÷åíèå â ðåçóëüòàòå: îòêàçà âûçâàííîé åþ ïðîãðàììû, íàðóøåíèÿ
óòâåðæäåíèé, ñèãíàëîâ àïïàðàòóðû èëè îïåðàöèîííîé ñèñòåìû îá àíîìàëèÿõ, âîçíèêøèõ â
õîäå èõ ðàáîòû
ïðîãðàììíàÿ ñèñòåìà ìîæåò âêëþ÷àòü èñêëþ÷åíèÿ, ñïðîåêòèðîâàííûå ðàçðàáîò÷èêîì
îðãàíèçîâàííàÿ ïàíèêà íåïðèåìëåìà ïðè îáðàáîòêå èñêëþ÷åíèÿ
9. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ?
ïðîãðàììà âî âðåìÿ åå âûïîëíåíèÿ èìååò ïðàâî íàðóøàòü èíâàðèàíòû
ïðè îáðàáîòêå èñêëþ÷åíèÿ âîçìîæåí ïîäúåì ïî öåïî÷êå âûçîâîâ
èñêëþ÷åíèÿ ìîãóò áûòü ñëåäñòâèåì àïïàðàòíûõ ïðåðûâàíèé
10. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ?
íåñìîòðÿ íà âîçíèêàþùèå èñêëþ÷åíèÿ è îòêàçû ðàáîòà ïðèëîæåíèÿ ìîæåò çàâåðøèòüñÿ óñïåõîì
îòêàç â ðàáîòå âñåãî ïðèëîæåíèÿ ïðîèñõîäèò òîãäà, êîãäà ïðè îáðàáîòêå âîçíèêøåãî èñêëþ÷åíèÿ ïðîèñõîäÿò îòêàçû äëÿ âñåõ ïðîãðàìì èç öåïî÷êè âûçîâîâ
îòêàç â ðàáîòå âñåãî ïðèëîæåíèÿ ïðîèñõîäèò òîãäà, êîãäà ïðè îáðàáîòêå âîçíèêøåãî èñêëþ÷åíèÿ ïðîèñõîäèò îòêàç õîòÿ áû äëÿ îäíîé èç ïðîãðàìì öåïî÷êè âûçîâîâ
ìåõàíèçì èñêëþ÷åíèé ïðîòèâîðå÷èò ìåõàíèçìó êîíòðàêòîâ
End Quiz
Íàáðàíî áàëëîâ
11 Ââåäåíèå â íàñëåäîâàíèå
11.1 Îñíîâíûå ñîãëàøåíèÿ è òåðìèíîëîãèÿ
Êðîìå òåðìèíîâ íàñëåäíèê è ðîäèòåëü áóäóò ïîëåçíû ñëåäóþùèå òåðìèíû:
Òåðìèíîëîãèÿ íàñëåäîâàíèÿ
Ïîòîìîê êëàññà C - ýòî ëþáîé êëàññ, êîòîðûé íàñëåäóåò C ÿâíî èëè íåÿâíî, âêëþ÷àÿ è ñàì êëàññ
C. (Ôîðìàëüíî, ýòî ëèáî C, ëèáî, ïî ðåêóðñèè, ïîòîìîê íåêîòîðîãî íàñëåäíèêà C).
Ñîáñòâåííûé ïîòîìîê êëàññà C - ýòî ïîòîìîê, îòëè÷íûé îò ñàìîãî C.
Ïðåäîê C - ýòî òàêîé êëàññ A, äëÿ êîòîðîãî C ÿâëÿåòñÿ ïîòîìêîì. Ñîáñòâåííûé ïðåäîê C - ýòî
òàêîé êëàññ A, äëÿ êîòîðîãî C ÿâëÿåòñÿ ñîáñòâåííûì ïîòîìêîì.
 ëèòåðàòóðå òàêæå âñòðå÷àþòñÿ òåðìèíû ïîäêëàññ è ñóïåðêëàññ, íî ìû íå áóäåì èõ èñïîëüçîâàòü èç-çà íåîäíîçíà÷íîñòè.
Èìååòñÿ òàêæå òåðìèíîëîãèÿ äëÿ êîìïîíåíòîâ êëàññà: êîìïîíåíò ëèáî ÿâëÿåòñÿ íàñëåäóåìûì
(ïåðåøåäøèì îò íåêîòîðîãî ñîáñòâåííîãî ïðåäêà), ëèáî íåïîñðåäñòâåííûì (ââåäåííûì â äàííîì
êëàññå).
Ñòðåëêà óêàçûâàåò ââåðõ îò íàñëåäíèêà ê ðîäèòåëþ. Ýòî ñîãëàøåíèå ëåãêî çàïîìíèòü - îíî ïðåäñòàâëÿåò îòíîøåíèå íàñëåäîâàòü îò.
Ñòðåëêà - ýòî íå ïðîñòî ïðîèçâîëüíàÿ ïèêòîãðàììà, îíà óêàçûâàåò íà îäíîñòîðîííþþ ñâÿçü ìåæäó
ñâîèìè äâóìÿ êîíöàìè.  äàííîì ñëó÷àå:
• Âñÿêèé ýêçåìïëÿð íàñëåäíèêà ìîæíî ðàññìàòðèâàòü êàê ýêçåìïëÿð ðîäèòåëÿ, à îáðàòíîå íåâåðíî.
• Â òåêñòå íàñëåäíèêà âñåãäà óïîìèíàåòñÿ åãî ðîäèòåëü, íî íå íàîáîðîò. Ýòî, íà ñàìîì äåëå,
ÿâëÿåòñÿ âàæíûì ñâîéñòâîì ÎÎ-ìåòîäà, âûòåêàþùèì èç ïðèíöèïà Îòêðûò-Çàêðûò, ñîãëàñíî
êîòîðîìó êëàññ íå çíàåò ñïèñêà ñâîèõ íàñëåäíèêîâ è äðóãèõ ñîáñòâåííûõ ïîòîìêîâ.
Íàñëåäîâàíèå èíâàðèàíòà
Õîòåëîñü áû óêàçàòü èíâàðèàíò êëàññà RECTANGLE, êîòîðûé ãîâîðèë áû, ÷òî ÷èñëî ñòîðîí ïðÿìîóãîëüíèêà ðàâíî ÷åòûðåì è ÷òî äëèíû ñòîðîí ïîñëåäîâàòåëüíî ðàâíû side1, side2, side1 è side2.
Ó êëàññà POLYGON òàêæå èìååòñÿ èíâàðèàíò, êîòîðûé ïðèìåíèì è ê åãî íàñëåäíèêó:
Ïðàâèëî íàñëåäîâàíèÿ èíâàðèàíòà
Èíâàðèàíò êëàññà ÿâëÿåòñÿ êîíúþíêöèåé óòâåðæäåíèé èç åãî ðàçäåëà invariant è ñâîéñòâ èíâàðèàíòîâ åãî ðîäèòåëåé (åñëè òàêîâûå èìåþòñÿ).
Ïîñêîëüêó ó ðîäèòåëåé êëàññà ìîãóò áûòü ñâîè ðîäèòåëè, òî ýòî ïðàâèëî ðåêóðñèâíî: â ðåçóëüòàòå ïîëíûé èíâàðèàíò êëàññà ïîëó÷àåòñÿ êàê êîíúþíêöèÿ ñîáñòâåííîãî èíâàðèàíòà è èíâàðèàíòîâ
êëàññîâ âñåõ åãî ïðåäêîâ.
Ýòî ïðàâèëî îòðàæàåò îäíó èç âàæíûõ õàðàêòåðèñòèê íàñëåäîâàíèÿ: ñêàçàòü, ÷òî B íàñëåäóåò A
- ýòî óòâåðæäàòü, ÷òî êàæäûé ýêçåìïëÿð B ÿâëÿåòñÿ òàêæå ýêçåìïëÿðîì A. Âñëåäñòâèå ýòîãî âñÿêîå âûðàæåííîå èíâàðèàíòîì îãðàíè÷åíèå öåëîñòíîñòè, ïðèìåíèìîå ê ýêçåìïëÿðàì A, áóäåò òàêæå
ïðèìåíèìî è ê ýêçåìïëÿðàì B.
 íàøåì ïðèìåðå âòîðîå ïðåäëîæåíèå èíâàðèàíòà POLYGON óòâåðæäàåò, ÷òî ÷èñëî ñòîðîí äîëæíî áûòü íå ìåíåå òðåõ, îíî ÿâëÿåòñÿ ñëåäñòâèåì ïðåäëîæåíèÿ èç èíâàðèàíòà êëàññà RECTANGLE,
êîòîðîå òðåáóåò, ÷òîáû ñòîðîí áûëî ðîâíî ÷åòûðå.
Íàñëåäîâàíèå è êîíñòðóêòîðû
Ïðîöåäóðà ñîçäàíèÿ (êîíñòðóêòîð) äëÿ êëàññà POLYGON ìîæåò èìåòü âèä
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
@static
def len2(a, b):
return (a.x - b.x)**2 + (a.y - b.y)**2
class Polygon:
@static
def isLine(points):
...
def __init__(self, points):
assert len(points) >= 3
assert not isLine(points)
self.points = points
class Convex(Polygon):
@static
def isConvex(points):
...
def __init__(self, points):
Polygon.__init__(self, points)
assert len(points) >= 3
assert isConvex(points)
class Parallelogram(Convex):
def __init__(self, points):
Convex.__init__(self, points)
assert len(points) == 4
assert Point.len2(points[0], points[1]) == Point.len2(points[2], points[3])
assert Point.len2(points[1], points[2]) == Point.len2(points[3], points[0])
class Rectangle(Parallelogram):
def __init__(self, points):
Parallelogram.__init__(self, points)
assert (points[0].x - points[1].x)*(points[1].x - points[2].x) \
+ (points[0].y - points[1].y)*(points[1].y - points[2].y) == 0
Ïîëèìîðôíîå ïðèñîåäèíåíèå
Ïîëèìîðôèçì îçíà÷àåò ñïîñîáíîñòü îáëàäàòü íåñêîëüêèìè ôîðìàìè.  ÎÎ-ðàçðàáîòêå íåñêîëüêèìè ôîðìàìè îáëàäàþò ñóùíîñòè (ýëåìåíòû ñòðóêòóð äàííûõ), ñïîñîáíûå âî âðåìÿ âûïîëíåíèÿ
ïðèñîåäèíÿòüñÿ ê îáúåêòàì ðàçíûõ òèïîâ.
Òàêèå ñòðóêòóðû äàííûõ, ñîäåðæàùèå îáúåêòû ðàçíûõ òèïîâ, èìåþùèõ îáùåãî ïðåäêà, íàçûâàþòñÿ ïîëèìîðôíûìè ñòðóêòóðàìè äàííûõ. Äàëåå áóäóò ðàññìîòðåíû ìíîãî÷èñëåííûå ïðèìåðû
òàêèõ ñòðóêòóð. Ìàññèâû - ýòî òîëüêî îäíà èç âîçìîæíîñòåé, ïîëèìîðôíûìè ìîãóò áûòü ëþáûå
ñòðóêòóðû êîíòåéíåðîâ: ñïèñêè, ñòåêè è ò.ï.
Ïîëèìîðôíûå ñòðóêòóðû äàííûõ ðåàëèçóþò öåëü: îáúåäèíåíèå ïîðîæäåíèÿ è íàñëåäîâàíèÿ äëÿ
äîñòèæåíèÿ ìàêñèìàëüíîé ãèáêîñòè è íàäåæíîñòè.
a = {
Polygon([Point(1,2), Point(1,3), Point(3,4)),
Convex(...),
Parallelogram(...),
Rectangle(...),
}
for figure in a:
fugure.draw()
Ïðàâèëî Âûçîâà Êîìïîíåíòîâ
Åñëè òèï ñóùíîñòè x îñíîâàí íà êëàññå Ñ, òî â âûçîâå êîìïîíåíòà x.f ñàì êîìïîíåíò f äîëæåí áûòü
îïðåäåëåí â îäíîì èç ïðåäêîâ Ñ.
Íåîãðàíè÷åííûé ïîëèìîðôèçì áûë áû íåñîâìåñòèì ñî ñòàòè÷åñêèì ïîíÿòèåì òèïà. Äîïóñòèìîñòü
ïîëèìîðôíûõ îïåðàöèé îïðåäåëÿåòñÿ íàñëåäñòâåííîñòüþ.
11.2 Êëþ÷åâûå êîíöåïöèè
• Ñ ïîìîùüþ íàñëåäîâàíèÿ ìîæíî îïðåäåëÿòü íîâûå êëàññû êàê ðàñøèðåíèå, ñïåöèàëèçàöèþ è
êîìáèíàöèþ ðàíåå îïðåäåëåííûõ êëàññîâ.
• Êëàññ, íàñëåäóþùèé äðóãîìó êëàññó, íàçûâàåòñÿ åãî íàñëåäíèêîì, à èñõîäíûé êëàññ - åãî ðîäèòåëåì. Ðàñïðîñòðàíåííûå íà ïðîèçâîëüíîå ÷èñëî óðîâíåé (âêëþ÷àÿ íîëü) ýòè ïîíÿòèÿ ñòàíîâÿòñÿ ïîíÿòèÿìè ïîòîìêà è ïðåäêà.
• Íàñëåäîâàíèå ÿâëÿåòñÿ êëþ÷åâûì ìåòîäîì êàê äëÿ ïîâòîðíîãî èñïîëüçîâàíèÿ, òàê è äëÿ ðàñøèðÿåìîñòè.
• Ïëîäîòâîðíîå ïðèìåíåíèå íàñëåäîâàíèÿ òðåáóåò ïåðåîïðåäåëåíèÿ (ïðåäîñòàâëåíèÿ êëàññó âîçìîæíîñòè ïåðåïèñàòü ðåàëèçàöèþ íåêîòîðûõ êîìïîíåíòîâ åãî ñîáñòâåííîãî ïðåäêà), ïîëèìîðôèçìà (âîçìîæíîñòè ñâÿçûâàòü ññûëêó âî âðåìÿ âûïîëíåíèÿ ñ ýêçåìïëÿðàìè ðàçíûõ êëàññîâ),
äèíàìè÷åñêîãî ñâÿçûâàíèÿ (äèíàìè÷åñêîãî âûáîðà ïîäõîäÿùåãî âàðèàíòà ïåðåîïðåäåëåííîãî
êîìïîíåíòà), ñîâìåñòíîñòè òèïîâ (òðåáîâàíèÿ, ÷òîáû âñÿêàÿ ñóùíîñòü ìîãëà ïðèñîåäèíÿòüñÿ
òîëüêî ê ýêçåìïëÿðàì òèïîâ-íàñëåäíèêîâ).
• Ñ òî÷êè çðåíèÿ ìîäóëåé íàñëåäíèê ðàñøèðÿåò íàáîð ñëóæá, ïðåäîñòàâëÿåìûõ åãî ðîäèòåëÿìè.
 ÷àñòíîñòè, ýòî ïîëåçíî äëÿ ïîâòîðíî èñïîëüçîâàíèÿ.
• Ñ òî÷êè çðåíèÿ òèïîâ îòíîøåíèå ìåæäó íàñëåäíèêîì è åãî ðîäèòåëåì - ýòî îòíîøåíèå ÿâëÿåòñÿ. Îíî ïîëåçíî êàê äëÿ ïîâòîðíîãî èñïîëüçîâàíèÿ, òàê è äëÿ ðàñøèðÿåìîñòè.
• Ìåòîäû íàñëåäîâàíèÿ, â îñîáåííîñòè, äèíàìè÷åñêîå ñâÿçûâàíèå, ïîçâîëÿþò ðàçðàáàòûâàòü äåöåíòðàëèçîâàííóþ àðõèòåêòóðó, â êîòîðîé êàæäûé âàðèàíò îïåðàöèè îïðåäåëÿåòñÿ â òîì æå
ìîäóëå, ãäå îïèñàí ñîîòâåòñòâóþùèé âàðèàíò ñòðóêòóðû äàííûõ.
• Äëÿ òèïèçèðîâàííûõ ÿçûêîâ äèíàìè÷åñêîå ñâÿçûâàíèå ìîæíî ðåàëèçîâàòü ñ ìàëûìè íàêëàäíûìè ðàñõîäàìè. Ñâÿçàííûå ñ íèì îïòèìèçàöèè, â ÷àñòíîñòè, ïðèìåíÿåìîå êîìïèëÿòîðîì ñòàòè÷åñêîå ñâÿçûâàíèå è ïîäñòàíîâêà êîäà, ïîìîãàþò ÎÎ-ïðîãðàììàì äîñòè÷ü èëè ïðåâçîéòè
ýôôåêòèâíîñòü âûïîëíåíèÿ òðàäèöèîííûõ ïðîãðàìì.
• Îòëîæåííûå êëàññû ñîäåðæàò îäèí èëè áîëåå îòëîæåííûé (íå ðåàëèçîâàííûé) êîìïîíåíò. Îíè
îïèñûâàþò ÷àñòè÷íûå ðåàëèçàöèè àáñòðàêòíûõ òèïîâ äàííûõ.
• Ñïîñîáíîñòü ýôôåêòèâíûõ ïîäïðîãðàìì âûçûâàòü îòëîæåííûå ïîçâîëÿåò ïðèìèðèòü ñ ïîìîùüþ êëàññîâ ïîâåäåíèÿ ïîâòîðíîå èñïîëüçîâàíèå ñ ðàñøèðÿåìîñòüþ.
• Îòëîæåííûå êëàññû ÿâëÿþòñÿ îñíîâíûì ñðåäñòâîì, èñïîëüçóåìûì ÎÎ-ìåòîäàìè íà ñòàäèÿõ
àíàëèçà è ïðîåêòèðîâàíèÿ.
• Óòâåðæäåíèÿ, ïðèìåíÿåìûå ê îòëîæåííûì êîìïîíåíòàì, ïîçâîëÿþò òî÷íî ñïåöèôèöèðîâàòü
îòëîæåííûå êëàññû.
Êîíòðîëüíûå âîïðîñû
Begin Quiz
1. Ïðè íàñëåäîâàíèè
åñëè êëàññ À ÿâëÿåòñÿ ðîäèòåëåì êëàññà Â, òî êëàññ Â ÿâëÿåòñÿ íàñëåäíèêîì êëàññà À
åñëè êëàññ À ÿâëÿåòñÿ ïðåäêîì êëàññà Â, òî êëàññ Â ÿâëÿåòñÿ ïîòîìêîì êëàññà À
ïî îïðåäåëåíèþ êëàññ À ÿâëÿåòñÿ ïîòîìêîì êëàññà À
ïî îïðåäåëåíèþ êëàññ À ÿâëÿåòñÿ ïðåäêîì êëàññà À
2. Íàñëåäíèê
íàñëåäóåò âñå êîìïîíåíòû ðîäèòåëÿ
ìîæåò îïðåäåëèòü ñîáñòâåííûå (íåïîñðåäñòâåííûå) êîìïîíåíòû
ìîæåò ïåðåîïðåäåëèòü àòðèáóòû ðîäèòåëÿ
ìîæåò ïåðåîïðåäåëèòü ìåòîäû ðîäèòåëÿ
3. Èíâàðèàíò êëàññà
ñîâïàäàåò ñ ñîáñòâåííûì (íåïîñðåäñòâåííûì) èíâàðèàíòîì êëàññà êîíúþíêöèåé óòâåðæäåíèé èç åãî ðàçäåëà invariant
ÿâëÿåòñÿ êîíúþíêöèåé ñîáñòâåííîãî èíâàðèàíòà êëàññà è ñîáñòâåííîãî èíâàðèàíòà ðîäèòåëÿ
ñîâïàäàåò ñ èíâàðèàíòîì ðîäèòåëÿ
ÿâëÿåòñÿ êîíúþíêöèåé ñîáñòâåííûõ èíâàðèàíòîâ âñåõ ïðåäêîâ êëàññà
4. Òèï U ñîãëàñîâàí ñ òèïîì T
òîëüêî åñëè áàçîâûé êëàññ äëÿ U ÿâëÿåòñÿ ïîòîìêîì áàçîâîãî êëàññà äëÿ T
åñëè òèïû íå ÿâëÿþòñÿ óíèâåðñàëüíî ïîðîæäåííûìè
òîëüêî åñëè ñîâïàäàþò ôàêòè÷åñêèå ïàðàìåòðû ïðè óíèâåðñàëüíîì ïîðîæäåíèè òèïîâ
äëÿ óíèâåðñàëüíî ïîðîæäåííûõ êëàññîâ B [Y] áóäåò ñîãëàñîâàí ñ A [X], åñëè B ÿâëÿåòñÿ
ïîòîìêîì A, à Y ïîòîìêîì X
5. Â ïðèñâàèâàíèè P:= S
òèïû P è S äîëæíû ñîâïàäàòü
òèï S ìîæåò áûòü ïîòîìêîì òèïà P
òèï P ìîæåò áûòü ïîòîìêîì òèïà S
ïðèñâàèâàíèå âîçìîæíî è â ñèòóàöèè, êîãäà òèïû P è S íå ñâÿçàíû îòíîøåíèåì íàñëåäîâàíèÿ
6. Êëàññ íàñëåäíèê
íå íàñëåäóåò êîíñòðóêòîðû ñâîåãî ðîäèòåëÿ
íàñëåäóåò âñå êîìïîíåíòû ðîäèòåëÿ
êîíñòðóêòîðû ðîäèòåëÿ íàñëåäóþòñÿ, íî îíè íå ñîõðàíÿþò ñòàòóñ êîíñòðóêòîðîâ
êàæäûé êëàññ äîëæåí îïðåäåëèòü ñîáñòâåííûé íàáîð êîíñòðóêòîðîâ
7. Äèíàìè÷åñêèå è ñòàòè÷åñêèå òèïû
ñóùíîñòü èìååò äèíàìè÷åñêèé è ñòàòè÷åñêèé òèïû
ñóùíîñòü èìååò òîëüêî ñòàòè÷åñêèé òèï
ññûëêà èìååò äèíàìè÷åñêèé òèï èëè ìîæåò áûòü ïóñòîé
îáúåêò èìååò äèíàìè÷åñêèé è ñòàòè÷åñêèé òèïû
8. Ïîëèìîðôèçì ýòî ñïîñîáíîñòü îáëàäàòü íåñêîëüêèìè ôîðìàìè. Ïîëèìîðôíûìè ìîãóò áûòü?
ñóùíîñòè
ñòðóêòóðû äàííûõ
ïðèñâàèâàíèÿ è ïðèñîåäèíåíèÿ
ìåòîäû
9. Ïîëèìîðôíîå ïðèñîåäèíåíèå (ïðèñâàèâàíèå, çàìåíà ôîðìàëüíîãî àðãóìåíòà ôàêòè÷åñêèì) äîïóñêàåòñÿ?
òîëüêî äëÿ ññûëîê
òîëüêî äëÿ ðàçâåðíóòîãî òèïà
äëÿ ññûëîê è äëÿ ðàçâåðíóòîãî òèïà
âîîáùå íå äîïóñêàåòñÿ
10. Èçìåíåíèå îáúÿâëåíèÿ êîìïîíåíòà ïîçâîëÿåò?
ïåðåîïðåäåëèòü ðåàëèçàöèþ óæå ðåàëèçîâàííîãî êîìïîíåíòà
çàäàòü ðåàëèçàöèþ îòëîæåííîãî êîìïîíåíòà
ôóíêöèþ áåç àðãóìåíòîâ ïåðåîïðåäåëèòü â âèäå àòðèáóòà
ïåðåîïðåäåëèòü àòðèáóò â âèäå ôóíêöèè áåç àðãóìåíòîâ
11. Ðàñøèðåíèå èëè ñïåöèàëèçàöèÿ
íàñëåäîâàíèå êëàññîâ, ðàññìàòðèâàåìîå êàê íàñëåäîâàíèå òèïîâ, ÿâëÿåòñÿ ñïåöèàëèçàöèåé
íàñëåäîâàíèå êëàññîâ, ðàññìàòðèâàåìîå êàê íàñëåäîâàíèå ìîäóëåé, ÿâëÿåòñÿ ðàñøèðåíèåì
ýêçåìïëÿðû ðîäèòåëüñêîãî êëàññà ÿâëÿþòñÿ ýêçåìïëÿðàìè êëàññîâ ïîòîìêîâ
ó ýêçåìïëÿðîâ ïîòîìêîâ ñâîéñòâ è ìåòîäîâ ìîæåò áûòü áîëüøå, ÷åì ó ýêçåìïëÿðîâ ðîäèòåëüñêîãî êëàññà
12. Îòëîæåííûé êîìïîíåíò, îòëîæåííûé êëàññ
êîìïîíåíò ÿâëÿåòñÿ îòëîæåííûì, åñëè åãî ðåàëèçàöèÿ âîçëàãàåòñÿ íà ïîòîìêà
êîìïîíåíò ÿâëÿåòñÿ îòëîæåííûì, åñëè ïîòîìîê ïåðåîïðåäåëèë ðåàëèçàöèþ, çàäàííóþ åãî ðîäèòåëåì
êëàññ ÿâëÿåòñÿ îòëîæåííûì, åñëè îí èìååò õîòÿ áû îäèí îòëîæåííûé êîìïîíåíò
êëàññ ÿâëÿåòñÿ îòëîæåííûì, åñëè âñå åãî êîìïîíåíòû îòëîæåíû
13. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
ó îòëîæåííîãî êëàññà íåò èíâàðèàíòîâ, à äëÿ îòëîæåííîãî êîìïîíåíòà íå ìîæåò áûòü çàäàíî
ïðåäóñëîâèå è ïîñòóñëîâèå
òèï ñîçäàâàåìîãî ýêçåìïëÿðà â ïðîöåäóðå ñîçäàíèÿ íå ìîæåò áûòü îòëîæåííûì
âñÿêîå èçìåíåíèå îòëîæåííîãî êîìïîíåíòà äîëæíî ñäåëàòü åãî ýôôåêòèâíûì
ïîâòîðíîå îáúÿâëåíèå êîìïîíåíòà îçíà÷àåò îïðåäåëåíèå èëè ïåðåîïðåäåëåíèå åãî ðåàëèçàöèè
14. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
ïîëíîñòüþ îòëîæåííûé êëàññ ñîîòâåòñòâóåò ÀÒÄ
åñëè íàñëåäíèê ïåðåîïðåäåëèë ìåòîä ðîäèòåëÿ, òî âûçâàòü ðîäèòåëüñêèé ìåòîä ó ïîòîìêà íå
ïðåäñòàâëÿåòñÿ âîçìîæíûì
åñëè ðåçóëüòàò ñòàòè÷åñêîãî ñâÿçûâàíèÿ íå ñîâïàäàåò ñ ðåçóëüòàòîì äèíàìè÷åñêîãî ñâÿçûâàíèÿ, òî ñåìàíòè÷åñêè íåêîððåêòíûì ÿâëÿåòñÿ ñòàòè÷åñêîå ñâÿçûâàíèå
íàñëåäîâàíèå ïîçâîëÿåò îïðåäåëÿòü íîâûå êëàññû ëèáî êàê ðàñøèðåíèå, ëèáî êàê ñïåöèàëèçàöèþ
15. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
âûçîâ äèíàìè÷åñêè ñâÿçûâàåìîãî êîìïîíåíòà ìîæíî ðåàëèçîâàòü çà êîíñòàíòíîå âðåìÿ
ýôôåêòèâíûé êîìïîíåíò ýòî êîìïîíåíò, ñíàáæåííûé ðåàëèçàöèåé
ïðîãðàììîé ñ äûðàìè íàçûâàåòñÿ åùå íå çàâåðøåííàÿ ïðîãðàììà èëè ïðîãðàììà, â êîòîðîé
îáíàðóæåíû îøèáêè
íàñëåäîâàíèå ÿâëÿåòñÿ êëþ÷åâûì ìåõàíèçìîì ïîâòîðíîãî èñïîëüçîâàíèÿ è ðàñøèðÿåìîñòè
End Quiz
Íàáðàíî áàëëîâ
12 Ìíîæåñòâåííîå íàñëåäîâàíèå
Ïîëíîöåííîå ïðèìåíåíèå íàñëåäîâàíèÿ òðåáóåò âàæíîãî ðàñøèðåíèÿ ýòîãî ìåõàíèçìà. Èçó÷àÿ åãî îñíîâû, ìû ñòîëêíóëèñü ñ íåîáõîäèìîñòüþ ïîðîæäàòü íîâûå êëàññû îò íåñêîëüêèõ êëàññîâ-ðîäèòåëåé.
Ýòà âîçìîæíîñòü, èçâåñòíàÿ êàê ìíîæåñòâåííîå (multiple) íàñëåäîâàíèå (èìåíóåìîå òàê â ïðîòèâîâåñ
åäèíè÷íîìó (single) íàñëåäîâàíèþ), äåéñòâèòåëüíî íóæíà äëÿ ïîñòðîåíèÿ íàäåæíûõ ÎÎ-ðåøåíèé.
Ìíîæåñòâåííîå íàñëåäîâàíèå ýòî, ïî ñóòè, ïðÿìîå ïðèëîæåíèå óæå ðàññìîòðåííûõ ïðèíöèïîâ íàñëåäîâàíèÿ, - êëàññ âïðàâå èìåòü ïðîèçâîëüíîå ÷èñëî ðîäèòåëåé. Îäíàêî, èçó÷àÿ ýòîò âîïðîñ áîëåå
âíèìàòåëüíî, ìîæíî îáíàðóæèòü äâå èíòåðåñíûå ïðîáëåìû: ïîòðåáíîñòü â ñìåíå èìåí êîìïîíåíòîâ,
êîòîðàÿ ìîæåò îêàçàòüñÿ ïîëåçíîé è ïðè åäèíè÷íîì íàñëåäîâàíèè; äóáëèðóåìîå (repeated) íàñëåäîâàíèå, ïðè êîòîðîì äâà êëàññà ñâÿçàíû îòíîøåíèåì ïðåäîê-ïîòîìîê áîëåå ÷åì îäíèì ñïîñîáîì.
12.1 Ïðèìåðû ìíîæåñòâåííîãî íàñëåäîâàíèÿ
Âûÿñíèì, ïðåæäå âñåãî, â êàêèõ ñèòóàöèÿõ ìíîæåñòâåííîå íàñëåäîâàíèå è â ñàìîì äåëå óìåñòíî.
Äëÿ ýòîãî ðàññìîòðèì ðÿä òèïè÷íûõ ïðèìåðîâ, çàèìñòâîâàííûõ èç ðàçíûõ ïðåäìåòíûõ îáëàñòåé.
Òàêîé êðàòêèé ýêñêóðñ òåì áîëåå íåîáõîäèì, ÷òî íåñìîòðÿ íà ýëåãàíòíîñòü, ïðîñòîòó ìíîæåñòâåííîãî íàñëåäîâàíèÿ è ðåàëüíóþ ïîòðåáíîñòü â íåì, äåìîíñòðàöèÿ ýòîãî ìåõàíèçìà ïîä÷àñ ñîçäàåò
âïå÷àòëåíèå ÷åãî-òî ñëîæíîãî è òàèíñòâåííîãî. È õîòÿ ýòó òî÷êà çðåíèÿ íå ïîäòâåðæäàåò íè ïðàêòèêà, íè òåîðèÿ, îíà ðàñïðîñòðàíèëàñü äîñòàòî÷íî øèðîêî, è òåïåðü ìû ïðîñòî îáÿçàíû ïîòðàòèòü
Ðèñ. 12.1: Ïðèìåð ìíîæåñòâåííîãî íàñëåäîâàíèÿ
íåìíîãî âðåìåíè íà èçó÷åíèå ñëó÷àåâ, â êîòîðûõ ìíîæåñòâåííîå íàñëåäîâàíèå äåéñòâèòåëüíî ñîâåðøåííî íåîáõîäèìî.
Ñíà÷àëà ïîêîí÷èì ñ îäíèì áûòóþùèì çàáëóæäåíèåì. Äëÿ ýòîãî ðàññìîòðèì ïðèìåð, ïðèâîäèìûé
(â òîì èëè èíîì âèäå) âî ìíîãèõ ñòàòüÿõ, êíèãàõ è ëåêöèÿõ, íî çà÷àñòóþ ïîðîæäàþùèé íåäîâåðèå ê
ìíîæåñòâåííîìó íàñëåäîâàíèþ. È äåëî íå â òîì, ÷òî ýòîò ïðèìåð íåâåðåí; ïðîñòî ïðè ïåðâîì çíàêîìñòâå ñ ïðîáëåìîé îí íå ìîæåò ñëóæèòü èëëþñòðàöèåé, ïîñêîëüêó ÿâëÿåò ñîáîé îáðàçåö íåòèïè÷íîãî
ïðèìåíåíèÿ ýòîãî ìåõàíèçìà.
 ñòàíäàðòíîé ôîðìóëèðîâêå ïðèìåðà ðå÷ü çàõîäèò î êëàññàõ TEACHER è STUDENT, è âàì òóò
æå ïðåäëàãàþò îòìåòèòü òîò ôàêò, ÷òî îòäåëüíûå ñòóäåíòû òîæå ïðåïîäàþò, è ñîâåòóþò ââåñòè êëàññ
TEACHING_ASSISTANT, ïîðîæäåííûé îò TEACHER è STUDENT.
Âûõîäèò, â ýòîé ñõåìå ÷òî-òî íå òàê? Íå îáÿçàòåëüíî. Íî êàê íà÷àëüíûé ïðèìåð îí âåñüìà íåóäà÷åí. Âñå äåëî â òîì, ÷òî STUDENT è TEACHER - íå îòäåëüíûå àáñòðàêòíûå ïîíÿòèÿ, à âàðèàöèè
íà îäíó òåìó UNIVERSITY_PERSON. Ïîýòîìó, óâèäåâ êàðòèíó â öåëîì, ìû îáíàðóæèì ïðèìåð
íå ïðîñòî ìíîæåñòâåííîãî, íî äóáëèðóåìîãî (repeated) íàñëåäîâàíèÿ - ñõåìû, èçó÷àåìîé ïîçæå â
Ðèñ. 12.2: À ýòî ïðèìåð äóáëèðóåìîãî íàñëåäîâàíèÿ
ýòîé ëåêöèè, â êîòîðîé êëàññ ÿâëÿåòñÿ ïðàâèëüíûì íàñëåäíèêîì äðóãîãî êëàññà äâóìÿ èëè áîëåå
ðàçëè÷íûìè ïóòÿìè:
Äóáëèðóåìîå íàñëåäîâàíèå - ýòî îñîáûé ñëó÷àé. Åãî ïðèìåíåíèå òðåáóåò áîëüøîãî îïûòà â èñïîëüçîâàíèè áîëåå ïðîñòûõ ôîðì ïîðîæäåíèÿ êëàññîâ. Ýòîò ïðèìåð íåëüçÿ îáñóæäàòü ñ íà÷èíàþùèìè
ïðîñòî ïîòîìó, ÷òî îí ñîçäàåò âïå÷àòëåíèå êîíôëèêòîâ ìåæäó îòäåëüíûìè êîìïîíåíòàìè, íàñëåäóåìûõ îò îáîèõ ðîäèòåëåé, â òî âðåìÿ êàê ðå÷ü èäåò î ñâîéñòâå, ïðèõîäÿùåì îò îáùåãî ïðåäêà.
Ïðè ïðàâèëüíîì ïîäõîäå èñïðàâèòü ýòó ïðîáëåìó íå ñîñòàâèò òðóäà. Íî áûëî áû ñåðüåçíîé îøèáêîé
íà÷èíàòü ðàçãîâîð ñ òàêèõ èñêëþ÷èòåëüíûõ è íåïðîñòûõ ñëó÷àåâ, äåëàÿ âèä, áóäòî îíè õàðàêòåðíû
äëÿ âñåãî ìíîæåñòâåííîãî íàñëåäîâàíèÿ.
Ìîæåò ëè ñàìîëåò áûòü èìóùåñòâîì?
Íàø ïåðâûé ïîäõîäÿùèé ïðèìåð îòíîñèòñÿ ñêîðåå ê ìîäåëèðîâàíèþ ñèñòåì, ÷åì ê ïðîåêòèðîâàíèþ
ïðîãðàììíûõ ïðîäóêòîâ. Îäíàêî îí íàãëÿäíî èëëþñòðèðóåò ñèòóàöèþ, â êîòîðîé ìíîæåñòâåííîå
íàñëåäîâàíèå íåîáõîäèìî.
Ïóñòü êëàññ AIRPLANE îïèñûâàåò ñàìîëåò. Ñðåäè çàïðîñîâ ê íåìó ìîãóò áûòü ÷èñëî ïàññàæèðîâ
(passenger_count), âûñîòà (altitude), ïîëîæåíèå (position), ñêîðîñòü (speed); ñðåäè êîìàíä - âçëåòåòü
(take_o ), ïðèçåìëèòüñÿ (land), íàáðàòü ñêîðîñòü (set_speed).
Íåçàâèñèìî îò íåãî ìîæåò èìåòüñÿ êëàññ ASSET, îïèñûâàþùèé ïîíÿòèå èìóùåñòâà. Ê åãî êîìïîíåíòàì ìîæíî îòíåñòè òàêèå àòðèáóòû è ìåòîäû, êàê öåíà ïîêóïêè (purchase_price), öåíà ïðîäàæè (resale_value), óìåíüøèòü â öåíå (depreciate), ïåðåïðîäàòü (resell), âíåñòè î÷åðåäíîé ïëàòåæ
(pay_installment).
Íàâåðíîå, âû äîãàäàëèñü, ê ÷åìó ìû êëîíèì: êîìïàíèÿ âåäü ìîæåò âëàäåòü ñàìîëåòîì! È äëÿ
ïèëîòà ñàìîëåò êîìïàíèè ýòî ïðîñòî ìàøèíà, ñïîñîáíàÿ âçëåòàòü, ñàäèòüñÿ, íàáèðàòü ñêîðîñòü. Äëÿ
ôèíàíñèñòà ýòî èìóùåñòâî, èìåþùåå (î÷åíü âûñîêóþ) öåíó ïîêóïêè, (ñëèøêîì íèçêóþ) öåíó ïðîäàæè, è âûíóæäàþùåå êîìïàíèþ åæåìåñÿ÷íî ïëàòèòü ïî êðåäèòó.
Äëÿ ìîäåëèðîâàíèÿ ïîíÿòèÿ ñàìîëåò êîìïàíèè ïðèáåãíåì ê ìíîæåñòâåííîìó íàñëåäîâàíèþ:
 ìîäåëèðîâàíèè ñèñòåì íàéäåòñÿ åùå íåìàëî ïðèìåðîâ, ïîäîáíûõ COMPANY_PLANE.
• Íàðó÷íûå ÷àñû-êàëüêóëÿòîð ìîäåëèðóþòñÿ ñ ïðèìåíåíèåì ìíîæåñòâåííîãî íàñëåäîâàíèÿ. Îäèí
ðîäèòåëü ïîçâîëÿåò óñòàíàâëèâàòü âðåìÿ è îòâå÷àòü íà òàêèå çàïðîñû, êàê òåêóùåå âðåìÿ è
òåêóùàÿ äàòà. Äðóãîé - ýëåêòðîííûé êàëüêóëÿòîð - ïîääåðæèâàåò àðèôìåòè÷åñêèå îïåðàöèè.
• Íàñëåäíèêîì êëàññîâ ñóäíî è ãðóçîâèê ÿâëÿåòñÿ àìôèáèÿ (AMPHIBIOUS_VEHICLE). Íàñëåäíèê êëàññîâ: ñóäíî, ñàìîëåò - ãèäðîñàìîëåò (HYDROPLANE). (Êàê è ñ TEACHING_ASSISTANT,
çäåñü òàêæå âîçìîæíî äóáëèðóåìîå íàñëåäîâàíèå, ïîñêîëüêó êàæäûé èç êëàññîâ-ðîäèòåëåé ÿâëÿåòñÿ ïîòîìêîì ñðåäñòâà ïåðåäâèæåíèÿ VEHICLE.)
Ðèñ. 12.3: Ñàìîëåò êîìïàíèè
• Óæèí â ðåñòîðàíå; ïîåçäêà â âàãîíå ïîåçäà - âàãîí-ðåñòîðàí (EATING_CAR). Âàðèàíò: ñïàëüíûé âàãîí (SLEEPING_CAR).
• Äèâàí-êðîâàòü (SOFA_BED), íà êîòîðîì ìîæíî íå òîëüêî ÷èòàòü, íî è ñïàòü.
• Äîì íà êîëåñàõ (MOBILE_HOME) - âèä òðàíñïîðòà (VEHICLE) è æèëèùå (HOUSE) îäíîâðåìåííî; è òàê äàëåå.
×èñëîâûå è ñðàâíèìûå çíà÷åíèÿ
Ñëåäóþùèé ïðèìåð íàïðÿìóþ îòíîñèòñÿ ê ïîâñåäíåâíîé ïðàêòèêå ÎÎ-ðàçðàáîòêè è íåðàçðûâíî
ñâÿçàí ñ ïîñòðîåíèåì áèáëèîòåêè Kernel.
Ðÿä êëàññîâ Kernel, ïîòåíöèàëüíî íåîáõîäèìûõ âñåì ïðèëîæåíèÿì, òðåáóþò ïîääåðæêè òàêèõ
îïåðàöèé àðèôìåòèêè, êàê +, -, *, -, à òàêæå ñïåöèàëüíûõ çíà÷åíèé zero (åäèíè÷íûé ýëåìåíò ãðóïïû ñ îïåðàöèåé +) è one (åäèíè÷íûé ýëåìåíò ãðóïïû ñ îïåðàöèåé *). Ýòè êîìïîíåíòû èñïîëüçóþò
îòäåëüíûå êëàññû áèáëèîòåêè Kernel: INTEGER, REAL è DOUBLE. Âïðî÷åì, îíè íóæíû è äðóãèì, çàðàíåå íå îïðåäåëåííûì êëàññàì, íàïðèìåð, êëàññó MATRIX, êîòîðûé îïèñûâàåò ìàòðèöû
îïðåäåëåííîãî âèäà. Ïðèâåäåííûå àáñòðàêöèè óìåñòíî îáúåäèíèòü â îòëîæåííîì êëàññå NUMERIC,
ÿâëÿþùåìñÿ ÷àñòüþ áèáëèîòåêè Kernel.
NUMERIC èìååò ñòðîãîå ìàòåìàòè÷åñêîå îïðåäåëåíèå. Åãî ýêçåìïëÿðû ñëóæàò äëÿ ïðåäñòàâëåíèÿ
ýëåìåíòîâ êîëüöà (ìíîæåñòâà ñ äâóìÿ îïåðàöèÿìè, êàæäàÿ èç êîòîðûõ èíäóöèðóåò íà íåì ãðóïïó,
ïðè÷åì îäíà èç îïåðàöèé êîììóòàòèâíà, à âòîðàÿ äèñòðèáóòèâíà îòíîñèòåëüíî ïåðâîé).
Ìíîãèì êëàññàì íåîáõîäèìî îòíîøåíèå ïîðÿäêà ñ îïåðàöèÿìè ñðàâíåíèÿ ýëåìåíòîâ. Òàêàÿ âîçìîæíîñòü ïîëåçíà äëÿ êëàññîâ Kernel, òàêèõ êàê STRING, è äëÿ ìíîãèõ äðóãèõ êëàññîâ. Ïîýòîìó â
ñîñòàâ áèáëèîòåêè âõîäèò îòëîæåííûé êëàññ COMPARABLE :
Ìàòåìàòè÷åñêè åãî ýêçåìïëÿðû - ýòî ïîëíîñòüþ óïîðÿäî÷åííûå ìíîæåñòâà ñ çàäàííûì îòíîøåíèåì ïîðÿäêîì.
Íå âñå ïîòîìêè COMPARABLE äîëæíû áûòü ïîòîìêàìè NUMERIC. Â êëàññå STRING àðèôìåòèêà íå íóæíà, îäíàêî íóæåí ïîðÿäîê. Îáðàòíî, íå âñå ïîòîìêè NUMERIC äîëæíû áûòü ïîòîìêàìè COMPARABLE. Òàê, íà ìíîæåñòâå ìàòðèö ñ äåéñòâèòåëüíûìè êîýôôèöèåíòàìè åñòü ñëîæåíèå,
óìíîæåíèå, åäèíèöà, íóëü, ÷òî ïðèäàåò åé ñâîéñòâà êîëüöà, íî íåò îòíîøåíèÿ ïîðÿäêà. Ïîýòîìó
COMPARABLE
è NUMERIC äîëæíû îñòàâàòüñÿ ðàçëè÷íûìè êëàññàìè, è íè îäèí èç íèõ íå äîë-
æåí áûòü ïîòîìêîì äðóãîãî.
Îáúåêòû íåêîòîðûõ òèïîâ, îäíàêî, èìåþò ÷èñëîâóþ ïðèðîäó è îäíîâðåìåííî äîïóñêàþò ñðàâíåíèå. (Òàêèå êëàññû ìîäåëèðóþò âïîëíå óïîðÿäî÷åííûå êîëüöà.) Ïðèìåðû òàêèõ êëàññîâ - REAL
è INTEGER. Öåëûå è äåéñòâèòåëüíûå ÷èñëà ñðàâíèâàþò, ñêëàäûâàþò è óìíîæàþò. Èõ îïèñàíèå
ìîæíî ïîñòðîèòü íà ìíîæåñòâåííîì íàñëåäîâàíèè:
Ðèñ. 12.4: Ñòðóêòóðà ìíîæåñòâåííîãî è åäèíè÷íîãî íàñëåäîâàíèÿ
Ñîñòàâíûå ôèãóðû
Ñëåäóþùèé ïðèìåð áîëüøå ÷åì ïðèìåð, - îí ïîñëóæèò íàì îáðàçöîì ïðîåêòèðîâàíèÿ êëàññîâ â
ñàìûõ ðàçëè÷íûõ ñèòóàöèÿõ.
Ðàññìîòðèì ñòðóêòóðó, ââåäåííóþ â ïðåäûäóùåé ëåêöèè äëÿ èçó÷åíèÿ íàñëåäîâàíèÿ è ñîäåðæàùóþ êëàññû ãðàôè÷åñêèõ ôèãóð: FIGURE, OPEN_FIGURE, POLYGON, RECTANGLE, ELLIPSE è
ò.ä. Äî ñèõ ïîð â ýòîé ñòðóêòóðå èñïîëüçîâàëîñü ëèøü åäèíè÷íîå íàñëåäîâàíèå.
Ïóñòü â ýòîé èåðàðõèè ïðåäñòàâëåíû âñå íóæíûå íàì áàçîâûå ôèãóðû. Îäíàêî â áèáëèîòåêó
êëàññîâ õîòåëîñü áû âêëþ÷èòü è íå áàçîâûå ôèãóðû, èìåþùèå øèðîêîå ðàñïðîñòðàíåíèå. Êîíå÷íî,
ëþáîå èçîáðàæåíèå êàæäûé ðàç ìîæíî ñòðîèòü èç ïðèìèòèâîâ, íî ýòî íåóäîáíî. Ïîýòîìó ìû ñîçäàäèì áèáëèîòåêó ôèãóð, ÷àñòü êîòîðûõ áóäóò áàçîâûìè, à ÷àñòü - ïîñòðîåíà íà èõ îñíîâå. Òàê, èç
ýêçåìïëÿðîâ áàçèñíûõ êëàññîâ: îòðåçêà è îêðóæíîñòè ìîæíî ñîáðàòü êîëåñî:
Êîëåñî, â ñâîþ î÷åðåäü, ìîæåò ïðèãîäèòüñÿ ïðè ðèñîâàíèè âåëîñèïåäà, è ò. ä.
Èòàê, íàì íåîáõîäèì óíèâåðñàëüíûé ìåõàíèçì ñîçäàíèÿ íîâûõ ôèãóð, ïîñòðîåííûõ íà îñíîâå
ñóùåñòâóþùèõ, íî, áóäó÷è ïîñòðîåííûìè, èñïîëüçóåìûìè íàðàâíå ñ áàçîâûìè.
Íàçîâåì íîâûå ôèãóðû ñîñòàâíûìè (COMPOSITE_FIGURE). Êàæäóþ òàêóþ ôèãóðó, áåçóñëîâíî,
íàäî ïîðîæäàòü îò FIGURE, ÷òî ïîçâîëèò åé áûòü íà ðàâíûõ ñ áàçîâûìè ïðèìèòèâàìè. Ñîñòàâíàÿ
ôèãóðà - ýòî åùå è ñïèñîê ôèãóð, åå îáðàçóþùèõ, êàæäàÿ èç êîòîðûõ ìîæåò áûòü áàçîâîé èëè
ñîñòàâíîé. Âîñïîëüçóåìñÿ ìíîæåñòâåííûì íàñëåäîâàíèåì 12.5.
Äëÿ ïîëó÷åíèÿ ýôôåêòèâíîãî êëàññà COMPOSITE_FIGURE âûáåðåì îäíó èç âîçìîæíûõ ðåàëèçàöèé ñïèñêà, íàïðèìåð ñâÿçíûé ñïèñîê - LINKED_LIST.
Êàê è â ïðåäûäóùèõ ðàññìîòðåíèÿõ, ìû ïðåäïîëàãàåì, ÷òî êëàññ ñïèñîê ïðåäëàãàåò ìåõàíèçì
îáõîäà ýëåìåíòîâ, îñíîâàííûé íà ïîíÿòèè êóðñîðà. Êîìàíäà start óñòàíàâëèâàåò êóðñîð íà ïåðâûé
ýëåìåíò, åñëè îí åñòü (èíà÷å after ñðàçó æå ðàâíî True), after óêàçûâàåò, îáîøåë ëè êóðñîð âñå
ýëåìåíòû, item äàåò çíà÷åíèå ýëåìåíòà, íà êîòîðûé óêàçûâàåò êóðñîð, forth ïåðåäâèãàåò êóðñîð ê
Ðèñ. 12.5: Ñîñòàâíàÿ ôèãóðà - ýòî ôèãóðà è ñïèñîê ôèãóð îäíîâðåìåííî
ñëåäóþùåìó ýëåìåíòó.
ß íàõîæó ýòó ñõåìó ïðåêðàñíîé è, íàäåþñü, âû òîæå ïëåíèòåñü åå êðàñîòîé. Â íåé âû íàéäåòå
ïî÷òè âåñü àðñåíàë ñðåäñòâ: êëàññû, ìíîæåñòâåííîå íàñëåäîâàíèå, ïîëèìîðôíûå ñòðóêòóðû äàííûõ
(LINKED_LIST [FIGURE]), äèíàìè÷åñêîå ñâÿçûâàíèå (âûçîâ item.display ïðèìåíÿåò ìåòîä display
òîãî êëàññà, êîòîðîìó ïðèíàäëåæèò òåêóùèé ýëåìåíò ñïèñêà), ðåêóðñèþ (êàæäûé ýëåìåíò item ñàì
ìîæåò áûòü ñîñòàâíîé ôèãóðîé áåç îãðàíè÷åíèÿ ãëóáèíû âëîæåííîñòè).
Íî ìîæíî ïîéòè åùå äàëüøå. Îáðàòèìñÿ ê äðóãèì êîìïîíåíòàì COMPOSITE_FIGURE - ìåòîäàì âðàùåíèÿ (rotate) è ïåðåíîñà (translate). Îíè òàêæå äîëæíû âûïîëíÿòü íàäëåæàùèå îïåðàöèè íàä êàæäûì ýëåìåíòîì ôèãóðû, è êàæäûé èç íèõ ìîæåò âî ìíîãîì íàïîìèíàòü display. Äëÿ
ÎÎ-ïðîåêòèðîâùèêà ýòî ìîæåò ñòàòü ïðè÷èíîé òðåâîãè: õîòåëîñü áû èçáåæàòü ïîâòîðåíèÿ; ïîòîìó
âûïîëíèì ïðåîáðàçîâàíèå - îò èíêàïñóëÿöèè ê ïîâòîðíîìó èñïîëüçîâàíèþ. (Ýòî ìîãëî áû ñòàòü äåâèçîì.) Òåõíèêà, ðàññìàòðèâàåìàÿ çäåñü, ñîñòîèò â èñïîëüçîâàíèè îòëîæåííîãî êëàññà èòåðàòîð,
÷üè ýêçåìïëÿðû ñïîñîáíû âûïîëíÿòü öèêë ïî COMPOSITE_FIGURE. Åãî ýôôåêòèâíûì ïîòîìêîì
ìîæåò ñòàòü DISPLAY_ ITERATOR, à òàêæå ðÿä äðóãèõ êëàññîâ.
12.2 Ñòðóêòóðíîå íàñëåäîâàíèå
Ìíîæåñòâåííîå íàñëåäîâàíèå ïðîñòî íåîáõîäèìî, êîãäà íåîáõîäèìî çàäàòü äëÿ êëàññà ðÿä äîïîëíèòåëüíûõ ñâîéñòâ, ïîìèìî ñâîéñòâ, çàäàííûõ áàçîâîé àáñòðàêöèåé.
Ðàññìîòðèì ìåõàíèçì ñîçäàíèÿ îáúåêòîâ ñ ïîñòîÿííîé ñòðóêòóðîé (ñïîñîáíûõ ñîõðàíÿòüñÿ íà
äîëãîâðåìåííûõ íîñèòåëÿõ). Ïîñêîëüêó îáúåêò ÿâëÿåòñÿ ñîõðàíÿåìûì, òî ó íåãî äîëæíû áûòü
ñâîéñòâà, ïîçâîëÿþùèå åãî ÷òåíèå è çàïèñü.  áèáëèîòåêå Kernel çà ýòè ñâîéñòâà îòâå÷àåò êëàññ
STORABLE, êîòîðûé ìîæåò áûòü ðîäèòåëåì ëþáîãî êëàññà. Î÷åâèäíî, òàêîé êëàññ, ïîìèìî STORABLE,
äîëæåí èìåòü è äðóãèõ ðîäèòåëåé, à çíà÷èò, ñõåìà íå ñìîæåò ðàáîòàòü, íå áóäü ìíîæåñòâåííîãî íà-
ñëåäîâàíèÿ. Ïðèìåðîì ìîæåò ñëóæèòü èçó÷åííîå âûøå íàñëåäîâàíèå ñ ðîäèòåëÿìè COMPARABLE
è NUMERIC. Ôîðìà íàñëåäîâàíèÿ ïðè êîòîðîé ðîäèòåëü çàäàåò îáùåå ñòðóêòóðíîå ñâîéñòâî, è, ÷àùå âñåãî, èìååò èìÿ, çàêàí÷èâàþùååñÿ íà - ABLE, íàçûâàåòñÿ ñõåìîé íàñëåäîâàíèÿ ñòðóêòóðíîãî
âèäà.
Áåç ìíîæåñòâåííîãî íàñëåäîâàíèÿ íåò ñïîñîáà óêàçàòü, ÷òî íåêîòîðàÿ àáñòðàêöèÿ îáëàäàåò äâóìÿ ñòðóêòóðíûìè ñâîéñòâàìè - ÷èñëîâûìè è ñîõðàíåíèÿ, ñðàâíåíèÿ è õåøèðîâàíèÿ. Âûáîð òîëüêî
îäíîãî èç ðîäèòåëåé ïîäîáåí âûáîðó ìåæäó îòöîì è ìàòåðüþ.
12.3 Íàñëåäîâàíèå ôóíêöèîíàëüíûõ âîçìîæíîñòåé
Âîò åùå îäíà òèïè÷íàÿ ñèòóàöèÿ. Ìíîãèå ïðîãðàììíûå èíñòðóìåíòû äîëæíû ñîõðàíÿòü èñòîðèþ,
÷òî ïîçâîëÿåò ïîëüçîâàòåëÿì:
• ïðîñìîòðåòü ñïèñîê ïîñëåäíèõ êîìàíä;
• âòîðè÷íî âûïîëíèòü ïîñëåäíþþ êîìàíäó;
• âûïîëíèòü íîâóþ êîìàíäó, îòðåäàêòèðîâàâ äëÿ ýòîãî ïðåäûäóùóþ;
• àííóëèðîâàòü äåéñòâèå ïîñëåäíåé êîìàíäû, êîòîðàÿ íå ñóìåëà çàêîí÷èòü
• ñâîþ ðàáîòó.
Òàêîé ìåõàíèçì ïðèâëåêàòåëåí äëÿ ëþáîé èíòåðàêòèâíîé ñðåäû, îäíàêî åãî ñîçäàíèå òðåáóåò áîëüøèõ óñèëèé. Ïîýòîìó èñòîðèþ ïîääåðæèâàþò ëèøü íåìíîãèå èíñòðóìåíòû (ê ïðèìåðó, ðÿä êîìàíäíûõ îáîëî÷åê Unix è Windows), äà è òå íåðåäêî ÷àñòè÷íî. Óíèâåðñàëüíûå æå ðåøåíèÿ íå çàâèñÿò
îò êîíêðåòíîãî èíñòðóìåíòà. Èõ ìîæíî èíêàïñóëèðîâàòü â êëàññ, à îò íåãî - ïîðîäèòü äðóãîé êëàññ
äëÿ óïðàâëåíèÿ ðàáî÷åé ñåññèåé ëþáîãî èíñòðóìåíòà. (Ðåøåíèå ñ ïðèìåíåíèåì êëàññîâ-êëèåíòîâ
äîïóñòèìî, íî íå òàê ïðèâëåêàòåëüíî.) È ñíîâà áåç ìíîæåñòâåííîãî íàñëåäîâàíèÿ íå îáîéòèñü, òàê
êàê íåäîñòàòî÷íî èìåòü ðîäèòåëÿ, çíàþùåãî òîëüêî èñòîðèþ.
Íàáîð ïîëåçíûõ âîçìîæíîñòåé ïðåäîñòàâëÿåò êëàññ TEST, èíêàïñóëèðóþùèé ðÿä ìåõàíèçìîâ òåñòèðîâàíèÿ êëàññà: ïðèåì è õðàíåíèå äàííûõ îò ïîëüçîâàòåëÿ, âûâîä è õðàíåíèå ðåçóëüòàòà, ñðàâíåíèå, ðåãðåññíîå òåñòèðîâàíèå è ò.ä. Õîòÿ ðåøåíèå ñ èñïîëüçîâàíèåì âëîæåíèÿ ìîæåò áûòü ïðåäïî÷òèòåëüíûì, íåïëîõî èìåòü âîçìîæíîñòü ïðè òåñòèðîâàíèè êëàññà X îïðåäåëÿòü êëàññ X_TEST,
ïîðîæäåííûé îò X è TEST.
Äàëåå ìû áóäåì âñòðå÷àòü è äðóãèå ïðèìåðû íàñëåäîâàíèÿ ôóíêöèîíàëüíûõ âîçìîæíîñòåé, ïðè
êîòîðîì îäèí êëàññ F èíêàïñóëèðóåò íàáîð, íàïðèìåð êîíñòàíò èëè ìåòîäîâ ìàòåìàòè÷åñêîé áèáëèîòåêè, à äðóãîé, îáúÿâëÿÿ ñåáÿ ïîòîìêîì F, ìîæåò èìè âîñïîëüçîâàòüñÿ.
Êîíôëèêò èìåí
Èíîãäà ïðè ìíîæåñòâåííîì íàñëåäîâàíèè âîçíèêàåò ïðîáëåìà êîíôëèêòà èìåí (name clash). Åå
ðåøåíèå - îáðàùåíèå ïî ïîëíîìó èìåíè íå òîëüêî ñíèìàåò ñàìó ïðîáëåìó, íî è ñïîñîáñòâóåò
ëó÷øåìó ïîíèìàíèþ ïðèðîäû êëàññîâ.
12.4 Êëþ÷åâûå êîíöåïöèè
• Ïîäõîä ê êîíñòðóèðîâàíèþ ÏÎ, ïîäîáíûé êîíñòðóèðîâàíèþ èç êóáèêîâ, òðåáóåò âîçìîæíîñòè îáúåäèíåíèÿ íåñêîëüêèõ àáñòðàêöèé â îäíó. Ýòî äîñòèãàåòñÿ áëàãîäàðÿ ìíîæåñòâåííîìó
íàñëåäîâàíèþ.
•  ñàìûõ ïðîñòûõ è íàèáîëåå îáùèõ ñëó÷àÿõ ìíîæåñòâåííîãî íàñëåäîâàíèÿ äâà ðîäèòåëÿ ïðåä-
ñòàâëÿþò íåçàâèñèìûå àáñòðàêöèè.
• Ìíîæåñòâåííîå íàñëåäîâàíèå ÷àñòî íåîáõîäèìî êàê äëÿ ìîäåëèðîâàíèÿ ñèñòåì, òàê è äëÿ ïîâñåäíåâíîé ðàçðàáîòêè ÏÎ, â ÷àñòíîñòè, ñîçäàíèÿ ïîâòîðíî èñïîëüçóåìûõ áèáëèîòåê.
• Êîíôëèêòû èìåí ïðè ìíîæåñòâåííîì íàñëåäîâàíèè äîëæíû óêàçàíèåì ïîíîãî èìåíè.
• Äóáëèðóåìîå íàñëåäîâàíèå - ìîùíàÿ òåõíèêà - âîçíèêàåò êàê ðåçóëüòàò ìíîæåñòâåííîãî íàñëåäîâàíèÿ, ïðè êîòîðîì îäèí êëàññ ñòàíîâèòñÿ ïîòîìêîì äðóãîãî íåñêîëüêèìè ñïîñîáàìè.
Êîíòðîëüíûå âîïðîñû
Begin Quiz
1. Äîñòîèíñòâà, íåäîñòàòêè è ïðîáëåìû ìíîæåñòâåííîãî íàñëåäîâàíèÿ
äîñòîèíñòâî: íàñëåäîâàíèå âñåõ âîçìîæíîñòåé ðîäèòåëåé
íåäîñòàòîê: íàñëåäíèê íå ìîæåò îòêàçàòüñÿ îò âðåäíûõ èëè ïðîòèâîðå÷àùèõ ðîäèòåëüñêèõ
ñâîéñòâ
ïðîáëåìà: ðîäèòåëè èìåþò îáùèõ ïðåäêîâ
ïðîáëåìà: êîìïîíåíòû ðîäèòåëåé èìåþò îäèíàêîâûå èìåíà
2. Äóáëèðóåìîå íàñëåäîâàíèå
ýòî ñèòóàöèÿ, ïðè êîòîðîé ðîäèòåëüñêèå êëàññû èìåþò êîìïîíåíòû ñ îäèíàêîâûìè èìåíàìè
èëè ñîâïàäàþùèìè ðåàëèçàöèÿìè
ýòî ñèòóàöèÿ, ïðè êîòîðîé ðîäèòåëüñêèå êëàññû èìåþò îáùèõ ïðåäêîâ
ýòî ñèòóàöèÿ, ïðè êîòîðîé èäåò íàñëåäîâàíèå îò îäíîãî è òîãî æå êëàññà ïî ðàçíûì ïóòÿì
íàñëåäîâàíèÿ
çàïðåùåíî èç-çà âîçíèêàþùèõ êîíôëèêòîâ
3. Áðàêîì ïî ðàñ÷åòó íàçûâàåòñÿ òàêîå ìíîæåñòâåííîå íàñëåäîâàíèå, êîãäà?
îäèí êëàññ ïðåäîñòàâëÿåò àòðèáóòû (äàííûå), à äðóãîé ïðîöåäóðû è ôóíêöèè (äåéñòâèÿ)
îäèí êëàññ ÿâëÿåòñÿ êðàñèâûì, à äðóãîé áîãàòûì
îäèí êëàññ ïðåäîñòàâëÿåò ñïåöèôèêàöèè, à äðóãîé âîçìîæíîñòè èõ ðåàëèçàöèè
êîãäà ïîëó÷åíî îäîáðåíèå ïðåäêîâ íà ìíîæåñòâåííîå íàñëåäîâàíèå
4. Ïåðåèìåíîâàíèå ïîçâîëÿåò
îòëîæåííûé êëàññ ñäåëàòü ýôôåêòèâíûì
ýôôåêòèâíûé êëàññ ñäåëàòü îòëîæåííûì
âûáðàòü èìåíà êîìïîíåíòîâ â ñîîòâåòñòâèè ñî ñòèëåì êëàññà íàñëåäíèêà
ðàçðåøèòü êîíôëèêò èìåí
5. Åñëè êîìïîíåíòû ðîäèòåëåé èìåþò îäèíàêîâûå èìåíà, òî ïðè íàñëåäîâàíèè âîçíèêàåò êîíôëèêò
èìåí. Ýòîò êîíôëèêò ðàçðåøàåòñÿ çà ñ÷åò òîãî, ÷òî?
îäèí èç ðîäèòåëåé äîëæåí ïåðåèìåíîâàòü êîíôëèêòóþùèé êîìïîíåíò
îáà ðîäèòåëÿ äîëæíû ïåðåèìåíîâàòü êîíôëèêòóþùèé êîìïîíåíò
íàñëåäíèê äîëæåí ïðîèçâåñòè ïåðåèìåíîâàíèå, ïîëó÷èâ äâà êîìïîíåíòà ñ ðàçíûìè èìåíàìè
íàñëåäíèê ìîæåò âûïîëíèòü ñêëåèâàíèå êîìïîíåíòîâ ñèòóàöèÿ ÷àñòî âîçíèêàþùàÿ ïðè
äóáëèðóåìîì íàñëåäîâàíèè
6. Îäèí è òîò æå êëàññ
ìîæåò áûòü ðîäèòåëåì ñàìûõ ðàçíûõ êëàññîâ, ïðåäîñòàâëÿÿ âñåì ñâîèì íàñëåäíèêàì ïîëåçíûå ñâîéñòâà (ñîõðàíÿåìîñòü, ñðàâíèìîñòü è ò.ä.)
ìîæåò áûòü ðîäèòåëåì ñàìûõ ðàçíûõ êëàññîâ, ïðåäîñòàâëÿÿ âñåì ñâîèì íàñëåäíèêàì ïîëåçíûå ôóíêöèè (âîçìîæíîñòü âûïîëíåíèÿ àðèôìåòè÷åñêèõ îïåðàöèé è ò.ä.)
ìîæåò áûòü îáùèì ïðåäêîì âñåõ êëàññîâ
íå ìîæåò áûòü ðîäèòåëåì íåñêîëüêèõ êëàññîâ
7. Ïðè äóáëèðóåìîì íàñëåäîâàíèè êîìïîíåíò ìíîãîêðàòíî íàñëåäóåòñÿ îò îáùåãî ïðåäêà. Êàêèå
ñèòóàöèè ïðèâîäÿò ê êîíôëèêòàì è äîëæíû áûòü ðàçðåøåíû?
êîìïîíåíò ñ îäíîé è òîé æå ðåàëèçàöèåé è îäíèì è òåì æå èìåíåì ïðèõîäèò îò ðàçíûõ
ðîäèòåëåé
îò îäíîãî ðîäèòåëÿ ïðèõîäèò ýôôåêòèâíûé êîìïîíåíò, îò äðóãîãî îòëîæåííûé, èõ èìåíà
ñîâïàäàþò
ðîäèòåëè ïðåäîñòàâëÿþò ýôôåêòèâíûå êîìïîíåíòû, èìåíà êîìïîíåíòîâ ðàçëè÷íû
ðîäèòåëè ïðåäîñòàâëÿþò ýôôåêòèâíûå êîìïîíåíòû, èìåíà êîìïîíåíòîâ ñîâïàäàþò, íàñëåäíèê ïåðåîïðåäåëÿåò ðåàëèçàöèþ êîìïîíåíòà
8. Íàñëåäíèê ìîæåò
îòìåíèòü ðåàëèçàöèþ, ñäåëàâ êîìïîíåíò îòëîæåííûì
çàïðåòèòü âûçîâ ðåàëèçàöèè ðîäèòåëÿ
ïåðåîïðåäåëèòü ðåàëèçàöèþ
ïðåâðàòèòü îòëîæåííûé êîìïîíåíò â ýôôåêòèâíûé
9. Êîíôëèêò èìåí äåëàåò êëàññ íåêîððåêòíûì çà èñêëþ÷åíèåì ñëåäóþùèõ ñëó÷àåâ
îáà êîìïîíåíòà óíàñëåäîâàíû îò îáùåãî ïðåäêà, è íè îäèí èç íèõ íå ïîëó÷åí ïîâòîðíûì
îáúÿâëåíèåì âåðñèè ïðåäêà
îáà êîìïîíåíòà èìåþò ñîâìåñòèìûå ñèãíàòóðû, è, ïî êðàéíåé ìåðå, îäèí èç íèõ íàñëåäóåòñÿ
â îòëîæåííîé ôîðìå
îáà êîìïîíåíòà èìåþò ðàçëè÷íûå ñèãíàòóðû, è îáà ýôôåêòèâíû
îáà êîìïîíåíòà èìåþò ñîâìåñòèìûå ñèãíàòóðû è ïåðåîïðåäåëÿþòñÿ â íîâîì êëàññå
End Quiz
Íàáðàíî áàëëîâ
13 Òåõíèêà íàñëåäîâàíèÿ
Íàñëåäîâàíèå - êëþ÷åâàÿ ñîñòàâëÿþùàÿ ÎÎ-ïîäõîäà ê ïîâòîðíîìó èñïîëüçîâàíèþ è ðàñøèðÿåìîñòè.
13.1 Íàñëåäîâàíèå è óòâåðæäåíèÿ
Âêðàòöå ìû óæå î÷åðòèëè îñíîâíûå ïðàâèëà, óïðàâëÿþùèå âçàèìîñâÿçüþ íàñëåäîâàíèÿ è óòâåðæäåíèé: âñå óòâåðæäåíèÿ (ïðåäóñëîâèå è ïîñòóñëîâèÿ ïîäïðîãðàìì, èíâàðèàíòû êëàññîâ), çàäàííûå â
êëàññàõ-ðîäèòåëÿõ, îñòàþòñÿ â ñèëå è äëÿ èõ ïîòîìêîâ.  ýòîì ðàçäåëå ìû óòî÷íèì ýòè ïðàâèëà è
èñïîëüçóåì ïîëó÷åííûå ðåçóëüòàòû, ÷òîáû äàòü íîâûé âçãëÿä íà íàñëåäîâàíèå êàê íà ñóáïîäðÿäû
(subcontracts).
Èíâàðèàíòû
Ñ ïðàâèëîì îá èíâàðèàíòàõ êëàññà ìû âñòðå÷àëèñü è ïðåæäå:
Ïðàâèëî ðîäèòåëüñêèõ èíâàðèàíòîâ: Èíâàðèàíòû âñåõ ðîäèòåëåé ïðèìåíèìû è ê ñàìîìó êëàññó.
Èíâàðèàíòû ðîäèòåëåé äîáàâëÿþòñÿ ê êëàññó. Èíâàðèàíòû ñîåäèíÿþòñÿ ëîãè÷åñêîé îïåðàöèåé
and then. (Åñëè ó êëàññà íåò ÿâíîãî èíâàðèàíòà, òî èíâàðèàíò True èãðàåò ýòó ðîëü.) Ïî èíäóêöèè
â êëàññå äåéñòâóþò èíâàðèàíòû âñåõ åãî ïðåäêîâ, êàê ïðÿìûõ, òàê è êîñâåííûõ.
Ðèñ. 13.1: Ïîäïðîãðàììà, êëèåíò è êîíòðàêò
Êàê ñëåäñòâèå, âûïèñûâàòü èíâàðèàíòû ðîäèòåëåé â èíâàðèàíòå ïîòîìêà åùå ðàç íå íóæíî (õîòÿ
ñåìàíòè÷åñêè òàêàÿ èçáûòî÷íîñòü íå âðåäèò: a and then a åñòü òî æå ñàìîå, ÷òî a).
Ïðåäóñëîâèÿ è ïîñòóñëîâèÿ ïðè íàëè÷èè äèíàìè÷åñêîãî ñâÿçûâàíèÿ
 ñëó÷àå ñ ïðåäóñëîâèÿìè è ïîñòóñëîâèÿìè ñèòóàöèÿ ÷óòü ñëîæíåå. Îáùàÿ èäåÿ, êàê îòìå÷àëîñü,
ñîñòîèò â òîì, ÷òî ëþáîå ïîâòîðíîå îáúÿâëåíèå äîëæíî óäîâëåòâîðÿòü óòâåðæäåíèÿì îðèãèíàëüíîé ïîäïðîãðàììû. Ýòî îñîáåííî âàæíî, åñëè ïîäïðîãðàììà îòëîæåíà: áåç òàêîãî îãðàíè÷åíèÿ íà
áóäóùóþ ðåàëèçàöèþ, çàäàíèå ïðåäóñëîâèå è ïîñòóñëîâèé äëÿ îòëîæåííûõ ïîäïðîãðàìì áûëî áû
áåñïîëåçíûì èëè, õóæå òîãî, ïðèâåëî áû ê íåæåëàòåëüíîìó ðåçóëüòàòó. Òå æå òðåáîâàíèÿ ê ïðåäóñëîâèþ è ïîñòóñëîâèþ îñòàþòñÿ è ïðè ïåðåîïðåäåëåíèè ýôôåêòèâíûõ ïîäïðîãðàìì.
Àíàëèçèðóÿ ìåõàíèçìû ïîâòîðíîãî îáúÿâëåíèÿ, ïîëèìîðôèçìà è äèíàìè÷åñêîãî ñâÿçûâàíèÿ, ìîæíî äàòü òî÷íóþ ôîðìóëèðîâêó èñêîìîãî ïðàâèëà. Íî äëÿ íà÷àëà ïðåäñòàâèì òèïè÷íûé ñëó÷àé.
Ðàññìîòðèì êëàññ è åãî ïîäïðîãðàììû, èìåþùèå êàê ïðåäóñëîâèå, òàê è ïîñòóñëîâèå:
Äëÿ ïðîñòîòû ìû ïðîèãíîðèðóåì âñå àðãóìåíòû, êîòîðûå ìîæåò òðåáîâàòü r, è ïîëîæèì, ÷òî r
ÿâëÿåòñÿ ïðîöåäóðîé, õîòÿ íàøè ðàññóæäåíèÿ â ðàâíîé ìåðå ïðèìåíèìû è ê ôóíêöèÿì.
Êàê îáìàíóòü êëèåíòîâ
×òîáû ïîíÿòü, êàê óäîâëåòâîðèòü êëèåíòîâ, ìû äîëæíû ñûãðàòü ðîëü àäâîêàòîâ äüÿâîëà è íà ñåêóíäó ïðåäñòàâèòü ñåáå, êàê èõ îáìàíóòü. Òàê ïîñòóïàåò îïûòíûé êðèìèíàëèñò, ðàçãàäûâàÿ ïðåñòóïëåíèå. Êàê ìîã áû ïîñòóïèòü ïîñòàâùèê, æåëàþùèé ââåñòè â çàáëóæäåíèå ñâîåãî ÷åñòíîãî êëèåíòà C,
ãàðàíòèðóþùåãî ïðè âûçîâå è îæèäàþùåãî âûïîëíåíèÿ β ? Åñòü äâà ïóòè:
• Ïîòðåáîâàòü áîëüøå, ÷åì ïðåäïèñàíî ïðåäóñëîâèåì . Ôîðìóëèðóÿ áîëåå ñèëüíîå ïðåäóñëîâèå,
ìû ïîçâîëÿåì ñåáå èñêëþ÷èòü ñëó÷àè, êîòîðûå, ñîãëàñíî èñõîäíîé ñïåöèôèêàöèè, áûëè ñîâåðøåííî ïðèåìëåìû.
• Ãàðàíòèðîâàòü ìåíüøå, ÷åì ýòî ñëåäóåò èç íà÷àëüíîãî ïîñòóñëîâèÿ β . Áîëåå ñëàáîå ïîñòóñëîâèå
ïîçâîëÿåò íàì äàòü â ðåçóëüòàòå ìåíüøå, ÷åì áûëî îáåùàíî èñõîäíîé ñïåöèôèêàöèåé.
Âñïîìíèòå, ÷òî ìû íåîäíîêðàòíî ãîâîðèëè ïðè îáñóæäåíèè Ïðîåêòèðîâàíèÿ ïî Êîíòðàêòó: óñèëåíèå ïðåäóñëîâèÿ îáëåã÷àåò çàäà÷ó ïîñòàâùèêà (êëèåíò ÷àùå íå ïðàâ), èëëþñòðàöèåé ÷åãî ñëóæèò
êðàéíèé ñëó÷àé - ïðåäóñëîâèå false (êîãäà êëèåíò âñåãäà íå ïðàâ).
Êàê óæå áûëî ñêàçàíî, óòâåðæäåíèå A íàçûâàåòñÿ áîëåå ñèëüíûì, ÷åì B, åñëè A ëîãè÷åñêè âëå÷åò
B, íî îòëè÷àåòñÿ îò íåãî: íàïðèìåð, x >= 5 ñèëüíåå, ÷åì x >= 0. Åñëè óòâåðæäåíèå A ñèëüíåå
óòâåðæäåíèÿ B, ãîâîðÿò åùå, ÷òî óòâåðæäåíèå B ñëàáåå óòâåðæäåíèÿ A.
Êàê áûòü ÷åñòíûì
Òåïåðü íàì ïîíÿòíî, êàê îáìàíûâàòü. Íî êàê æå áûòü ÷åñòíûì? Îáúÿâëÿÿ ïîäïðîãðàììó ïîâòîðíî,
ìû ìîæåì ñîõðàíèòü åå èñõîäíûå óòâåðæäåíèÿ, íî òàêæå ìû âïðàâå:
• çàìåíèòü ïðåäóñëîâèå áîëåå ñëàáûì;
• çàìåíèòü ïîñòóñëîâèå áîëåå ñèëüíûì.
Ïåðâûé ïîäõîä ñèìâîëèçèðóåò ùåäðîñòü è âåëèêîäóøèå: ìû äîïóñêàåì áîëüøåå ÷èñëî ñëó÷àåâ,
÷åì èçíà÷àëüíî. Ýòî íå ïðè÷èíèò âðåä êëèåíòó, êîòîðûé íà ìîìåíò âûçîâà óäîâëåòâîðÿåò èñõîäíîìó ïðåäóñëîâèþ. Âòîðîé ïîäõîä îçíà÷àåò, ÷òî ìû âûäàåì áîëüøå, ÷åì îò íàñ òðåáîâàëîñü. Ýòî íå
ïðè÷èíèò âðåä êëèåíòó, ïîëàãàþùåìóñÿ íà âûïîëíåíèå ïî çàâåðøåíèè âûçîâà èñõîäíûõ ïîñòóñëîâèé.
Èòàê, îñíîâíîå ïðàâèëî:
Ïðàâèëî (1) Óòâåðæäåíèÿ Ïåðåîáúÿâëåíèÿ (Assertion Redeclaration): Ïðè ïîâòîðíîì îáúÿâëåíèè
ïîäïðîãðàììû ïðåäóñëîâèå ìîæåò çàìåíÿòüñÿ ëèøü ðàâíûì åìó èëè áîëåå ñëàáûì, ïîñòóñëîâèå ëèøü ðàâíûì åìó èëè áîëåå ñèëüíûì.
Ýòî ïðàâèëî îòðàæàåò òîò ôàêò, ÷òî íîâûé âàðèàíò ïîäïðîãðàììû íå äîëæåí îòâåðãàòü âûçîâû,
äîïóñòèìûå â îðèãèíàëå, è äîëæåí, êàê ìèíèìóì, ïðåäñòàâëÿòü ãàðàíòèè, ýêâèâàëåíòíûå ãàðàíòèÿì
èñõîäíîãî âàðèàíòà. Îí âïðàâå, õîòü è íå îáÿçàí, äîïóñêàòü áîëüøåå ÷èñëî âûçîâîâ èëè äàâàòü áîëåå
ñèëüíûå ãàðàíòèè.
Êàê ÿâñòâóåò èç íàçâàíèÿ, ýòî ïðàâèëî ïðèìåíèìî ê îáåèì ôîðìàì ïîâòîðíîãî îáúÿâëåíèÿ: ïåðåîïðåäåëåíèþ è ðåàëèçàöèè îòëîæåííîãî êîìïîíåíòà. Âòîðîé ñëó÷àé âàæåí îñîáî, - óòâåðæäåíèÿ
áóäóò ñâÿçàíû ñî âñåìè ýôôåêòèâíûìè âåðñèÿìè ïîòîìêîâ.
Óòâåðæäåíèÿ ïîäïðîãðàììû, êàê îòëîæåííîé, òàê è ýôôåêòèâíîé, çàäàþò åå ñåìàíòèêó, ïðèìåíèìóþ ê íåé ñàìîé è êî âñåì ïîâòîðíûì îáúÿâëåíèÿì åå ïîòîìêîâ. Òî÷íåå ãîâîðÿ, îíè ñïåöèôèöèðóþò
îáëàñòü äîïóñòèìîãî ïîâåäåíèÿ ïîäïðîãðàììû è åå âîçìîæíûõ âåðñèé. Ëþáîå ïîâòîðíîå îáúÿâëåíèå
ìîæåò ëèøü ñóæàòü ýòó îáëàñòü, íå íàðóøàÿ åå.
Êàê ñëåäñòâèå, ñîçäàòåëü êëàññà äîëæåí áûòü îñòîðîæíûì ïðè íàïèñàíèè óòâåðæäåíèé ýôôåêòèâíîé ïîäïðîãðàììû, íå ïðèâíîñÿ èçëèøíþþ ñïåöèôèêàöèþ (overspecication). Óòâåðæäåíèÿ äîëæíû
îïèñûâàòü íàìåðåíèÿ ïîäïðîãðàììû, - åå àáñòðàêòíóþ ñåìàíòèêó, - íî íå ñâîéñòâà ðåàëèçàöèè. Èíà÷å ìîæíî çàêðûòü âîçìîæíîñòü ñîçäàíèÿ èíîé ðåàëèçàöèè ïîäïðîãðàììû ó áóäóùèõ ïîòîìêîâ.
Ñóáïîäðÿäû
Ïðàâèëî Óòâåðæäåíèÿ Ïåðåîáúÿâëåíèÿ âåëèêîëåïíî ñî÷åòàåòñÿ ñ òåîðèåé Ïðîåêòèðîâàíèÿ ïî Êîíòðàêòó.
Ìû âèäåëè, ÷òî óòâåðæäåíèÿ ïîäïðîãðàììû îïèñûâàþò ñâÿçàííûé ñ íåé êîíòðàêò, â êîòîðîì êëèåíò ãàðàíòèðóåò âûïîëíåíèå ïðåäóñëîâèÿ, ïîëó÷àÿ ïðàâî ðàññ÷èòûâàòü íà èñòèííîñòü ïîñòóñëîâèÿ;
äëÿ ïîñòàâùèêà âñå íàîáîðîò.
Íàñëåäîâàíèå ñîâìåñòíî ñ ïîâòîðíûì îáúÿâëåíèåì è äèíàìè÷åñêèì ñâÿçûâàíèåì ïðèâîäèò ê ñîçäàíèþ ñóáïîäðÿäîâ. Ïðèíÿâ óñëîâèÿ êîíòðàêòà, âû íå îáÿçàíû âûïîëíÿòü åãî ñàìè. Ïîä÷àñ âû
çíàåòå êîãî-òî åùå, ñïîñîáíîãî ñäåëàòü ýòî ëó÷øå è ñ ìåíüøèìè èçäåðæêàìè. Òàê ïðîèñõîäÿò, êîãäà
êëèåíò çàïðàøèâàåò ïîäïðîãðàììó èç MATRIX, íî áëàãîäàðÿ äèíàìè÷åñêîìó ñâÿçûâàíèþ ìîæåò íà
ýòàïå âûïîëíåíèÿ ôàêòè÷åñêè âûçûâàòü âåðñèþ, ïåðåîïðåäåëåííóþ â ïîòîìêå. Ìåíüøèå èçäåðæêè îçíà÷àþò çäåñü áîëåå ýôôåêòèâíóþ ðåàëèçàöèþ, êàê â çíàêîìîì íàì ïðèìåðå ñ ïåðèìåòðîì
ïðÿìîóãîëüíèêà, à ëó÷øå - óñîâåðøåíñòâîâàíèå óòâåðæäåíèé, â îïèñàííîì çäåñü ñìûñëå.
Ïðàâèëî Óòâåðæäåíèÿ Ïåðåîáúÿâëåíèÿ ïðîñòî óñòàíàâëèâàåò, ÷òî ÷åñòíûé ñóáïîäðÿä÷èê, ïðèíÿâ
óñëîâèÿ êîíòðàêòà, äîëæåí âûïîëíèòü ðàáîòó íà òåõ æå óñëîâèÿõ, ÷òî è ïîäðÿä÷èê èëè ëó÷øèõ, íî
íèêàê íå õóäøèõ.
Ñ ïîçèöèè Ïðîåêòèðîâàíèÿ ïî Êîíòðàêòó, èíâàðèàíòû êëàññîâ - ýòî îãðàíè÷åíèÿ îáùåãî õàðàêòåðà, ïðèìåíèìûå è ê ïîäðÿä÷èêàì, è ê êëèåíòàì. Ïðàâèëî ðîäèòåëüñêèõ èíâàðèàíòîâ îòðàæàåò òîò
ôàêò, ÷òî âñå ïîäîáíûå îãðàíè÷åíèÿ ïåðåäàþòñÿ ñóáïîäðÿä÷èêàì.
Ñâîå èñòèííîå çíà÷åíèå äëÿ ÎÎ-ðàçðàáîòêè íàñëåäîâàíèå ïðèîáðåòàåò ëèøü ñîâìåñòíî ñ óòâåðæäåíèÿìè è äâóìÿ ïðèâåäåííûìè âûøå ïðàâèëàìè. Ìåòàôîðà êîíòðàêòîâ è ñóáïîäðÿäîâ - ïðåêðàñíàÿ
àíàëîãèÿ, ïîìîãàþùàÿ ðàçðàáàòûâàòü êîððåêòíîå ÎÎ-ÏÎ. Íåñîìíåííî, â ýòîì - îäíà èç öåíòðàëüíûõ èäåé òåîðèè ïðîåêòèðîâàíèÿ.
Àáñòðàêòíûå ïðåäóñëîâèÿ
Ïðàâèëî îñëàáëåíèÿ ïðåäóñëîâèé ìîæåò îêàçàòüñÿ ÷åðåñ÷óð æåñòêèì â ñëó÷àå, êîãäà íàñëåäíèê
ïîíèæàåò óðîâåíü àáñòðàêöèè, õàðàêòåðíûé äëÿ åãî ïðåäêà. Ê ñ÷àñòüþ, åñòü ëåãêèé îáõîäíîé ïóòü,
ïîëíîñòüþ ñîãëàñóþùèéñÿ ñ òåîðèåé.
Òèïè÷íûì ïðèìåðîì ýòîãî ÿâëÿåòñÿ ïîðîæäåíèå BOUNDED_STACK îò óíèâåðñàëüíîãî êëàññà
ñòåêà (STACK). Ïðîöåäóðà çàíåñåíèÿ â ñòåê ýëåìåíòà (put) â ïîðîæäåííîì êëàññå èìååò ïðåäóñëîâèå count <= capacity, ãäå count - òåêóùåå ÷èñëî ýëåìåíòîâ â ñòåêå, capacity - ôèçè÷åñêàÿ åìêîñòü
íàêîïèòåëÿ.
 îáùåì ïîíÿòèè ñòåêà íåò ïîíÿòèÿ åìêîñòè. Ïîýòîìó ñîçäàåòñÿ âïå÷àòëåíèå, áóäòî ïðè ïåðåõîäå ê
BOUNDED_STACK ïðåäóñëîâèå ïðèõîäèòñÿ óñèëèòü (îò áåñêîíå÷íîé åìêîñòè ïåðåéòè ê êîíå÷íîé).
Êàê âûñòðîèòü ñòðóêòóðó íàñëåäîâàíèÿ, íå íàðóøàÿ ïðàâèëî Óòâåðæäåíèÿ Ïåðåîáúÿâëåíèÿ?
Îòâåò ñòàíîâèòñÿ î÷åâèäåí, åñëè ìû áëèæå ïîçíàêîìèìñÿ ñ òðåáîâàíèÿìè ê êëèåíòó. Òî, ÷òî
íóæíî ñîõðàíèòü èëè îñëàáèòü, íå îáÿçàòåëüíî ÿâëÿåòñÿ êîíêðåòíûì ïðåäóñëîâèåì, êàê îíî âèäèòñÿ
â ðåàëèçàöèè ïîñòàâùèêà (ðåàëèçàöèÿ ýòî åãî çàáîòà), íî êàñàåòñÿ ïðåäóñëîâèÿ, êàê îíî âèäèòñÿ
êëèåíòó.
Çàìå÷àíèå ìàòåìàòè÷åñêîãî õàðàêòåðà
Íåôîðìàëüíî, ïðàâèëî Óòâåðæäåíèÿ Ïåðåîáúÿâëåíèÿ ãëàñèò: Ïîâòîðíîå îáúÿâëåíèå óòâåðæäåíèé
ìîæåò ëèøü ñóæàòü îáëàñòü äîïóñòèìîãî ïîâåäåíèÿ, íå íàðóøàÿ åå. Ñåé÷àñ, çàâåðøàÿ îáñóæäåíèå
ýòîé òåìû, ïðèâåäåì ñòðîãóþ ôîðìóëèðîâêó äàííîãî ñâîéñòâà.
r, îòîáðàæàþùóþ ìíîæåñòâî âîçìîæíûõ
âõîäíûõ ñîñòîÿíèé I â ìíîæåñòâî âîçìîæíûõ âûõîäíûõ ñîñòîÿíèé O . Óòâåðæäåíèÿ ïîäïðîãðàììû
îïðåäåëÿþò ïðàâèëà äåéñòâèÿ r è åå âîçìîæíûõ ïåðåîïðåäåëåíèé.
Ïóñòü ïîäïðîãðàììà ðåàëèçóåò ÷àñòè÷íóþ ôóíêöèþ
• Ïðåäóñëîâèå çàäàåò îáëàñòü îïðåäåëåíèÿ DOM ôóíêöèè r (ïîäìíîæåñòâî I , íà êîòîðîì r
ãàðàíòèðîâàííî âûðàáàòûâàåò ðåçóëüòàò).
• Ïîñòóñëîâèå çàäàåò äëÿ êàæäîãî x èç DOM ïîäìíîæåñòâî RESU LT S(x) ìíîæåñòâà O, òàêîå,
÷òî r(x) ∈ RESU LT S(x). Òàê êàê ïîñòóñëîâèå íå âñåãäà îäíîçíà÷íî îïèñûâàåò ðåçóëüòàò, ýòî
ïîäìíîæåñòâî ìîæåò èìåòü áîëüøå îäíîãî ýëåìåíòà.
Ïðàâèëî Óòâåðæäåíèÿ Ïåðåîáúÿâëåíèÿ îçíà÷àåò, ÷òî ïîâòîðíîå îáúÿâëåíèå ìîæåò ðàñøèðÿòü
îáëàñòü îïðåäåëåíèÿ è ñóæàòü ìíîæåñòâî ðåçóëüòàòîâ. Ïîìåòèâ íîâûå ìíîæåñòâà çíàêîì ', çàïèøåì
òðåáîâàíèÿ, çàêðåïëåííûå ýòèì ïðàâèëîì:
DOM 0 ⊇ DOM
RESU LT S 0 (x) ⊆ RESU LT S(x) äëÿ âñåõ x èç DOM
Ïðåäóñëîâèå óñòàíàâëèâàåò, ÷òî ïîäïðîãðàììà è åå ïîâòîðíûå îáúÿâëåíèÿ, êàê ìèíèìóì, äîëæíû
ïðèíèìàòü íåêîòîðûå âõîäû (DOM ), õîòÿ ïîâòîðíûå îáúÿâëåíèÿ ìîãóò ýòî ìíîæåñòâî è ðàñøèðèòü.
Ïîñòóñëîâèå ãîâîðèò, ÷òî ðåçóëüòàòû, âîçâðàùàåìûå ïîäïðîãðàììîé è åå ïîâòîðíûìè îáúÿâëåíèÿìè,
ìîãóò, ñàìîå áîëüøåå, ñîäåðæàòü çíà÷åíèÿ èç RESU LT S(x), îäíàêî, ïîñòóñëîâèÿ ïðè ïîâòîðíûõ
îáúÿâëåíèÿõ ìîãóò ýòî ìíîæåñòâî ñóçèòü.
 ýòîì îïèñàíèè ñîñòîÿíèå ñèñòåìû â ïåðèîä âûïîëíåíèÿ îïðåäåëÿåòñÿ ñîñòîÿíèåì (çíà÷åíèÿìè)
âñåõ äîñòèæèìûõ îáúåêòîâ. Êðîìå òîãî, âõîäíûå ñîñòîÿíèÿ (ýëåìåíòû I ) òàêæå âêëþ÷àþò â ñåáÿ çíà÷åíèÿ àðãóìåíòîâ. Áîëåå ïîäðîáíîå ââåäåíèå â ìàòåìàòè÷åñêîå îïèñàíèå ïðîãðàìì è ÿçûêîâ
ïðîãðàììèðîâàíèÿ.
13.2 Íàñëåäîâàíèå è ñêðûòèå èíôîðìàöèè
Ïîñëåäíèé âîïðîñ, îñòàâøèéñÿ ïîêà áåç îòâåòà, êàê íàñëåäîâàíèå âçàèìîäåéñòâóåò ñ ïðèíöèïîì
Ñêðûòèÿ èíôîðìàöèè.
 îòíîøåíèÿõ ìåæäó êëàññîì è åãî êëèåíòàìè ñêðûòèå èíôîðìàöèè îïðåäåëÿåò ðàçðàáîò÷èê
êëàññà. Èìåííî îí îïðåäåëÿåò ïîëèòèêó â îòíîøåíèè êàæäîãî êîìïîíåíòà êëàññà: ýêñïîðòèðóÿ åãî
âñåì êëèåíòàì, ðàçðåøàÿ âûáîðî÷íûé ýêñïîðò, èëè äåëàÿ êîìïîíåíò çàêðûòûì.
Êîå-÷òî î ïîëèòèêå
×òî ïðîèñõîäèò ñî ñòàòóñîì ýêñïîðòà ïðè ïåðåäà÷å êîìïîíåíòà ïîòîìêó? Íàñëåäîâàíèå è ñêðûòèå
èíôîðìàöèè - îðòîãîíàëüíûå ìåõàíèçìû. Íàñëåäîâàíèå îïðåäåëÿåò îòíîøåíèå ìåæäó êëàññîì è åãî
ïîòîìêàìè, ýêñïîðò - ìåæäó êëàññîì è åãî êëèåíòàìè. Êëàññ B ìîæåò ñâîáîäíî ýêñïîðòèðîâàòü èëè
ñêðûâàòü ëþáîé èç êîìïîíåíòîâ f, óíàñëåäîâàííûõ èì îò êëàññàA. Ïðè ýòîì äîñòóïíû âñå âîçìîæíûå
êîìáèíàöèè:
• f ýêñïîðòèðóåòñÿ â êëàññå A è â êëàññå B (õîòÿ è íå îáÿçàòåëüíî îäíèì è òåì æå êëèåíòàì);
• f ñêðûòî â A è B;
• f ñêðûòî â A, íî ïîëíîñòüþ èëè ÷àñòè÷íî ýêñïîðòèðóåòñÿ â B;
• f ýêñïîðòèðóåòñÿ â A, íî ñêðûòî â B.
Ïðèìåíåíèå
Õàðàêòåðíûì ïðèìåðîì ÿâëÿåòñÿ ñîçäàíèå íåñêîëüêèõ âàðèàíòîâ îäíîé àáñòðàêöèè.
Ðèñ. 13.2: Ðàçíûå îáëèêè îäíîé àáñòðàêöèè
Ïðåäñòàâèì ñåáå GENERAL_ACCOUNT - êëàññ, ñîäåðæàùèé âñå íåîáõîäèìûå îïåðàöèè äëÿ ðàáîòû ñ áàíêîâñêèìè ñ÷åòàìè: ïðîöåäóðû open, withdraw, deposit, code (äëÿ ñíÿòèÿ äåíåã ÷åðåç áàíêîìàò), change_code è ò.ä.,- íî íå ïðåäíàçíà÷åííûé äëÿ èñïîëüçîâàíèÿ êëèåíòàìè íàïðÿìóþ, à ïîòîìó
íå ýêñïîðòèðóþùèé íèêàêèõ ïîäïðîãðàìì. Åãî ïîòîìêè âûñòóïàþò êàê ðàçíûå îáëèêè ðîäèòåëÿ: îíè
íå ñîäåðæàò íîâûõ êîìïîíåíòîâ è îòëè÷àþòñÿ ëèøü ïðåäëîæåíèÿìè ýêñïîðòà. Îäèí ýêñïîðòèðóåò
open è deposit, âòîðîé, íàðÿäó ñ íèìè, - withdraw è code, è ò. ä.
Êëþ÷åâûå êîíöåïöèè
• Ê èíâàðèàíòó êëàññà àâòîìàòè÷åñêè äîáàâëÿþòñÿ èíâàðèàíòû åãî ðîäèòåëåé.
•  ïîäõîäå Ïðîåêòèðîâàíèÿ ïî Êîíòðàêòó íàñëåäîâàíèå, ïåðåîïðåäåëåíèå è äèíàìè÷åñêîå ñâÿçûâàíèå ïðèâîäÿò ê èäåå ñóáïîäðÿäîâ.
• Ïîâòîðíîå îáúÿâëåíèå ïîäïðîãðàììû (ïåðåîïðåäåëåíèå èëè ñîçäàíèå ðåàëèçàöèè) ìîæåò ñîõðàíèòü èëè îñëàáèòü ïðåäóñëîâèå, ñîõðàíèòü èëè óñèëèòü ïîñòóñëîâèå.
• Îãðàíè÷åííàÿ óíèâåðñàëüíîñòü äàåò âîçìîæíîñòü èñïîëüçîâàòü òîëüêî ðîäîâûå ïàðàìåòðû ñî
ñïåöèôè÷åñêèìè ñâîéñòâàìè.
• Ïîïûòêà ïðèñâàèâàíèÿ ïîçâîëÿåò äèíàìè÷åñêè ïðîâåðèòü, ïðèíàäëåæèò ëè îáúåêò îæèäàåìîìó òèïó. Ýòà îïåðàöèÿ íå äîëæíà èñïîëüçîâàòüñÿ êàê çàìåíà äèíàìè÷åñêîãî ñâÿçûâàíèÿ.
• Ïîòîìîê âïðàâå ïåðåîïðåäåëÿòü òèï ëþáîé ñóùíîñòè (àòðèáóòà, ðåçóëüòàòà ôóíêöèè, ôîðìàëüíîãî ïàðàìåòðà ïîäïðîãðàììû). Ïîâòîðíîå îïðåäåëåíèå äîëæíî áûòü êîâàðèàíòíûì çàìåíÿòü èñõîäíûå òèïû ñîîòâåòñòâóþùèìè, ñîãëàñóÿñü ñ òðåáîâàíèÿìè ïîòîìêà.
• Íàñëåäîâàíèå è ñêðûòèå èíôîðìàöèè - ýòî íåçàâèñèìûå ìåõàíèçìû. Ïîòîìêè ìîãóò ñêðûâàòü
ýêñïîðòèðîâàííûå êîìïîíåíòû è ýêñïîðòèðîâàòü ñêðûòûå êîìïîíåíòû.
• Êîìïîíåíò, äîñòóïíûé ñàìîìó êëàññó, äîñòóïåí è åãî ïîòîìêàì.
Êîíòðîëüíûå âîïðîñû
Begin Quiz
1. Ïðè ïîâòîðíîì îáúÿâëåíèè êîìïîíåíòà
ïðåäóñëîâèå ðàñøèðÿåò ÷èñëî ñèòóàöèé, äîïóñòèìûõ ó êëèåíòà
ïðåäóñëîâèå ñóæàåò ÷èñëî ñèòóàöèé, äîïóñòèìûõ ó êëèåíòà
ïîñòóñëîâèå óæåñòî÷àåò òðåáîâàíèÿ, ïðåäúÿâëÿåìûå ê ðàáîòå êîìïîíåíòà
ïîñòóñëîâèå îñëàáëÿåò òðåáîâàíèÿ, ïðåäúÿâëÿåìûå ê ðàáîòå êîìïîíåíòà
2. Èíâàðèàíò êëàññà
ñîâïàäàåò ñ ñîáñòâåííûì (íåïîñðåäñòâåííûì) èíâàðèàíòîì êëàññà êîíúþíêöèåé óòâåðæäåíèé èç åãî ðàçäåëà invariant
ÿâëÿåòñÿ êîíúþíêöèåé ñîáñòâåííîãî èíâàðèàíòà êëàññà è ñîáñòâåííîãî èíâàðèàíòà ðîäèòåëÿ
åñëè ó êëàññà íåò ñîáñòâåííîãî èíâàðèàíòà, òî èíâàðèàíò True èãðàåò ýòó ðîëü
ÿâëÿåòñÿ êîíúþíêöèåé ñîáñòâåííûõ èíâàðèàíòîâ âñåõ ïðåäêîâ êëàññà
3. Åñëè íàñëåäíèê ïîâòîðíî îáúÿâëÿåò êîìïîíåíò ðîäèòåëÿ, òî, ÷òîáû íå îáìàíóòü êëèåíòîâ, îí
äîëæåí
óñèëèòü èëè ñîõðàíèòü ïðåäóñëîâèå êîìïîíåíòà
óñèëèòü èëè ñîõðàíèòü ïîñòóñëîâèå êîìïîíåíòà
îñëàáèòü èëè ñîõðàíèòü ïðåäóñëîâèå êîìïîíåíòà
îñëàáèòü èëè ñîõðàíèòü ïîñòóñëîâèå êîìïîíåíòà
4. Êîíòðàêòû è ñóáïîäðÿäû. Ïîä ñóáïîäðÿäîì ïîíèìàåòñÿ ñîçäàíèå êëàññà íàñëåäíèêà ñóùåñòâóþùåãî êëàññà. Ñóáïîäðÿä÷èê
íå âïðàâå èçìåíèòü ñóùåñòâóþùèé êîíòðàêò
îáÿçàí óäîâëåòâîðèòü âñåì òðåáîâàíèÿì ñóùåñòâóþùåãî êîíòðàêòà
âïðàâå óëó÷øèòü äëÿ êëèåíòîâ óñëîâèÿ êîíòðàêòà
ìîæåò ýôôåêòèâíåå âûïîëíèòü ðàáîòó, ïðåäóñìîòðåííóþ êîíòðàêòîì
5. Ïîïûòêà ïðèñâàèâàíèÿ
ýòî ñïåöèàëüíîå îáîáùåíèå îïåðàöèè ïðèñâàèâàíèÿ
ïðèñâàèâàíèå, çàêàí÷èâàþùååñÿ îòêàçîì
ïðåäïîëàãàåò äèíàìè÷åñêóþ ïðîâåðêó ñîîòâåòñòâèÿ òèïîâ ëåâîé è ïðàâîé ÷àñòè ïðèñâàèâàíèÿ
ýòî ïðèñâàèâàíèå öåëè çíà÷åíèÿ void â ñëó÷àå íåñîîòâåòñòâèÿ òèïîâ
6. Îãðàíè÷åíèå óíèâåðñàëüíîñòè
îçíà÷àåò, ÷òî ïðè ðîäîâîì ïîðîæäåíèè ôàêòè÷åñêèé ïàðàìåòð íå ìîæåò áûòü ïðîèçâîëüíîãî
òèïà
äàåò âîçìîæíîñòü çàäàâàòü â êà÷åñòâå ôàêòè÷åñêîãî ïàðàìåòðà òèï ñ çàäàííûì íàáîðîì îïåðàöèé
îãðàíè÷èâàåò âîçìîæíîñòè ðàáîòû ñ îáúåêòàìè â ñðàâíåíèè ñ íåîãðàíè÷åííîé óíèâåðñàëüíîñòüþ
ïîçâîëÿåò ðàñøèðèòü íàáîð îïåðàöèé, äîïóñòèìûõ ïðè ðàáîòå ñ îáúåêòàìè
7. Ïðè ïîâòîðíîì îáúÿâëåíèè
òðåáóåòñÿ ñîõðàíåíèå ñèãíàòóðû êîìïîíåíòà
ðàçðåøàåòñÿ èçìåíåíèå ñèãíàòóðû êîìïîíåíòà
ðàçðåøàåòñÿ ïðîèçâîëüíîå èçìåíåíèå òèïà àòðèáóòà è òèïà àðãóìåíòîâ ó êîìïîíåíòîâ
ðàçðåøàåòñÿ èçìåíåíèå òèïà àòðèáóòà è òèïà àðãóìåíòîâ ó êîìïîíåíòîâ â ñîîòâåòñòâèè ñ
ïðàâèëàìè ñîãëàñîâàííîñòè òèïîâ
8. Ýêñïîðò è íàñëåäîâàíèå
ýêñïîðò êîìïîíåíòîâ ìîæåò áûòü âûáîðî÷íûì; òîò èëè èíîé êîìïîíåíò ìîæíî ýêñïîðòèðîâàòü îäíîìó èëè íåñêîëüêèì êëèåíòàì
ýêñïîðò êîìïîíåíòà êëèåíòó åùå íå îçíà÷àåò, ÷òî êîìïîíåíò ýêñïîðòèðóåòñÿ âñåì ïîòîìêàì
ýòîãî êëèåíòà
ýêñïîðò êîìïîíåíòà êëèåíòó îçíà÷àåò, ÷òî êîìïîíåíò ýêñïîðòèðóåòñÿ âñåì ïîòîìêàì ýòîãî
êëèåíòà
âñå êîìïîíåíòû êëàññà äîëæíû áûòü äîñòóïíû åãî ïîòîìêàì
9. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
óòâåðæäåíèÿ äàþò ãëóáîêîå ïîíèìàíèå ïðèðîäû íàñëåäîâàíèÿ
ïðè ïîâòîðíîì èñïîëüçîâàíèè èíòåðôåéñîâ ñêðûâàåòñÿ èíôîðìàöèÿ î ðåàëèçàöèè
íàñëåäîâàíèå è ñêðûòèå èíôîðìàöèè ýòî âçàèìîçàâèñèìûå ìåõàíèçìû
êîìïîíåíò, äîñòóïíûé êëàññó, ìîæåò áûòü íå äîñòóïåí åãî ïîòîìêàì
10. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
ó êëèåíòà íåò âîçìîæíîñòè êîíòðîëÿ èçìåíåíèÿ ñåìàíòèêè îïåðàöèé ñîçäàòåëÿìè êëàññîâ,
ïîëüçóþùèìèñÿ ïîâòîðíûìè îáúÿâëåíèÿìè è äèíàìè÷åñêèì ñâÿçûâàíèåì
ïîâòîðíîå îáúÿâëåíèå äîëæíî óäîâëåòâîðÿòü óòâåðæäåíèÿì îðèãèíàëüíîé ïîäïðîãðàììû
ïîïûòêà ïðèñâàèâàíèÿ ìîæåò çàìåíèòü äèíàìè÷åñêîå ñâÿçûâàíèå
ïðè ïîâòîðíîì èñïîëüçîâàíèè ðåàëèçàöèé èíôîðìàöèÿ ñêðûâàåòñÿ
11. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ?
ëèøü ïîíèìàíèå ïðèíöèïîâ Ïðîåêòèðîâàíèÿ ïî Êîíòðàêòó ïîçâîëÿåò â ïîëíîé ìåðå ïîñòè÷ü
ñóùíîñòü êîíöåïöèè íàñëåäîâàíèÿ
ýêñïîðò îïðåäåëÿåò îòíîøåíèÿ ìåæäó êëàññîì è åãî ïîòîìêàìè
ïðè ïîâòîðíîì èñïîëüçîâàíèè èíòåðôåéñîâ ðåàëèçàöèÿ íå çàùèùåíà
çàìîðîçèâ êîìïîíåíò, ìîæíî ãàðàíòèðîâàòü åãî ñåìàíòè÷åñêóþ óíèêàëüíîñòü
End Quiz
Íàáðàíî áàëëîâ
14 Òèïèçàöèÿ
Ýôôåêòèâíîå ïðèìåíåíèå îáúåêòíîé òåõíîëîãèè òðåáóåò ÷åòêîãî îïèñàíèÿ â òåêñòå ñèñòåìû òèïîâ
âñåõ îáúåêòîâ, ñ êîòîðûìè îíà ðàáîòàåò íà ýòàïå âûïîëíåíèÿ. Ýòî ïðàâèëî, èçâåñòíîå êàê ñòàòè÷åñêàÿ òèïèçàöèÿ (static typing), äåëàåò íàøå ÏÎ: áîëåå íàäåæíûì, ïîçâîëÿÿ êîìïèëÿòîðó è äðóãèì
èíñòðóìåíòàëüíûì ñðåäñòâàì óñòðàíÿòü íåñîîòâåòñòâèÿ ïðåæäå, ÷åì îíè ñìîãóò íàíåñòè âðåä; áîëåå
ïîíÿòíûì, îáåñïå÷èâàÿ òî÷íîé èíôîðìàöèåé ÷èòàòåëåé: àâòîðîâ êëèåíòñêèõ ñèñòåì è òåõ, êòî áóäåò
ñîïðîâîæäàòü ñèñòåìó; áîëåå ýôôåêòèâíûì, ïîñêîëüêó èíôîðìàöèÿ î òèïàõ äàííûõ ïîçâîëèò êîìïèëÿòîðó ñãåíåðèðîâàòü îïòèìàëüíûé êîä. Õîòÿ âîïðîñàìè òèïèçàöèè äàííûõ àêòèâíî çàíèìàëèñü
è âíå îáúåêòíîé ñðåäû, äà è ñàìà ñòàòè÷åñêàÿ òèïèçàöèÿ ïðèìåíÿåòñÿ â ÿçûêàõ, íå ïîääåðæèâàþùèõ
ÎÎÏ, îñîáåííî ÿðêî ýòè èäåè ïðîÿâèëè ñåáÿ èìåííî ïðè îáúåêòíîì ïîäõîäå, âî ìíîãîì îñíîâàííîì
íà ïîíÿòèè òèïà, êîòîðîå, ñëèâàÿñü ñ ïîíÿòèåì ìîäóëÿ, îáðàçóåò áàçîâóþ ÎÎ-êîíñòðóêöèþ - êëàññ.
14.1 Ïðîáëåìà òèïèçàöèè
Î òèïèçàöèè ïðè ÎÎ-ðàçðàáîòêå ìîæíî ñêàçàòü îäíî: ýòà çàäà÷à ïðîñòà â ñâîåé ïîñòàíîâêå, íî
ðåøèòü åå ïîä÷àñ íåëåãêî.
Áàçèñíàÿ êîíñòðóêöèÿ
Ïðîñòîòà òèïèçàöèè â ÎÎ-ïîäõîäå åñòü ñëåäñòâèå ïðîñòîòû îáúåêòíîé âû÷èñëèòåëüíîé ìîäåëè.
Îïóñêàÿ äåòàëè, ìîæíî ñêàçàòü, ÷òî ïðè âûïîëíåíèè ÎÎ-ñèñòåìû ïðîèñõîäÿò ñîáûòèÿ òîëüêî îäíîãî
ðîäà - âûçîâ êîìïîíåíòà (feature call):
x.f (arg)
îçíà÷àþùèé âûïîëíåíèå îïåðàöèè f íàä îáúåêòîì, ïðèñîåäèíåííûì ê x, ñ ïåðåäà÷åé àðãóìåíòà arg
(âîçìîæíî íåñêîëüêî àðãóìåíòîâ èëè íè îäíîãî âîîáùå). Ïðîãðàììèñòû ãîâîðÿò â ýòîì ñëó÷àå î
ïåðåäà÷å îáúåêòó x ñîîáùåíèÿ f ñ àðãóìåíòîì arg, íî ýòî - ëèøü îòëè÷èå â òåðìèíîëîãèè, à ïîòîìó
îíî íåñóùåñòâåííî.
Òî, ÷òî âñå îñíîâàíî íà ýòîé Áàçèñíîé Êîíñòðóêöèè (Basic Construct), îáúÿñíÿåò ÷àñòè÷íî îùóùåíèå êðàñîòû ÎÎ-èäåé.
Èç Áàçèñíîé Êîíñòðóêöèè ñëåäóþò è òå íåíîðìàëüíûå ñèòóàöèè, êîòîðûå ìîãóò âîçíèêíóòü â
ïðîöåññå âûïîëíåíèÿ:
Îïðåäåëåíèå:
íàðóøåíèå òèïà
Íàðóøåíèå òèïà â ïåðèîä âûïîëíåíèÿ èëè, äëÿ êðàòêîñòè, ïðîñòî íàðóøåíèå òèïà (type violation)
âîçíèêàåò â ìîìåíò âûçîâà x.f (arg), ãäå x ïðèñîåäèíåí ê îáúåêòó OBJ, åñëè ëèáî:
• íå ñóùåñòâóåò êîìïîíåíòà, ñîîòâåòñòâóþùåãî f è ïðèìåíèìîãî ê OBJ,
• òàêîé êîìïîíåíò èìååòñÿ, îäíàêî, àðãóìåíò arg äëÿ íåãî íåäîïóñòèì.
Êëþ÷åâûì ÿâëÿåòñÿ ñëîâî êîãäà. Ðàíî èëè ïîçäíî âû ïîéìåòå, ÷òî èìååò ìåñòî íàðóøåíèå òèïà.
Íàïðèìåð, ïîïûòêà âûïîëíèòü êîìïîíåíò Ïóñê òîðïåäû äëÿ îáúåêòà Ñëóæàùèé íå áóäåò ðàáîòàòü è ïðè âûïîëíåíèè ïðîèçîéäåò îòêàç. Îäíàêî âîçìîæíî âû ïðåäïî÷èòàåòå íàõîäèòü îøèáêè êàê
ìîæíî ðàíüøå, à íå ïîçæå.
Ñòàòè÷åñêàÿ è äèíàìè÷åñêàÿ òèïèçàöèÿ
Õîòÿ âîçìîæíû è ïðîìåæóòî÷íûå âàðèàíòû, çäåñü ïðåäñòàâëåíû äâà ãëàâíûõ ïîäõîäà:
• Äèíàìè÷åñêàÿ òèïèçàöèÿ: æäàòü ìîìåíòà âûïîëíåíèÿ êàæäîãî âûçîâà è òîãäà ïðèíèìàòü ðåøåíèå.
• Ñòàòè÷åñêàÿ òèïèçàöèÿ: ñ ó÷åòîì íàáîðà ïðàâèë îïðåäåëèòü ïî èñõîäíîìó òåêñòó, âîçìîæíû
ëè íàðóøåíèÿ òèïîâ ïðè âûïîëíåíèè. Ñèñòåìà âûïîëíÿåòñÿ, åñëè ïðàâèëà ãàðàíòèðóþò îòñóòñòâèå îøèáîê.
Ýòè òåðìèíû ëåãêî îáúÿñíèìû: ïðè äèíàìè÷åñêîé òèïèçàöèè ïðîâåðêà òèïîâ ïðîèñõîäèò âî âðåìÿ
ðàáîòû ñèñòåìû (äèíàìè÷åñêè), à ïðè ñòàòè÷åñêîé òèïèçàöèè ïðîâåðêà âûïîëíÿåòñÿ íàä òåêñòîì
ñòàòè÷åñêè (äî âûïîëíåíèÿ).
Òåðìèíû òèïèçèðîâàííûé è íåòèïèçèðîâàííûé (typed/untyped) íåðåäêî èñïîëüçóþò âìåñòî ñòàòè÷åñêè òèïèçèðîâàííûé è äèíàìè÷åñêè òèïèçèðîâàííûé (statically/dynamically typed). Âî èçáåæàíèå
ëþáûõ íåäîðàçóìåíèé ìû áóäåì ïðèäåðæèâàòüñÿ ïîëíûõ èìåíîâàíèé.
Ñòàòè÷åñêàÿ òèïèçàöèÿ ïðåäïîëàãàåò àâòîìàòè÷åñêóþ ïðîâåðêó, âîçëàãàåìóþ, êàê ïðàâèëî, íà
êîìïèëÿòîð. Â èòîãå èìååì ïðîñòîå îïðåäåëåíèå:
Îïðåäåëåíèå:
ñòàòè÷åñêè òèïèçèðîâàííûé ÿçûê
ÎÎ-ÿçûê ñòàòè÷åñêè òèïèçèðîâàí, åñëè îí ïîñòàâëÿåòñÿ ñ íàáîðîì ñîãëàñîâàííûõ ïðàâèë, ïðîâåðÿåìûõ êîìïèëÿòîðîì, ñîáëþäåíèå êîòîðûõ ãàðàíòèðóåò, ÷òî âûïîëíåíèå ñèñòåìû íå ïðèâåäåò ê
íàðóøåíèþ òèïîâ.
 ëèòåðàòóðå âñòðå÷àåòñÿ òåðìèí ñèëüíàÿ òèïèçàöèÿ (strong). Îí ñîîòâåòñòâóåò óëüòèìàòèâíîé ïðèðîäå îïðåäåëåíèÿ, òðåáóþùåé ïîëíîãî îòñóòñòâèÿ íàðóøåíèÿ òèïîâ. Âîçìîæíû è ñëàáûå
(weak) ôîðìû ñòàòè÷åñêîé òèïèçàöèè, ïðè êîòîðûõ ïðàâèëà óñòðàíÿþò îïðåäåëåííûå íàðóøåíèÿ,
íå ëèêâèäèðóÿ èõ öåëèêîì.  ýòîì ñìûñëå íåêîòîðûå ÎÎ-ÿçûêè ÿâëÿþòñÿ ñòàòè÷åñêè ñëàáî òèïèçèðîâàííûìè. Ìû áóäåì áîðîòüñÿ çà íàèáîëåå ñèëüíóþ òèïèçàöèþ.
 äèíàìè÷åñêè òèïèçèðîâàííûõ ÿçûêàõ, íàïðèìåð Python, èçâåñòíûõ êàê íåòèïèçèðîâàííûå, îòñóòñòâóþò îáúÿâëåíèÿ òèïîâ, à ê ñóùíîñòÿì â ïåðèîä âûïîëíåíèÿ ìîãóò ïðèñîåäèíÿòüñÿ ëþáûå
çíà÷åíèÿ. Ñòàòè÷åñêàÿ ïðîâåðêà òèïîâ â íèõ íåâîçìîæíà.
Ïðåèìóùåñòâà
Ïðè÷èíû ïðèìåíåíèÿ ñòàòè÷åñêîé òèïèçàöèè â îáúåêòíîé òåõíîëîãèè ìû ïåðå÷èñëèëè â íà÷àëå
ëåêöèè. Ýòî íàäåæíîñòü, ïðîñòîòà ïîíèìàíèÿ è ýôôåêòèâíîñòü.
Íàäåæíîñòü îáóñëîâëåíà îáíàðóæåíèåì îøèáîê, êîòîðûå èíà÷å ìîãëè ïðîÿâèòü ñåáÿ ëèøü âî âðåìÿ ðàáîòû, è òîëüêî â íåêîòîðûõ ñëó÷àÿõ. Ïåðâîå èç ïðàâèë, çàñòàâëÿþùåå îáúÿâëÿòü ñóùíîñòè,
êàê, âïðî÷åì, è ôóíêöèè, âíîñèò â ïðîãðàììíûé òåêñò èçáûòî÷íîñòü, ÷òî ïîçâîëÿåò êîìïèëÿòîðó, èñïîëüçóÿ äâà äðóãèõ ïðàâèëà, îáíàðóæèâàòü íåñîîòâåòñòâèÿ ìåæäó çàäóìàííûì è ðåàëüíûì
ïðèìåíåíèåì ñóùíîñòåé, êîìïîíåíòîâ è âûðàæåíèé.
Ðàííåå âûÿâëåíèå îøèáîê âàæíî åùå è ïîòîìó, ÷òî ÷åì äîëüøå ìû áóäåì îòêëàäûâàòü èõ ïîèñê, òåì ñèëüíåå âûðàñòóò èçäåðæêè íà èñïðàâëåíèå. Ýòî ñâîéñòâî, èíòóèòèâíî ïîíÿòíîå âñåì
ïðîãðàììèñòàì-ïðîôåññèîíàëàì, êîëè÷åñòâåííî ïîäòâåðæäàþò øèðîêî èçâåñòíûå ðàáîòû Áåìà (Boehm).
Çàâèñèìîñòü èçäåðæåê íà èñïðàâëåíèå îò âðåìåíè îòûñêàíèÿ îøèáîê ïðèâåäåíà íà ãðàôèêå, ïîñòðîåííîì ïî äàííûì ðÿäà áîëüøèõ ïðîìûøëåííûõ ïðîåêòîâ è ïðîâåäåííûõ ýêñïåðèìåíòîâ ñ íåáîëüøèì
óïðàâëÿåìûì ïðîåêòîì:
×èòàáåëüíîñòü èëè Ïðîñòîòà ïîíèìàíèÿ (readability) èìååò ñâîè ïðåèìóùåñòâà. Âî âñåõ ïðèìåðàõ
ýòîé êíèãè ïîÿâëåíèå òèïà ó ñóùíîñòè äàåò ÷èòàòåëþ èíôîðìàöèþ î åå íàçíà÷åíèè. ×èòàáåëüíîñòü
êðàéíå âàæíà íà ýòàïå ñîïðîâîæäåíèÿ.
Èñêëþ÷èâ ÷èòàáåëüíîñòü èç êðóãà ïðèîðèòåòîâ, ìîæíî áûëî áû ïîëó÷èòü äðóãèå ïðåèìóùåñòâà,
Ðèñ. 14.1: Ñðàâíèòåëüíûå èçäåðæêè íà èñïðàâëåíèå îøèáîê
íå ââîäÿ ÿâíûõ îáúÿâëåíèé. Â ñàìîì äåëå, âîçìîæíà íåÿâíàÿ ôîðìà òèïèçàöèè, êîãäà êîìïèëÿòîð,
íå òðåáóÿ ÿâíîãî óêàçàíèÿ òèïà, ïûòàåòñÿ àâòîìàòè÷åñêè îïðåäåëèòü åãî èç êîíòåêñòà ïðèìåíåíèÿ
ñóùíîñòè. Ýòà ñòðàòåãèÿ èçâåñòíà êàê âûâåäåíèå òèïîâ (type inference). Íî â ïðîãðàììíîé èíæåíåðèè
ÿâíûå îáúÿâëåíèÿ òèïîâ ýòî ïîìîùü, à íå íàêàçàíèå, - òèï äîëæåí áûòü ÿñåí íå òîëüêî ìàøèíå, íî
è ÷èòàþùåìó òåêñò ÷åëîâåêó.
Íàêîíåö, ýôôåêòèâíîñòü ìîæåò îïðåäåëÿòü óñïåõ èëè îòêàç îò îáúåêòíîé òåõíîëîãèè íà ïðàêòèêå.
 îòñóòñòâèå ñòàòè÷åñêîé òèïèçàöèè íà âûïîëíåíèå x.f (arg) ìîæåò óéòè ñêîëüêî óãîäíî âðåìåíè.
Ïðè÷èíà ýòîãî â òîì, ÷òî íà ýòàïå âûïîëíåíèÿ, íå íàéäÿ f â áàçîâîì êëàññå öåëè x, ïîèñê áóäåò
ïðîäîëæåí ó åå ïîòîìêîâ, à ýòî âåðíàÿ äîðîãà ê íåýôôåêòèâíîñòè. Ñíÿòü îñòðîòó ïðîáëåìû ìîæíî, óëó÷øèâ ïîèñê êîìïîíåíòà ïî èåðàðõèè. Àâòîðû ÿçûêà Self ïðîâåëè áîëüøóþ ðàáîòó, ñòðåìÿñü
ãåíåðèðîâàòü ëó÷øèé êîä äëÿ ÿçûêà ñ äèíàìè÷åñêîé òèïèçàöèåé. Íî èìåííî ñòàòè÷åñêàÿ òèïèçàöèÿ
ïîçâîëèëà òàêîìó ÎÎ-ïðîäóêòó ïðèáëèçèòüñÿ èëè ñðàâíÿòüñÿ ïî ýôôåêòèâíîñòè ñ òðàäèöèîííûì
ÏÎ.
Êëþ÷îì ê ñòàòè÷åñêîé òèïèçàöèè ÿâëÿåòñÿ óæå âûñêàçàííàÿ èäåÿ î òîì, ÷òî êîìïèëÿòîð, ãåíåðèðóþùèé êîä äëÿ êîíñòðóêöèè x.f (arg), çíàåò òèï x. Èç-çà ïîëèìîðôèçìà íåò âîçìîæíîñòè
îäíîçíà÷íî îïðåäåëèòü ïîäõîäÿùóþ âåðñèþ êîìïîíåíòà f. Íî îáúÿâëåíèå ñóæàåò ìíîæåñòâî âîçìîæíûõ òèïîâ, ïîçâîëÿÿ êîìïèëÿòîðó ïîñòðîèòü òàáëèöó, îáåñïå÷èâàþùóþ äîñòóï ê ïðàâèëüíîìó
f ñ ìèíèìàëüíûìè èçäåðæêàìè, - ñ îãðàíè÷åííîé êîíñòàíòîé ñëîæíîñòüþ äîñòóïà. Äîïîëíèòåëüíî
âûïîëíÿåìûå îïòèìèçàöèè ñòàòè÷åñêîãî ñâÿçûâàíèÿ (static binding) è ïîäñòàíîâêè (inlining) - òàêæå
îáëåã÷àþòñÿ áëàãîäàðÿ ñòàòè÷åñêîé òèïèçàöèè, ïîëíîñòüþ óñòðàíÿÿ èçäåðæêè â òåõ ñëó÷àÿõ, êîãäà
îíè ïðèìåíèìû.
Àðãóìåíòû â ïîëüçó äèíàìè÷åñêîé òèïèçàöèè
Íåñìîòðÿ íà âñå ýòî, äèíàìè÷åñêàÿ òèïèçàöèÿ íå òåðÿåò ñâîèõ ïðèâåðæåíöåâ. Èõ àðãóìåíòû îñíîâàíû ïðåæäå âñåãî íà ðåàëèçìå, ðå÷ü î êîòîðîì øëà âûøå. Îíè óâåðåíû, ÷òî ñòàòè÷åñêàÿ òèïèçàöèÿ
÷åðåñ÷óð îãðàíè÷èâàåò èõ, íå äàâàÿ èì ñâîáîäíî âûðàæàòü ñâîè òâîð÷åñêèå èäåè, íàçûâàÿ èíîãäà
åå ïîÿñîì öåëîìóäðèÿ.
Ñ òàêîé àðãóìåíòàöèåé ìîæíî ñîãëàñèòüñÿ, íî ëèøü äëÿ ñòàòè÷åñêè òèïèçèðîâàííûõ ÿçûêîâ, íå
ïîääåðæèâàþùèõ ðÿä âîçìîæíîñòåé. Ñòîèò îòìåòèòü, ÷òî âñå êîíöåïöèè, ñâÿçàííûå ñ ïîíÿòèåì
òèïà è ââåäåííûå â ïðåäûäóùèõ ëåêöèÿõ, íåîáõîäèìû - îòêàç îò ëþáîé èç íèõ ÷ðåâàò ñåðüåçíûìè
îãðàíè÷åíèÿìè, à èõ ââåäåíèå, íàïðîòèâ, ïðèäàåò íàøèì äåéñòâèÿì ãèáêîñòü, à íàì ñàìèì äàåò
âîçìîæíîñòü â ïîëíîé ìåðå íàñëàäèòüñÿ ïðàêòè÷íîñòüþ ñòàòè÷åñêîé òèïèçàöèè.
Âîçìîæíî, âû çàìåòèëè, ÷òî ïîïûòêà ïðèñâàèâàíèÿ - íåîòúåìëåìûé êîìïîíåíò ðåàëèñòè÷íîé ñèñòåìû òèïîâ - íàïîìèíàåò ïðèâåäåíèå. Îäíàêî åñòü ñóùåñòâåííîå îòëè÷èå: ïîïûòêà ïðèñâàèâàíèÿ
âûïîëíÿåò ïðîâåðêó, äåéñòâèòåëüíî ëè òåêóùèé òèï ñîîòâåòñòâóåò çàäàííîìó òèïó, - ýòî áåçîïàñíî,
à èíîãäà è íåîáõîäèìî.
Òèïèçàöèÿ è ñâÿçûâàíèå
Õîòÿ êàê ÷èòàòåëü ýòîãî ïîñîáèÿ âû íàâåðíÿêà îòëè÷èòå ñòàòè÷åñêóþ òèïèçàöèþ îò ñòàòè÷åñêîãî
ñâÿçûâàíèÿ, åñòü ëþäè, êîòîðûì ïîäîáíîå íå ïîä ñèëó. Îò÷àñòè ýòî ìîæåò áûòü ñâÿçàíî ñ âëèÿíèåì
ÿçûêà Smalltalk, îòñòàèâàþùåãî äèíàìè÷åñêèé ïîäõîä ê îáåèì çàäà÷àì è ñïîñîáíîãî ñôîðìèðîâàòü
íåâåðíîå ïðåäñòàâëåíèå, áóäòî îíè èìåþò îäèíàêîâîå ðåøåíèå. (Äëÿ ñîçäàíèÿ íàäåæíûõ è ãèáêèõ
ïðîãðàìì æåëàòåëüíî îáúåäèíèòü ñòàòè÷åñêóþ òèïèçàöèþ è äèíàìè÷åñêîå ñâÿçûâàíèå.)
Êàê òèïèçàöèÿ, òàê è ñâÿçûâàíèå èìåþò äåëî ñ ñåìàíòèêîé Áàçèñíîé Êîíñòðóêöèè x.f (arg), íî
îòâå÷àþò íà äâà ðàçíûõ âîïðîñà:
Òèïèçàöèÿ è ñâÿçûâàíèå
• Âîïðîñ î òèïèçàöèè: êîãäà ìû äîëæíû òî÷íî çíàòü, ÷òî âî âðåìÿ âûïîëíåíèÿ ïîÿâèòñÿ îïåðàöèÿ, ñîîòâåòñòâóþùàÿ f, ïðèìåíèìàÿ ê îáúåêòó, ïðèñîåäèíåííîìó ê ñóùíîñòè x (ñ ïàðàìåòðîì
arg)?
• Âîïðîñ î ñâÿçûâàíèè: êîãäà ìû äîëæíû çíàòü, êàêóþ îïåðàöèþ èíèöèèðóåò äàííûé âûçîâ?
Òèïèçàöèÿ îòâå÷àåò íà âîïðîñ î íàëè÷èè êàê ìèíèìóì îäíîé îïåðàöèè, ñâÿçûâàíèå îòâå÷àåò çà
âûáîð íóæíîé.
 ðàìêàõ îáúåêòíîãî ïîäõîäà:
• ïðîáëåìà, âîçíèêàþùàÿ ïðè òèïèçàöèè, ñâÿçàíà ñ ïîëèìîðôèçìîì: ïîñêîëüêó x âî âðåìÿ âûïîëíåíèÿ ìîæåò îáîçíà÷àòü îáúåêòû íåñêîëüêèõ ðàçëè÷íûõ òèïîâ, ìû äîëæíû áûòü óâåðåíû,
÷òî îïåðàöèÿ, ïðåäñòàâëÿþùàÿ f, äîñòóïíà â êàæäîì èç ýòèõ ñëó÷àåâ;
• ïðîáëåìà ñâÿçûâàíèÿ âûçâàíà ïîâòîðíûìè îáúÿâëåíèÿìè: òàê êàê êëàññ ìîæåò ìåíÿòü íàñëåäóåìûå êîìïîíåíòû, òî ìîãóò íàéòèñü äâå èëè áîëåå îïåðàöèè, ïðåòåíäóþùèå íà òî, ÷òîáû
ïðåäñòàâëÿòü f â äàííîì âûçîâå.
Îáå çàäà÷è ìîãóò áûòü ðåøåíû êàê äèíàìè÷åñêè, òàê è ñòàòè÷åñêè.  ñóùåñòâóþùèõ ÿçûêàõ
ïðåäñòàâëåíû âñå ÷åòûðå âàðèàíòà ðåøåíèÿ.
• Ðÿä íåîáúåêòíûõ ÿçûêîâ, ñêàæåì, Pascal è Ada, ðåàëèçóþò êàê ñòàòè÷åñêóþ òèïèçàöèþ, òàê è
ñòàòè÷åñêîå ñâÿçûâàíèå. Êàæäàÿ ñóùíîñòü ïðåäñòàâëÿåò îáúåêòû òîëüêî îäíîãî òèïà, çàäàííîãî ñòàòè÷åñêè. Òåì ñàìûì îáåñïå÷èâàåòñÿ íàäåæíîñòü ðåøåíèÿ, ïëàòîé çà êîòîðóþ ÿâëÿåòñÿ
åãî ãèáêîñòü.
• Smalltalk è äðóãèå ÎÎ-ÿçûêè ñîäåðæàò ñðåäñòâà äèíàìè÷åñêîãî ñâÿçûâàíèÿ è äèíàìè÷åñêîé
òèïèçàöèè. Ïðè ýòîì ïðåäïî÷òåíèå îòäàåòñÿ ãèáêîñòè â óùåðá íàäåæíîñòè ÿçûêà.
• Îòäåëüíûå íåîáúåêòíûå ÿçûêè ïîääåðæèâàþò äèíàìè÷åñêóþ òèïèçàöèþ è ñòàòè÷åñêîå ñâÿçûâàíèå. Ñðåäè íèõ - ÿçûêè àññåìáëåðà è ðÿä ÿçûêîâ ñöåíàðèåâ (scripting languages).
Îòìåòèì ñâîåîáðàçèå ÿçûêà C++, ïîääåðæèâàþùåãî ñòàòè÷åñêóþ òèïèçàöèþ, õîòÿ è íå ñòðîãóþ
ââèäó íàëè÷èÿ ïðèâåäåíèÿ òèïîâ, ñòàòè÷åñêîå ñâÿçûâàíèå (ïî óìîë÷àíèþ), äèíàìè÷åñêîå ñâÿçûâàíèå
ïðè ÿâíîì óêàçàíèè âèðòóàëüíûõ (virtual) îáúÿâëåíèé.
Ïðè÷èíà âûáîðà ñòàòè÷åñêîé òèïèçàöèè è äèíàìè÷åñêîãî ñâÿçûâàíèÿ î÷åâèäíà. Ïåðâûé âîïðîñ:
Êîãäà ìû áóäåì çíàòü î ñóùåñòâîâàíèè êîìïîíåíòîâ? - ïðåäïîëàãàåò ñòàòè÷åñêèé îòâåò: ×åì
ðàíüøå, òåì ëó÷øå, ÷òî îçíà÷àåò: âî âðåìÿ êîìïèëÿöèè. Âòîðîé âîïðîñ: Êàêîé èç êîìïîíåíòîâ èñïîëüçîâàòü? ïðåäïîëàãàåò äèíàìè÷åñêèé îòâåò: òîò, êîòîðûé íóæåí, - ñîîòâåòñòâóþùèé äèíàìè÷åñêîìó òèïó îáúåêòà, îïðåäåëÿåìîìó âî âðåìÿ âûïîëíåíèÿ. Ýòî åäèíñòâåííî ïðèåìëåìîå ðåøåíèå,
åñëè ñòàòè÷åñêîå è äèíàìè÷åñêîå ñâÿçûâàíèå äàåò ðàçëè÷íûå ðåçóëüòàòû.
Êîíòðîëüíûå âîïðîñû
Begin Quiz
1. Äëÿ óñïåøíîãî ïðèìåíåíèÿ ñòàòè÷åñêîé òèïèçàöèè òðåáóåòñÿ ñîâìåñòíîå ïðèìåíåíèå ìåõàíèçìîâ
óòâåðæäåíèé
ìíîæåñòâåííîãî íàñëåäîâàíèÿ
ïîïûòêè ïðèñâàèâàíèÿ
îãðàíè÷åííîé è íåîãðàíè÷åííîé óíèâåðñàëüíîñòè
2. Ñòàòè÷åñêàÿ òèïèçàöèÿ
ïîçâîëÿåò îáíàðóæèâàòü ìíîãèå îøèáêè åùå íà ýòàïå êîìïèëÿöèè
âîçìîæíà òîëüêî äëÿ ÎÎ-ÿçûêîâ
ïîçâîëÿåò óñòàíîâèòü äèíàìè÷åñêèé òèï ñóùíîñòè
àíàëèçèðóåò ñîñòîÿíèå îáúåêòîâ â ïåðèîä âûïîëíåíèÿ
3. Äèíàìè÷åñêàÿ òèïèçàöèÿ
ïîçâîëÿåò îáíàðóæèâàòü ìíîãèå îøèáêè åùå íà ýòàïå êîìïèëÿöèè
âîçìîæíà òîëüêî äëÿ ÎÎ-ÿçûêîâ
ïîçâîëÿåò óñòàíîâèòü äèíàìè÷åñêèé òèï ñóùíîñòè
àíàëèçèðóåò ñîñòîÿíèå îáúåêòîâ â ïåðèîä âûïîëíåíèÿ
4. Äèíàìè÷åñêîå ñâÿçûâàíèå
ïîçâîëÿåò ñâÿçàòü öåëü âûçîâà ñ âûçûâàåìûì êîìïîíåíòîì åùå íà ýòàïå êîìïèëÿöèè
èìååò òîò æå ýôôåêò, ÷òî è ñòàòè÷åñêîå ñâÿçûâàíèå
âûáèðàåò ñâÿçûâàåìûé êîìïîíåíò èç êëàññà, ñîîòâåòñòâóþùåãî äèíàìè÷åñêîìó òèïó öåëè
âûáèðàåò ñâÿçûâàåìûé êîìïîíåíò èç êëàññà, ñîîòâåòñòâóþùåãî ñòàòè÷åñêîìó òèïó öåëè
5. Ñòàòè÷åñêîå ñâÿçûâàíèå
ïîçâîëÿåò ñâÿçàòü öåëü âûçîâà ñ âûçûâàåìûì êîìïîíåíòîì åùå íà ýòàïå êîìïèëÿöèè
èìååò òîò æå ýôôåêò, ÷òî è äèíàìè÷åñêîå ñâÿçûâàíèå
âûáèðàåò ñâÿçûâàåìûé êîìïîíåíò èç êëàññà, ñîîòâåòñòâóþùåãî äèíàìè÷åñêîìó òèïó öåëè
âûáèðàåò ñâÿçûâàåìûé êîìïîíåíò èç êëàññà, ñîîòâåòñòâóþùåãî ñòàòè÷åñêîìó òèïó öåëè
6. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
ÿçûê ñòàòè÷åñêè òèïèçèðîâàí, åñëè îí ïîñòàâëÿåòñÿ ñ íàáîðîì ñîãëàñîâàííûõ ïðàâèë, ïðîâåðÿåìûõ êîìïèëÿòîðîì, ñîáëþäåíèå êîòîðûõ ãàðàíòèðóåò, ÷òî âûïîëíåíèå ñèñòåìû íå ïðèâåäåò ê íàðóøåíèþ òèïîâ
ñîâìåñòíîå äåéñòâèå ðÿäà ïîëåçíûõ ìåõàíèçìîâ íàñëåäîâàíèÿ, ñòàòè÷åñêîé òèïèçàöèè, ñêðûòèÿ ïîòîìêîì ìîæåò ïðèâîäèòü ê íåêîððåêòíîé ðàáîòå ñèñòåìû; óäà÷íîå ðåøåíèå ýòîé ïðîáëåìû åùå íå íàéäåíî
ñòàòè÷åñêîå ñâÿçûâàíèå è ñòàòè÷åñêàÿ òèïèçàöèÿ ýòî ñèíîíèìè÷íûå ïîíÿòèÿ
äëÿ êëàññîâî-êîððåêòíîé ñèñòåìû íå ìîãóò âîçíèêàòü íàðóøåíèÿ òèïà â ïåðèîä âûïîëíåíèÿ
ñèñòåìû
7. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
íàðóøåíèå òèïà â ìîìåíò âûçîâà x.f (arg), ãäå x ïðèñîåäèíåí ê îáúåêòó OBJ, íå âîçíèêàåò,
åñëè ñóùåñòâóåò êîìïîíåíò, ñîîòâåòñòâóþùèé f è ïðèìåíèìûé ê OBJ
ñòàòè÷åñêàÿ òèïèçàöèÿ ïîçâîëÿåò îáíàðóæèòü íàðóøåíèÿ òèïà â ìîìåíò âûïîëíåíèÿ ñèñòåìû
ïîëèìîðôèçì íå äàåò âîçìîæíîñòè îñóùåñòâèòü ñòàòè÷åñêîå ñâÿçûâàíèå
íàñëåäîâàíèå ïîçâîëÿåò ïåðåéòè îò æåñòêîãî òðåáîâàíèÿ ñîâïàäåíèÿ òèïîâ èñòî÷íèêà è öåëè
ê ìÿãêîìó òðåáîâàíèþ ñîîòâåòñòâèÿ òèïîâ
8. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
â ðÿäå ñëó÷àåâ óíèâåðñàëüíîñòü òðåáóåòñÿ îãðàíè÷èòü
ïðèâåäåíèå òèïà (êàñòèíã) ïðåïÿòñòâóåò ñòðîãîé ñòàòè÷åñêîé òèïèçàöèè
çàäà÷è òèïèçàöèè è ñâÿçûâàíèÿ ìîãóò áûòü ðåøåíû òîëüêî ñòàòè÷åñêè
çàäà÷è òèïèçàöèè è ñâÿçûâàíèÿ ìîãóò áûòü ðåøåíû òîëüêî äèíàìè÷åñêè
End Quiz
Íàáðàíî áàëëîâ
15 Ãëîáàëüíûå îáúåêòû è êîíñòàíòû
Ëîêàëüíûõ çíàíèé íå äîñòàòî÷íî - êîìïîíåíòàì ÏÎ íåîáõîäèìà ãëîáàëüíàÿ èíôîðìàöèÿ: ðàçäåëÿåìûå äàííûå, îáùåå îêíî äëÿ âûâîäà îøèáîê, øëþç äëÿ ïîäêëþ÷åíèÿ ê áàçå äàííûõ èëè ñåòè. Â
êëàññè÷åñêîì ïîäõîäå äîñòàòî÷íî îáúÿâèòü òàêîé îáúåêò ãëîáàëüíîé ïåðåìåííîé ãëàâíîé ïðîãðàììû.  ÎÎ-ñèñòåìàõ íåò íè ãëàâíîé ïðîãðàììû, íè ãëîáàëüíûõ ïåðåìåííûõ. Íî ðàçäåëÿåìûå (shared)
îáúåêòû ïî-ïðåæíåìó íóæíû. Ãëîáàëüíûå îáúåêòû - íåêèé âûçîâ ÎÎ-ìåòîäó, ïðîâîçãëàøàþùåìó
èäåè äåöåíòðàëèçàöèè, ìîäóëüíîñòè è àâòîíîìíîñòè. Áîðüáà øëà çà íåçàâèñèìîñòü ìîäóëåé, çà èçáàâëåíèå îò ïðîèçâîëà öåíòðàëüíîé âëàñòè. Òåïåðü ýòîé âëàñòè íåò. Êàê æå ïîñòðîèòü ñèñòåìó, â
êîòîðîé êîìïîíåíòû ñîâìåñòíî èñïîëüçóþò äàííûå, íå òåðÿÿ ñâîåé àâòîíîìíîñòè, ãèáêîñòè, äîïóñêàþò ïîâòîðíîå èñïîëüçîâàíèå? Ïåðåäàâàòü ìîäóëþ ðàçäåëÿåìûå îáúåêòû êàê ïàðàìåòðû íå ðàçóìíî,
ïîñêîëüêó ÷èñëî èõ ìîæåò áûòü äîñòàòî÷íî âåëèêî. Äà è ñàìà ïåðåäà÷à ïàðàìåòðîâ ïðåäïîëàãàåò
ñóùåñòâîâàíèå âëàäåëüöà, õîòÿ ïðè ïîäëèííîì ðàçäåëåíèè âëàäåòü çíà÷åíèÿìè íå ìîæåò íè îäèí
ìîäóëü. Ïîèñê áîëåå óäà÷íîãî ðåøåíèÿ ìû íà÷íåì ñ õîðîøî èçâåñòíîãî ïîíÿòèÿ, íåîáõîäèìîãî êàê
â îáúåêòíîé, òàê è â òðàäèöèîííîé ìåòîäîëîãèè ïðîåêòèðîâàíèÿ. Ðå÷ü ïîéäåò î êîíñòàíòàõ. ×òî
òàêîå êîíñòàíòà Pi, êàê íå ïðîñòîé, ñîâìåñòíî èñïîëüçóåìûé îáúåêò? Îáîáùèâ ýòî ïîíÿòèå íà áîëåå
ñëîæíûå îáúåêòû, ìû ñäåëàåì ïåðâûé øàã íà ïóòè ê ðàçäåëåíèþ îáúåêòîâ.
15.1 Êîíñòàíòû áàçîâûõ òèïîâ
Íà÷íåì ñ ôîðìû çàïèñè êîíñòàíò.
Ïðàâèëî ñòèëÿ - ïðèíöèï ñèìâîëè÷åñêèõ êîíñòàíò - ãëàñèò, ÷òî îáðàùåíèå ê êîíêðåòíîìó çíà÷åíèþ (÷èñëó, ñèìâîëó èëè ñòðîêå) ïî÷òè âñåãäà äîëæíî áûòü êîñâåííûì. Äîëæíî ñóùåñòâîâàòü îïðåäåëåíèå êîíñòàíòû, çàäàþùåå èìÿ, èãðàþùåå ðîëü ñèìâîëè÷åñêîé êîíñòàíòû (symbolic constant), è
ñâÿçàííîå ñ íèì çíà÷åíèå - êîíñòàíòà, íàçûâàåìàþ ìàíèôåñòíîé (manifest constant). Äàëåå â àëãîðèòìå ñëåäóåò èñïîëüçîâàòü ñèìâîëè÷åñêóþ êîíñòàíòó. Òîìó åñòü äâà îáúÿñíåíèÿ.
• ×èòàáåëüíîñòü: ÷èòàþùåìó òåêñò ëåã÷å ïîíÿòü ñìûñë US_states_count, ÷åì ÷èñëà 50;
• Ðàñøèðÿåìîñòü: ñèìâîëè÷åñêóþ êîíñòàíòó ëåãêî îáíîâèòü, èñïðàâèâ ëèøü åå îïðåäåëåíèå.
Àòðèáóòû-êîíñòàíòû
Êàê è âñå ñóùíîñòè, ñèìâîëè÷åñêèå êîíñòàíòû äîëæíû áûòü îïðåäåëåíû âíóòðè êëàññà. Áóäåì ðàññìàòðèâàòü êîíñòàíòû êàê àòðèáóòû ñ ôèêñèðîâàííûì çíà÷åíèåì, îäèíàêîâûì äëÿ âñåõ ýêçåìïëÿðîâ
êëàññà.
Ïîòîìêè íå ìîãóò ïåðåîïðåäåëÿòü çíà÷åíèÿ àòðèáóòîâ-êîíñòàíò.
Êàê è äðóãèå àòðèáóòû, êëàññ ìîæåò ýêñïîðòèðîâàòü êîíñòàíòû èëè ñêðûâàòü. Òàê, åñëè C - êëàññ,
ýêñïîðòèðóþùèé âûøå îáúÿâëåííûå êîíñòàíòû, à ó êëèåíòà êëàññà ê ñóùíîñòè x ïðèñîåäèíåí îáúåêò
òèïà C, òî âûðàæåíèå x.Backslash îáîçíà÷àåò ñèìâîë '\'.
 îòëè÷èå îò àòðèáóòîâ-ïåðåìåííûõ, êîíñòàíòû íå çàíèìàþò â ïàìÿòè ìåñòà. Èõ ââåäåíèå íå
ñâÿçàíî ñ èçäåðæêàìè â ïåðèîä âûïîëíåíèÿ, à ïîòîìó íå ñòðàøíî, åñëè èõ â êëàññå äîñòàòî÷íî
ìíîãî.
Êîíñòàíòû ïîëüçîâàòåëüñêèõ êëàññîâ
Ñèìâîëè÷åñêèå êîíñòàíòû ïîëåçíû íå òîëüêî ïðè ðàáîòå ñ ïðåäîïðåäåëåííûìè òèïàìè, òàêèìè êàê
INTEGER. Îíè íóæíû è òîãäà, êîãäà èõ çíà÷åíèÿìè ÿâëÿþòñÿ îáúåêòû êëàññîâ, ñîçäàííûõ ðàçðàáîò÷èêîì.  ýòîì ñëó÷àå ðåøåíèå íå ñòîëü î÷åâèäíî.
Êëþ÷åâûå êîíöåïöèè
• Ïðè ëþáîì ïîäõîäå ê êîíñòðóèðîâàíèþ ÏÎ âîçíèêàåò ïðîáëåìà ðàáîòû ñ ãëîáàëüíûìè îáúåêòàìè, ñîâìåñòíî èñïîëüçóåìûìè êîìïîíåíòàìè ðàçíûõ ìîäóëåé, è èíèöèàëèçèðóåìûìè â ïåðèîä âûïîëíåíèÿ, êîãäà êàêîé-ëèáî èç êîìïîíåíòîâ ïåðâûì ê íèì îáðàòèëñÿ.
• Êîíñòàíòû ìîãóò áûòü ìàíèôåñòíûìè è ñèìâîëè÷åñêèìè. Ïåðâûå çàäàþòñÿ çíà÷åíèÿìè, ñèíòàêñèñ êîòîðûõ îïðåäåëåí òàê, ÷òî çíà÷åíèå îäíîâðåìåííî îïèñûâàåò è òèï êîíñòàíòû, à ïîòîìó ÿâëÿåòñÿ ìàíèôåñòîì. Ñèìâîëè÷åñêèå êîíñòàíòû ïðåäñòàâëåíû èìåíàìè, à èõ çíà÷åíèå
óêàçûâàåòñÿ â îïðåäåëåíèè êîíñòàíòû.
• Ìàíèôåñòíûå êîíñòàíòû áàçîâûõ òèïîâ ìîæíî îáúÿâëÿòü êàê êîíñòàíòíûå àòðèáóòû, íå òðåáóþùèå ïàìÿòè â îáúåêòàõ.
• Çà èñêëþ÷åíèåì ñòðîê, òèïû, îïðåäåëåííûå ïîëüçîâàòåëåì, íå èìåþò ìàíèôåñòíûõ êîíñòàíò,
íàðóøàþùèõ ïðèíöèïû Ñêðûòèÿ èíôîðìàöèè è ðàñøèðÿåìîñòè.
Êîíòðîëüíûå âîïðîñû
Begin Quiz
1. Äëÿ íîðìàëüíîãî ôóíêöèîíèðîâàíèÿ ñèñòåìû ãëîáàëüíàÿ èíôîðìàöèÿ íåîáõîäèìà, êàê?
èñòî÷íèê ðàçäåëÿåìûõ äàííûõ
åäèíñòâåííûé ñïîñîá îáìåíà äàííûìè ìåæäó ìîäóëÿìè
åäèíûå òî÷êè ïîäêëþ÷åíèÿ ê âíåøíèì ìèðàì: áàçàì äàííûõ, ñåòè, îêíàì ââîäà è âûâîäà
íå íóæíà â ÎÎ-ñèñòåìàõ
2. Â ÎÎ-ñèñòåìàõ ãëîáàëüíûå îáúåêòû
ñóùåñòâóþò
íå ñóùåñòâóþò
ìîãóò áûòü ñìîäåëèðîâàíû
íå íóæíû
3. Êîíñòàíòû âñòðîåííûõ òèïîâ
ìîãóò áûòü ñèìâîëè÷åñêèìè (èìåíîâàííûìè)
ìîãóò áûòü ìàíèôåñòíûìè (çàäàííûìè çíà÷åíèåì)
4. Êîíñòàíòû ñïåöèàëüíûõ êëàññîâ
ñîçäàþòñÿ, èñïîëüçóÿ ñïåöèàëüíûå ïðàâèëà, çàäàííûå äëÿ êàæäîãî êëàññà
ñîçäàþòñÿ îáû÷íîé ïðîöåäóðîé ñîçäàíèÿ êëàññà
ïðåäñòàâëÿþò ñîáîé îáû÷íóþ ôóíêöèþ, âûçûâàþùóþ ïðîöåäóðó ñîçäàíèÿ
ïðåäñòàâëÿþò ñîáîé îäíîêðàòíóþ ôóíêöèþ, âûçûâàþùóþ ïðîöåäóðó ñîçäàíèÿ
5. Êîíñòàíòû
ðàçíûõ êëàññîâ îáúÿâëÿþòñÿ â ñàìèõ êëàññàõ
ñîáèðàþòñÿ âìåñòå â ñïåöèàëüíûõ êëàññàõ, ïðåäîñòàâëÿþùèõ ýòîò íàáîð äðóãèì êëàññàì
êëàññû, êîòîðûì òðåáóþòñÿ êîíñòàíòû, êàê ïðàâèëî ÿâëÿþòñÿ íàñëåäíèêàìè ñïåöèàëüíûõ
êëàññîâ ñ íàáîðîì êîíñòàíò
êëàññû, êîòîðûì òðåáóþòñÿ êîíñòàíòû, êàê ïðàâèëî ÿâëÿþòñÿ êëèåíòàìè ñïåöèàëüíûõ êëàññîâ ñ íàáîðîì êîíñòàíò
6. Ðàçäåëÿåìûå îáúåêòû
ñîçäàþòñÿ, èñïîëüçóÿ ñïåöèàëüíûå ïðàâèëà, çàäàííûå äëÿ êàæäîãî êëàññà
ñîçäàþòñÿ îáû÷íîé ïðîöåäóðîé ñîçäàíèÿ êëàññà
ïðåäñòàâëÿþò ñîáîé îáû÷íóþ ôóíêöèþ, âûçûâàþùóþ ïðîöåäóðó ñîçäàíèÿ
ïðåäñòàâëÿþò ñîáîé îäíîêðàòíóþ ôóíêöèþ, âûçûâàþùóþ ïðîöåäóðó ñîçäàíèÿ
7. Ñîçäàíèå ðàçäåëÿåìûõ îáúåêòîâ è ðàçäåëÿåìûõ êîíñòàíò îòëè÷àåòñÿ òåì, ÷òî?
íè÷åì íå îòëè÷àåòñÿ
äëÿ êîíñòàíò çàäàþòñÿ èíâàðèàíòû, çàïðåùàþùèå èçìåíÿòü èõ çíà÷åíèÿ
êàê êîíñòàíòû, òàê è ðàçäåëÿåìûå îáúåêòû ÿâëÿþòñÿ êîíñòàíòíûìè ññûëêàìè
â îòëè÷èå îò êîíñòàíò çíà÷åíèÿ ïîëåé ññûëêè äëÿ ðàçäåëÿåìûõ îáúåêòîâ èçìåíÿþòñÿ â ïðîöåññå ðàáîòû
8. Ñòðîêîâûå êîíñòàíòû
ÿâëÿþòñÿ ðàçäåëÿåìûìè îáúåêòàìè
ÿâëÿþòñÿ òàêèìè æå êîíñòàíòàìè, êàê è êîíñòàíòû äðóãèõ áàçîâûõ òèïîâ
äîïóñêàþò èçìåíåíèå ñèìâîëîâ ñòðîêè
ìîãóò èñïîëüçîâàòüñÿ êàê âûðàæåíèÿ ïðè ïåðåäà÷å àðãóìåíòîâ èëè ïðèñâàèâàíèè
9. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
êîíñòàíòû çàíèìàþò ïàìÿòü, òàêæå êàê è îáû÷íûå àòðèáóòû
ïîòîìêè ìîãóò ïåðåîïðåäåëÿòü çíà÷åíèÿ àòðèáóòîâ-êîíñòàíò
êëàññ íå ìîæåò ýêñïîðòèðîâàòü èëè ñêðûâàòü êîíñòàíòû
îäíîêðàòíûå ôóíêöèè ìîãóò ïðèìåíÿòüñÿ äëÿ ìîäåëèðîâàíèÿ ãëîáàëüíûõ çíà÷åíèé "ñèñòåìíûõ ïàðàìåòðîâ"
10. Îòìåòüòå èñòèííûå âûñêàçûâàíèÿ
ìàíèôåñòíûå êîíñòàíòû áàçîâûõ òèïîâ ìîæíî îáúÿâëÿòü êàê êîíñòàíòíûå àòðèáóòû, íå òðåáóþùèå ïàìÿòè â îáúåêòàõ
ñòðîêîâûå êîíñòàíòû íàðóøàþò ïðèíöèïû ñêðûòèÿ èíôîðìàöèè
â ÎÎ-ñèñòåìàõ íå èñïîëüçóåòñÿ ãëîáàëüíûé ñïîñîá ïåðåäà÷è èíôîðìàöèè
îäíîêðàòíûå ïðîöåäóðû èñïîëüçóþòñÿ äëÿ èíèöèàëèçàöèè ñâîéñòâ
End Quiz
Íàáðàíî áàëëîâ
Ëèòåðàòóðà
[1]
Àíèñèìîâ, À. Å. Ñáîðíèê çàäàíèé ïî îñíîâàíèÿì ïðîãðàììèðîâàíèÿ / À. Å. Àíèñèìîâ, Â. Â.
Ïóïûøåâ. Èíòåðíåò-óíèâåðñèòåò èíôîðìàöèîííûõ òåõíîëîãèé - ÈÍÒÓÈÒ.ðó, ÁÈÍÎÌ. Ëàáîðàòîðèÿ çíàíèé, 2006. Ñ. 352.
Ñáîðíèê çàäàíèé ñîäåðæèò ðÿä çàäà÷, âîïðîñîâ è ïðîáëåì ïî îñíîâàíèÿì ïðîãðàììèðîâàíèÿ. Öåëüþ çàäàíèé ÿâëÿåòñÿ îñâîåíèå è çàêðåïëåíèå îñíîâíûõ èäåé òåîðåòè÷åñêîãî è ïðèêëàäíîãî ïðîãðàììèðîâàíèÿ.
Ðåêîìåíäîâàíî äëÿ ñòóäåíòîâ âûñøèõ ó÷åáíûõ çàâåäåíèé, îáó÷àþùèõñÿ ïî ñïåöèàëüíîñòÿì â îáëàñòè
èíôîðìàöèîííûõ òåõíîëîãèé. Ñáîðíèê ñîñòîèò èç äâóõ ÷àñòåé - ðàçäåëà çàäàíèé è ðàçäåëà îòâåòîâ è
ðåøåíèé; çàäàíèÿ ðàçäåëåíû òåìàòè÷åñêè íà 16 ãëàâ.  êàæäîé ãëàâå àâòîðû ñòàâÿò ïåðåä ÷èòàòåëÿìè ïðîáëåìû îïðåäåëåííîé îáëàñòè, íàïðàâëåíèÿ èëè òåõíîëîãèè ïðîãðàììèðîâàíèÿ ðàçíîãî óðîâíÿ
ñëîæíîñòè.
[2]
Ìåéåð, Á. Îáúåêòíî-îðèåíòèðîâàííîå êîíñòðóèðîâàíèå ïðîãðàììíûõ ñèñòåì + CD / Á. Ìåéåð. Ðóññêàÿ Ðåäàêöèÿ, Èíòåðíåò-óíèâåðñèòåò èíôîðìàöèîííûõ òåõíîëîãèé - ÈÍÒÓÈÒ.ðó, 2005. Ñ. 1232.
Êíèãà ïîñâÿùåíà îáîñíîâàíèþ è òåõíîëîãèè ïðèìåíåíèÿ îáúåêòíîãî ïîäõîäà ïðè ðàçðàáîòêå ïðîãðàììíûõ ñèñòåì. Îñíîâíîå âíèìàíèå óäåëÿåòñÿ âîïðîñàì êà÷åñòâà, ïîâòîðíîãî èñïîëüçîâàíèÿ è ðàñøèðÿåìîñòè ïðîåêòèðóåìûõ ñèñòåì. Ðàññìàòðèâàåìûé îáúåêòíûé ïîäõîä îõâàòûâàåò âåñü æèçíåííûé öèêë
ðàçðàáîòêè - àíàëèç, ïðîåêòèðîâàíèå, ïðîãðàììèðîâàíèå è ñîïðîâîæäåíèå. Êíèãà â ïåðâóþ î÷åðåäü îðè-
åíòèðîâàíà íà ïðîôåññèîíàëüíûõ ðàçðàáîò÷èêîâ ïðîãðàììíûõ ïðîäóêòîâ, íî ïðåäñòàâëÿåò íåñîìíåííûé èíòåðåñ äëÿ âñåõ, êòî èçó÷àåò è èñïîëüçóåò îáúåêòíûé ïîäõîä â ïðîãðàììèðîâàíèè. Îòäåëüíûå
ðàçäåëû ìîãóò èñïîëüçîâàòüñÿ â êà÷åñòâå ó÷åáíèêà ïðè èçó÷åíèè òàêèõ äèñöèïëèí, êàê "Îáúåêòíîîðèåíòèðîâàííîå ïðîãðàììèðîâàíèå "Îáúåêòíî-îðèåíòèðîâàííûé àíàëèç è ïðîåêòèðîâàíèå".
[3]
Ñóçè, Ð. À. ßçûê ïðîãðàììèðîâàíèÿ Python / Ð. À. Ñóçè. Èíòåðíåò-óíèâåðñèòåò èíôîðìàöèîííûõ òåõíîëîãèé - ÈÍÒÓÈÒ.ðó, ÁÈÍÎÌ. Ëàáîðàòîðèÿ çíàíèé, 2006. Ñ. 328.
Èçó÷àåòñÿ ÿçûê ïðîãðàììèðîâàíèÿ Python, åãî îñíîâíûå áèáëèîòåêè è íåêîòîðûå ïðèëîæåíèÿ. Ðåêîìåíäîâàíî äëÿ ñòóäåíòîâ âûñøèõ ó÷åáíûõ çàâåäåíèé, îáó÷àþùèõñÿ ïî ñïåöèàëüíîñòÿì â îáëàñòè èíôîðìàöèîííûõ òåõíîëîãèé. Êóðñ ïîñâÿùåí îäíîìó èç áóðíî ðàçâèâàþùèõñÿ è ïîïóëÿðíûõ â íàñòîÿùåå âðåìÿ
ñöåíàðíûõ ÿçûêîâ ïðîãðàììèðîâàíèÿ - Python. ßçûê Python ïîçâîëÿåò áûñòðî ñîçäàâàòü êàê ïðîòîòèïû
ïðîãðàììíûõ ñèñòåì, òàê è ñàìè ïðîãðàììíûå ñèñòåìû, ïîìîãàåò â èíòåãðàöèè ïðîãðàììíîãî îáåñïå÷åíèÿ äëÿ ðåøåíèÿ ïðîèçâîäñòâåííûõ çàäà÷. Python èìååò áîãàòóþ ñòàíäàðòíóþ áèáëèîòåêó è áîëüøîå êîëè÷åñòâî ìîäóëåé ðàñøèðåíèÿ ïðàêòè÷åñêè äëÿ âñåõ íóæä îòðàñëè èíôîðìàöèîííûõ òåõíîëîãèé. Áëàãîäàðÿ ÿñíîìó ñèíòàêñèñó èçó÷åíèå ÿçûêà íå ñîñòàâëÿåò áîëüøîé ïðîáëåìû. Íàïèñàííûå íà íåì ïðîãðàììû
ïîëó÷àþòñÿ ñòðóêòóðèðîâàííûìè ïî ôîðìå, è â íèõ ëåãêî ïðîñëåäèòü ëîãèêó ðàáîòû. Íà ïðèìåðå ÿçûêà Python ðàññìàòðèâàþòñÿ òàêèå âàæíûå ïîíÿòèÿ êàê: îáúåêòíî-îðèåíòèðîâàííîå ïðîãðàììèðîâàíèå,
ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå, ñîáûòèéíî-óïðàâëÿåìûå ïðîãðàììû (GUI-ïðèëîæåíèÿ), ôîðìàòû
ïðåäñòàâëåíèÿ äàííûõ (Unicode, XML è ò.ï.). Âîçìîæíîñòü äèàëîãîâîãî ðåæèìà ðàáîòû èíòåðïðåòàòîðà
Python ïîçâîëÿåò ñóùåñòâåííî ñîêðàòèòü âðåìÿ èçó÷åíèÿ ñàìîãî ÿçûêà è ïåðåéòè ê ðåøåíèþ çàäà÷ â ñîîòâåòñòâóþùèõ ïðåäìåòíûõ îáëàñòÿõ. Python ñâîáîäíî äîñòóïåí äëÿ ìíîãèõ ïëàòôîðì, à íàïèñàííûå íà
íåì ïðîãðàììû îáû÷íî ïåðåíîñèìû ìåæäó ïëàòôîðìàìè áåç èçìåíåíèé. Ýòî îáñòîÿòåëüñòâî ïîçâîëÿåò
ïðèìåíÿòü äëÿ èçó÷åíèÿ ÿçûêà ëþáóþ èìåþùóþñÿ àïïàðàòíóþ ïëàòôîðìó.