C ++ Library API Design

12

Ich bin auf der Suche nach einer guten Ressource, um etwas über gutes API-Design für C ++ - Bibliotheken zu lernen, um gemeinsam genutzte Objekte / DLLs usw. zu betrachten. Es gibt viele Ressourcen zum Schreiben netter APIs, netter Klassen, Vorlagen usw. auf Quellenebene, aber kaum etwas darüber Zusammenfügen von Dingen in gemeinsam genutzten Bibliotheken und ausführbaren Dateien. Bücher wie Large-Scale C ++ Software Design von John Lakos sind interessant, aber massiv veraltet.

Was ich suche, sind Ratschläge zB zum Umgang mit Vorlagen. Mit Vorlagen in meiner API habe ich häufig Bibliothekscode in meiner ausführbaren Datei (oder einer anderen Bibliothek). Wenn ich dort einen Fehler behebe, kann ich die neue Bibliothek nicht einfach ausrollen, sondern muss alle Clients dieses Codes neu kompilieren und verteilen. (und ja, ich kenne einige Lösungen wie den Versuch, zumindest die gängigsten Versionen innerhalb der Bibliothek zu instanziieren usw.)

Ich suche auch nach anderen Vorsichtsmaßnahmen und Dingen, die ich beachten muss, um die Binärkompatibilität bei der Arbeit an C ++ - Bibliotheken zu erhalten.

Gibt es eine gute Website oder ein Buch über solche Dinge?

johannes
quelle
Ich habe es so gehandhabt: sivut.koti.soon.fi/~terop/GameApi.html - dh während Vorlagen in der Bibliothek sind, ist nichts davon in der API ...
tp1
1
std::unique_ptrist ziemlich neues Zeug. Was genau haben Sie gedacht , war mehr geeignet zu Ihrem vorgeschlagenen API? Wie mussten Sie alle Ressourcen manuell verwalten, um beispielsweise Leckagen und doppelte Löschvorgänge praktisch zu gewährleisten? Oder die Art und Weise, wie viele Ihrer Typen einen oder zwei Buchstabennamen hatten, wodurch es unmöglich wurde, ihren Zweck zu erraten?
DeadMG
1
@tp1: Aber du hast nicht darauf geachtet, dass ich damit umgehen konnte. Sie haben gerade "HANDLE THEM" gesagt, ohne etwas dagegen zu tun. Ich habe nicht damit umgegangen und was jetzt? Anstatt eine RAII-Klasse zu verwenden, die solche Fehler nicht zulässt. Wenn Sie verwendet hätten unique_ptr, wäre es nicht möglich, Code wie diesen zu schreiben.
DeadMG
1
@tp1: Mir ist aufgefallen, dass das Env zerstört werden kann. Das wars so ziemlich. Es scheint überhaupt keine Funktionalität zum Verwalten von Objekten zu geben. Wenn ich den Speicher feinkörniger verwalten wollte als "Alles, was ich jemals erstellt habe" oder "Nichts", würde es scheinen, als wäre ich durcheinander.
DeadMG
3
Bitte nehmen Sie ein längeres Gespräch mit dem Software Engineering Chat auf . Können nützliche Informationen in die Frage oder Antwort aufgenommen werden?
ChrisF

Antworten:

12

Es gibt tatsächlich ein Buch, das genau das ist, wonach Sie suchen. Passenderweise heißt es API Design for C ++. Die Website des Buches enthält den Quellcode des Buches sowie Errata .

Weltingenieur
quelle
1
Bestimmt +1 für das Buch! Ich wollte das vorschlagen, aber es stellte sich heraus, dass Sie mich geschlagen haben.
zxcdw
+1: Ich bin mit dem Lesen dieses Buches fertig und es ist eine großartige Ressource. Sehr empfehlenswert.
Korchkidu
3

Das ist so ziemlich unmöglich. Die einfache Tatsache ist, dass Sie manchmal den Compiler brauchen, um einen Job zu erledigen, und Sie können diese Notwendigkeit nicht einfach wegzaubern. Es gibt keine Funktion, die std::vectorkeine Nur-Header-Bibliothek erstellen kann. Der Compiler kann viele Magics zum Laufen bringen, aber Sie können sie nicht haben, ohne sie aufzurufen, und das ist eine Tatsache des Lebens.

Folgendes können Sie tun: Verwenden Sie Vorlagen nicht dort, wo Sie sie nicht benötigen. Folgendes können Sie nicht tun: noch etwas.

Die einfache Tatsache ist, dass das erneute Kompilieren mit der neuen Version im Vergleich zu den Vorteilen von Leistung, Sicherheit und Funktionalität, die Sie mit statisch typisierten Bibliotheken erzielen können, keine allzu große Belastung darstellt.

DeadMG
quelle
2
Ich erwähnte das als ein Beispiel zum Nachdenken. Was ich suche, sind Anleitungen zu ähnlichen Themen, auf die ich mich vorbereiten sollte, und bewährte Methoden, um diese zu behandeln.
Johannes
Nun, wenn alle neuen Versionen, die die ABI-Kompatibilität brechen, in einen neuen Inline-Namespace gestellt werden, was macht es dann aus, ob es sich um eine reine Header-Bibliothek handelt oder nicht?
Deduplizierer