Conception d'API de bibliothèque C ++

12

Je suis à la recherche d'une bonne ressource pour en savoir plus sur la bonne conception d'API pour les bibliothèques C ++, la recherche d'objets partagés / DLL, etc. Il existe de nombreuses ressources sur l'écriture de belles API, de belles classes, de modèles et ainsi de suite au niveau source, mais à peu près rien sur rassembler les choses dans des bibliothèques et des exécutables partagés. Des livres comme Large-Scale C ++ Software Design de John Lakos sont intéressants mais massivement dépassés.

Ce que je recherche, c'est des conseils, c'est-à-dire sur la gestion des modèles. Avec des modèles dans mon API, je me retrouve souvent avec du code de bibliothèque dans mon exécutable (ou une autre bibliothèque), donc si je corrige un bogue, je ne peux pas simplement déployer la nouvelle bibliothèque, mais je dois recompiler et redistribuer tous les clients de ce code. (et oui, je connais des solutions comme essayer d'instancier au moins les versions les plus courantes dans la bibliothèque, etc.)

Je recherche également d'autres mises en garde et des choses à l'esprit pour conserver la compatibilité binaire tout en travaillant sur les bibliothèques C ++.

Existe-t-il un bon site Web ou un livre sur de telles choses?

johannes
la source
Je l'ai géré de cette façon: sivut.koti.soon.fi/~terop/GameApi.html - c'est-à-dire qu'il y a des modèles à l'intérieur de la bibliothèque, rien ne se trouve dans l'api ...
tp1
1
std::unique_ptrest assez nouveau. Qu'est-ce qui, selon vous, était le plus adapté à votre API proposée? La manière dont vous avez dû gérer manuellement toutes les ressources, garantissant virtuellement des fuites et doubles suppressions, par exemple? Ou la façon dont beaucoup de vos types avaient des noms à une ou deux lettres, rendant impossible la devinette?
DeadMG
1
@ tp1: Mais vous n'avez pas pris soin de voir que je les ai manipulés. Vous venez de dire "MANIPULEZ-LES" sans rien y faire. Je ne les ai pas manipulés et maintenant quoi? Au lieu d'utiliser une classe RAII qui ne permet pas de telles erreurs. Si vous l'aviez utilisé, unique_ptril ne serait pas possible d'écrire du code comme ça.
DeadMG
1
@ tp1: J'ai remarqué que l'Env pouvait être détruit. C'est à peu près ça. Il ne semble pas y avoir de fonctionnalité pour gérer les objets, du tout. Si je voulais gérer une mémoire plus fine que "Tout ce que j'ai jamais créé" ou "Rien", il semblerait que je suis foutu.
DeadMG
3
Veuillez apporter toute conversation prolongée à Software Engineering Chat . Des informations utiles peuvent-elles être incorporées dans la question ou une réponse?
ChrisF

Réponses:

12

Il y a en fait un livre qui est précisément ce que vous cherchez. Il s'agit, à juste titre, de la conception d'API pour C ++. Le site Web du livre contient également le code source du livre et des errata .

Ingénieur du monde
la source
1
Définitivement +1 pour le livre! Je suis venu pour suggérer cela, mais il s'avère que vous m'avez battu.
zxcdw
+1: Je termine la lecture de ce livre et c'est une excellente ressource. Hautement recommandé.
Korchkidu
3

C'est à peu près impossible. Le simple fait est que parfois, vous avez besoin du compilateur pour faire un travail, et vous ne pouvez pas simplement éliminer cette nécessité par magie. Aucune fonction ne peut fairestd::vector une bibliothèque uniquement en-tête. Le compilateur peut faire fonctionner de nombreuses magies, mais vous ne pouvez pas les avoir sans l'invoquer, et c'est une réalité.

Voici ce que vous pouvez faire: n'utilisez pas de modèles là où vous n'en avez pas besoin. Voici ce que vous ne pouvez pas faire: autre chose.

Le simple fait est que la recompilation avec la nouvelle version n'est pas vraiment un gros fardeau par rapport aux avantages de performances, de sécurité et de fonctionnalités que vous pouvez obtenir avec des bibliothèques typées statiquement.

DeadMG
la source
2
J'ai mentionné cela comme un exemple auquel réfléchir. ce que je recherche, ce sont des conseils sur d'autres problèmes similaires auxquels je devrais me préparer et les meilleures pratiques pour les gérer.
johannes
Eh bien, si toutes les nouvelles versions brisant la compatibilité ABI sont placées dans un nouvel espace de noms en ligne, qu'importe si c'est une bibliothèque uniquement en-tête ou non?
Déduplicateur