C ++ Library API Design

12

Я ищу хороший ресурс для изучения хорошего дизайна API для библиотек C ++, просмотра общих объектов / библиотек и т. Д. Есть много ресурсов по написанию хороших API, хороших классов, шаблонов и так далее на уровне исходного кода, но почти ничего о собирать вещи в общие библиотеки и исполняемые файлы. Такие книги, как Large-Scale C ++ Software Design от Джона Лакоса, интересны, но сильно устарели.

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

Я также ищу другие предостережения и вещи для сохранения двоичной совместимости при работе с библиотеками C ++.

Есть ли хороший сайт или книга о таких вещах?

Johannes
источник
Я обработал это следующим образом: sivut.koti.soon.fi/~terop/GameApi.html - то есть, хотя в библиотеке есть шаблоны, ни один из них не находится в api ...
tp1
1
std::unique_ptrэто довольно новый материал. Что именно, по вашему мнению, больше подходит для предложенного вами API? Например, каким образом вам пришлось вручную управлять всеми ресурсами, фактически гарантируя утечки и двойное удаление? Или то, как многие из ваших типов имели одно-или двухбуквенные имена, делая невозможным гадание их цели?
DeadMG
1
@ tp1: Но вы не позаботились о том, чтобы я справился с ними. Вы просто сказали «ОБРАЩАЙТЕСЬ ИХ», ничего не делая с этим. Я не справился с ними, и что теперь? Вместо использования класса RAII, который не допускает таких ошибок. Если бы вы использовали, unique_ptrбыло бы невозможно написать такой код.
DeadMG
1
@ tp1: я заметил, что Env можно уничтожить. Вот и все. Похоже, что нет никаких функций для управления объектами вообще. Если бы я хотел управлять памятью более детально, чем «Все, что я когда-либо создавал» или «Ничто», то казалось бы, что я облажался.
DeadMG
3
Пожалуйста, продолжайте разговор в чате Software Engineering . Может ли какая-либо полезная информация быть включена в вопрос или ответ?
ChrisF

Ответы:

12

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

Мировой инженер
источник
1
Определенный +1 за книгу! Я пришел, чтобы предложить это, но оказалось, что вы победили меня.
zxcdw
+1: я заканчиваю читать эту книгу, и это отличный ресурс. Настоятельно рекомендуется.
Корчкиду
3

Это почти невозможно. Простой факт заключается в том, что иногда вам нужен компилятор для выполнения работы, и вы не можете просто устранить эту необходимость. Нет функции, которая могла бы сделать std::vectorбиблиотеку не только заголовком. Компилятор может заставить работать много магии, но вы не можете получить их, не вызывая их, и это факт жизни.

Вот что вы можете сделать: не используйте шаблоны там, где они вам не нужны. Вот что вы не можете сделать: что-нибудь еще.

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

DeadMG
источник
2
Я упомянул это в качестве примера для размышления. то, что я ищу, - это руководство по другим подобным вопросам, к которым я должен подготовиться, и лучшие практики для их решения.
Йоханнес
Хорошо, если все новые версии, нарушающие ABI-совместимость, помещаются в новое пространство имен inline, какое это имеет значение, является ли это библиотека только для заголовков или нет?
Дедупликатор