|
Программирование >> Полиморфизм без виртуальных функций в с++
множество других библиотек, и каждый месяц появляется несколько новых. Похоже, что та фор.ма индустрии программных ко.мпонентов, появление которой специалисты предсказывали уже на протяжении многих лет - и горевали по поводу ее отсутствия, - наконец-то родилась. Раздел назван Другие библиотеки , поскольку упоминае.мые в нем библиотеки не оказали существенного влияния на развитие С++. Не надо понимать это как оценку их технических достоинств или важности для пользователей. 8.4.1. Базовые библиотеки Существует два взгляда на то, что представляют собой базовые библиотеки -горизонтальная и вертикальная. Первая предлагает набор базовых классов, которые предположительно должны быть полезны любому программисту при работе над любым приложением. Обычно сюда включаются основные структуры данных: динамические и контролируемые массивы, списки, ассоциативные массивы, AVL-деревья и т.д., а также распространенные вспомогательные классы, такие как строки, регулярные выражения, дата и время. Как правило, горизонтальную базовую библиотеку стараются сделать максимально переносимой. Целью вертикальной базовой библиотеки является предоставление полного набора сервисов для данного окружения, например X Windows System, MS Windows, МасАрр, или некоторого множества таких окружений. Обычно в состав вертикальных библиотек входят и те базовые классы, которые включаются в горизонтальные, но акцент делается на классах, в полной мере использующих особенности и.менно выбранного окружения. Порой преобладают классы для поддержки пользовательских интерфейсов и графики. Частью такой библиотеки могут быть также интерфейсы к конкретным базам данных. Нередко классы из вертикальной библиотеки ориентированы на применение в некотором общем каркасе, поэтому использование отдельной части библиотеки затруднено. Лично я предпочитаю разделять горизонтальные и вертикальные аспекты базовой библиотеки, что упрощает при.менение и выбор наиболее подходящей из них. С другой стороны, по ряду технических и коммерческих причин разумна интеграция. Самые значительные из ранних базовых библиотек: созданная Китом Горлецом NIH [Gorlen, 1990], предлагавшая набор классов в духе Smalltalk, и Interviews Марка Линтона (Mark Linton) [Linton, 1987], упрощавшая работу с X Windows из программ на С++. Компилятор GNU С++ (G++) поставляется с библиотекой, которую спроектировал Дуг Леа. Ее отличительной особенностью является эффективное использование абстрактных базовых классов [Lea, 1993]. Библиотека USL Standard Components [Carroll, 1993] содержит набор эффективно реализованных конкретных типов для различных структур данных, а также поддержку основных про.мышленных версий системы UNIX. Ко.мпания Rogue Wave продает библиотеку Tools++, включающую набор базовых классов, которые с 1987 г. писали То.мас Кеффер (Thomas Keffer) и Брюс Эккель [Keffer, 1993]. Компания Glockenspiel в течение .многих лет поставляла коммерческие библиотеки для различных применений [Dearie, 1990]. Компания Rational поставляет С++-версию библиотеки The Booch Components, которую Грейди Буч (Grady Booch) первоначально реализовал на языке Ada. На С++ ее переписали сам Буч и Майк Вило (Mike Vilot). Версия на Ada занимает 125 тыс. строк исходного текста без учета комментариев, тогда как версия на С++ - всего 10 тыс. строк. Как видно, наследование в сочетании с шаблонами может стать .мошным механизмом для организации библиотек без потери эффективности или ясности [Booch, 1993]. 8.4.2. Устойчивость и базы данных Под устойчивостью (persistence) понимаются разные аспекты. Некоторым пользователям просто нужен пакет для ввода/вьшода объектов, который входит в состав многих библиотек. Другие хотят обеспечить прозрачную миграцию объекта из файла в память и обратно. Третьим необходим контроль версий и протоколирование транзакций. Четвертые не согласны пи на что, кроме распределенной систе.мы с адекватным управлением параллельностью и полной поддержкой перемещения схе.м. Поэтому я думаю, что устойчивость следует обеспечивать за счет специальных библиотек, нестандартных расширений, а возможно, и продуктов третьих фирм. Имеющийся в С++ механизм идентификации типов во время исполнения содержит кое-какие зацепки , которые оказались полезны для специалистов по устойчивости (см. раздел 14.2.5). И NIH, и библиотека GNU содержат базовые механизмы для ввода/вывода объектов. РОЕТ - при.мер коммерческой С++-библиотеки для поддержки устойчивости. Существует около дюжины объектно-ориентированных баз данных, к которым можно обращаться из С++ и па С++ же и написанных. В качестве примера назову ObjectStore, ONTOS [Cattell, 1991] и Versant. 8.4.3. Библиотеки для численных расчетов Ко.мпании Rogue Wave [Keffer, 1992] и Dyad предлагают много классов, ориентированных прежде всего на научные приложения. Основное назначение таких библиотек - представить нетривиальные математические методы в форме, удобной для специалистов, работающих в разных областях науки или техники. Вот пример использования поставляемой компанией Sandia National Labs библиотеки RHALE++ для математической физики: void Decompose(const double delt, SymTensor& V, Tensor& R, const Tensor& L) SymTensor D = Sym(L); AntiTensor W = Anti(L); Vector z = Dual(V*D); Vector omega = Dual (W) - 2 . 0*lnverse (V-Tr (V) *One) *z,-AntiTensor Omega = 0.5*Dual(omega); R = Inverse(One-0.5*delt*0mega) * (One+O.5*delt*0mega)*R; V += delt*Sym(L*V-V*Oir.ega) ; Согласно [Budge,1992], этот код прозрачен, a лежащие в его основе библиоте-. ки классов весь.ма мпогоплановы и удобны для сопровождения. Физику, знако.мому 8.5. Стандартная библиотека Коль скоро библиотеки для С-н- так разнообразны, возникает вопрос о том, какие из них должны быть стандартными, то есть специфицированными в стандарте и включенными в любую реализацию. Прежде всего необходимо стандартизировать основные библиотеки, используемые повсеместно. Это значит, что нужно специфицировать точный интерфейс между С-н- и стандартными библиотеками С, а также библиотеку iostreams. с алгоритмом полярной декомпозиции, смысл этого кода ясен с первого взгляда, так что не нужна даже дополнительная документация . 8.4.4. Специализированные библиотеки Вышеупомянутые библиотеки предназначены главным образом для поддержки программирования как такового. Но не менее важны и узкоспециализированные библиотеки. В частности, можно найти обшедоступные, ко.ммерческие и разработанные для внутреннего применения библиотеки для таких областей, как гвдродинамика, молекулярная биология, анализ сетей связи, пульты телефонных операторов и т.д. Для многих програ.ммистов именно подобные библиотеки являются свидетельством достоинств С-н- в плане простоты программирования, уменьшения числа ошибок, сокрашения затрат на сопровождение и т.д. Вот пример из области моделирования сетей с ком.мутацией каналов [Eick, 1991]: #include <simlib.h> int trunks[] = { /* ... */ }; double load[] = { /* ... */ } ; class LBA : public Policy { /* ... */ }; main() { Sim sim; планировщик событий sim.network(new Network(trunks)); создать сеть sim.traffic(new Traffic(load,3.0)); матрица трафика sim.policy(new LBA); стратегия маршрутизации LBA sim.run(180); моделировать в течение 180 минут cout sim; вывести результаты Встречаюшиеся в этом фрагменте классы - это либо классы из библиотеки SIMLIB, либо произведенные от них пользователе.м. Они определяют сеть, на-фузку и стратегию маршрутизации для одного прогона модели. Многие специализированные библиотеки, например для поддержки графики и визуализации, являются обшими, по в этой книге я не ставил своей целью перечислять или классифицировать их.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |