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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Как Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, ΡƒΠ»ΡƒΡ‡ΡˆΠ°ΡŽΡ‚ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡŽΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 3

Автор Π‘ΠΊΠΎΡ‚Ρ‚ ΠœΠ΅ΠΉΠ΅Ρ€Ρ

ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ инкапсуляция

Π’ "Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ использовании C++" (Effective C++), я ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ» Π΄ΠΎΠ²ΠΎΠ΄Ρ‹ Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ интСрфСйсов класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎΠ»Π½Ρ‹ΠΌΠΈ ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ [10]. Π’Π°ΠΊΠΈΠ΅ интСрфСйсы ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ класса Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ Π΄Π΅Π»Π°Ρ‚ΡŒ, Π½ΠΎ классы содСрТат ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π½Π΅ большС, Ρ‡Π΅ΠΌ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Π½Π΅ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΌΠΎΠ³ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΊΠ°ΠΊ я писал, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ возмоТности ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования класса. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, увСличиваСтся врСмя трансляции для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Π”ΠΆΠ΅ΠΊ РивСс (Jack Reeves) написал, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² свСрх этих Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ, Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости-закрытости, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΆΠΈΡ€Π½Ρ‹Π΅ интСрфСйсы класса, ΠΈ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счСтС Π²Π΅Π΄Π΅Ρ‚ ΠΊ загниванию ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния [11]. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ числа ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ число ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² классС, Π½ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ этого: ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ инкапсуляция класса.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс класса – Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ самый Π»ΡƒΡ‡ΡˆΠΈΠΉ интСрфСйс. Π― ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠ» Π² "Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ использовании C++", Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ свСрх нСобходимости ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π°Π²Π΄Π°Π½Π½Ρ‹ΠΌ, Ссли это Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ класса, Π΄Π΅Π»Π°Π΅Ρ‚ класс, Π±ΠΎΠ»Π΅Π΅ Π»Π΅Π³ΠΊΠΈΠΌ Π² использовании ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ вСроятныС клиСнтскиС ошибки [10]. ΠžΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ строковыми классами, Π”ΠΆΠ΅ΠΊ РивСс ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΎΡ‰ΡƒΡ‚ΠΈΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΈΡ… Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΈ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Π΄Ρ€ΡƒΠ·ΡŒΡΠΌΠΈ ΠΈ Π½Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ [12]. "ΠΠ°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΉ" интСрфСйс для класса ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΉΠ΄Π΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС балансировки ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ ΠΊΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ, срСди ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ инкапсуляции являСтся лишь ΠΎΠ΄Π½ΠΈΠΌ.

Однако ΡƒΡ€ΠΎΠΊ этой ΡΡ‚Π°Ρ‚ΡŒΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ясСн. Бтандартная ΠΌΡƒΠ΄Ρ€ΠΎΡΡ‚ΡŒ, нСсмотря Π½Π° использованиС "Π½Π΅Π΄Ρ€ΡƒΠ³ΠΎΠ²" ΠΈ Π½Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡŽ класса, ΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅ для Ρ‚Π°ΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π°Π΄ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΡ‰Π΅, ΠΊΠΎΠ³Π΄Π° Π½Π°Π΄ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ классы с интСрфСйсами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎΠ»Π½Ρ‹ΠΌΠΈ ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ (ΠΈΠ»ΠΈ Π±Π»ΠΈΠ·ΠΊΠΈΠΌΠΈ ΠΊ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ). ВозраТСния, связанныС с Π½Π΅Π΅ΡΡ‚Π΅ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰Π΅ΠΉ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ измСнСния синтаксиса Π²Ρ‹Π·ΠΎΠ²Π°, ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ нСобоснованными, Π° ΡΠΊΠ»ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ ΠΊ "Π½Π΅Π΄Ρ€ΡƒΠ³Π°ΠΌ" ΠΈ Π½Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ Π²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΏΠ°ΠΊΡƒΡŽΡ‰ΠΈΠΌ стратСгиям для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ интСрфСйсов класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ клиСнтскиС зависимости ΠΏΡ€ΠΈ трансляции, сохраняя доступ ΠΊ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ числу Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

ΠŸΡ€ΠΈΡˆΠ»ΠΎ врСмя, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠΉ, Π½ΠΎ Π½Π΅Ρ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ΄Π΅ΠΈ, связанной с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ "Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ". Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ Π’Ρ‹ – истинный сторонник инкапсуляции? Если Ρ‚Π°ΠΊ, я знаю, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΡƒΡ…Π²Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ Π·Π° "нСдруТСствСнныС" внСшниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΡ‹Π»ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ΠΈ Π·Π°ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚.

Благодарности

