Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 165

Автор Π‘Π΅Ρ€Ρ‚Ρ€Π°Π½ ΠœΠ΅ΠΉΠ΅Ρ€

Π”Π²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° (copy ΠΈ standard_copy) описаны ΠΊΠ°ΠΊ синонимы. ΠŸΡ€Π°Π²ΠΈΠ»Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‚ совмСстно ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΄Π²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° класса, Ссли ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ±Ρ‰Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² допускаСт ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ объявлСниС, Π²Ρ‚ΠΎΡ€ΠΎΠΉ - Π·Π°ΠΌΠΎΡ€ΠΎΠΆΠ΅Π½. Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΈ Π²ΠΏΡ€Π°Π²Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ copy, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ классам ARRAY ΠΈ STRING, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ содСрТимоС, Π° Π½Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ. Однако ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΈ Π·Π°ΠΌΠΎΡ€ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° для Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΡ€ΠΈ нСобходимости исходной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ - standard_copy.

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ clone, входящий Π² состав класса GENERAL, Ρ‚ΠΎΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ "Π΄Π²ΠΎΠΉΠ½ΠΈΠΊΠ°" standard_clone, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ±Π΅ вСрсии Π·Π°ΠΌΠΎΡ€ΠΎΠΆΠ΅Π½Ρ‹. Π—Π°Ρ‡Π΅ΠΌ понадобилось Π·Π°ΠΌΠΎΡ€Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ clone? ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° кроСтся Π½Π΅ Π² Π·Π°ΠΏΡ€Π΅Ρ‚Π΅ задания ΠΈΠ½ΠΎΠΉ сСмантики ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ клонирования, Π° Π² нСобходимости сохранСния совмСстимости сСмантик copy ΠΈ clone, Ρ‡Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт, ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ Π·Π°Π΄Π°Ρ‡Ρƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. ΠžΠ±Ρ‰ΠΈΠΉ Π²ΠΈΠ΄ объявлСния clone Ρ‚Π°ΠΊΠΎΠ²:


frozen clone (other:...): ... is

-- Void Ссли other пуст; ΠΈΠ½Π°Ρ‡Π΅ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, содСрТимоС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ скопировано

ΠΈΠ· other.

do

if other /= Void then

Result := "Новый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°, Ρ‡Ρ‚ΠΎ other"

Result.copy (other)

end

ensure

equal (Result, other)

end



Π€Ρ€Π°Π·Π° "Новый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°, Ρ‡Ρ‚ΠΎ other" Π΅ΡΡ‚ΡŒ Π½Π΅Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая создаСт ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°, Ρ‡Ρ‚ΠΎ ΠΈ other. (Result Ρ€Π°Π²Π΅Π½ Void, Ссли other - "пустой" ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ.)

НСсмотря Π½Π° Π·Π°ΠΌΠΎΡ€Π°ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° clone, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ, соотвСтствуя Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ copy, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² классах ARRAY ΠΈ STRING. Π­Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ (для смСны сСмантики copy-clone достаточно ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ copy) ΠΈ бСзопасно (Π·Π°Π΄Π°Ρ‚ΡŒ ΠΈΠ½ΡƒΡŽ сСмантику clone Π±Ρ‹Π»ΠΎ Π±Ρ‹, скорСС всСго, ошибкой).

ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ clone Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ (Π΄Π° ΠΈ нСльзя), ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ copy понадобится ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈ сСмантику равСнства. Как сказано Π² постусловиях ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² copy ΠΈ clone, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ копирования Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ тоТдСствСнныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Π‘Π°ΠΌΠ° функция equal, ΠΏΠΎ сути, зафиксирована, ΠΊΠ°ΠΊ ΠΈ clone, Π½ΠΎ ΠΎΠ½Π° зависит ΠΎΡ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅:


frozen equal (some, other: ...): BOOLEAN is

-- ОбС сущности some ΠΈ other пусты ΠΈΠ»ΠΈ присоСдинСны

-- ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ?

do

Result := ((some = Void) and (other = Void)) or else some.is_equal (other)

ensure

Result = ((some = Void) and (other = Void)) or else some.is_equal (other)

end



Π’Ρ‹Π·ΠΎΠ² equal (a, b) Π½Π΅ соотвСтствуСт строгому ОО-Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρƒ a.is_ equal (b), Π½ΠΎ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Π²Ρ‹Π³ΠΎΠ΄Π½ΠΎ отличаСтся ΠΎΡ‚ Π½Π΅Π³ΠΎ, Π±ΡƒΠ΄ΡƒΡ‡ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ, Π΄Π°ΠΆΠ΅ Ссли a ΠΈΠ»ΠΈ b пусто. Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ is_equal Π½Π΅ Π·Π°ΠΌΠΎΡ€ΠΎΠΆΠ΅Π½ ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ согласованного пСрСопрСдСлСния Π² любом классС, ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅ΠΌ copy. Π­Ρ‚ΠΎ дСлаСтся для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сСмантика равСнств ΠΎΡΡ‚Π°Π²Π°Π»Π°ΡΡŒ совмСстимой с сСмантикой copy-clone, Π° постусловия copy ΠΈ clone Π±Ρ‹Π»ΠΈ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π²Π΅Ρ€Π½Ρ‹ΠΌΠΈ.

