Ihre Behauptung, dass "das C++ und die Java-API dasselbe tun sollen", ist unbegründet. Sie sind nicht dokumentiert, um die gleichen Dinge zu tun. Jede Ausgabesprache kann eine andere Interpretation der in der Datei .proto beschriebenen Struktur erzeugen. Der Vorteil davon ist, dass das, was Sie in jeder Sprache bekommen, idiomatisch ist für diese Sprache. Es minimiert das Gefühl, dass Sie beispielsweise "Java in C++ schreiben". Das wäre definitiv, wie I würde fühlen, wenn es eine separate Builder-Klasse für jede Nachrichtenklasse gab.
für eine ganze Zahl Feld foo
, die C++ Ausgabe von Protoc wird für die gegebene Nachricht ein Verfahren void set_foo(int32 value)
in der Klasse enthalten.
Die Java-Ausgabe generiert stattdessen zwei Klassen. Man stellt die Nachricht direkt dar, hat jedoch nur Getter für das Feld. Die andere Klasse ist die Builder-Klasse und hat nur Setter für das Feld.
Die Python-Ausgabe ist noch anders. Die generierte Klasse enthält ein Feld, das Sie direkt bearbeiten können. Ich erwarte, dass die Plugins für C, Haskell und Ruby auch ganz anders sind. Solange sie alle eine Struktur darstellen können, die in äquivalente Bits auf der Leitung übersetzt werden kann, sind sie ihre Aufgaben erledigt.Denken Sie daran, dass dies "Protokollpuffer" sind, nicht "API-Puffer".
Die Quelle für das C++ - Plug-in wird mit der protoc Verteilung geliefert. Wenn Sie den Rückgabetyp für die Funktion set_foo
ändern möchten, können Sie dies gerne tun. Normalerweise meide ich Reaktionen wie "Es ist Open Source, also kann jeder es modifizieren", weil es normalerweise nicht hilfreich ist, jemandem zu empfehlen, ein völlig neues Projekt gut genug zu lernen, um größere Änderungen vorzunehmen, nur um ein Problem zu lösen. Ich erwarte jedoch nicht, dass es in diesem Fall sehr schwer wäre. Der schwierigste Teil wäre, den Codeabschnitt zu finden, der die Setter für die Felder generiert. Sobald Sie das gefunden haben, wird die Änderung, die Sie benötigen, wahrscheinlich einfach sein. Ändern Sie den Rückgabetyp, und fügen Sie am Ende des generierten Codes eine return *this
-Anweisung hinzu. Sie sollten dann in der Lage sein, Code in dem Stil zu schreiben, der in Hrnt's answer gegeben wird.
Ich denke, es ist wahrscheinlich die persönliche Präferenz des C++ - Implementierers. Builder sind nicht (in meiner Erfahrung zumindest) in C++ - Code verpönt, und tatsächlich benutze ich sie überall dort, wo ein Objekt a) viele Parameter oder (wahrscheinlicher) b) viele optionale Parameter haben kann. – moswald
Eine Sache, die Sie in Ihrer Frage nicht bemerkt haben, ist, dass die Person-Klasse unveränderlich ist. –