ΠΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΡΡΡ ΠΈ ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΡΡΠΈΡ
Π "ΠΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ 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 */);
β¦
}
ΠΠ»Ρ ΡΡΠ½ΠΊΡΠΈΠΉ ΡΠ°Π±ΡΠΈΠΊΠΈ ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π·Π°Π΄Π°Π½Ρ Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΡΡΠΈΡ ΠΊΠ»Π°ΡΡΠ°, ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² ΠΈΠΌΠ΅ΡΡ ΡΠ°Π·Π½ΠΎΠ³Π»Π°ΡΠΈΡ. Π ΡΠ°ΠΊΠΈΡ ΡΠ»ΡΡΠ°ΡΡ , ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΡΠΌ ΠΈ ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ ΡΡΠΎΠΌΡ. ΠΠ΄Π½Π°ΠΊΠΎ, Π΄Π»Ρ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΊΠ»Π°ΡΡΠΎΠ² β Ρ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌΡΠΌΠΈ ΠΊΠ»Π°ΡΡΠΎΠΌ, ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² ΠΏΠ΅ΡΠ΅ΡΡΠ°Π΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ, ΠΈ ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΡΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΡΠ½ΠΎΠ²Π° Π±ΡΡΡ Π³Π»Π°Π²Π΅Π½ΡΡΠ²ΡΡΡΠ΅ΠΉ.