НС злоупотрСбляйтС Π·Π°ΠΌΠΎΡ€Π°ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ замораТивания - это Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π·Ρ†Ρ‹ примСнСния ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°, Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ соотвСтствиС ΠΊΠΎΠΏΠΈΠΉ ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ² сСмантикС исходного класса.

Π—Π°ΠΌΠΎΡ€Π°ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π½Π΅ слСдуСт Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎ сообраТСниям эффСктивности. (Π­Ρ‚Ρƒ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΈΠ½ΠΎΠ³Π΄Π° ΡΠΎΠ²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ программисты, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ Π½Π° C++ ΠΈΠ»ΠΈ Smalltalk, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π²Π½ΡƒΡˆΠΈΠ»ΠΈ ΠΌΡ‹ΡΠ»ΡŒ, Π±ΡƒΠ΄Ρ‚ΠΎ динамичСскоС связываниС Π½Π°ΠΊΠ»Π°Π΄Π½ΠΎ ΠΈ Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎ возмоТности ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ.) Π₯отя Π²Ρ‹Π·ΠΎΠ² Π·Π°ΠΌΠΎΡ€ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ отсутствиС динамичСского связывания, это лишь ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° frozen, Π° Π½Π΅ Π΅Π³ΠΎ конСчная Ρ†Π΅Π»ΡŒ. Π’Ρ‹ΡˆΠ΅ ΠΌΡ‹ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ бСзопасноС статичСскоС связываниС - это ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΈ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Π΅Π΅ компилятор, Π° Π½Π΅ программист. Π’ Π³Ρ€Π°ΠΌΠΎΡ‚Π½ΠΎ спроСктированном языкС компилятор ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ всСм Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ для Ρ‚Π°ΠΊΠΎΠΉ ΠΈ Π΄Π°ΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ сильной ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, скаТСм, для подстановки Ρ‚Π΅Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ‚ΠΎΡ‡ΠΊΡƒ Π²Ρ‹Π·ΠΎΠ²Π° (routine inlining). Поиск возмоТностСй ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ - Π·Π°Π΄Π°Ρ‡Π° машин, Π° Π½Π΅ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°. ΠŸΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ frozen Π² Ρ€Π΅Π΄ΠΊΠΈΡ…, Π½ΠΎ Π²Π°ΠΆΠ½Ρ‹Ρ… для сСбя случаях, ΠΊΠΎΠ³Π΄Π° это Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ (для обСспСчСния Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ соотвСтствия сСмантикС исходной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ), ΠΈ ΠΏΡƒΡΡ‚ΡŒ ваш язык ΠΈ ваш компилятор Π΄Π΅Π»Π°ΡŽΡ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ.

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Π°Ρ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ

Π Π°ΡΡˆΠΈΡ€ΡΡ Π±Π°Π·ΠΎΠ²ΠΎΠ΅ понятиС класса, ΠΌΡ‹ прСдставляли наслСдованиС ΠΈ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ (genericity) ΠΊΠ°ΠΊ своСго Ρ€ΠΎΠ΄Π° "ΠΏΠ°Ρ€Ρ‚Π½Π΅Ρ€ΠΎΠ²". ΠžΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΈΡ… Π½Π°ΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ знакомство с ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½Ρ‹ΠΌΠΈ структурами Π΄Π°Π½Π½Ρ‹Ρ…: Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ - ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, описанный ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒΡŽ Ρ‚ΠΈΠΏΠ° SOME_CONTAINER_TYPE [T] с Ρ€ΠΎΠ΄ΠΎΠ²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ T - ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ самого Ρ‚ΠΈΠΏΠ° T, Π½ΠΎ ΠΈ любого ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° T. Однако Π΅ΡΡ‚ΡŒ ΠΈ другая интСрСсная комбинация партнСрства, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ наслСдованиС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для задания ограничСния Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ фактичСского Ρ€ΠΎΠ΄ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° класса.

Π’Π΅ΠΊΡ‚ΠΎΡ€Π°, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠ΅ слоТСниС

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ простой, Π½ΠΎ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ввСдСния ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Он ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π² обосновании ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ поставлСнной Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ Π² Π²Ρ‹Π±ΠΎΡ€Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ конструкции языка.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ класс VECTOR, Π½Π°Π΄ элСмСнтами ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° опСрация слоТСния. ΠŸΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ Π² ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΌ Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС нСоспорима. Π’ΠΎΡ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚:


indexing

description: "Π’Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ со слоТСниСм"

class

VECTOR [G]

feature -- Доступ

count: INTEGER

-- ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ элСмСнтов

item, infix "@" (i: INTEGER): G is

-- Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° с индСксом i (нумСрация с 1)