Π‘Π»Π°Π³ΠΎΠ΄Π°Ρ€ΡŽ Арона ΠšΠ°Π½Π΄Ρƒ Π·Π° постановку вопроса, которая ΠΏΡ€ΠΈΠ²Π΅Π»Π° ΠΊ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅. Π‘Π»Π°Π³ΠΎΠ΄Π°Ρ€ΡŽ Ρ‚Π°ΠΊΠΆΠ΅ Π”ΠΆΠ΅ΠΊΠ° РивСса (Jack Reeves), Π₯Π΅Ρ€Π±Π° Π¨ΡƒΡ‚Π΅Ρ€Π° (Herb Sutter), Π”Π΅ΠΉΠ²Π° Π‘ΠΌΠ°Π»Π»Π±Π΅Ρ€Π³Π° (Dave Smallberg), АндрСя АлСксандрСску (Andrei Alexandrescu), Π‘Ρ€ΡŽΡΠ° Π•ΠΊΠ΅Π»Π° (Bruce Eckel), Π‘Ρ€Π°ΠΉΠ½Π° Бтрауструпа (Bjarne Stroustrup), ΠΈ ΠΠ½Π΄Ρ€ΡŽ ΠšΠΎΡƒΠ½ΠΈΠ³Π°) Andrew Koenig Π·Π° ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ. Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, большая Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π½ΠΎΡΡ‚ΡŒ АдСлС Новак (Adela Novak) Π·Π° ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ сСминаров C++ Π² Π›ΡŽΡ†Π΅Ρ€Π½Π΅ (Π¨Π²Π΅ΠΉΡ†Π°Ρ€ΠΈΠΈ), которая Π²Π΅Π»ΠΈ ΠΊ многочасовым дискуссиям, позволившим ΠΌΠ½Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ этой ΡΡ‚Π°Ρ‚ΡŒΠΈ.

Π—Π°ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΈ ссылки 

[1] Scott Meyers. Effective C++: 50 Specific Ways to Improve Your Programs and Designs, First Edition (Addison-Wesley, 1991), Item 19.

[2] Scott Meyers. Effective C++, Second Edition (Addison-Wesley, 1998).

[3] The algorithm remains unchanged in current printings of Effective C++, because I'd have to also add the requisite reasoning (this article), and making such a substantial change to a book already in production simply isn't practical.

[4] Effective C++, Item 34.

[5] Erich Gamma et al. Design Patterns, Elements of Reusable Object-Oriented Software (Addison-Wesley, 1995). Also known as the GOF or ''Gang of Four'' book.

[6] James O. Coplien. Advanced C++: Programming Styles and Idioms (Addison-Wesley, 1991).

[7] Herb Sutter. ''Sutter's Mill: What's in a Class?'' C++ Report, March 1998.

[8] Herb Sutter. Exceptional C++ (Addison-Wesley, 1999), Items 31-34.

[9] John Lakos. Large-Scale C++ Software Design (Addison-Wesley, 1996).

[10] Effective C++, Item 18.

[11] Jack Reeves. ''(B)leading Edge: How About Namespaces?,'' C++ Report, April 1999.

[12] Jack Reeves. Personal communication.

Об Π°Π²Ρ‚ΠΎΡ€Π΅ 

Scott Meyers – извСстный Π°Π²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΏΠΎ C++; ΠΎΠ½ обСспСчиваСт ΠΊΠΎΠ½ΡΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ услуги ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ ΠΏΠΎ всСму ΠΌΠΈΡ€Ρƒ. Он Π°Π²Ρ‚ΠΎΡ€ Effective C++, Second Edition (Addison-Wesley, 1998), More Effective C++ (Addison-Wesley, 1996), ΠΈ Effective C++ CD (Addison-Wesley, 1999). Π‘ΠΊΠΎΡ‚Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Π΅Π³ΠΎ Ph. D. Π² области Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠΊΠΈ Π² УнивСрситСта Π‘Ρ€ΠΎΡƒΠ½Π° (Brown University) Π² 1993.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ. ΠŸΠ΅Ρ€Π²Π°Ρ, ΠΈΠ· пСрСчислСнных Π²Ρ‹ΡˆΠ΅ ΠΊΠ½ΠΈΠ³ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Π° Π½Π° русский язык:

Π‘ΠΊΠΎΡ‚Ρ‚ ΠœΠ΅ΠΉΠ΅Ρ€Ρ. Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ использованиС C++. 50 Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ ΠΏΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡŽ Π²Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ²: ΠŸΠ΅Ρ€. с Π°Π½Π³Π». – М.: Π”ΠœΠš, 2000. – 240 с.: ΠΈΠ».

