Im vorherigen Fehlerkonzept war es sehr nützlich, Makros zu generieren, da wir oft neue Fehler hinzugefügt haben. Die Codegenerierung selbst ist jedoch recht kompliziert (C++-Code, der den Code ausgibt; auch nicht ideal für Cross-Compilierung, siehe auch #2814).
Jetzt haben wir einen mehr oder weniger festen Satz von ein paar Fehlern. Die Frage ist also, was wir tun sollen:
@PhilippGackstatter @raphi011 @kodebach @Piankero Was denkst du?
Persönlich bevorzuge ich Option 1. Die Fehlercodes sollten sich nur sehr selten ändern, wodurch der zusätzliche Aufwand, den C-Code manuell zu schreiben und andere Sprachen synchron zu halten, vernachlässigbar ist. Der anfängliche Aufwand sollte auch geringer sein im Vergleich zur Einrichtung jeglicher Form der automatischen Generierung.
Warum nicht Variante 2?
Moustache-Templates müssen irgendwie mit den Eingabedaten versorgt werden. Entweder müssen wir eine benutzerdefinierte ausführbare Datei verwenden, die zur Build-Zeit kompiliert wird. In diesem Fall würden wir nur std::cout << ...
im C++-Code loswerden, aber sonst würde sich nicht viel ändern. Die andere Möglichkeit besteht darin, die standardmäßige ausführbare Schnurrbart-Datei zu verwenden, die ein Ruby-Skript ist und daher die Installation von Ruby erfordert.
Außerdem kann kdb gen
nicht wiederverwendet werden, da dazu zuerst kdb
kompiliert werden müsste, was kdberrors.h
.
Warum nicht Variante 3?
Das Generieren des C-Codes funktioniert möglicherweise in CMake, aber komplexere Sprachen können Probleme bei der Verwendung von CMake haben.
Wenn wir uns für eine Form der Codegenerierung entscheiden, sollten wir nur die Teile generieren, die unbedingt generiert werden müssen. Zum Beispiel enthält das aktuelle kdberrors.h
viel Code, der völlig statisch und unabhängig davon ist, welche Fehler wir tatsächlich haben. Dieser Code sollte nicht generiert werden, wir sollten ihn aus einer statischen Datei #include
.
Ich bevorzuge auch Option 1 wegen stabiler Fehlercodes. Das Hinzufügen von Codegenerierung fügt dem Gesamtcode auch unnötige Komplexität hinzu, der wiederum fehleranfällig ist.
@kodebach danke für deine Ausarbeitung zu Option 2
Ich denke, es ist ziemlich klar, dass wir uns für Option 1 entscheiden, @Piankero, können Sie bitte die Entscheidung aufschreiben?
Für die Bindungen bedeutet das, dass sich nicht viel ändert.
Was wäre toll, wenn wir ein verbindliches Schreib-Tutorial hätten, das beschreibt:
Ich hoffe, wir können dieses Tutorial für die verschiedenen Situationen erweitern, die wir in verschiedenen Sprachen sehen. @Piankero können Sie bitte mit dem Schreiben des Tutorials beginnen, insbesondere des Abschnitts zur Fehlerbehandlung (wie man Vererbung implementiert, ...)
Tutorial: #2875
Designentscheidung: #2872