require ... do

...

end

feature -- ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ

infix "+" (other: VECTOR [G]): VECTOR is

-- ΠŸΠΎΡΠ»Π΅ΠΌΠ΅Π½Ρ‚Π½ΠΎΠ΅ слоТСниС Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° с other

require ... do

...

end

... ΠŸΡ€ΠΎΡ‡ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ...

invariant

non_negative_count: count >= 0

end



ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ инфиксной записи ΠΏΡ€ΠΎΠ΄ΠΈΠΊΡ‚ΠΎΠ²Π°Π½ΠΎ сообраТСниями удобства. Для удобства Π²Π²Π΅Π΄Π΅Π½Ρ‹ ΠΈ синонимы Π² ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ i-Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π²Π΅ΠΊΡ‚ΠΎΡ€Π°: v.item (i) ΠΈΠ»ΠΈ просто v @ i.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΠΌΡΡ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ "+". Π‘Π½Π°Ρ‡Π°Π»Π° слоТСниС Π΄Π²ΡƒΡ… Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² каТСтся ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ ΠΈ состоящим Π² суммировании элСмСнтов Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… мСстах. ΠžΠ±Ρ‰Π°Ρ Π΅Π³ΠΎ схСма Ρ‚Π°ΠΊΠΎΠ²Π°:


infix "+" (other: VECTOR [G]): VECTOR is

-- ΠŸΠΎΡΠ»Π΅ΠΌΠ΅Π½Ρ‚Π½ΠΎΠ΅ слоТСниС Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° с other

require

count = other.count

local

i: INTEGER

do

"Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Result ΠΊΠ°ΠΊ массив ΠΈΠ· count элСмСнтов"

from i := 1 until i > count loop

Result.put(item (i) + other.item (i), i)

i := i + 1

end

end



Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ΅ - Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ слоТСния i-Π³ΠΎ элСмСнта Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° с i-ΠΌ элСмСнтом other. ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° put сохраняСт это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² i-ΠΌ элСмСнтС Result, ΠΈ хотя ΠΎΠ½Π° Π½Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π² классС VECTOR, данная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π² Π½Π΅ΠΌ, бСзусловно, присутствуСт.

Рис. 16.5.  ΠŸΠΎΡΠ»Π΅ΠΌΠ΅Π½Ρ‚Π½ΠΎΠ΅ слоТСниС Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ²

Но подобная схСма Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚! ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ +, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ для слоТСния Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² (VECTOR), здСсь примСняСтся ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ совсСм Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° (G), ΡΠ²Π»ΡΡŽΡ‰Π΅Π³ΠΎΡΡ Ρ€ΠΎΠ΄ΠΎΠ²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ. По ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ, Ρ€ΠΎΠ΄ΠΎΠ²ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ прСдставлСн нСизвСстным Ρ‚ΠΈΠΏΠΎΠΌ - фактичСским ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ, ΠΏΠΎΡΠ²Π»ΡΡŽΡ‰ΠΈΠΌΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ понадобится для ΠΊΠ°ΠΊΠΈΡ… Π»ΠΈΠ±ΠΎ Ρ†Π΅Π»Π΅ΠΉ Ρ€ΠΎΠ΄ΠΎΠ²ΠΎΠΉ класс. ΠŸΡ€ΠΎΡ†Π΅ΡΡ пороТдСния класса ΠΏΡ€ΠΈ Π·Π°Π΄Π°Π½ΠΈΠΈ фактичСского Ρ€ΠΎΠ΄ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° называСтся Ρ€ΠΎΠ΄ΠΎΠ²Ρ‹ΠΌ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ (generic derivation). Если фактичСским ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ слуТит INTEGER Π»ΠΈΠ±ΠΎ ΠΈΠ½ΠΎΠΉ Ρ‚ΠΈΠΏ (класс), содСрТащий Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ infix "+" ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ сигнатуры, коррСктная Ρ€Π°Π±ΠΎΡ‚Π° обСспСчСна. Но Ρ‡Ρ‚ΠΎ Ссли ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ станСт ELLIPSE, STACK, EMPLOYEE ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΈΠΏ Π±Π΅Π· ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ слоТСния?

Π‘ ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌΠΈ Ρ€ΠΎΠ΄ΠΎΠ²Ρ‹ΠΌΠΈ классами: ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ STACK, LIST ΠΈ ARRAY - этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΡ… дСйствия Π½Π°Π΄ элСмСнтами (Ρ‚ΠΈΠΏΠ° G ΠΊΠ°ΠΊ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°) Π±Ρ‹Π»ΠΈ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ - ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (присваиваниС, сравнСниС) ΠΌΠΎΠ³Π»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π°Π΄ элСмСнтами любого класса. Но для абстракций, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌ, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΡ… слоТСниС, Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΊΡ€ΡƒΠ³ допустимых фактичСских Ρ€ΠΎΠ΄ΠΎΠ²Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌΠΈ Π² допустимости ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.