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?
la source
std::unique_ptr
est 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?unique_ptr
il ne serait pas possible d'écrire du code comme ça.Réponses:
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 .
la source
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 faire
std::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.
la source