Программирование >>  Полиморфизм без виртуальных функций в с++ 

1 ... 56 57 58 [ 59 ] 60 61 62 ... 144


графики. И обе они сильно отличаются от библиотеки, предоставляющей низкоуровневые структуры данных для создания других библиотек.

C-I-+ развивался в направлении поддержки различных структур библиотек, а некоторые из последних нововведений специально спроектированы для того, чтобы разные библиотеки можно было использовать совместно.

8.2.1. Альтернативы при проектировании библиотеки

При создании первых библиотек С++ часто слепо копирова/тсь приемы из других языков. Например, первоначальный вариант моей библиотеки для поддержки многозадачности [Strou.strup, 1980b], [Stroustrup, 1987b] - са.мой первой библиотеки для С++ - предоставлял средства, аналогичные .механизма.м моделиро-ва1П1я из Simula. Библиотека для работы с комплексными числами [Rose, 1984] содержала функции, похожие на функции для арифметики с плавающей точкой из стандартной математической библиотеки С. Библиотека NIH Кита Горлена [Gorlen, 1990] представляла собой аналог библиотеки Smalltalk. По мере того как гюльзователи, работавшие раньше на других языках, переключаются на С++, появляются и новые библиотеки в стиле раннего С+-ь . Программисты еще не до конца освоили методы проектирования па нем; создавая такие библиотеки, они одновременно знакомятся с возможностями, которые предоставляет С++.

О каких альтернативах идет речь? Отвечая на этот вопрос, часто акцентируют внимание на языковых средствах. Следует ли пользоваться встраиваемыми функциями, виртуальными функциями, множественным наследованием, иерархиями с одним корнем, абстрактными классами, перегруженными операторами? Все это второстепенно. Перечисленные и другие средства существуют для поддержки фундаментальных возможностей. Должно ли проектирование:

□ ставить во главу угла эффективность во время исполнения?

□ минимизировать вре.мя перекомпиляции после из.менений?

□ максимально облегчать перенос на другую платформу?

□ разрешать пользователям расширять базовую библиотеку?

□ допускать использование без исходных текстов?

□ сочетаться с существующими нотациями и стилями?

□ обеспечивать использование из программ, написанных не на С++?

□ быть пригодным для неопытных пользователей?

Только после ответа на вопросы такого рода можно переходить к техническим деталям. Современные библиотеки часто предоставляют самые разнообразные классы, чтобы по.мочь пользователю сделать правильный выбор. Например, библиотека может располагать очень простым и эффективным классом для работы со строками. Кроме того, для той же цели в пей может быть размещен высокоуровневый Kviacc с большим число.м средств и возможностей настройки пользователем (см. раздел 8.3).

8.2.2. Языковые средства и построение библиотеки

Концепция классов и система типов С++ - основа проектирования любой библиотеки. Сильные и слабые стороны данных аспектов определяют структуру



библиотек С++. Главная рекомендация авторам библиотек - не пытайтесь сражаться с системой типов. Над багровыми механизмами языка пользователь может одержать лишь пиррову победу. Изяп1ества, простоты использования и эффективности можно достичь, только оставаясь в рамках базовой структуры языка. Если эти рамки вас стесняют, стоит подумать о смене языка.

Базовая структура С++ поошряет програм.мирование с сильной типизацией. В С++ класс - это тип. Сочета1И1е правил наследования, механиз.ма абстрактных классов и механизма шаблонов подталкивают пользователя к то.му, чтобы .манипулировать объектами в точном соответствии с предоставляемы.ми интерфейсами. Можно говорить и более определенно: не обходите систему контроля путе.м приведения типов. Приведения необходимы для многих низкоуровневых операций, иногда для отображения высокоуровневых интерфейсов на низкоуровневые, но библиотека, при работе с которой приходится постоянно прибегать к приведениям типов, возлагает на пользователя непомерный, а чаще всего и ненужный труд. Семейство функций printf из библиотеки С, указатели типа void*, объединения и другие низкоуровневые средства лучше всего и.зъять из интерфейсов библиотеки, поскольку из-за них возникают дыры в системе контроля библиотечных типов.

8.2.3. Как работать с разнообразными библиотеками

Нельзя ожидать, что две произвольно взятые библиотеки смогут работать вместе. Многие библиотеки оказываются совместимыми, но в обычно это является предметом особой заботы и программиста, и разработчика библиотеки, и проектировщика языка.