Π‘Ρ‚Π°Ρ‚ΡŒΡ, Π½Π° ΠΌΠΎΠΉ взгляд, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π΅ всС Ρ‚Π°ΠΊ Π³Π»Π°Π΄ΠΊΠΎ Π² чистых ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ проСктирования, Ссли приходится ΠΏΡ€ΠΈΠ±Π΅Π³Π°Ρ‚ΡŒ ΠΊ ухищрСниям, присущим чисто ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, эффСкт ΠΎΡ‚ использования Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½ лишь ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ достаточно Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… систСм, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ приходится Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π° Π½Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π·Π°Π½ΠΎΠ²ΠΎ. Но ΡΡ‚Π°Ρ‚ΡŒΡ Π½Π°ΠΌΠ΅ΠΊΠ°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ чисто ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ языки ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π² этом случаС вСсьма Π½Π΅ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ. А Π·Π½Π°Ρ‡ΠΈΡ‚: ΠΏΡ€ΠΎΡ‰Π°ΠΉ Java ΠΈ C#? Или ΠΈΡ… ΠΆΠ΄Π΅Ρ‚ рСвизия?

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны оказываСтся, Ρ‡Ρ‚ΠΎ инкапсуляция Π»ΡƒΡ‡ΡˆΠ΅ всСго удаСтся ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΌ языкам!? Π’Π΅Π΄ΡŒ Π»ΡŽΠ±ΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΊΡ€ΡƒΠΆΠΈΡ‚ΡŒ внСшними функциями ΠΈ Ρ‡Π΅Ρ€Π΅Π· Π½ΠΈΡ… ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ доступ. А ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π² классС Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹!? ΠŸΠΎΡΡ‚Π°Ρ€Π°ΡŽΡΡŒ Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅ Π²Ρ‹ΡΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΏΠΎ этому ΠΏΠΎΠ²ΠΎΠ΄Ρƒ. А пока… ВмСсто этого тСкста скоро появится ссылка Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π».

А.Π›.

Π¨Π°Π±Π»ΠΎΠ½Ρ‹ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ Π² контСкстС пространства ΠΈΠΌΠ΅Π½

(Π’Ρ€Π΅Π·ΠΊΠ°)

Π’ основной ΡΡ‚Π°Ρ‚ΡŒΠ΅, я ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°ΡŽ, Ρ‡Ρ‚ΠΎ статичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ классов Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΊΠ°ΠΊ внСшниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡŽ класса. Π—Π΄Π΅ΡΡŒ я Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽ Π΄Π²Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ:

// ΠΌΠ΅Π½Π΅Π΅ инкапсулированный ΠΏΡ€ΠΎΠ΅ΠΊΡ‚

class Widget {

 β€¦

public:

 static Widget* make(/* params */);

};


// Π±ΠΎΠ»Π΅Π΅ инкапсулированный ΠΏΡ€ΠΎΠ΅ΠΊΡ‚

namespace WidgetStuff {class Widget {…}; Widget* make(/* params */);};

Π­Π½Π΄Ρ€ΡŽ ΠšΠΎΡƒΠ½ΠΈΠ½Π³ (Andrew Koenig) ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ (Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ make являСтся статичСским ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ класса) позволяСт Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡˆΠ°Π±Π»ΠΎΠ½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ make ΠΈ Π½Π΅ Π·Π½Π°Ρ‚ΡŒ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅ΠΌΡ‹ΠΉ Сю Ρ‚ΠΈΠΏ:

templateβ€Ήtypename Tβ€Ί

void doSomething(/* params */) {

 // Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ для класса T

 T *pt = T::make(/* params */);

 β€¦

}

Π­Ρ‚ΠΎ Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΌ пространство ΠΈΠΌΠ΅Π½, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ способа, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ пространство ΠΈΠΌΠ΅Π½, содСрТащСго Ρ‚ΠΈΠΏ, Π²Π½ΡƒΡ‚Ρ€ΠΈ шаблона. Π’ΠΎ Π΅ΡΡ‚ΡŒ, Π½Π΅Ρ‚ способа Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ Ρ‡Π΅ΠΌ являСтся??? Π² псСвдокодС, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅:

templateβ€Ήtypename Tβ€Ί

void doSomething(/* params */) {

 // нСльзя ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠ΅ T содСрТит пространство ΠΈΠΌΠ΅Π½!

 T *pt =???::make(/* params */);

 β€¦

}

Для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½Ρ‹ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ максимальная инкапсуляция класса, ΠΈ максимальноС использованиС шаблонов ΠΈΠΌΠ΅ΡŽΡ‚ разногласия. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях, Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ являСтся Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹ΠΌ ΠΈ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ этому. Однако, для статичСских ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² классов – с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ опрСдСляСмыми классом, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° шаблонов пСрСстаСт Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ, ΠΈ инкапсуляция ΠΌΠΎΠΆΠ΅Ρ‚ снова Π±Ρ‹Ρ‚ΡŒ Π³Π»Π°Π²Π΅Π½ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ.