Кіріспе
Андрей Александрескудің кітабы: «Modern C++ Design: Generic Programming and Design Patterns Applied» – Андрей Александрескудің 2001 жылы Addison Wesley баспасында жарық көрген кітабы. Скотт Мейерс оны «C++ тіліндегі ең маңызды кітаптардың бірі» деп атады. Кітапта C++ бағдарламалау техникасы – шаблондық метапрограммалау пайдаланылады және зерттеледі. Александреску бұл техниканы ойлап таппағанмен, бағдарламашылар арасында оны танымал етті. Оның кітабында C++ бағдарламашылары кездесуі мүмкін нақты мәселелердің шешімдері келтірілген. Кітаптан алынған бірнеше тіркес қазір C++ қауымдастығында жалпылама терминдер ретінде қолданылады: қазіргі заманғы C++ (C/C++ стилінен өзгеше), саясатқа негізделген дизайн және типтік тізім. Кітапта сипатталған кодтың бәрі оның Loki кітапханасында тегін қолжетімді. 2001 жылдан бері кітап қайта басылып, бірнеше тілге аударылды.
Modern C++ Design: Generic Programming and Design Patterns Applied is a book written by Andrei Alexandrescu, published in 2001 by Addison Wesley. It has been regarded as "one of the most important C++ books" by Scott Meyers. The book makes use of and explores a C++ programming technique called template metaprogramming. While Alexandrescu didn't invent the technique, he has popularized it among programmers. His book contains solutions to practical problems which C++ programmers may face. Several phrases from the book are now used within the C++ community as generic terms: modern C++ (as opposed to C/C++ style), policy based design and typelist. All of the code described in the book is freely available in his library Loki. The book has been republished and translated into several languages since 2001.
Саясаттамалық жобалау
Саясатқа негізделген дизайн, сондай-ақ саясатқа негізделген сынып дизайны немесе саясатқа негізделген бағдарламалау, — қазіргі заманғы C++ дизайнында C++ үшін қолданылатын идиомаға негізделген тәсілді білдіретін термин. Ол стратегия үлгісінің компиляция уақытындағы нұсқасы ретінде сипатталған және C++ шаблондық метапрограммалауымен байланысты. Оны алғаш рет C++ әлеміне Андрей Александреску «Modern C++ Design» кітабы және «C/C++ Users Journal» журналындағы «Generic<Programming>» бағаны арқылы таныстырды. Қазіргі уақытта ол C++ және D тілдерімен тығыз байланысты, себебі оған үлгілерді жоғары деңгейде қолдайтын компилятор қажет, бұл 2003 жылға дейін кең таралған емес. Параметрленген жалпы кодқа негізделген осы тәсілдің бұрынғы мысалдарына ML тілдерінің параметрлік модульдері (функторлар) және жадты басқару саясаты үшін C++ бөлушілері жатады. Саясатқа негізделген дизайнның негізгі идиомасы — кластық үлгі (хост класы деп аталады), ол бірнеше типтік параметрлерді қабылдайды, олар пайдаланушы таңдаған типтермен (саясат кластары деп аталады) инстанцияланады. Әр саясат класы белгілі бір жасырын интерфейсті (саясат деп аталады) іске асырып, инстанцияланған хост класының мінез-құлқының ортогоналды (немесе көбінесе ортогоналды) аспектілерін қамтиды. Хост класын әрбір саясат үшін әртүрлі, дайын іске асырулар жиынтығымен ұсыну арқылы кітапхана немесе модуль компиляция уақытында шешілетін және хост класының үлгісін инстанциялау кезінде әртүрлі саясат кластарын таңдау арқылы қол жеткізілетін мінез-құлық комбинацияларының экспоненциалды санын қолдай алады. Сонымен қатар, саясаттың жекешелендірілген нұсқасын жазу арқылы саясатқа негізделген кітапхананы кітапхананы жасаушылар көздемеген мінез-құлықты қажет ететін жағдайларда пайдалануға болады. Тіпті әр саясаттың бір ғана іске асырылуы қолданылмаса да, класты саясаттарға бөлу жобалау процесін жеңілдетуге көмектеседі, модульділікті арттырып және ортогоналды жобалау шешімдері қабылданған жерлерді нақты көрсетеді. Бір-бірімен алмастырылатын модульдерден бағдарламалық жасақтама компоненттерін құрастыру жаңа тұжырым емес болса да, саясатқа негізделген дизайн осы тұжырымды жеке кластың мінез-құлқының анықтамасы деңгейінде (салыстырмалы түрде төмен) қолдану тәсілінде жаңашылдық білдіреді. Саясат кластары кері шақыруларға ұқсас, бірақ бір функциядан тұратын кері шақырудан айырмашылығы, саясат класы әдетте бірнеше байланысты функцияларды (әдістерді) қамтиды, көбінесе жай-күй айнымалыларымен немесе ұялы типтер сияқты басқа мүмкіндіктермен біріктіріледі. Саясатқа негізделген хост класын метафункцияның түрі ретінде қарастыруға болады, ол түрлер арқылы бейнеленген мінез-құлықтар жиынтығын қабылдайды және шығыс ретінде осы мінез-құлықтарды жұмыс істейтін тұтас жиынтыққа біріктіру нәтижесін білдіретін түрді қайтарады. (Дегенмен, MPL метафункцияларынан айырмашылығы, шығыс әдетте ұялы шығыс түрінен гөрі инстанцияланған хост класының өзімен бейнеленеді.) Саясат идиомасының маңызды ерекшелігі — әдетте (қатаң түрде қажет болмаса да) хост класы өзінің әрбір саясат класынан (жария) көптік мұрагерлік арқылы шығады. (Баламаларға хост класы әрбір саясат класы түрінің мүшелік айнымалысын ғана қамтуы немесе саясат кластарын жеке мұра етуі жатады; алайда саясат кластарын жария етудің басты артықшылығы — саясат класы жаңа әдістерді қоса алады, олар инстанцияланған хост класына мұра етіледі және оның пайдаланушыларына қол жетімді болады, бұл хост класының өзі білуі қажет емес.) Саясат идиомасының осы аспектісінің ерекшелігі — объектіге бағытталған бағдарламалауға қатысты, саясаттар базалық сынып пен туынды сынып арасындағы қатынасты теріске шығарады. OOP интерфейстерінде интерфейстер әдетте (абстрактілік) базалық сыныптармен бейнеленеді және интерфейстердің іске асырылуы туынды сыныптармен, ал саясатқа негізделген дизайнда туынды (хост) сынып интерфейстерді білдіреді және базалық (саясат) сыныптар оларды іске асырады. Саясат жағдайында қоғамдық мұрагерлік хост пен саясат кластары арасындағы «болып табылады» қатынасын білдірмейді. Бұл дәстүрлі түрде OOP контекстінде жобалау ақаулығының дәлелі деп саналатын болса да, бұл саясат идиомасының контекстіне қолданылмайды. Саясаттың қазіргі нұсқасының кемшілігі — саясат интерфейсі кодта тікелей, нақты түрде бейнеленбеген, бірақ кері түрде, үйрек тебу арқылы анықталады және жеке және қолмен, түсіндірмелерде құжатталуы керек. Басты идея — типті тұрақты іске асыру мен интерфейске, саясатқа негізделген сыныпқа және әртүрлі саясаттарға бөлу үшін ортақтық және өзгергіштік талдауын пайдалану. Алдағы қадам — не хост класына, не саясаттарға енгізу керек екенін білу. Жоғарыда аталған мақалада мына жауап берілген: егер бізге шектеулі жобалау шешімін қабылдау қажет болса, онда біз осы шешімді кейінге қалдыруымыз керек, оны тиісті атпен аталатын саясатқа жүктеуіміз керек. Саясат кластары іске асыруды, типтік анықтамаларды және т.б. қамтуы мүмкін. Негізінен, негізгі үлгі класын жобалаушы саясат кластары қамтамасыз етуі керек нәрсені, олар іске асыруы тиіс әдеттеу орындарын анықтайды. Жақсы саясаттар жиынтығын жасау қиын міндет болуы мүмкін, дәл қажетті саны (мысалы, ең аз қажетті). Бірге жинақталған әртүрлі әдеттеу орындары бір саясат аргументіне, мысалы, сақтау саясатына, тексеру саясатына және т.б. енуі керек. Графикалық дизайнерлер өз саясаттарына атау бере алады, олар операцияларды немесе ұсақ іске асыру емес, ұғымдарды көрсетеді. Саясатқа негізделген дизайн басқа да пайдалы техникаларды қамтуы мүмкін. Мысалы, үлгі әдісін компиляция уақытында қайта қарастыруға болады, сондықтан негізгі сынып қаңқа алгоритміне ие болады, ол әдеттеу орындарында кейбір саясаттардың тиісті функцияларын шақырады. Бұл C++ тілінің болашақ нұсқаларындағы түсініктер арқылы динамикалық түрде жүзеге асырылады.
Локи кітапханасы
Loki – Андрей Александrescu жазған C++ бағдарламалық кітапханасының атауы. Кітапхана C++ үлгілік метапрограммалауды кеңінен пайдаланады және бірнеше жиі қолданылатын құралдарды іске асырады: typelist, functor, singleton, smart pointer, object factory, visitor және multimethods. Бастапқыда кітапхана тек екі стандартқа сәйкес C++ компиляторымен (CodeWarrior және Comeau C/C++) үйлесімді болды: кейінгі жұмыстар оны көптеген компиляторлармен (соның ішінде ескі Visual C++ 6.0, Borland C++ Builder 6.0, Clang және GCC) қолдануға мүмкіндік берді. Компилятор өндірушілері Loki-ді үйлесімділік өлшемі ретінде пайдаланды, бұл сәйкес компиляторлардың санын одан әрі арттырды. Loki-ді күтіп, одан әрі дамыту Питер Кюмель мен Ричард Спозато басқаратын ашық кодты қауымдастық арқылы SourceForge жобасы ретінде жалғастырылды. Көптеген адамдардың үнемі салған үлесі кітапхананың жалпы тұрақтылығы мен функционалдығын жақсартты. Loki енді кітапқа байланысты емес, себебі ол көптеген жаңа компоненттерге ие (мысалы, StrongPtr, Printf және Scopeguard). Loki-ге ұқсас құралдар мен мүмкіндіктер енді Boost кітапханалар жинағында да бар.