ΠΠ²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° (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 ΠΊΠ°ΠΊ ΡΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°) Π±ΡΠ»ΠΈ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½Ρ - ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ (ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅, ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅) ΠΌΠΎΠ³Π»ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π½Π°Π΄ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°. ΠΠΎ Π΄Π»Ρ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΉ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ Π²Π΅ΠΊΡΠΎΡΠ°ΠΌ, Π΄ΠΎΠΏΡΡΠΊΠ°ΡΡΠΈΡ ΡΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½ΡΠΆΠ½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΡ ΠΊΡΡΠ³ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠΎΠ΄ΠΎΠ²ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΡΡΠΎΠ±Ρ Π±ΡΡΡ ΡΠ²Π΅ΡΠ΅Π½Π½ΡΠΌΠΈ Π² Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎΡΡΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΡΠ΅ΠΌΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ.