Während ich kürzlich versuchte, die optimale Reihenfolge für optionale Parameter für eine Funktion herauszufinden, bin ich auf diesen Blog-Beitrag und das dazugehörige GitHub-Repo gestoßen , das einen Header für eine Pythonic- kwargs
ähnliche Funktion in C ++ enthält. Obwohl ich es nicht benutzt habe, frage ich mich, ob dies in einer stark typisierten Sprache gut ist oder nicht. Nachdem ich eine Weile in Python gearbeitet habe, finde ich die Vorstellung einer kwargs
ähnlichen Einrichtung in meinem Projekt sehr ansprechend, da viele seiner Objekte / Funktionen eine Reihe optionaler Parameter haben (die leider nicht vermieden werden können), was zu langen Listen von Konstruktoren führt, die unterscheiden sich durch ein oder zwei Parameter und könnten viel prägnanter / trockener gemacht werden.
Was ist, wenn überhaupt, die Erfahrung anderer mit solchen Dingen? Sollte es vermieden werden? Gibt es Richtlinien dafür? Was sind die möglichen Probleme / Fallstricke?
Antworten:
Ich bin mit C ++ - Warwar nicht sehr vertraut, aber nach dem Überfliegen der Quelle fallen mir einige Nachteile ein:
Sie erfordern die globale Vordeklaration aller Argumente . Das einfache Beispiel im Blog-Beitrag enthält diesen Abschnitt mit dem Eigengewicht:
Nicht so prägnant wie das pythonische Original.
C ++ bietet native Alternativen, um die Funktionalität benannter Parameter zu erreichen:
Strukturverpackungen . Definieren Sie Ihre optionalen Parameter als Felder einer Struktur.
Proxy-Objekte . Argumente werden in einer temporären Struktur gespeichert, die mit verketteten Setzern geändert werden kann.
Hinweis : Die Boilerplate kann auf Kosten der Lesbarkeit in ein Makro abstrahiert werden:
Variadische Funktionen . Dies ist offensichtlich typunsicher und erfordert Kenntnisse über Typwerbung, um richtig zu sein. Es ist jedoch in reinem C verfügbar, wenn C ++ keine Option ist.
Hinweis : In C ++ kann dies mit verschiedenen Vorlagen typsicher gemacht werden. Der Laufzeitaufwand geht zu Lasten langsamerer Kompilierungszeiten und binärer Aufblähung.
boost :: parameter . Immer noch eine Bibliothek von Drittanbietern, wenn auch etablierter als irgendein obskures Github-Repo. Nachteile: vorlagenlastig.
Abschließend möchte ich sagen, dass ich diese kwargs-Bibliothek nicht einfach verwenden würde, weil es in C ++ eine Reihe von Alternativen gibt, die gut genug sind, um dasselbe zu erreichen. Ich persönlich würde mich für 1. oder 2. aus der obigen (nicht erschöpfenden) Liste entscheiden.
quelle
private
? Wenn Sie siepublic
erstellen, können Sie entweder die Funktion aufrufen oder die Variable direkt festlegen.struct foo
es sich um ein Wegwerfobjekt handelt, das nur die ursprüngliche Python-Funktionssyntax nachahmt. Übergabe von Namenswerten in einer Zeile an der Anrufstelle. Sie könnten es sein,public
aber das war hier einfach nicht der Punkt.