Дизайн API бібліотеки C ++


12

Я шукаю хороший ресурс для вивчення хорошого дизайну API для бібліотек C ++, перегляду спільних об'єктів / dll тощо. Є багато ресурсів для написання приємних API, приємних класів, шаблонів тощо на рівні джерела, але майже нічого про об'єднання речей у спільні файли та виконавчі файли. Книги на кшталт крупномасштабного програмного забезпечення C ++ Джона Лакоса цікаві, але масово застаріли.

Я шукаю поради, тобто щодо роботи з шаблонами. За допомогою шаблонів у моєму API я часто стикаюся з кодом бібліотеки у своїй виконуваній (або іншій бібліотеці), тому якщо я виправляю помилку там, я не можу просто розгорнути нову бібліотеку, але доведеться перекомпілювати та перерозподілити всіх клієнтів цього коду. (і так, я знаю деякі рішення, такі як намагання створити принаймні найпоширеніші версії всередині бібліотеки тощо)

Я також шукаю інші застереження та важливі речі для збереження бінарної сумісності під час роботи над C ++ бібліотеками.

Чи є хороший веб-сайт чи книга про такі речі?


Я обробляв це так: 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не бібліотеку, призначену лише для заголовка. Компілятор може змусити багато магії працювати, але ви не можете їх мати, не викликаючи цього, і це факт життя.

Ось що можна зробити: не використовуйте шаблони там, де вони вам не потрібні. Ось що ви не можете зробити: нічого іншого.

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


2
Я згадував це як приклад для роздуму. Що я шукаю - це вказівки щодо інших подібних питань, до яких я повинен підготуватися, та найкращі практики для їх вирішення.
johannes

Що ж, якщо всі нові версії, що порушують сумісність з ABI, поміщаються в новий простір імен вбудованих рядків, то що це має значення, чи це бібліотека, призначена лише для заголовка, чи ні?
Дедуплікатор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.