По мере развития С++ удалось обеспечить достаточные средства для решения фундаментальных проблем, с которыми сталкивается пользователь при попытке применить независимо разработанные библиотеки. Стоит добавить, что и разработчики теперь заду.мываются о то.м, что их библиотеку, возможно, будут применять вместе с другими.

Проблема использования одного и того же имени в разных библиотеках решается с помошью пространства имен (см. раздел 17.2). В основе общей .модели обработки ошибок лежит обработка исключений (см. главу 16). Шаблоны (см. главу 15) дают механизм определения контейнеров и алгоритмов, не зависящих от тина данных; конкретные типы пользователь указывает при вызове библиотеки. Конструкторы и деструкторы обеспечивают единый способ инициализации и уничтожения объектов (см. раздел 2.11). Абстрактные классы - это механизм определения интерфейсов независимо от реализации (см. раздел 13.2.2). Идентификация типа во время исполнения позволяет восстановить информацию о типе, утраченную из-за того, что переданный библиотеке объект возвращен обратно в виде экземпляра менее конкретного типа, то есть экземпляра базового класса (см. раздел 14.2.1). Конечно, это лишь одно из возможных применений указанных языковых средств, но рассмотрение их в качестве способа поддержки построения программ из независимо разработанных библиотек может быть полезным.

Расс.мотри.м в этом ключе множественное наследование (см. раздел 12.1). Библиотеки в духе Smalltalk основаны на одном универсальном корневом классе.



Сложности появляются, когда таких класса два. Но если библиотека написана для конкретной нред.метной области, то иногда помогает множественное наследование:

class GD3 root :

public GraphicsObject, public DataBaseObject {};

Неразреши.мая пробле.ма возникает, когда оба универсальных базовых класса предоставляют один и тот же сервис, например идентификацию типов во вре.мя исполнения и меха1П13.м ввода/вывода объектов. Некоторые из подобных проблем луппе всего репшются иуте.м выноса обпц1х возможностей в стандартную библиотеку или реализации их в само.м языке. Можно также по.местить общую функциональность в иерархию классов с новым общим корпе.м. Однако объединить подобиы.м образом универсальные библиотеки так просто пе получится, и это необходимо учитывать при проектировании библиотеки.

Управление памятью - еще одна область, в которой и.меется целый ряд проблем как для разработчиков библиотек, так и для пользователей, выпуждешилх обращаться сразу к нескольким библиотека.м (см. раздел 10.7).

8.3. Ранние библиотеки

Первым кодом, написанным на С With Classes, была библиотека для поддержки многозадачности (см. раздел 8.3.2.1), в которой реализовались Simula-подобные .механизмы параллельности для моделирования [Stroustrup, 1980Ь]. Первы-.ми реа,чьными программами, в которых использовалась эта библиотека, стали приложения для моделирования сетевого трафика, проектирования топологии печатных плат и т.д. Эта библиотека интенсивно используется и по сей день. Стандартная библиотека С - без каких бы то ни было дополнительных затрат - поставлялась вместе с С-ы- с самого начала, равно как и все прочие написанные на С библиотеки. Ю1ассические типы данных - строки символов, массивы с коптро-лс\! выхода за границы, динамические массивы и списки - использовались как при.меры при проектировании и тестировании ранних реализаций С-ы- (см. раздел 2.14).

Сначала работы, связанные с такими контейнерными класса.ми, как списки и массивы, сильно осложнялись из-за отсутствия в языке поддержки параметризованных типов (см. раздел 9.2.3). Приходилось обходиться макросами. Макросы, поддерживаемые препроцессоро.м С, помогли нам приобрести опыт, пригодившийся затем при разработке параметризованных типов.

Са.ми классы проектировали .мы с Джонатаном Шопиро. В 1983 г. он реали.зо-вал классы строк и списков, которые широко при.менялись в AT&T и легли в ос-но[)у классов, включенных в нынешнюю библиотеку Стандартных ко.мпопентов . Эта библиотека была разработана в Bell Labs и продается через USL. Создание ранних библиотек шло параллельно с проектированием языка, в частности с проектированием механизма перегрузки.

Основная цель первых библиотек для работы со строками и списка.ми - предоставление относительно простых классов, которые можно было бы использовать как строительные блоки в приложениях и при создании более сложных библиотек.



1 ... 56 57 58 [ 59 ] 60 61 62 ... 144

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика