Sie sind auf Seite 1von 326
CospemeHHoe npoekmuposaHue Ha C++ O6o6wenHoe nporpammupoBanue VU Laem eee Mn lean e)-t al Axgpeti Anekcangpecky Mpeaucnosue Cxotta Meitepca Npeancnosve f>xoHa Bnuccugeca CospemeHHoe npoekmuposaHue Ha C++ O6o6uyeHHOe NporpammupoBaHue Y npuKnagupie wa6noHet APOeKTUPOBaHUA Axgpea Aaekcangpecky onc Na VagatenbcKui fom “Bunbamc” Mocksa * Cankr-Metep6ypr + Knes 2002 BBK 32.973.26-018.2.75 A46 YAK 681.3.07 Usaatentcxuii 20M "Bubamc” Bap. penaKunedi A.B. Crenyoe Tlepeon c axraniickoro M peuakuna KaHul.bw3.-MaT.Hayk JLA. Kaouuna To o6uiuM sonpocam o6pauialitecs B Maaatenbckuit 20M "Britbamc” ro ampecy: info@williamspublishing.com, http://www. williamspublishing.com Anexcanapecky, Aruipeli. A46 Cospemenitoe npoextuposanue Ha C++. Cepusa C++ In-Depth, 7. 3.: Tep. canrn. — M. : Maaatenbexnit 20M "Bunpsame", 2002. — 336 c. : ua. — Tapan. THT. aHTA, ISBN 5-8459-0351-3 (pyc.) B kHHre WaiOxKeHa HOBAA TeXHONOrMA MporpaMMMposaHHs, MpelcTawimoulad coGoit cruias O606uleHHoro MporpaMMHposaHHst, MeTaNpOrpaMMUpoBAaHHs WaGIOHOB H OGbEKTHO- OpveHTHpoBaHHoro MporpaMMMposaHHsA Ha C++, O606uleHHbIe KOMMOHEHTBI, CO3TAHHbIC ABTOPOM, BBICOKO TOAHAIM yPOBCH’ aGcTpaKUMH, HateNHB A3biK C++ YepraMH ABbIKa cTIe- UMeHKALLMH MpoeKTHpOBAHHiA, COXpaHHB BCIO ero MOULb H BuIPAsHTEALHOCTE. B KHUre H3NOXKEHbI CrocoGb! peaU3AllHM OCHOBHBIX WaGNOHOB MpoekTHpoBaHHsA. Pas- paGoTaHHble KOMMOHeHTEI BorLIOUIeHEE B GHONHOTeKe Loki, KOTOpyIO MOKHO 3arpy3HTb c Web-crpaHuubt atopa. Krvra nipemHa3HaXieHa U1 OnbITHBIX nporpaMMucToB Ha C++. BBK 32.973.26-018.2.75 Bee HaaBaHHif NpOrpaMMHBIX MPOLYKTOB AATAIOTCA 3apeTHCTPHPOBAHHBIMH TOPrOBLIMH MapKaMH coorseTcTayioWHx (bHpM. Hukakas 4actb HacTosllero H32aHHA HB KaKHX UeTAx He MoxXeT ObiTb BOCTpoHsBeLeHa B KaKoli 651 TO HH Obit GOpMe Ht KAKHMH Gul TO HH GbLTO cpeuicTBAMH, Oyils TO STeKTPOHHBIC HAH MexaHie- ckHe, BKMONAR POTOKOMMpOBAHHe H 3ANMCh Ha MarHUTHBI HOCHTeTB, ECAH Ha 3TO HeT MHCbMeHHOrO paspeuieiia uaaatenbetea Addison-Wesley Publishing Company, Inc. : Authorized translation from the English language edition published by Addison-Wesley Publishing Company, Inc, Copyright ©2002 Alll rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage re- trieval system, without permission from the Publisher. Russian language edition published by Williams Publishing House according to the Agreement with R&I Enterprises International, Copyright © 2002 ISBN $-8459-0351-3 (pyc.) © Wanatenscknti 20m "Buasamc’, 2002 ISBN 0-201-77581-6 (anra.) © Addison-Wesley Publishing Company, Inc OrnABNEHME Yacte I. Meroapr 23 Tarawa 1, PaspaGorka knaccos Ha ocHoBe cTpaterHit 25 [rapa 2. Mpwemst nporpaMMuponannsa 45 Taapa 3, Cnckn THO ta [napa 4. PasMeutenue B maMaTH HeGomBLIHX O6bEKTOB 99 Yactp II. Komnonentst 19 Tapa 5. O605uleHHBIE byHKTOpsI 121 Tapa 6. Peanuaauns wia6z0na Singleton 151 Tapa 7. Mnreniextyanbrbie ykasaTen 179 Tapa 8. Da6puki o6teKtos 27 [napa 9. LWa6a0n Abstract Factory 239 Tnasa 10. LWa6a0n Visitor 255 [napa 1. Myasrumeroapr 281 Tipwaoxerne. Muoronorounas 6H6nMoTeKa B CTHIe MMHMMaTH3Ma 319 BuGanorpaus 329 TpeamerHptii ykasatem 331 COEPXKAHME IIpeancaosue Cxorra Meiiepea TIpenucaosne Jpxona Banccugeca Tpeancaosne Ayantopua BuGanotexa Loki Crpyxtypa Kiurit Baarosapuoctn acts I. Meronpt Taana 1. PaspaGorka kaaccos Ha ocHone crparernii 1.1, PasHoo6pasue MeTosoR paspaGoTKH MporpamMHoro oGecreveHHA 2. Henoctatkn yHusepcanbuoro HHTepbeiica 3. OnacHo aH MHoxecTBeEHHOe HacslezoBaHite? 4. Fpeumyurecraa ura610r08 5. Crparernut it kalacest etpaternit 1.5.1, Peanisauns knaccos cTparernit ¢ NOMOUIBIO LAGAOHHBIX apameTpoB 1.5.2. Peanisauna Kiacco crparernit ¢ oMOUIbIO UAGTOHHBIX YHKUNi-UeHOB 1.6. Pacummperinste crpaternn 1.7. Jlectpykropst kiaccos etpaterHit 1.8. @akyabramHBHble BOSMOKHOCTH, MpesOcTARMIeMbIe HenOAKOit KOHKpeTHIAUHe!t 1.9. Kom6uHmposane knaccor ctpateritit 1.10. Hactpoiika ctpyktyp ¢ omoutbio Knaccos crparernit LIL. Copmectumste H HecopMecTHMble crpaTeriii, 1.12. Pasnoxenme knaccos Ha crpaTerii 1.13. Pesiome [asa 2. IIpwemst nporpammuponanua 2.1. Craieckam mponepka aMarHocTHHeckHX yrBePKICHHIE 2.2, YacTHuHan cheuamH3auNA Wa6AOHOR 2.3. JlokanbHble Kaccbt 2.4, OroSpaxere ueToUNcAeHHbIX KOHCTAHT B THITBL 2.5. OroSpaxerne onHoro THna B Apyroit 2.6. Boi6op Tuna 2.7. PacnosHapaHe KOHBepTHpYeMOCTH H HaCHeAOBAHHA Ha STANe KOMMMAAUIIH 2.8. OGono4Ka BoKpyr Kacca type_info 2.9. Knacest NullType « EmptyType 2.10. XapakrepuctuKu Tun08 2.10.1, Peannsauus xapaktepHeTHKk ykasaTencit 2.10.2, PacrtosHananite OcHOBHBIX THNOB 2.10.3, OnTHManbHbIe THN! NapaMeTpoB 2.10.4, Yaanerine ksaanduxaropon 2.10.5, FIpumenenne kracca TypeTraits 2.10.6. 3akniovere ip 1. Li 1 il 15 ey 18 19 20 21 23 25 25 26 28 29 30 32 34 34 35 36 37 39 39 41 43 45 46 48 50 SI 33 34 56 59 61 61 62 63 64 65 66 67 2.11. Pestome Taava 3. Crack THNI0B 3.1, 3auem HYKHBI CHHCKH THNOB 3.2. Onpenenerine cricKop THTIOB 3.3, JImeapyaaunis cosmarits CMCKOB THNOB 3.4, BouHcreHite JUIMHBE criMcKa 3.5. MnTepMeuuo 3.6. Maaexcnposanibili octyn 3.7. Tlonck onementa 3.8. JoSaprenite aaementa 3.9. Yaanerine anemertTa 3.10. Yaanenne aySnnKaToB 3.11, 3amena snemenra 3.12. YacTHuHo yrlopaxoueHHbIe CIHMCKH THTIOB 3.13. Teepauuis Kitacca Ha OcHoBe cricka THTIOB 3.13.1. Peepauns pacnpesenentbix nepapxnit 3.13.2. Tenepauna koptexeli 3.13.3. Tenepauns amnetirix nepapxnit 3.14, Pestome 3.15. Kpatkoe onucanine xstacca Typelist Tapa 4. PasMemenne 8 namsTa He6oasumx o6beKTOB 4.1. Cranaapritbiit MexaHin3M pacripellenenit 2HHaMHMecKOil TaMsTH 4.2. Kak paGotaer cranaapTHbiii MexaHH3M pactipeneneHiia TMHAMMMeCKOH TaMsTH 4.3. Pacnpemenitenb naMaTH 1 HeGONbULHX OFbeKTOB 4.4. Knacc Chunk 4.5. Knace FixedAllocator 4.6. Knace SmallObjAllocator 4.7. Tpiok 4.8. Tpocto, c1oxtio 4 copa Mpocto 4.9. Tipamenenne 4.10. Pesiome 4.11. Kparkoe onicatine Mexatiw3Ma pacnpenemenna naMsrrn JUI HeOOMBILHX O6bEKTOR Yacte II. Komnonentt Tana 5. O6oGurennbie dbynKTopst 5.1. [a610H1 Command 5.2. a610Hn Command s peatsiom Mupe 5.3, Boisbisaemble CyLUHOCTH B ssbIKe C++ 3.4, CkereT waGnoHHoro Kiacca Functor 5.5, Peanuzauns onepatopa nepecbinkn Functor::operator() 5.6. PaGota c dbyHkTopannt 5.7. OaMH MMWeM, 2a B yMe 5.8. [peoSpasonaHie THTIOB apryMeHTOB H BOsBpaulaeMoro 3HaYeHHs 5.9. Yeasatemn Ha byHKUMH-4eHBL 5.10, Cassbipanne Conepxanne 6 n 71 73 4 Lh 76 7 78 79 80 81 82 83 86 86 91 92 95 96 99 100 100 102 103 106 110 112 114 115 116 17 119 121 122 124 125 126 131 132 134 136 137 141 5.1L. Cuermenne 5.12. Tlepsas npaktuueckas npo6stema: cTOMMOCT byHKUMi MepecbUIKH 5.13. Bropat npaktuyeckaa npo6sema: pacnpeneneHve AMHaMMYecKoii MaMsTH 5.14. Peanm3auna onepaunit Undo 1 Redo c nomouibio K1acca Functor 5.15. Pesiome 5.16. Kparkoe onucanne knacca Functor Taapa 6. Peanwsauna ua6z0na Singleton 6.1, Crarueckie aanubte + crarHueckne yHkunH != CHHEATOH 6.2. OcHoBHBIe KAHOMEI H3EIKa C++ sU1a MOMMepKKU CHHTATOHOB 6.3, O6ecneveHHe YHMKaIbHOCTH CHHTATOHOB 6.4. Paspyutene o6bexKToB Kulacca Singleton 6.5. Mpo6ema Bucsyeli ccnuikH 6.6. TipoGnema anpecatin Buestieli coputku (I): eHuKe 6.6.1. MpoGremst, caszannbte c byHKunelt atexit 6.7. MIpo6nema anpecaumn BucAYeH ccBiTkH (II): CHHTATOH ¢ saaHHoit MpO2OLKUTEAbHOCTBIO 2KHIHA 6.8. Peanw3auns CHHPTTOHOB, HMeIOLINX 3azaHAYIO MpoTOLKUTeABHOCTS KHIHM 6.9. MlponorxKuTeAbHOCTb KH3HH OOLEKTOR B MHOTONOTOMHONt cpene 6.9.1. La6nox 6roKuposki c 2BoitHO! NpoBepKOIi 6.10. C6opKa 6.10.1. Paanoxenne kiacca SingletonHolder Ha crpaterun 6.10.2. TpeGonanua, npempaniaembie K cTpateruaM Knacca SingletonHolder 6.10.3. C6opxa Knacca SingletonHolder 6.10.4. Peannsaunn crparerii 6.11. PaGota ¢ knaccom SingletonHodler 6.12. Pesiome 6.13. Kparkoe onvcanve waGroHHoro K1acca SingletonHolder Taasa 7. Hvresnextyanbunie ykasaTen 7.1. Cro nepsoe onvicaHMe HATesMIeKTYANBHBIX ykasaTeselt 7.2. OcoBeHHOcTH MHTeLICKTYaNbHBIX ykazaTeneit 7.3. Xpavenme MHTeLIeKTYANBHEIX yKasaTeseit 7.4. OyHKUMH-WeHbI MHTeLIEKTYANBHBIX yKasaTerelt 7.5, Crpaternu Bianennst 7.5.1, Pay6oxoe Konmposanne 7.5.2. Konuponanme npv 3anucn 7.5.3. Tloneyer ccbit0K 7.5.4. CBASbIBaHHE CCBUIOK 7.5.5. Paspyuiaioulee KONMpopanne 7.6. Onepatop BaaTust anpeca 7.7. Heauoe Mpupelenie K THHAM OGbIHHBIX ykazaTeneh 7.8. PaneHicTBo M HepaneHcTBo 7.9. OrHoweHHA nopaKa 7.10. OGHapyxenne H peructpauns OMMGOK 7.10.1. TIposepka Bo speMa HHHUMANH3auMK 7.10.2. Tposepxa nepen pasbimeHopannem 7.10.3. CoobiwenHs 06 ourn6Kax 143 144 146 147 148, 148 151 152 153 154 155 157 159 161 162 164 167 168 170 171 171 172 174 175 176 177 179 179 180 182 183 185 185 186, 187 189 190 192 193 195 200 202 202 203 203 Cogepxanne 7.11. MattemmektyanbHble yka3aTenM Ha KOHCTAaHTHBIC OGbeKTbI M KOHCTaHTHBIC HHTeNMeKTyabHbIe ykasaTemH 12. Maccnsst 7.13. Mittennexryanbibte ykasaTent H MHOrOrioToNHOCTS 7.13.1, MHoronoTo¥Hocts Ha ypoBHe OGBEKTOR 7.13.2. MHororrotownocTs Ha ypose perHicTpalMit 2aHHBIX 7.14. C6opKa 7.14.1, MiioronoTowHocts Ha ypoBHe OGbeKTOB 7.14.2. Crpaterua Ownership 7.14.3. Crpaterus Conversion 7.14.4. Crpaterus Checking 7.15. Pestome 7.16. Kparknit 0630p kacca SmartPtr Taapa 8. Pa6pukn o6sexron 8.1. [laa vero Hy xHBI aGpuKH OGBeKTOR 8.2. Da6puKu o6pexTos B A3bIKe C++: KiaccbI H OGbCKTEI 8.3. Peanusauns ca6puKn O6beKTOB 8.4. Vixerrtukatopet THrI0B 8.5. O6o6meHHe 8.6. Meaxue aerant 8.7. Ma6puka KIoHHpoRAHHA 8.8. Mcriomssosanie cbaSpHkH O6beKTOR B COMETAHHH C JIPYTHMH OGOSILEHHBINE xommoHeHTaMu 8.9. Pestome 8.10. Kpatkuit o630p wa6noHHoro Kiacca Factory 8.11. Kpatkuit 0630p ua610HHoro Kacca CloneFactory Taapa 9. Hla6.01 Abstract Factory 9.1. ApxHTeKTypHas pom wiaGroHa Abstract Factory 9.2. OGoSmeHti wHTepdelic wa6rOHA Abstract Factory 9.3. Peamusauna kiacca AbstractFactory 9.4. Peainsauns wa6noHa Abstract Factory Ha ocHiose NpoToTHmon 9.5. Pestome 9.6. Kparkuit o630p knaccop AbstractFactory # ConcreteFactory Taaea 10. Hla6aon Visitor 10.1. OcHosst wa6noxa Visitor 10.2, Teperpyska n dbyHkuns-nonyiiKa 10.3. Yrounerine peatusaunn: wa6noH Acyclic Visitor 10.4. O6o6weHHas peanisauns ulaGroHa Visitor 10.5. Hasax — x “pocromy” wa6roxy Visitor 10.6, Otaaaka sapnartoR 10.6.1. Oyskuns-nosyurka 10.6.2. Hectporoe nricriextaponanne 10.7, Pestome 10.8. Kpatkutit o630p oSo6ulenHbIx KoMMoHeHTOR wa6z0Ha Visitor Taapa 11, Myabtumeroabt 11.1, Yo Takoe Mybtumetombt? Conepxanne 204 205 205 205 207 209 210 212 214 214 215 216 217 218 220 221 225 227 230 231 234 a 235 236 239 239 242 245 249 . . 255 rap 261 262 268 274 277 277 279 279 280 281 282 10 11.2, ee 14, ILS. 11.6. 117. 11.8. 11.9. Korga HYKHBI MysbTHMeTOuBI Apoiinoe nepexmoyenne no THNY: rpy6btit Moaxoa ABroMaTH3HpoBaHHtii rpyGbili moaxon Cummerpustocrs rpyGoro nonxona Jlorapndmusecknii apoiinoi ancnetuep 11.6.1, Jlorapadmuvecknii ancneruep 1 Hactenosannte 11.6.2. Jlorapudmnyecknit ancner4ep H npHBemeHHe THTOB Kaace FnDispatcher cummerpust Zesoitvas avcneTuepusauns dyHKTopos Mpeobpasonarine aprymentos: static_cast am dynamic_cast? 11.10. MyabTHMeToabI c NOCTOAHHEIM BpeMeHeM BbITOAHeHHA 11.11, Kaaccer BasicDispatcher 1 BasicFastDispatcher kak crpareri 11.12. Hepenexripst 11.13. Pestome 11.14, Kparkuit 0630p anoitesx ancneruepos Tipnaoxenne. Muoronotownas 6uGaKoTeKa & CTHLIe MHHAMAIHaMa 1 11.2. 7 1.4. Ts. 11.6. . 1.8. Kputuka MHoronoTouxoctn Tloaxoa, peanu3oBaHHbii B GuGanoteke Loki AtomapHble onepaltHit ¢ LleMOMHCHeHHBIMM THMaMH Motorexcer CemanTHka G10KMpoBKH B O6bEKTHO-OpHeHTHpOBaHHOM NporpaMMMpoBaHHt Moancukarop volatile Cemacbopst, cobLiTHs H apyrHe TonesHBre Be Pestome BuGanorpapas Tipeamerubuit ykasareas 282 284 286 290 294 296 297 299 300 302 307 310 —_ 312 314 319 320 321 321 323 325 — ARE cee 329 331 Conepxarne NMPEQUCNOBUE CKOTTA MEMEPCA B 1991 roay pout neppoe usaanne KHUTH “SdbeKTHBHOe MerionbaoBaHHe C++” (“Effective C++"). B Hem MOYTH He paceMaTpHBATch 1a6OHBI, MOCKOABKY B TO BpEMst OHM OBUIM HOBUIECTROM, H st 0 HHX MIpaKTHYeCKH Hitvero He 3Han. BRTOYeHHbIC B_KHHTY HeMHOrouncHeHHBte ¢bparMeHTs! MporpaMM, ComePXALLAX WAGTOHBL, s Gb BEIHYATEH NO- CbUIaTb MO SMeKTPOHHOM MOUTe APYTMM MHOMAM, MOCKOMBKY BCE HOCTYNHbIe MHE KOMMLIA- Topbl HX He MomaepxHBaMH. B 1995 roay Hanucan KHury “HanGosee adbexTHBHoe ucrionbaoBanue C++” (“More effective C++”). H copa nouTH He ymoMaiyn 0 uaGqoHax. Ha TOT pas Merit OCTaHOBIATO He oTcyrcrae 3Hanuii (B MepsonavaMbHOM BapHaHTe KHHTa conepxKana UeTyIO rmaBy, TO- CBAMIEHHYIO STO! TeMe) 1 He OrpaHNYeHHocTs MOHX KOMnMIATOpOR, TIpocTo BOIHKTO T10- Jospene, TO NOHUMAHMe pos uIAGTOHOB B cpelle NporpaMMitcToB Ha sabIke C++ mpe- TepllepaeT HACTOMbKO 3HAYHTEABHBIC H3MCHEHHA, YTO BCe MOM MbICII 110 3TOMY MOBOAY MOrYT GBICTPO CTaTS GaHATBHBIMH, NOBEPXHOCTHBIMH H aXe OLIMGOMHBIMH. StH Mogosperna BOIHHKAN NO aByM MpuaunaM. Teppol u9 HUX OLia craTbA, ony6an- KOBaHHas B SHBapCKOM HOMepe xypHasia “C++ Report” 3a 1995 roa J>koHom BapToHoM ohn Barton) # Iu HoxMariom (Lee Nackman). B Heit oncbipatocs mpumeHenie ua610- HOB M19 GesoMlacHoro ariaiH3a pasmepHoctelt (typesafe dimension analysis) 6e3 AorioaHH- TeNbHBIX 3aTPAT MALIMHHOFO BpeMeHH. AA caM TOBOABHO ONTO MbITANICA PeullMTb STY satay M 3Has, TO APYTHe MporpaMMucTHI TaKKe GesycrIeLIHO MOMAIOT Had Heit ronoBy. PeBosio- UMOHHBI TOAXOA, MpeaToxeHHBtit BaproHom H9KMeHOM, TOMO MHe TOHATB, TO c TO MOULBIO UFAGAOHOB MOKHO He MPOCTo CoIIaBATS KOHTeHiHepbI, ConepxaUNe OGbEKTBI KAC- ca T, Ho H TOCTHYD HamHoro Gonee IHANHTeTbHBIX PesysIbTATOB. B katiecTBe WUHOCTpAUMKt 3TOTO MoAXORA PaccMOTPUM Kos, MpeAHAIHAveHHBLit WIA_yM- HOXEHHS BYX (PUSHYECKHX BEAM NPOHIBOABHON pasMepHOCTH. templatecint ml, int 11, int tl, int m2, int 12, int t2> Physical operator*(Physical Ths, : Physical rhs) return physical unit*Ths.value()*rhs.value() ; } Taxe Ges oSpacHeHnii, NPHBeIEHHBIX B CTATBE, COBEPLEHHO O¥eBHAHO, 47O 97a WHA6- slonias ¢yskunst (function template) nonytaeT wecTb napaMeTpos, HH OAMH 13 KOTOpbIX He mpeactasaset coGolt Kakoii-1160 Tun! 3To ABIMIOC AIA MeHs TIPHSTHBIM OTKPBITHEM. Bekope # ctam Hayvatb craraptuyi Ou6mMOTeKy wWa6roHoB STL (Standard Templates Library). ta paspa6orka Anexcanpa Crenariosa (Alexander Stepanov) pecbMa 97eranTHa, B Heit KonTeliepbt HuMero He 3HaIOT 06 ANTTOPHTMAX, AITOPHTMBI HUETO He 3HaIOT © KOH- Telinepax, HTepaToppl (byHKUMOHMPyIOT KAK ykazaTeMH (HO MoryT ObITb OOBEKTAMMH), KOH- TeiiHepbl H aATOPUTMD! OAMHAKOBO YerleuIHO MOryT NonyuaTe ykazaTeT Ha PYHKUMH 1 ca Mit QYHKUMH B BHe OGbEKTOB, a MonbIOBATENH GHOMOTEKH MOFYT pacUIMpsTb ee, He MIpH- Gera K HacieNoBaHHI0 oT KaKoro-mG0 Ga30BOro KAacca MAH mlepeonipemeteHitio puptyanbubix ynkunit. M tyr 1 nouyscrsopan (kak M mpH aTeHHH craTéM Baprowa i HokMeria), 40 MpakTHYeckH Kuteeo He 3HaIO 0 urA6AOHAX Tlo sto npHunHe a He cTan MOMTH Huvero MHCATs oO WAGTOHAX B KHHTe “Bosee xb- cbextuprntlt C++”. Kak & Mor KacaTbc# STOM TeMbl, CCIM Moe MOHMMAHHE la6OHOB OC TaBaock Ha ypOBHe KOHTefiHepoB, ConepKAMUX OGbEKTHI KNacca T, B TO BpeMst Kak Bap- Tox, Hokmak, CremaHos M Apyrve mpoxeMoHcTpupoBamH, To Takoe MpHMeHeHHe wa6n0- HOB ABISETCH NHL BepUIMHO! aitcepra? B 1998 rony Avupeit Anexcanapecky (Andrei Alexandrescu) cram oMeHHBaTEca COOGIEHHSIMH TO SeKTPOHHOI MOTE, H BCKOpe NOH, YTO MHe NpHseTeA CHOBA H3Me- HIT CBOE MHeHHe 0 aGTOHaX. B To Bpema Kak Baprou, Hakmax u Crenaos oulenomHn MeHs TEM, 47110 MOXHO cenaTb ¢ TOMOUIbIO WaGTOHOB, AHApeit MopasHA MeHs, OOLACHHB, Kak 310 MOXHO cnenaTs. Onta v3 npocteitux Beuleit, KOTOPEIe OH MOMOT MHe H31OKHTS B o6ulenocTyNHOM opMe, 10 CHX Mop OcTaeTca MPHMepoM, KoTopbIit A TepBbIM TIPHBOxY JonAM, HayHHaio~ UMM paGoTaTs B sTOf oGracTH. Sto waGIOH CTASsert, npeacTanimouMit coGoft ananor Makpoca assert, Ho NosBonAIOUIMit NPOBEPATL YCTOBHA BO BPEMA KOMMMNAUMH, a He BO BPEMs BBITIONHeHHs MporpanMet. template struct CTAssert; templates struct CTassert {}; Bor ace! OGpaTute BHHMAHHe Ha To, 4TO OOBIUHBI waGIOH CTASSert HUME He onpenensetcs. Bonee Toro, OH KOHKpeTH3HpoBaH TOKO AIA 3HAYCHHA true, HO He Ais false. To, 470 ecTb B 3TOM mlaGNOHe, He MeHee BaxKHO, YeM To, ¥ee0 @ Hem Kem. Sto 3acraBAaeT MlocMoTpeTb Ha Ko 3Toro waGxoHa Mon ApyrHM yrtoM, mocKomBKy OKasMIBAeTeH, YTO GonbUIAR YacTb ero “HcXOAHOTO Kosa” OcosHAHHO MpourHopHposana Dror o6pa3 MBILINCHHH coBepUIeHHO oTATMYAeTCH oT O6ulenpHHATOrO. (B stoi KHHTe Auupeit oGcyxnaeT Gone choxKHBIt Wa6AOH Compi leTimecheker.) B wore Anapeit mpucrynan x paspaGorke waGiOHHO-opHeHTHpoBaHHol peanHaaunM pac- NpoctpaHeHHbIx ASBIKOBLIX HAaHOM (language idioms) H waG1oHoB MpocxTHposaHHs, OcoGeHHO uaGoHi08 GoF". ro BbIsBaTO Tepenanky B cpele paspaGoTuHKOB WaGTOHOB, MOCKONBKY OHH Geum a6comoTHo y6exueHbI, 4TO STH WaGTOHI HeBOsMOXHO 3anporpaMMuponarD. Koraa crato sco, uo Annpeii cosnan cpescTBa sim aBTOMaTHNecKOrO reHepHpOBAHHA peaauzayut wa6ToHOR, a He AAs NporpaMMupowaHHs coGcTBeHHO WaGIOHOR, BospaxKeHHs GEUIM cHaTHt. Me GbuIo NPHATHO y3HaTb, 4TO AHmpei H OH M3 paspa6oTUnKoB waGr0- Hos GoF (JLxon Baviccuec) BMecte HanMcanH ape cTaTbH B xypHane “C++ Report”, ro CBAULeHHBIe STO TeMe Caeays BLIGpanHoMy HanpanieHMio, CBASAHHOMY C Wa6TOHAMM AIA TeHepaLMH WHOM PeaTH3ALLMAMH WaGTOHOB MIpockTHpoBAHHs, AHApeii cToAKHYsICA c NpoGeMaMH, CTOSLLAMH 1 Tepe APYTHMH MporpaMMHcTaMM, paGoTaOWMMH B sTOH OGacTH. JomKHa mH NporpamMa GbITb GesonacHiofi B MHororioTosHoit cHcTeme (thread safe)? Orkyza 6paTb NonomHHTeMbHyIO MaMsTE: M3 KYUH, CTeka WIM Mysa craTHYecKoii NAMATH? HykKHo JIM Mepell pasbIMeHOBaHHeM MHTEsLICK- TyANbHBIX ykasareneit (smart pointers) MposepaTs, paBHbI 1M OHH HYmO? Yro cay¥HTeR MPH 3a- BePEHHM MporpaMMe!, ec ONMH AecTpyKTop cHHTaTOHa (singlton’s destructor) ronsrraetes VCTIOMBIOBAT YAKC YHUYTOKCHHBI CHHTATOH? AHUIpell CTPEMHLICR MpeMIOKUTE Mombs0BATEAAM MaKCHMAIEHO LIMPOKHil BBIGOP BOsMOXHOCTeH, He HaBASHIBAR CBOCTO MHEHHA, OH peu HHKaNcynHpobaTb STH pellleHHa B Bie x2accoe cmpameeutl (policy classes), 4TO NOSBONHTO MoAB3OBaTeAAM nepesaBaTs UX Kak WAGAOCHHBIe TapaMeTps!. Kpome Toro, Axapeii Mpemioxkun na STHX KIACCOB pasyMHEIe 3HaYeHHs MO YMOTMAHHIO, Tak 4TO 6onb- | Hassanne stux wa6ToHos mpoxexoanT oT cropocoveraHia “Gang of Four” — “Banna sersipex”. B coctas aTofi “Gans” exon Erich Gamma (Spyx Tama), Richard Helm (Pivapa Xeam), Ralph Johnson (Panu Lxoxcon) 4 John Viisides (ikon Banccuaec), Hanvicasuie ocHoponoxaruowyio Kxnty Design Partems: Elements of Reusable Object-Oriented Software (Addison-Wesley, 1995). 12 Mpeancnosne Cxorta Mefiepca MMHCTBO KAHEHTOB MOXKET MX MpocTo UrHOpHpoBaT. PesynbTaT oKasarcA NoTpacaIOULHM! Hanpumep, waGn0H 14 HHTeANeKTYANbHOTO YKazaTeNs, OMMCAHHBI B KHHTe, MonyyacT B BWUIe TlapameTpoB TonbKO 4 Kaacca CrpaterHil, a reHepupyeT Gore 300 pasHbIx THTOB HE- TeACKTYAIHBIX YKASATENEH, KaXKAbU M9 KOTOPBIX OGTATACT YHHKATBHBIMH OCOGEHHOCTAMH noseseHHs. FporpaMMHcTHI, OcBeHOMAeHHBIe O MOBCACHUK MHTeMTeKTYANbHOrO Yka3aTes1A, 3alaHHOM No yMOTYaHMIO, MoryT BoOGIe NPOHTHOpHpoRATs NapaeTpbt, MpescTaRTAOULHE coGoii KaccbI cTpaTerHit, YKa3aB TMI THN OObEKTA, HA KOTOPBI OH DOILKEH CcHITaTECH Bro NosBoNseT HM HOBTeKATH BHITOMY M3 MpeKpACHO CHleNAHHOTO KAaCca IN MHTesIeKTY- anbHOro ykasaTens, He MIpWiarad HUKAKHX YCHUIi B KoHue KHMTH paccMOTPeHbI TPH pasHbIe TMB, MIPHEM Ain KAxHO! H3 HHX BEIGpAH cBoii crloco6 HaoxeHHs. Bo-NepBbIX, MpeCTaRMeH HOB BINA Ha MOU) M THOKOCTS waGrOHOB B sabiKe C++. (Ecam, mpoulttas MaTepHan, noceauleHHbti cnuckam THMOB (typelists), Bb He CRATIMINCE CO CTYNA, 3HANHT, BAI CHEN Ha Moy.) BO-BTOpbIX, YKAsaHbI OpToroHabHble HaNpABAeHHA, 10 KOTOPBIM KINOMBI H PeanH3aLHH WaGNOHOB MOFYT OTsUH- varbea apyr ot apyra. Jia paspaGotunkos WaG7OHOB H MporpaMMUcTOB, 3aHHMAIOUIMXCs HX peannaauneii, 97a HHGopMauMs KpaliHe BaxHa, ONHAKO BHI BPs 1M HaitteTe ce BUPY- THX HCTOUHHKaX, B 3aKMIOUCHHe, HHTATeMM MOryT CBOGOAHO 3arpy3HTb HCXOAHBI Ko 6H6- sMOTeKM waGTOHOB Loki, onucaHHolt B 9TOM KHMTe, M M3Y4NT ce cTpoeHHe. C ec MoMo- UIbIO BAI MOXKETe He TONBKO HCMIMITATh CBOH KOMNWJITOP, HOH HaaTh CoOCTBEHHYIO paspa- Gorky. PasyMeetcs, Bbt MOXeTe BMONHe 3aKOHHO MCHONb3OBATh KOU, HanHcaHHBii AHApeeM, 119 CBOHX Herel. A AGCOMOTHO YREpeH, YTO eMy 9TO 6yeT MPHsTHO. Cxort Meiiepe (Scott Meyers) Mpeancnosue Cxotta Mefepca 13 Mpegucnosue 2>KOHA BJINCCUDECA Yro HoBOTO MOKHO ckaszaTp o AIbIKe C++? OxasbipaeTes, Over MHOrO. Sra KHHa TocBA- lueHa cAMAHHGO pasHbIX crloco6os NporpaMMUposaHHst — OGO6LeHHOTO NporpaMMuposAHHA, MeTaNPOrpaMMHPORAHHA WIAGTOHOB, OOKEKTHO-OPHEHTHPOBAHHOTO NporpaMMHNpORAHHA H pas- paGorkH uia67OHOB NPoekTHpoRAHHs — B paMKaX HoBoro Tiosxoaa. Jo cHX Nop 3TH Hanpante- AMG. B MIporpaMMHPOBAHHM PaIBHBAANCh HIOMMPORAHHO APYT OT APYTA, H BBITOMBI, MoAyHEHHBIE OT HX OOKEAHHEHHA, JHU HAYHHAIOT Mony4aTs LOcToIHYIO OUeHKy. ITO cHMsIHe OTKpHIBACT HOBBIe MepcHleKTHBBI LIA sIbIKA C++ He TONBKO ¢ TOUKH 3peHHs COOCTBEHHO MporpaMMipona- HHA, HO It paspaGorKHt NporpaMMHOTO OGECHIe¥eHHA B LeNOM. OcoGeHHo sHaNHTeENBHO 3TO TOBAHMeT Ha alaIH3 MporpaMMHOro OGecrIeveHHA H eTO apXHTEKTYPY. OGo6ureHHbIe KOMMOHEHTH, coslaHHble AHpeeM, MOLHUMaIoT yposeHb aGcTpaKuHH. HACTOABKO BBICOKO, TO s3bIK C++ MpHOOpeTaeT HepTbI s13bIKA CrIeUNG>HKAMMit MpoekTHpO- parina (design specification language). TIpt Tom B OTMHYHe OT Y3KOCTICUHaH3HpOBAHHBIX A3bIKOB N1poeKTHPOBAHHS A3bIK C++ cOXpaHAeT BclO CBOIO MOUIb H BbIpasitTebHOCTb. AHA Peit npoaeMOHCTpHpoBaT, Kak NPOrpaMMUpyIOTCA KOHMEMUMM MPOeKTHPOBAHMA: CHHTTTO- Ht (singletones), uHcmeKTopst (visitors), saMecTuTem (proxies), a6ctpaxtHsie abpuKn (abstract factories) HT. MoxkHO aXe HACTpalBaTs TOTOBBIE KOMMOHEHTBI C MOMOUIbIO UAGTOHHEIX NapaMeTPoB, He paCXOAys LOMONHHTENbHOTO MaLIMHHOTO BpeMeHH. He HyxXHO BBIGPacbiBaTb KYNY JeHer Ha paspabOTky HOBBIX HHCTPYMEHTANBHBIX CPeACTE HIM H3y4aTb ToMa MeToflomorHveckol Tapa6apumntibi. JloctaTouHO MMeTb HalleXHbIii CoBpeMcHHBtit KOMMWIATOp (H 9TY KHHTY). Paspa6oruHkH reHepaTopoB Kola AOATHe roubt oGeMlan oGecreHTb HX coBMeCTH- MOCTb, HO TeOpeTHYECKHe HCcHeAORAHHS M MpaKTHeckHit ONBIT YOCAHAH MeHsl, 4TO 20C~ TH4b sTO! UeAM HEBOSMOXHO, OcraloTes HepellleHHbIMH MpoGTeMb! MonHOrO OGxoMa ste peBa TloHcKa, TeHepaUHH HeocTaTONHO KaecTBEHHOrO Kowa, HerHOKHX reHepatopon, HeuHTaGenbHOCTH creHepHpoBAHHOTO Koa H, PA3yMeeTCA, WHPOKO H3BECTHaA NPoGreMa, KoTopyio MOKHO cibopMysMpoRaTe Tak: “A He MOTY BCTABHTb TOT MpoKsTbI KOA B cBowo nporpammy”. Kaxkgoi 13 oToM MpoGrem AocTaToUHO, YTOGbI 3aBeCTH MporpaMMH- Ta B TYMMK, a BMECTe OHH CO3MAIOT MPAKTHYECKH HEMPEOMOAMMBE MIPeNATCTEHA As aB- ToMaTHYeckoit reHepanimn Koza. Kak 6bi10 6bi XOpoUlO TlonyuNTS BCe TeopeTHiecKHe MPEHMYllLeCTRA ABTOMATHYECKOHL TeHepaulMM Kola — CKOPOCTb, JETKOCTh PeaTH3ALHM, COKPALLEHHy!0 M36bITOUHOCTD, MEHBII€e KONHYECTBO OUIMGOK, OHOBPeMEHHO H3GEKAB eo MIpakTHYECKHX HenOcTaTKoB! Vmenno oto oGeumaeT nogxog, npeanoxennetii Anapeem. O606ileHHBIE KOMMOHEHTEI (generic components) peanHayioT yauHble CXEMBI B BHAC YAOOHBIX AIA HeTIOMBIOBAHHS, TOMAIOUIHXCA CMELIMBAHHIO H MOAXOMAULNX ATA peMleHUs 3aa4H 1WaGTOHOB (mixable- and-matchable templates). S11 wiaGroHbI JestatoT MpaKTHYeckH To Ke, 4TO M TeHepaTopHt Kola: cO3MaloT CTAHAApTHBIe (parMeHTHL KOA ANA AaAbHeliueli OGpaGoTKM ¢ MOMOLIBIO KoMMHAsTOpa, OTINNHe 3akmoUaeTe B TOM, 4TO UlaGIOHI No3BONAOT cAeNATe 3TO, HE BbIXOMS 3a PAMKH si3b1ka C++, B pesyBTATe MPOMCXOAHT MomHAK HHTerpauns Hoy4eH- HOTO Koa C HCXOAHBIM KOLOM MpHTOXxeHHs. [pi 9TOM OcTaeTCH BOSMOXHOCTS HcHOA- 3ORATb Belo MOUlb s3bIKa, PACUIMpAA Kiacch, 3aMellas MeTORB H MOATOHAR Ua6AOHBI nog cBon TpeGopanns. Hekoropste 13 OMMCAHHBIX NPHEMOB MPOTPAaMMUPORAHHA AOBOABHO TPy;HO MOHSTB, ocoBeHHo MeTaNporpamMMHpoBaHHe UlAGTOHOR, paccmoTpeHHoe B raaBe 3. OnHaKO, OCBOHB €Fo, BI CMOXeTE TIOCTHb BCIO TEOpHIO OGOGULEHHEIX KOMTIOHEHTOB, KOTOpble MpakTHYeckH camn ce6a cosaaior. STH KOMMOHEHTH ONHcaHbl B NocHemyIOUMX rnaBax. AL yMaIo, 4TO MeTaNporpamMMHpOBaHHe WAGAOHOB, USTOKEHHOE B TNaBe 3, CAMO MO ceGe MOCTOIHO oT- BeABHOH KHHTH. OcTanbHbIe JecATb r1aB OcBeUlaIoT crocoBsI ero NpuMeHeHHs. Hecmorps Ha TO 4To eCATH MAB — 9TO AOBOMKHO MHOTO, BALK HHBECTHUHH OKYTIATeA cTOpHUeit Zou Banccuec (John Vlissides) 16 Npeancnoene Dpkona Bauccnaeca NPEQUCNOBUE BosMOxKHO, BBI slepxXHTe ITY KHHTY B PYKAX, HAXOMACE B_KHIDKHOM NaBKe, paanyMbIBAM, MO- Kynatb 11m ee? A MoxeT 6bITb BbI NPHULTH B GHOAMOTeKY M peulaeTe, CTOHT 1M TpaTHTb BpeMA Ha 3Ty KHHTY? 3Halo, YTO y Bac HeT BpeMeHH, osToMy Gyay KpaToK. Ecnit BbI KorMa-1H60 HHTepe- CoRAMHcb, KaK HYAKHO TIMcaTb MPorpaMMEI BEICOKOTO YpOBHA Ha s3bike C++, KaK crpaBHTbcA C JABKHOI MeNKHX seTaNeii, 3arPOMOXKNAIOUIKX jake CAMyIO NpocTyIo NporpaMMy, 11H KaK CO3- AaTb KOMMOHEHT, MpHrOsHbIi AIA NOBTOPHOTO HcriONb30BaHHA, KOTOPbIi He HYKHO paspaGaTel- BATb 3AHOBO AA KAKLOTO HOBOTO NPHLIOKEHHA, TO 3Ta KHMTA IA BAC. TIpeactanste ceGe Takyio Kapriny. Bui MpHXxoauTe C MpousBomcTBeHHoTO coBelllaHuA, Hecs B pykax rpyAy AMarpaMM, Ha KOTOpBIX HauapariaHbl BallM KOMMEHTApHH. O'Keit, roBO- PHTe BEI, THM COBBITHA, MepeaBAeMorO OT OAHOFO OGbeKTa K ApyFOMy, B T10G0M cryuae HE char. 3to — Tun int. VW Bet usMeHseTe onHy’ cTpoKy B Bae MporpamMe. Mnteniexty- aNbHBI yKa3aTenb Ha OGbeKT Kilacca Widget paGoTaeT CAMUIKOM MeILIEHHO, ero crenyeT caenate HeKOHTponupyembiM. Hl BbI H3MeHseTe elle omy crpoKy. PaGpHKa oGbeKToB AowkHa TOMepMBATb HOBbIH KIAcc Gadget, NoBaBNeHHEI coceAHHM oTaeIOM. Hi BBI cHoBa H3MeHseTe OnHY CTPOKY. But 3aKoH4HNIM paspa6oTKy cBoelt nporpammel. Komniuanpyete. Cassbinaete. Totoso. Ornuuno! He kaxeres JIM BaM, WTO B 3TOM CLIeHapHHt 4TO-TO He Tak? HamHoro npagaonio- ROGHee BLINIAINT cnenyloulee pasBHTHe coObITHit. Bb! NpHXomHTe ¢ MpoH3BoNCTBeHHOTO coBe- UAHH BIMBLICHHDI, MOCKONBKY BAM MPeCTOHT BLINOTHHTE KyYY paGoTbI. Ber sanyckaeTe r10- Ganbubiit rroucK. Yaansete cbparment. JoGanisere cparment. Jlenaere oum6Ku. Hcnparasere ouH6kH... B atom u 3akmo4aeTes pa6ota nporpaMMucTa, He Tak 1M? XoTA 9Ta KHMTa H He Ta- PAHTHpyeT BAM HcrloNHeHHe NepBoro clleHapHs, OHA NOMOXeT BaM MPOITH HECKOADKO WaroB B 3TOM HanpaBreHMH. 3nech NpeanpHHsTa NonbrTka NpestcTaBHTb A3bIK C++ B HOBOM KayecTBE — si3bIKa JLIs paspaGOTKM APXHTeKTypbI MIporpaMMHoro OGecrieveHHs, TpagHuHoHHo Kon npeactapaaeT coGoit HaHGonee AeTaNM3HpoBaHHbiit HM CAOKHbIt ac- Nekt nporpaMMHoro oGecneyenna. McTopuueckn, HECMOTpa Ha CYLIeCTBOBAHHe s3bIKOB Pa3HBIX ypoBHeii, NpeAHasHayeHHBIX JIA MomLepXKK MeToRONOTHit MpoeKTHpoRAHHA (HanpuMep, OGbeKTHOM OpHeHTaLMM), MexKZY MpoeKTOM NporpaMMbl HM ee KOJOM JexKUT Mponactb. Sto oGycHoBNeHO TEM, 4TO B KOE AOWKHEI BITS yUTEHBI BCE MebYAiIWIMe neTa- AM peatW3auHH H MHOXeCTBO APYrHX MOGOHDIX MOMeHToB. Llenb nporpaMMbI B GONbINHH- cTBe ciy4aeB CKpbIBaeTCA 3a MHOXKECTBOM NogzpobHocTeit. B roi KHure MpemcTaBiena KONICKUMA MPHTOAHBIX K MOBTOPHOMY HCrOAb30BaHHIO WaGAOHOB, Ha3bIBAeMBIX OGobweHKeMU KoMNoKeHmamu (generic Components), a TAKE cno- coObI HX paspaGorKH. OGoGueHHbIe KOMMOHeHTHI MpesocTaBAAIOT MoxTb30BaTeNMIO XOpowlo W3RECTHbIC BbITOAbI, CBOCTBEHHbIC 6HOAMOTeKAM, OHAKO OHH NPHTOAHbI Via Gomee wiH- PoKoro crleKtpa cHCTeMHBIX apxHTekTyp. TIpHeMbl KOAHpoBAHHA H peatH3aUHH CKCHUCH- TpHpoBaHbI Ha sala4ax MW MOMeHTAX, TPALHUHOHHO MpHcyWHX NpoeKTHPOBAHHI, KOTOpoe ObbIYHO mpedwecmayem CoFCTREHHO KOAMpoBaHHio MporpamM. Buaromaps cBOeMy BbICOKOMY YpoBHIo aGCTPAKUNH OGOGLICHHbIe KOMMOHEHTH MO3BONAIOT HeOOblaiHO BEIPASHTeNbHO, ©XaTO H AerKo OTOGpaxaTs B Kose CHOKHbIC APXHTEKTYPEI. B o606mieHHBIX KOMNOHEHTAX BOMOUICHs! TPH BeTBH NporpaMMMposaHHA: NpoeKTHpo- Bale wa6iOHoB, OGoGUleHHoe NporpaMMuposakite H AaBIK C++, KoMGNHaUNA STHX aa1e- MEHTOB NO3BOTHIa NOCTHYb BBICOKOTO YPOBHs FOTOBHOCTH Kola K MOBTOPHOMY HcrI0s130- BaHHIO, YCNOBHO TOBOPS, KAK B TOPHSOHTATLHOM, TAK H B BePTHKATBHOM HampantenHsx. B TOPH3OHTATBHOM HaMpaBleHHH HeGONBUNCe KOMMYECTBO GHOAMOTeYHOTO Kosa NOsBONseT peamH30BaT OrpoMHoe — B MPHHUUNe, GecKoHeYHoe — KOAYECTBO CTpyKTYp H Monenefi noneaenus. B BeptHkanbHoM HarpamieHHM cTeneHb O60GileHHOCTH STHX KOMTIOHEHTOB AenaeT UX MpHroHbIMH Jit WMpoyaiiuiero Kpyra nporpaMM. CBOHM rosBHeHHeM KHHra OGs3aHa MpoeKTHpoBAHHiO w1aGOHOB, KoTOpoe NosBONAET Co31aBaTb MOLIHbIe cpeiCTBA pelleHHH YaCTO BCTPeYaIOWLNXcH 3ala4 OGBEKTHO- OpHeHTHpoBaHHolt paspaGoTKH nporpaMM. [poeKTHposaHHe wWaGroHoB — 970 TulaTeAbHO oToSpanHble MPUMepbI Xopoulelt paspaGoTKH — pelleNIT! MPABHIBHBIX, MPHTOAMBIX K MO- BTOPHOMY HCHONbIOBAHHMIO PCLICHHit 3ada4, BOSHMKAIOULMX B pasIM4HbIx OGnacTsX, OcHOB- Holt 3azaNei MpoeKTHPoBAHHs UlAGTOHOB ABIAeTCH COIAHHeE COsepxaTeMBHOTO TeKCHKOHA (suggestive lexicon) a2 porioulaemnix paspa6oToK. ITH waGAOHEI ONMCHIBAIOT 3aA4Y, €€ MPOBePEHHOE BPEMCHEM PeliieHHe ¢ PaIHbIMH BapHaHTaMH, a TaKKE MocTeNCTBUs BHIGOpA onHoro 13 HHX. FTpoekTHpoaHHe waGIOHOB He CBA3AHO C KOHKPeTHBIMH sI3bIKaMH 11p0- TpaMMuponaHHs. Crelys onpedeneHHbim wa6voHaM npoeKTHpOBaHHs H KOMGHHMpYa Hx APT © APYTOM, KOMMOHCHTEI, MpescTaBNeHHble B stoi KHMTe, CTPeMATCH OXBATHTb KaK MOXHO Govlee LMPOKHIt Kpyr KOHKPeTHBIX 3aa4. O606meHHoe NporpaMMHpoBaHe — 3To MapalMrMa, B LeHTpe KoTOpOIt nexKaT aGcTPAKTHEIE Tunbl, y3KHit HaGOp cyHKLMOHATBHBIX TpeGOBAHHii H afOpHTMbI peavlH3aLMH, BbIPwKEHHDIC B TepMHHAX 9THX TpeGonAHHii. FlOcKONBKY ANTOPHTMBI CAMH OMPEAEISOT TOUHYIO H TECHYIO CBAIb ¢ THMaMH, KOTOPKIMH OHM MOTyT MaHHITyMpOBaTb, OHH H TOT 2ke AATOPHTM MOXHO MPHMEHsITb 48 paGoTbI ¢ AIMpOKHM cneKTpoM THnos. JLtr peanH3aLLHH anopHTMOB, MPHBELeHHBIX B ITOH KHHTe, HCHO/LIORAHBI MeTONb! OGOGUeHHOTO MporpaMMUPOBAHHA, MOIBONAIOUIME JOCTHYG MH- HUMANBHOMt CeUMHYHOCTH, HeBepomTHO!t JTAKOHMYHOCTH 1 acbbeKTHBHOCTH, NPHCyLLAX Npo- rpaMMaM, TulaTenbHO paspaGOTaHHBIM Bpy4HYIO. B kavectse cpencTsa peatH3auKM B KHMTe HcnonbsyeTeR ToIbKO a3bIk C++. B oroit KHUFe BbI He HaiUleTe KONA, peamM3yIOUlerO H3AULHbIe CHCTEMbI OKOHHOLO MHTepieiica, CHOKHBIX GHGANOTeK JIA CeTeBOTO NPOrpAaMMHPOBAHHs HM MHTEMMIEKTYANBHBIX MeXaHH3- MoB perucrpaunH (logging mechanisms). Béecto storo Bbt oGHapyxuTe Maccy 6a30BbIxX KOMMNOHeHTOB, KoTOpple OGNerYaloT pellleHMe KAK BCEX OMMCAHHBIX BEIMe 3afa4, TAK 1 Muorux apyrux. Jt paspaGorky 9THX KOMMOHEHTOB, 135k C++ Kpaiine HeoOxoaum. Jle- XXAlUMit B TO OCHOBE MeXAHH3M YIpABIeHHs MAMATHIO, peatHs0BaHHBIli B AsbIKe C, rapaH- TUpyeT GBICTPOe BEINOAHEHME NporpaMM, NOMepxKa NOAMMOPHHSMa MOBoseT MPUMe- HATS MpHEMbt OGbEKTHO-OPHEHTHPOBAHHOTO MporpaMMUpoBaHHs, a WaGAOHBI AONycKAIOT MCNOMbIOBAHHE HEBEPOATHBIX MALHH, MpesHa3HAYeHHBIX JUL ABTOMATHYeCKOl reHepauHn kona. [aGnonbr npoxousT KpacHoii HUTbIO Nepe3 BCIO KHMTY, MOcKONKy OK oGecne4n- BAWT Tecloe BIAMMONCHCTBME NoNsIoBaTeAK M GHGnMoTeKH. FonbsoBaTenb GuGaMOTeKH GykBaNbHO KOHTponHpyeT crocs reHepauMH Kona, NPHYEM sTOT crlocoG orpaHHuHBacTca caMoli GuGanoTeKoii. MpeaHasHayertte GHGAKOTeKH OGOGUIEHHBIX KOMMOHEHTOB — M03K0- JsiTh HOAbIORATEMIO COIABATS COGCTHEHHBIe THN M OMpeLeMATh HX HOBeNeHMe, a TAKKE MPABHAbHO OGLEMMHATh HX ¢ APYTHMM O6OGWLEHHbIMH KOMRoHeHTaMH. [lockosbKy MpH STOM HCMOMb3YIOTCH CTATHYECKHE METOLB, OMLMGKH, CBASAHHBIE CO CMELUMBAHHEM Ht TOs TOHKOM COOTBETCTBYIONAX (pparMeHToB, OGBIYHO OGHapyxHBAIOTCH Ha 9TaNe KOMMMARLMM. Ayauropua AyaMTopHs, KoTopoii mpemHasHavena 97a KHHTA, COCTOHT M3 aByx Yacreii. K mepsoii Ka- TeropHH OTHOCHTCA ONBITHBIE NporpaMMucTsl Ha C++, XesajouIMe OBTATeTS HaNGomee CO- BPeMeHHBIMKE MeTOAMM co3laHHs GHOAMOTeK. B KHMTe MpeCTARAeHb! HOBBIE MOWUHbIE 18 Npeaucnosue WAHOMBI si3bika C++, oBamaloLIe YAMBHTERDHBIMH BOIMOKHOCTAMH, HeKOTOpbIe H3 KOTO- PbIX HEBOIMOKHO GbUIO ceGe MpenCTABHTb. STH HAMOMBI OKAKYT HEOLEHMMYIO MOMOLIb TpH cosaaHHn GHOAMOTeK BEICOKOTO ypoBHs. Jin MporpaMMHCToB cpemHero YpOBHS, xe- JAIUINX MIOBEICHTb CBOI KBANMHKAUHIO, KHHTA TaKKe GyseT TlosesHO!, OcOGEHHO ecmH OHH NposBat onpesesrenHy!o HacroiuMpocts. HecMorps Ha To 4TO HHOTMa B KHHTe BeTpe- YalOTCH JOBONBHO CHOKHbIC sbparMeHTbI Koga Ha C++, OHM Bcerma CONPOBOXLaloTCA MOL- pOGHBIM KoMMeHTapHeM. Bropaa KateropHs COCTOHT M3 MOCTORHHO 3aHATEIX NPorpaMMHCTOB, KOTOPHIM HYAKHO cHenaTs eno, He TpaTA AMUIHETO BPeMeHH Ha Hay¥eHHe TeopHH. OHH MoryT MponycTHTs HanGonee cnOxHbIe AETANH PeaTH3aUHH H COCPeMOTOYHT coe BHHMAHHE Ha ucnozssoeanu NpemoxeHHoli GuOmMoTeKH. Kasam raza HaYHHaeTCA ¢ MOMpOOHOTO BRELEHHA M 3aKaH- MMBACTCA pAIIEIOM, MOCBAILLEHHBIM YacTO 3alaBaeMbIM BortpocaM. Jia NOHMMAHHS H HC~ NOMIOBAHHS KOMMOHEHTOB 9TH pases OKaXKYTCH RechMa mMonesHBIMH. KoMMOHeHTH MOXHO H3y4aTb He3aBHCHMO Apyr OT Apyra. OHH O4CHb MOLIHbE H TeM He McHee Ge3zonac- Hit, H, KPOMe TOTO, HX OYEH JeTKO MPUMCHAT B CBOHX IPHAOKEHHAX. Ot untateas TpeGyeTea xopouree 3HaHHe aabiKa C++ 4 XenaHHe sHaTb ero ule AyUULe Cneayer TakKe UMeTb MIpeCTABNeHHe O waGTOHAx BooBie H CTaHAapTHO! Gu6aMOTeKe ura6n0HoB (STL) 8 vactHocTH, 3HAHHe OCHOBHBIX WAGTOHOB MpoextpoBaHHs (Tama H ap., 1995) xKenatenbHO, HO He oGasarenbHo. HavOMb H WaGTOHbI, MPHMcHAeMBIe B KHHTe, LeTanbHo onMcanbl. OnHaKo 27a KHHTa TlocaueHa apyrofi Teme — B Heil He AenaeTes MOMKITOK MaKCHMaNbHO 0606- UT waGTOHBI MpoeKTHpoRanHs. MlocKonBky OHH paccMaTPHBAWOTCH C TONKH 3peHiis: MparmatHuHoro cosatent GHGAMOTeKM, aaxKe YHTaTeNb, HHTepecyloulMiica B OCHOBHOM waGiOHAMH NpoexTHpoBaHHs, HaiizeT AIA ce6H MHOTO HOBOTO, eciH 3aXoueT. BuG6nnortexa Loki B xnire onvestpaeres peanbiian 6u6mHoTeKa Loki, HanvcaHHas Ha sabike C++. JloKH (Loki) — 2T0 Gor octpoymust B ckaHAMHABCKOl MH¢ONOTHH, M ABTOp HasleeTes, HT opHTH- HaubHOCTs H THGKocTb TOM GHOAMOTEKH CooTBETCTBYeT HaIBaHiNIO, Bee sneMeHTEI GUGNHOTe- Kit HaxousTea B Ipoctpatcrse MMeH Loki. B mipHMepax nporpaMM MpocTpaHcTBo UMeH He YEAIBIBACTCH, TOCKOABKY 370 YBENHHHIO GBI paaMep KONA H 3aTEMHIUIO eTo ComepKaHHe. Bu6- aMoteky Loki MoxHO cBO6onH0 sarpy3HTb ¢ Web-crpannubt http://www. awl .com/cseng/ titles/0-201-70431-5. 3a HCKIONeHMeM vacTH, Kacaloulefica MoToKoB, 6HOmHOTeKa Loki Hanvcala Ha cTaHt- MapTHoM aabike C++. Yep, sTo o3Hayaet, YTO MHOrHe COBpeMeHHbIe KOMMMTSTOPEI HE cMoryr paGoraTb c Heli B TloTHOM oGbeMe. AI peamH3oBan M MpoTecTHpoBan GHOAHOTeKY Loki c Momoutio KoMnusTopos CodeWarrior Pro 6.0 Komnanmn Metrowerks 1 Comeau C++ 4.2.38 (06a KoMMuAaTOpa paGoramH Non yrpasieHHem cucteMbl Windows). Moxoxe, 4To Kommistop KAI C++ Takxe He 1ODKeH HMeTb ¢ 9TOH GHOAMOTeKOM HUKAKHX TIpO- Gnem. Kak Tonbko mloctaslMkH pacnpocTpaHaT HOBBIe, YCORepUIeHCTBORAHHBIE BepcHit KOMMHITOPOB, BI CMOXKETe 9KCIyaTHpoRATS GHGTMOTeKy Loki MomHocTEIO. Kon Gu6anorexn Loki, a TaKXe MIpHMepsI, TIpHBeTeHHBIe B_KHHTe, HerlombsyIOT Tony- ASpHBI cTaWIapT KOAHPOBAHUA, TIpeIOxkeHHbI Xep6om Catrepom (Herb Sutter). A yBe- peH, 4To BI erko ero NoiiMere. JToT cranmapr cBomHTeH K ceTyIOUIeMy. © Kaaccet, byHKUMH H MlepesHcMHMble THIIBI BLITASULAT Tak: LikeThis. © Tlepementisie 1 repeuncanmete 3Haenns BbIrnagst Tak: TikeThis. © Mlepemennbie-wienst sbirasuat Tak: 1ikeThis_. Mpeanenosne 19 © WaGrontite mapamerpet OSEABNAIOTCA ¢ KIHONEBLIM CIOBOM Class, ect OHH MIpen- ctannmot co6oi THM, OMpeserseMbii Mlonbs0BaTenem (user-defined type), 1 ¢ KmI0- SeBBIM CHOROM typename, ecHH THM sBMAeTeR MpoctEIM (primitive) Crpykrypa kaurn Kira coctout 43 aByx ocHOBHBIX acteft: crloco6i1 nporpaMMUpoRaHita H KOMMOHeH- rel. Yacts I (rnappt 1-4) onucsisaet croco6st mporpaMMUpoBaHua Ha a3bike C++, He- TonbayeMble B OGOGUICHHOM NporpaMMHPOBAHHH H, B YACTHOCTH, Aim comlaHis o606ileH- HBIX KOMMoHeHTOB. [pemctapteHo MHoxecT#o ocoBeHHocTeit H crioco6oR mIporpaMMupo- BaHHa Ha a3bike C++: mpockTMposaHne, OcHOBaHHoe Ha aHamM3e MoBemcHMs, YacTH4HaA CHeuMannsauMa WaGTOHOB, CIIMCKH THMOB, AOKANBHBIe KAaccbI MT. ITY YacTb MOxXHO UHTATS MOcreMOBaTeBHO, a 3aTeM BOIBpALlATECA K Heil 3a KOHKpeTHOA HHcbopaunelt. Yacre UI opraHvaopatia Tak >Ke, Kak M uacTe I. B Heit paccmatpuBaetes peatH3auntst 0606- UIeHHBIX KOMMIOHeHTOB. 3iecb HeT HCKYCCTREHHEIX NpHMepos, Bce OTMcaHHbIe KOMIIOHeHTbI HenonssyloTen B peanbHbIX MpiIOKeHHAX. [poGreMbt, exeIHeBHO BcTAIOUMe Nepen TporpaM- MucTaMH Ha sabike C++, HampHMep, MHTeNTeKTYATBHBIe ykaxaTeTH, ¢aGpHKH O6KeKTOR GbytiKropet, oBcyxuatoTes ry6OKO H peulaloTcs B OGIIIEM BiMte. PeanH3ALIKM, MpHBEMEHHBIC B TekcTe, OpHeHTHpyioTes Ha OCHOBHBIe MOTpeSHOCT MpOTPAMMHCTOB H MpeaHasHaveHtbl Ais pe- WeHMA yHaMecHTAIbHBIX 3ala4. BMecro Mospo6Horo OGbACHeHMA, YTO HMeHHO JemaeT TOT WIM MHOIt cparMeHT Koma, B KHHre MOcnemOBaTebHO MIPHMCHACTCA CEAYIOLUMH MODXom: cHata~ na OGcyKMAeTCA 3a1ava, a 3aTeM BbIGMPACTeR M peaTHsyeTCA MTOM ce PeLIEHHA. Tapa I nocpaulena KiaccaM crpaternit — WaHoMaM s3bika C++, Mo3BonmIOWIMM co3- agate THGKHE Wa6IOHBI. B rane 2 o6cy:kaaioTea OcHOBHbIE crIocobbI NporpaMMHposaHHi Ha s3BIKe C++, OTHO- emiuiecs K OGO6ILleEHHOMY NporpaMMupoBaHisio. Crickn THnoR, mpencTaprmomne co6oK MOUIbIe CTpyKTYpbI At MaHHMyAAUKH ¢ TH Tami, peatsyiotes B rape 3. B raape 4 oncbipactea BaxHbIi BCTOMOraTenbHBIM HHCTpyMeHT — MexaHM3M pacripe~ AeAeHMA TaMATH ALIA HeSombUIHX OSLeKTOR (small-object allocator) OGobuleHHbte CYHKTOPEI, HcHONbsyIOUMe WaGIOH MpoeKTHpoBAHMA Command, oGcyxK- aaiotes B rape 5. B raane 6 oncsiBaioTcn CHHTATOHBI Trapa 7 nocpmleHa HHTeAIeKTyATBHBIM ykasaTenAM. B raane 8 onncbinatoreR O6oBiLEHHBIE (baGpHKH OBKeKTOB. Tnapa 9 nocpauiena ua6ioHy mpoekTupopaiiia Abstract Factory M ero peanH3aunn, B raze 10 B O6uleM BHule peaTH30BaHO HECKONBKO BapiaHTOR Wa6noHAa NpoeKTHpoBa- wna Visitor. MexanvaMbt MybTHMeronos (multimethod engines), mpeactasntioune coboH peuienust, OpHeHTMpoBaHHBIe Ha HcmOMIOBAHHe TOTOBLIX KOMMOHEHTOB, peanH30BaHbI B rape 1} 20 Mpeancnosne BnarogAPHOCTH Tpexte Beero xo4y No6saronapHTb MOHX poaHTeneit 3a HX NocTosHHyIO sa60Ty. Caeayet nomYepkHyTb, 470 STO! KHHTH, Kak H GOnbUIMHCTBA MOHX mporbeccHoHabHBIX yenexon, He 6110 Gb Ges Cxorra Meitepca. C momenta Haureli setpexH Ha BcemupHom Kourpecce io C++ (C++ Worlds Congress) p 1998 roay Ckorr noctosHHo noMorat Mie. Ox nepsbim c SHTY3Ha3MoM NomIepxkal MOM paHHMe Mac, CKOTT nosHaKOMHA McHA c ALxoviom Bayccvstecom, nosoxHs Hayao Haulemy cotpyzHMYecTBy. OH mocopetoBan Xep6y Cartepy caenatb Mexia oSospenatenem xypHata “C++ Report” 4 mpuaer B HaqaTeabcTBO Addison-Wesley, npakTH¥eckH BBIHYMB Ha4aTb 3Ty KHury. B KoHUe KOHLOB CKOTT CBOHMH COBeTAMH H 3aMeYaHHAMH MoMoran MHe BCe BPeMs B Mpouiecce paGoTbI Had KHToli, paste- 3H CO MHOli TBOPYECKHE MYKH. Buipaxato rayGoxy!o npusHaterbHocts Jbkony Bavccuecy, KOTOpbIii CBOMMH pe3KHMHt 3aMeyaHHaMH y6edMA MeHs, 4TO MOM PellleHHA He WleanbHbI, H NoMor Hx yayuusHTb. P1a- Ba 9 — ero sacayra. Ona NosBuAach B KHHTe Gnaronaps MocTOAHHbIM TpeGoBaHHaM JbKoHa He OcTaHaBAMBATCA Ha AOCTHEHYTOM M HcKaTb Gosee yaauHble peuleHus. Baarogapio Il. Ix. Tlaarepa (P. J. Plaeger) 1 Mapxa Bpvanina (Mark Briand), paoxHo- BHBILHX MeHA MHCaTb CTaTbH B XypHaT “C/C++ Users Journal” B To apems, Korna # Cun ‘an oGospenateneii 9Toro xypHaTa MHOTMIAHeTAHAMH. A oueHb npusHateneH Moemy peaaxtopy He66u Jladybeprn (Debbie Lafferty) 3a ee 110- CTOAHHYIO MOLEPAKY H MOEIHEIe COBCTHI. Mou koatern mo Komnanun RealNetworks, ocoGeno Bopuc D>xepkyniua (Boris Jerkunica) vu Zbxum Kuaax (Jim Knaak), o4€Hb loom MHe, coalap aTMociepy cBoGonoMbICrNa, conep- HMMeCTBA Hi CTPeMIEHHs! K BepLIMHaM MacTepcTsa. $1 oNeHb GrarouapeH HM 3a 3TO. Buiparkato cBolO MpH3HaTeNbHOCTb BCEM YuACTHHKaM xelimcy Kormuy (James Coplien), [yry Xazery (Doug Hazen), Kensuny Xerun (Kelvin Henney), Jxony Xwxnny (ohn Hickin), Fosapay Xunnarty (Howard Hinnant), Copuny Ibxnary (Sorin Jianu), 3oxrany Kopmowy (Zoltan Kormos), xeiimcy Kafinepy (James Kuyper), JIuse JIunmanxor (Lisa Lippincott), J>koarany Jlynaxsuety (Jonathan Lundquist), Metpy Maprunsany (Petru Marginean), Tlatpuxy Max- Kiwureny (Patrick McKillen), Onopuy Muxaitzy (Florin Mihaila), Copnry Onps (Sorin Oprea), Ayxory Torrepy (John Potter), AapHaty Pamutany (Adrian Rapiteanu), Monuxe Panutany (Monica Rapiteanu), Bpatiasry Crenrony (Brian Stenton), Anpwary Crecne (Adrian Steflea), Xep6y Carrepy (Herb Sutter), Dxony Topiio ohn Torjo), Paopuny Tporpuny (Florin Trofin) 1 Kpucru Baacsry (Cristi Viaseanu). Bee om BHecnH cBoit BKIaM B ynyuuleHHe pyxonucn. Bes HX MHe He yaaock Gbt chenaT H NOIOBHHB! paGoTbl. Cnacu6o Tpery Komo (Greg Comeau) 3a To, 4T0 oH mpemlocTaBiin B Moe pacnlopskeHne npesocxonHbiii KOMMMASTOp. B saknoveHne s XoTen Gbi NoGnaroxapHTb BCIO Mow CeMBIO 4 Apyseit 3a UX MOcTOAHHOE Nootpee HM NosepxKY. “Yactp | METO ‘pI PA3PABOTKA KIIACCOB HA OCHOBE CTPATErMn B otoit raze onvebiBaioTea noHsTHA cTpaTerHH (policy) H Kitaccos ctpareruit (policy classes), UIpAIOUIMe BAKHYIO PO B COBIAHHH OHONHOTEK, 2dxbeKTHBHO OGecreYMBAIOWUMX MOBTOPHOE venombaopaHHe Kola, Bu6tmoteka Loki Opvia 3amyMaHa HMeHHO TaKoit. Kpatko roBops, NPOEKTHPOBAHHE, OCHOBAHHOE Ha cmpamecum, MOSBONSET COBMARATE KAACC CO CROKHBIM TOBEACHHEM M3 MHOXCCTBa MAICHBKHX KJaccoR (HasMBACMbIX cmpameeuamu), KaXxIbII M3 KOTOPBIX OTBeYAeT TONBKO 3a ONMH YHKUMOHANBHIT HAH CTpykTypHbIit acnekt. Kak cesyeT 43 ee HAIBAHMS, CTpaTerHs ycTaHaRTMBaeT HHTepIpelic, COOTETCTRYIOUIN ompereneHHOMy cnoiicray. Ctpateriw MOKHO peaH3OBbIBATs 10-Pa3HOMY, MOCKONBKY HX METepipelicht LeTHKOM HAXOISTCS B KOMIETEHIUMH MIporpaMMHcTa. CMeuiinas M rloaronast cTpaterHu APYT K APYTY, MOXHO MoueMMPoBATb OrpoMHoe KoNH- MeCTBO BHJIOB MOBEACHHA, HCMONb3Ys HEGONbULO! HAGOp 31eMEHTAPHBIX KOMMOHEHTOB. Crpaterum McrlonpsyloTea BO MHOTHX TaBax STO KHUTH, OSOOWeHHBIA wWaGTOHHBIi xace SingletonHolder (riapa6) c NoMoUIbIO cTpaternit ynpaBnaeT ANMTeMHOCTHIO yHKUMOHMpoBAHMA HM OGecrleNMBaeT GesonacHocTh paGoTbI B MHOToMoTOUHO! cpene Knace Smartetr (rapa 7) MmouTH WenHKOM cKOHCTpyHpopaH M3 cTpaternii. MexanusM ABOlHO! AMcneTYepHsauMH (double-dispatch engine), omMcaHHbHt B rnape 11, HcrronEsyeT CTpaterH 21a BHGOpa pasHEIX KOMMpoMHCcoR. Peamusauns OGOGuIeHHOM “aGcTpaKTHO! a6puxn” (Gamma et al. 1995), npuserentas B rnape 9, NpuMenseT cTpaterMio AIA BEI- Gopa MeToaa coamaHHst OGbeKTOB. B 9oToit rnape oncbisaeTcA npemHasHavenue crpaternii, paccmarpuBaiotes eTanH Hx MPOeKTHPOBAHHA H MPHBOAATCH CORETHI, MOIBONAHOULME PaIIOXMTh KNacC Ha CTpaTerHiK. 1.1. Pashoo6pa3ne metofos paspa6oTkn nporpamMMHOrO o6ecneyenua O6nacth npoexTHpoBaHis MporpaMMHOTo OGecrieveHHA KaK HHKakas Apyraa TexHMYe- ckas AMCUMMTHHA AeMOHCTPHpyeT GoBINoe pasHooGpasne MeTOsOB: OnHy M TY Xe sala4y MOXHO MpaBHIBHO PeUIHTs CaMbIMH Pa3HBIMH ciocoGaMH, MIPHYeM MeKIY MpaBIwbHEIM 1 HEMPABMIBHBIM pelleHHeM NeXT GecKOHeYHOe KONHMECTBO HKoaHcoB. Kaxxabifi HOBbtit cnoco6 oTKpEiBaeT HOBBI Mp. [IpH BEIGOpe OAHOTO H3 peUteHHit BOIHUKaeT MHOXKECTEO BO3MOXHBIX BapHAHTOR, HaYMHaA ¢ YPOBHA CHCTeMHOM APXHTeKTYpHI HM 3aKAHYMBaR Mameii- IWHMM 7eTANAMM KORMpORAHHs. TakHM OGpa3oM, paspa6oTKa MporpaMMHBIX CHCTEM 3aKIHO- vaeTes B BbiGope PeMeHHiA M3 THAHTCKOTO WHeNa BapHAHTOB. PaccmorpuM npocreiiimit npuMep HHSKOYpoBHeBO! paspaGorkH — MHTenAeKTYATbHBIE ykasaemi (raaba 7). HiTenvtextyanHbte yka3aten (smart pointers) npenctaniaior co6oii Klacebl, KOTOPHIE MOTYT OBIT KAK OAHO- TAK M MHOrOMloTOUHBIMH. OHM MOryT HcrIonb30- BaTb paMIMYHBle CTpATErHH BIAMeHH PecypCaMH, a TAKKE PaIHble KOMIPOMHCCHI Mex GesonacHocTio H cKopocTbio. KpoMe Toro, HHTeMeKTYANbHble Yka3aTeAM MOryT nomep- XUBATS WI HE TOMePXMBATS ABTOMATHYECKOe MPecbpasopatine B OBbINHDIE yKazaTeH. Bee 9TH cBoficTBa MOKHO cBoGOIHO KOMGHHMPOBATE, MpHIeM OGbIIHO B KOHKpeTHOIt o6- JacTH, AIA KOTOPOit MpenHasHa4eHo NporpaMMHoe OGecneveHHe, HAMAYMUMM sBIACTCA JIM OHO peUeHHe. PasHoobpasHe MeTOLOB co3laHHa MporpaMMHOTO OGecreveHHs MlocTomHHO cMyuiaeT Ha4MraIoWHx paspa6orunkos. Tepex HMMM CToHT KOHKpeTHas sazaya. Uro MpHMeHHT» 1A ee ycrrewHoro peuenia? Co6biTHa? OGbekte? HaSmtozaren? O6paribie BpIs0BbI? Bupry- anbHble Kaacce!? HlaGnoHe? Een aGcrparmpopaTbca OT KOHKPeTHBIX JeTateli, pasHbie pe- LeHits OKAKYTCH SKBHBALTCHTHbIMH, B ommmune of HoBH4Ka, onbITHBIH paspa6oTHMK MporpaMMetoro OGecreveHHA sHaer, ¥mo pabomaem, a 4mo — xem. Jia Kaxnoll KOHKpeTHOMt 3ala4H CYeCTBYeT MHOXECTBO MeTO- JOB peweHa. OHM OG1alaI0T CROMMH MpeMMyLeCTBAMH H HedocTaTKaMH, KOTOpbIe OMpe- JeAOT, HACKONKO TOT HIM HHOMl MeTOX MOMXOAHT Mit peuleHHa MocTABNeHHOH sana4n. Pewee, Koropoe Kaza1ock Brome MpHeMeMbiIM Ha GyMare, Ha MpakTHKe MOXeT OKa~ aaTbea OMIMGKOII Cosnapatb MporpaMMHoe oGecrieveHHe cAOKHO, MOCKONbKY paspa6oTHHK TocToAHHO OWKEH AeNaTh eiGop. A B TIporpaMMHpoBAHHH, KaK M BXHIHH BOOOUe, TpyzHO cHeTaTe TpaBiinbHbiit BBIGOp. Onurribiit paspa6orunk sHaet, Kakoit BbIGop BemeT K OcTABNeHHo! We, B-TO BpeMst kak HOBMYOK KaxXMbIi pas sesaeT War B HeHsBecTHocTb. OnbITHBIM apxHTeKTop mporpamM- Horo oGecrieveHHs HarloMMHaer Xopoulero WaXMaTHCTa: OH-BAAHT Ha MHOTO xOn0B Bneped. Tus stor HyxHO Jonro yurrrsea. BosMoxHO OSTOMY reHMaNbHBIe MporpaMMHcTb 6b1BalOT O4eHb MONOILIMH, B TO BPEMA Kak TeHHaMbHbIe paspaGoTHHKH MporpaMMHOTO oGecneveHHA OGbIHO HaxOMsTes B 3penOM Bospacte. KpoMe ronosonOMoK, MOCTOAHHO BOSHHKAIOINHX Neped HAYHHAIOWMMH paspa6oranka- MH, KOMOHHATOPHaA NPHpOsa APXHTEKTYPHbIX PCLICHHii MOcTaBAeT MHOrO XNOMOT co3ma- TenaM 6uOnHoTeK. Hit Toro 4TOGB peatHs0naTe GHOAMOTeKY, MpHrOmHy!O ana cosmaHuA NporpaMMHoro OGecrledeHHs, paspaGoTYHK MOMKeH KaccHPHLMpoRATe M alanTHpoBaTe MHOXECTBO THTMYHBIX CHTYaUHit. BHOAMOTeKY citellyeT OCTABHTS OTKPHITO!L wIA Monit KauHii, 4TO6sI MIpHKAaaHO! MporpaMMHcT Mor MIpHcHOCOBUTb ee WIA CROHX HYKA, cosaB KoHkpeTityio MporpamMy. Tleiictautensio, Kak ynakoBars rH6kHe, OcHoBaTeNbHO paspaGoTaHHble KOMMOHEHTH B 6u6nnoteky? Kak npexocTaBHTs Monb30RaTeMO BOIMOKHOCTS HACTPAMBaTb 9TH KOMMOHEH- Tu? Kak npeononets “npoksstHe BbiGopa” ¢ MOMOUIbIO Kola, MMelollero pasyMHBte pas- Mepb? Bor KakHM BOMpOCaM MOCBAULeHa 9Ta THaBa, a M BCH KHHTA B Les10M 1.2. Hegoctatkv yHuBepcanbHoro uHTepderica PeanusonaTb Bce Tol OSOAOYKOH YitHBepcanbHoro HHTeppelica — Heyna¥Hoe pewieHHe ro o6bACHAeTCA CeAYIOMIMMM NPHYnHAMH, K ocHoBHbIM HeraTHBHBIM MlocneACTRHAM Takoro BbIGOpa OTHOCATCA HHTeNTeKTYANbHBIE VoepKKHL, OTPOMHBIH paaMep 1 HesdbekTHBHOcTs 6uGAHOTeKH. PHraHTcKHe KaccbI O¥eHD HemPOAYKTHBHBI, MOCKONBKY Ha HX H3YYeHHe HYAXHO TPATHT GonbLIMe YcuMAHA, OHH CMU 26 Yactb |. Metopt KOM BEIMKH, a MporpaMMbl, HCTIOMb3yIOWUHe TaKHe KNaccBI, paGoTaioT HaMHOTO MeMIeHHee, 4YeM AHANOTH4HBIe MporpaMMbl, paspa6oraHHble Bpy4HyIo. Oanako capa 1M He caMoii BAXKHOI NpoGreMoii, CBASAHHO! C MCMOMb3IOBAHHEM YHUBEp- cambHoro WHTepdeiica, ABAaeTeA nomepa GesonacHocmu cmamureckux munos (static type safety). Ogta 3 OcHOBHDIX Heneit apxHTeKTYpst OGOTO MporpaMMHoro OGecrreNeHHA — BOTMIOWIEHHe HEKOTOPEIX aKCHOM “ro onpeneteHMi0”. Hanpumep, Herb3a OnHOBPEMCHHO cosaparb sia o6bexTa Knacca Singleton (rapa 6) HIM OGveKTEL HerlepeceKaIoULXca ce- Meiicrs (disjoint families) (rapa 9). B waeane paspaGoruk gowxkeH HaksaabiBatTb Gonb- LWWHHCTBO OrpaHHyeHHii Clue Ha 3TaNe KOMMWAALHH. B Gonbuiom BceoObeMMOUIeM MHTepielice OeHb TpyAHO yuecTb Bee NoZOGHBIe orpaHH- NeHMst, OOBIYHO KOHKPeTHBIe OrPAHHCHHs CEMAHTHYECKH COOTBETCTBYIOT HMI HacTH HH- Tepteiica. Sto BeneT K YBEAMYEHHIO. paspbipa MEXLY cukmakcuNecKoll W cemanmuueckoll npaguabHocmio NporpaMM, HCTOABSYIOULNX ZaHHYIO GHOAHOTEKY. PaccMoTpuM, HaMpuMep, acnekT peanusaunu oGbexta Kiacca Singleton, cBasaHHbiit c GesonacHoctsio paboTsi B MHoronoToUHO!t cpeue. EcnM GHGTMOTeKA NoMHOCTHIO HHKaricy- AMpyeT MOTOKOBEIe CBOLicTBA, TO MOMbIOBATETS KOHKPeTHOI, HemepeHOCUMOl cHcTeMBI He MoxXeT HcriombsoBaTs GHOAHOTeKY CHHTATOHOB. Ecru 91a 6uGaNoTeKa MpemoctapnseT 10c- TYM K OCHOBHBIM He3alHWeHHbIM GYHKUMAM, BOSHHKA€T OMacHocTb, 4TO NporpaMMHcT Paspyliur GHGAMOTeKY, HanHcaB KoA, KOTOpHIii GyeT CHHTAKCHYECKH MpaBHIbHBIM, HO ce- MAHTHYECKH HeBepHBIM. Aso, ccaH GHGNHOTeKa GyseT PeanHSORbIBATS PASHbIe MPOEKTHHI PeLLEHHA B BIULE PAsHIx kuiaccon Gostee cKpoMHoro pasMepa? Kaxabiii Knlacc Mor 6b BOTUIOUIATb KOHKpeTHoe npoekTHoe pewenne. TIpy HcronsonaHHH HHTeNeKTYANBHBIX yKasaTeeii, HANPHMEP, ECTECTREHHO OXH- JaTb NOARIEHHE MHOTOUNCHEHHbIX peanHsaumit: SingletonthreadedsmartPtr, MultiThread- edsmartPtr, RefCountedSmartPtr, RefLinkedSmartPtr T.n. Alna aToro noaxoma XapakTepeH pe3KHit poct KOAHYECTBa Pa3HbIX BaPHAHTOB MpOCKTHBIX peurenmii. Yerbipe yMOMsHYTHIX KACCA MOTYT MPHBECTH K TIOABNEHIIO HOBEIX KOMOHHA- unit, HanpuMep, B Bue Klacca SingleThreadedRefCountedsmartPtr. Mpeobpasopanne THNOB NpHBeeT K ele GOMbUIEMy KOMHYECTBY KOMOMHALMIi, KOTOPbIe B KOHUe KOHLOB BbliiqyT 3a paMKH BO3MOXHOCTeH KaK MporpaMMHcTa, TaK H Mosb30BaTeNIA GHONMOTCKH. Ouepiuto, 470 yurTH 9THM nyTeM He cxeayer. MpeomosleTs SKCNOHEHUMANBHbI PocT BapH- AHTOB ¢ NOMOULbIO TPYGOIt CHLUTEI HEBOIMOKHO. Takoro poua GHONMOTEKH He TOKO TpeOyioT JIA CBoeit paspaGoTKH H NpUMeHeHHa or- POMHBIX YMCTBEHHBIX YCHIMii, HO H ABIMIOTCA KpaiiHe HerHOKuMn. Maneituaad HenpenBn- HeHHas Hactpolika — HanpuMep, TOMbITKa HHMUHAM3KpoBaTb KOHKPeTHbIM 3Ha4eHHeM. HHTEAEKTYANBHBIe YKa3aTEMM, CO3IAHHBIe NO YMOMMAHMIO, — MPHBOAMT BCe TULATEbHO paspaGoranHble Kiaccht GHGTHOTEKH B IuIaveBHOe cocTOAHHe. B mpouecce paspaGorkKH NporpaMM Ha HHX HaKMaqbIBalOTes OMpereneHHbie OrpaHHvie- Hus. CreonaTetbHo, GHGIKOTeKH, OpHeHTHPORAHHBle Ha paspaGoTKY MporpaMM, AODKHBE JABATS MOMbIOBATEMIO BOIMORHOCTH (hOPMYAMPOBATS céou coOcmeennele OIPAHMMCHUA, a He HaBASbIBATb ecmpoenHwre. Paa 4 HaBCerda 3aKOHCepBUPOBAHHbIe NpoeKTHbIe peLlieHHA MOTT OkasaTHCA TAK KE HEMPHTOAHBIMH 1st GHGTHOTEK, OPMeHTHPORAHHBIX Ha paspaGoTKY MIpo- TpaMM, KaK, HaNpHMep, KOHCTAHTSI, ABHO 3alaHHBbIe B OGBIMHBIX NporpaMMax. PasyMcetes, HaGopbl “HaHGorce MOMyAApHbIX” HK “peKOMCHAYeMBIX” TOTOBBIX pelieHHit BHomHe 20- TYCTHMBI, ECAH MPOrPAMMHCT MOKET H3MCHSITb HX 110 Mepe HaLOGHOCTH. STH nporeMb! HLOCTPUPYIOT HeGATONPHATHYIO CHTYALLHIO, CROKMBULYIOCA B OGAACTH paspa6orKH GuGMHoTeK. Bosbuloro KOMMYeCTBa HU3KOYPOBHERBIX YHHBCPCAIBHBIX M crie~ UMAM3KpoBaHHBIX GUGAKOTeK, OGTerYaiOWWMX paspaGoTKY MporpaMM, T.€. CTPYKTYp BbICO- [naga 1. Paspa6orka knaccos Ha ocHoge cTpateriit 27 KOTO yPOBHA, NpakTHYECKH HeT. 3To MapaoKcanbHas CHTyALNA, NOcKONbKY mOG0e HeTPH- BANbHOe MpMOXeHME BONOMIAeT HEKMe MpoeKTHBIe peuleHHs. CaeoRATEMbHO, GHONHO- TeKH, OPHEHTHPOBAHHBIE Ha COILAHME NPOrPAMM, AOKHE! GBI OM HaliTH IPUMeHEHHe B SonbUMHCTBe NpHIOxXeHH STOT Mpoben MONBITAMMch saMlONHHTe crleuMaNBHBIe Cpemb paspa6orKH (frameworks). OaHa- KO OHH B OCHOBHOM MpeAHASHAYeHbI LIS TOTO, YTOOBI CBAGATb MIPHOKEHHE C KOHKPETHEIM MPO eKTHDIM PeUIeHHEM, @ BOBCE He AIA TOTO, 4TOGbI TOMOYb TloMBIOBATEMO e6iGpame Wu Hacmpoumd cBolt_mpoekt. Ect nporpaMMuct CTpeMuTca peaTH30BaTb CBO! OPUTHHATbHBI NpoeKT, OH JOWKEH HaYHHaTE Ace “C HY”, cosnaBAR Knaccel, PYHKUMH HTM. 1.3. OnacHo nu MHoxKeCTBeEHHOe HacnegoBaHne? PaccmotpuM Kilacc TemporarySecretary, Mpou3BorHbIit oT KNaccon Secretary H Tempo- rary onHoppementio!. Ksacc TemporarySecretary oGslataer cBoiicTBAMM OGOHX KNACCOB, OMM- CbIBAR KaK CeKPETAPA, TAK H BPEMEHHO HaHATOTO calyKautero. KpoMe Toro, OH MOXeT METS 1 CBOM OcOGEHHOCTH. BTO HATATKBACT Ha MBICIB, HTO MHOXeCTBeHHOE HacseORAHte MOXKET 110 MOMB HAM CIpaBHTKCH C SKCHOHEHUMATBHBIM POCTOM KOSHYECTBA MPOCKTHBIX peUIeHHii ¢ 110- MOULBIO ManOTO YHA TUlaTENbHO NoLOGpaHHbIx 6a30BbIX Kaccos. B TaKOM cily4ae MONBsOBa- TeNb CMOT GBI COMAT KNACC JIA MHOTONOTONHOTO HHTeMIeKTYAMbHOTO YKAIATENA, MONCHHTBI- Baioulero KomMYecTBO ccbLIOK (reference-counted smart ponter), mbipent ero H3 HeKOTOporo kaacca BaseSmartPtr H Klaccon MultiThreaded H RefCounted. Jo6oH onbiTHBiii paspabor- 4K KiIaCCOB 3HaeT, 4TO 9TOT HaMBHBIM Toxo He paGoTaer. AHa.1H3 MpHYHH, MO KOTOPbIM MHOXECTREHHOE HACMeAOBAHHe HE MOSRONAeT BONIOUIATb THOKHe MpoeKTHBIe PewleHHs, MoMOraeT HaitTH NpABHAbHBI BbIXOR. TMpobreMbI 3aKTIONA- ores B caenyroulem. 1. Mexanuxa. He cyutectayet ctaruiaptHoro Kona, nosnonmoUlero OGbeAHHMITe Hacre- AYEMbIe KOMMIOHEHTSI B OZHO HeTOe CTAHAApTHIM O6pasoM. EAMHCTREHHbIM HHCTPY- MeHTOM, JAI01LMM BO3MOXHOCTh OGBEMMHHITh Kuacchl BaseSmartPtr, Mul- tithreaded u RefCounted, aBnsetcs sSMIKOBBII MEXAHHIM, HaaBIBAeMbIit sMHooKecm- gennem nacaedoeanuem (multiple inheritance). Jaa oGenMHeHa Gaz0BbIX KIaccoB NpMMetneTes Mpocras cynepnosHuna H YCTaHaRAUNAIOTeA Mpasita doctyma K Ux seam. 3TO COBEpUIeHHO HeAOTIYCTHMO M paGoTAeT AMUID B MpocTefUMX cayyasK. Yauie cero 14 WOCTHXKEHHA xesaeMoro odxbeKTa MIporpaMMHCT BHINYKNEH THIa- ‘TeMbHO HaCTpaHBaTb MOBeAeHHe HaCTeAyeMbIX KIACcOB. 2. Huopmayus 0 munax, Basonbie Kiaccbl He HMeIOT AOCTATOYHO HH opMauntt © TH- Tax, YTOObI BEINOAHHTh cBOD paGory. [pencTaBHM, HaNpHMep, 4TO MbI TIbITaeMcA Peann30RaTh My6OKOe KOMMPOBAHHE HHTEMEKTYAIbHOFO MOKa3aTeEAA ¢ MOMOLIbIO HacienoBaHHst OT Gax0poro KAAcca DeepCopy. KaKoii HHTepielic ZoMKeH HMeTD Kace DeepCopy? OveniiaHo, TO OH BBIHYAIeH ComanaTh OObeKTHI, HMCIOUIMe THN, © Koropom"eMy HuNero He H3BECTHO. 3. Hamenenue cocmoanus. Pasiuutibie acriekTsl Monemenis, peamuz0naHHbie B 6a30BbIx Kaccax, LOKHbI BAHT Ha OHO H TO Ke COCTORHMe. Bto O3HaYaeT, ITO OHH LODK- ' Qror npuMep co3maH Ha OcHOBe CTaporo apryMeHTa, KoTopniii BoipH Crpayctpyn (Bjam Strous- trup) npweea B Nombsy MHOXecTBeHHOTO HacTeMOBAHHA B epsom HanaHMH KHUTH “The C++ Pro- gramming Language” (cm. Crpayctpyn B. “Slsbik nporpammupouanua C++”. — M.: Mup, 1990. — Tipus. ped.). B TO BpeMA MHOXeCTBEHHOE HactetOBAHHe 8 s3bIke C++ eulle He GeLTO peanH30BAHO. 28 Yacte |. MeToap! HbI MPUMEHSATD BHPTYATbHOe HaCTeMOBAHHe OT GasoBOrO KJlacca, MMeroUlero 3aaH- Hoe COcTomHHe. 9TO ycnOKHAET paspaGOTKy H AesAeT e¢ HETHGKO!, NocKOABKY Mpen- Momaraetes, YTO KNACcbI NOMbIOBAaTeEAA HacHeAyIOT CBOHCTBa OT GHGAMOTEUHBIX Knac~ coB, a He HaoGopoT. Kom6uHaroptice ro cpoeit MmpHpoile, MHOXeCTBeHHoe HacmeTOBAHHe caMo Mo ceGe Hemb3s NIpHMeHST JL HowepKKM MHOFOBApHaHTHBIX MpoeKTHBIX pelleHHit. 1.4. Mpeumywectsa wa6noHoB Daa WMuTaUnn KOMGHHaTOpHOro MoBeAeHUA XopoUIO NomXoNAT WaGTOHBI, NocKONEKY OHH MO3BOsOT FeHePHPOBATE KOA BO BPEMs KOMIMIAUMH, OCHOBBIBACh Ha THMaX, yKa- 3aHHBIX Momb3opaTeIeM. To cnocoby HactpoiikH waGAOHHBIe KNAaccbt NPHHUMMMANbHO OTTHYAIOTCH OT OGBIYHEIK. Eon HYKHO pean3oBaTb KaKOli-TO CNeUMaNbHBIi BapHaHT, MOKHO creUMaTHsMpoBaTD (specialize) so6ble @byHKUMH-WeHbI waGTOHHOTO Kacca, KOHKpeTH3upoBaB ero, Hanpu- Mep, ECM 3alaH Wa6TOH SmartPtr, MOXHO CNeuMaTH3HpoBaTs MoG6ylo byHKUHIO-WIeH kaacca SmartPtr. Sto MosBoNAeT XOPOIIO AeTAIMSMpoRATS NOBeNeHHe HacTpaH- Baemoro wa6n0Ha. Bonee Toro, 1 WaGTOHHBIX KIACCOB ¢ HECKOABKHMH MapaMeTpaMH MOXHO HcTIO1b30- BaTb WACTHYHYIO UIAGNOHHYIO crleuHaTHsattMto (KaK MBI YBHIMM B Tape 2). 9To 2aeT Bos MOXHOCTb CrEMHAMHIMPOBATh TOMBKO HEKOTOPBIC H13 apryMeHTOB waGsOHHOFO Knacca. Ha- NpHMep, ¢ TloMoUibio cneuHanHzauHn template class Smartetr { ... MOXKHO CHeLMATH3HpoBATh WaGAOH SmartPtr sa Kacca Widget, a TaKXxe ANA T0- Goro apyroro THNA, HCMONB3ym CREAYIOUYIO CHHTAKCHYECKyIO KOHCTPYKUMIO: template class SmartPtr { ... }; Cratwyeckas 1 KOMOMHaTOpHaa MpHpona waGnoHOB AenaeT UX ONEHS MpMBNeKaTeAb- HBIMH JI CosmaHMs ¢pparMeHTOB MpoeKTHBIX pellleHfi. OnHaKo Ha NYTH peanH3aulKH Ta- Koro MOUXoMa cylUeCTBYeT HECKONBKO HEOMEBHAHBIX MperisTcTBHit. 1. Heaosmoaeno cneyuaausuposams cmpyxmypy. Viclonbays Aut wa6AOHBI, HeBOSMOx- Ho cHleunanuauponats crpyktypy Kacca (T.e. ero JaHHbIe-WWienbi), CneunaTHsHpo- BATS MOXHO TOMBKO (PYHKUMH. 2. Chenuanusayua dyncuuil-uaenos He macuuma6upyemca. MoHO crleUMalH3HpoBaTb HO6yIO SPYHKUNIO~WIeH LiAGTOHHOTO KNacca C OTHUM UAGLOHHEIM NapaMeTpoM, HO HeBOSMOXHO CrleuMannaHpoBaTb OTIeMbHBIC (PYHKUMH-UIeHbI LIA WaGTOHOB c HECKONSKHMH UaGTOH- HBIMH TiapaMeTpamn. [TpolumocTpHpyeM 9TO yrBepxJIeHHe MPHMEpOM. template class widget void Fun() { ... o606weHHan peannzauna } 7/ OK: cneuvannzauna oyHKuMn-YneHa Knacca widget Fenplace <> Widget: :FunQ s+. CN€UMANM3ZKPOBAHHAA peannzaunA ... template class Gadget void Fun® { ... o606ueHHan peannsauna ... } Tnaga 1. PaspaSorka knaccos Ha OcHoBe CTpaTernit 29 3; 7/ Ouw6xa! YacTH4Haa CneunannsaunA dyHKyMH-uneHa 7/ «nacca Gadget HeBo3MoxHa! fenplate void Gadget::Fun() { ... CneuwannsuposaHHaa peanuzayua ... } ui 3. Aemop GuGauomexu He Momem sadam» Keckoaxo sHaxenuit no yMonanup. B nysurem cryyae NporpaMMucr, peanu3yloUIMit WaAGAOHHBIH Kiacc, MoXeT sanaTs ANA Kaxknoit OYHKUMH-WeHa ORY peanHsauMio No yMonvaniio. LWaGnonHaa dyHKUHs-weH He MOXET HMET HecKaabKO APTYMCHTOB, 3a1aHHBIX 110 YMomYaHMLO. CpaBHum cnicoK HemOcTaTKOB MHOKECTBEHHOTO HacneMoBAHHA co crHCKOM HenocTaT- KoB wa6noHOB. MHTepecHo, TO MHOXeCTHeHHOe HactesOBAHHe H WAGAOHEI JOMOAHAIOT Apyr apyra. MHoxKecTBeHHOe HacteMoBaHMe YeTPOCHO NOBOALHO MIPHMHTHBHO; UaGTOHDI, HaoGopor, OGnaTa‘oT GoraTbIMH BOSMOXHOCTAMH creLinanH3aLMH, MHOXKeCTREHHOE Hacye- AOBAHKE TepxeT HHCopMALIO O THNAX; WAGNOHS MMH HI06HNYIOT. CneuManHsauns wWa6- JOHOR, B OTIHYE OT MHOXECTHEHHOTO HacmemoRaHHs, He MacuITaGupyetes. B uaGnoHax Aaa PYHKUMH-WeHa MOXHO 3alaTb TONGKO OH apryMeHT MO YMOMYAHItIO M cO3MlaTb Heor- PAHHYEHHOe KOMHYECTHO Ga3OBBIX KIACCOB. Bee 970 MlosBossteT NPeANOOXHTS, YTO C NOMOUIDIO KOMGHHHPOBAHA 1a61OHOB M MHOKe- CTReHHOTO HacAeIOBAHHT MOKHO CKOHCTPYMPOBATH Oe THOKMIK MeXaHHIIM, MpHTOMHbIit JU comaHia GUGMHOTeK, cOmePKaLLNX TOTOBBIe SeMEHTE MpoTpaMMHOTO OGecriedeHHs. 1.5. Crpateruu u knaccbi cTpaterni Crpaternn H Kilaccb! cTpaTernit nosBonaioT peatHsoBaTb GesonacHBle, abibeKTHBHBIe H JerKO HACTPAMBAeMbIe SNEMCHTbI TIPOEKTHBIX peuleHUi. Cmpamezux (policy) onpenerser untepieiic oGbiuHoro HK WaGTOHHoro Kiacca. DoT uHTepdelic coctouT H3 onpeneneHHA BHYTPEHHHX THNOB, (YHKUMH-WICHOB H TepeMeHHBIX-WICHOB. Tlonatie crpaterHH HMeeT MHoro o6ulero ¢ xapakmepucmuxamu (traits) (Alexandrescu, 2000a), Ho OTIM¥aeTeA TeM, YTO B HUX MeHDIIe BHUMAHHA yjlerseTeA THNaM M Gombile — noseachiio. Kpome Toro, NOHATHe cTpaTerHH, npeWIOxXeHHOe HAMM, HanlOMHHaeT cmpa- meeuu npoexmuposanua (Gamma et al., 1995), Ho B OTAMYHe OT HHX KllaccbI cTpaterHit cBA- SbipaloTcs Ha STaNe KOMMMASLAH. Hanpumep, onpesenum crpateriio a4 costaHua oGveKtos. Crpaterus Creator onn- cbiBaeT WaGAOHHDI Kiace THNa T. SroT waGOHHBII KNacc AOMKEH NpemocTaBHTb byHK- UWio-WIeH ¢ HMeHeM Create, He MMeIOWIYIO ApryMeHTOB M BOSBpaUaloMlylo ykasaTeNb Ha o6teKT Kitacca T. Sto osHayaeT, TO KAXAbIH BHISOB (PYHKUMN Create AO/KeH BOSBpaulaTb ykasaTenb Ha HoBbIi OObeKT Knacca T. TouHblit pexHM co3laHHs OGbeKTa onpenerseTcA BO BpeMst peanM3auHH cTpaterHu. OnpenesiwM HeckOIbKO K1accoB CTpaterHit, peasM3y!ollHx cTpatervio Creator. [bia sToro cywecrsyeT Tpit crioco6a. Bo-nepsbix, MOKHO HcnanbsoBaTe onepatop new. Bo-BTOpbIX, BMECTO onepatopa NeW MOXHO BbISBATb ¢yHKUMIo malloc (Meyers, 1998b). B-1peTbHX, HOBbIe OFREKTBI MOXKHO CosmaBATb, KIOHMPys HX NpotoTHnbs. PaccMoTpHM 3TH MeToBI. template struct OpNewCreator 7 static T* Create() { return new T; 30 Yacte |. Metoapt } a template struct MallocCreator { static T* Create() void* buf = std: :malloc(sizeof(1)); if Cibuf) return 0; return new(buf) 7; } ai template struct PrototypeCreator t PrototypeCreator(T* pobj = 0) Prototype_(pobj) T* Create() return pPrototype_ ? pPrototype_->Clone() : 0; T* GetPrototype() { return pPrototype_; } void SetPrototype(T* pobj) {pPrototype... = pObj;} private: T* pPrototype_; Mavitian crpaterus MoxeT UMeTb CKOMbKO yromHo peanHsaunit. Peanu3aunn crpaternit Hasbipalotes Kaaccamu cmpamecuit®, Knaccet crpaternit no oTenbHOCTH He McnombsyioTes. Onn anGo HacaeayloTer APYTMMH KNaccaMH, M60 COAEPKATCH B HIN. CueayeT OTMeTHTb, YTO, B OTIMYMe OT KlaccH4ecKHXx HHTepdelicos (KoMIeKUM 4MCTO BUpTYANbHBIX dyHKunit), uHTephelicet cTpaterHit He MMeIOT YeTKorO onpeeneHHs. Crpa- TerHM OpveHTUpylotes Ha cHHTaKcHe, a He cMrHaTypy. MHbIMH cAOBAMH, cTpaTerHs Crea- tor ompesenset, Kakas! CHHTaKcH4ecKam CrpykTypa Kllacca CuMTaeTcA NpaBHAbHOH, HW He YTOUHSeT, KAKHe HMCHHO ¢YHKUMM Kiacc JODKeH peamHsoBbIBATe. HanpuMep, cTpateriis Creator He ykasbinacT, JOKHa 1H YHKUMs Create GbITS cTaTHYecKOH HI BUPTYARBHOit. Ona anu TpeGyer, YTOGH WaGTOHHBI KNacc OnpereAaT dyHKuMIO-wIeH Create. Kpome Toro, crpaterus Creator BbIpaxaeT NoxkenaHHe (HO He mpedyem), “TOGbI byHKuMa Create Bospaulata yka3zaTeAb Ha HoBbIit OGLeKT. CreMORATEAbHO, BIOAHE LOMYCKAETCH, ITO B OT- AeAbHBIX CHYYAAX YHKUMA-WIeH Create MOXeT BOSBpaullaTb Hysb WIM TeHepnpoBaTb He KIMONHTEAbHYIO CHTYALHW. JL1a onHoii ctparerin MOKHO peamH30BaTb HecKOMbKO Kilacco. Bee OHM ODKHbI cooT- BeTcTBOBATE HHTepDelicy, oMpeteneHHOMy cTpaterneli. 3aTeM, Kak MbI_BCKOpe yGeaHMcs, TlonbsopaTeNs cam BGepeT, KAKO! Kacc CTpATeTHH CHemYeT McrIoNbsOBaTs B GoNee KpyN- HBIX CTpykTYpax. Tpu knacca ctparernii, onpeneneHHEIx BEILIE, MMCIOT PasHBle peanMsauMH H MaKe crer- ka oTAMMarouIMecs MHTepheiict (HaTpHMep, Kiacc PrototypeCreator UMeeT Be JorION- HHTeNbHEIe byHKUMH — GetPrototype u SetPrototype). OnHaKo Bce OHH onpeserAIoT 2 90 Hasnale HeMHOTO HeTO“Hoe, MOCKONbKY, Kak MBI BCKOpe YOCAUMCA, PeATH3AUMAMH crpa~ Ter MOrYT GbiTh H waGrouneLe Kaacews. [napa 1. Paspa6orka knaccos Ha ocHose crpaterni 31 éynKumio c MMeHEM Create, BosBpalaioUly!o 3HaveHHe Tpe6yeMoro THMa, 4TO cooTBeTeT- ByeT TpeGOBAHHAM CTpaTerHH Creator. TlocmorpyM, KaK MOKHO Co32aTb Kilacc, MPHMeHSOWNi cTpaTero Creator. TaKoii Knace AomKeH ANGo ColepxaTb TPH Pattee OMIpeeAeHHBIX Klacca, MMGO HacreMoBaTs Hx CBOFICTBA, // Koa 6ubanoteKn template class widgetanager : public CreationPolicy yi Kaacett, HcrlonssyioulMe OnHY HAM HECKONDKO CTpaTerHit, HasBIBaIOTeR eaaeneumu Kaac~ camu? (host classes). B npBeneHHom BBIue npuMepe Knacc WidgetManager sBrseTor TAABHBIM K1accoM, O1aIaIOWUNM OBHOit crpaTerneii. TaaBHBIe KAACcbI OGREAHHAIOT CTPYK- TYP H YHKUMOHATbHEIC BOSMOXHOCTH CBOHX CTpaTerHil B OHH cocTaBHO!t Mozyb. Tipu Konkperusaunn (instantiation) wa6nona widgetManager K1MeHT nepenaeT ey HeKoMyio cTpaTerio, // Ko _npunoxennn typedef widgetManager < OpNewCreator > mywidgetmgr; Tipoatiannsupyem BOsHHKLIMi KoHTeKcT. Ecru oBbeKTy K1acca MyWidgetMgr Hy:Ki0 co3- Bare oGbeKT Kacca Widget, oH BEIsbIBAcT qbyHKUMO Create() m3 NogoGweKTa crpaTerHH OpNewCreator. OnHaKo BbIGOp cTpaTerHH comaHiia OObeKTOB HaXOMHTCA B KOMMe- TeHUMM rlombsonaTens Knacca WidgetManager. SroT Kaacc Mo oMpesleneHHto MOIBONAeT CROMM HonbsoBaTEAAM YTOUHSTE CHeLIM>UYECKHe AcTeKTEI CBOX bYHKUMOHANBHbIX BOIMOXKHOCTeH. Bot 5 vem sakmouaetca cyTs NpoeKTHPOBAHHA KiaccoB Ha OcHOBe cTpaTernit. 1.5, 1. Peanuszaynsa knaccos CTpaTernit c NOMOLbIO Wa6NOHHbIX NapaMeTPOB Kak i B mmpeabiayuiem npHMepe, uaGTOHHBI apryMeHT crpaTeruit sasactyIo HaAMUIeH. Heo6xoaHMoctb BHO sauaBaTb ulAGAOHHBIM apryMeHT cTpaterHH OpNeWCreator cosmaeT Heyn06cTs0, OObINHO TilaBHBIM Kiacc 3HaeT JapaHee WIM meCKO MOKET YCTAHOBHTS wa6- JOHHBIi apryMeHT Knacca cTparerHu. B paccMoTpeHHOM BILE MpHMepe KNacc WidgetMan- ager Bcerta ynpapnset OBBEKTAMH, UMEIOWMMM THN Widget, MosTOMy coRepleHHO H3- AMUIHE M MOTEHUMANBHO. HeGesonacHo TpeGoBATS, UTOGbI NoALIOBATEMb CHOBA YKASKIRAN ero Tip KOHKpeTH3auunH crpaterHH OpNewCreator. B 3Tom cayuae Koa GHGAMOTeKH MoXeT HcTlomb30BaTb WabioHHele waGAoNKELe napamem- por (template template parameters) cxeayroutum o6pasom. // Koa 6u6nuoteKn template