L'affermazione secondo cui "il C++ e l'API Java dovrebbero fare la stessa cosa" è infondata. Non sono documentati per fare le stesse cose. Ogni lingua di output può creare una diversa interpretazione della struttura descritta nel file .proto. Il vantaggio è che ciò che ottieni in ogni lingua è idiomatico per quella lingua. Riduce al minimo la sensazione che tu sia, per esempio, "scrivendo Java in C++". Sarebbe sicuramente come mi piacerebbe sentire se ci fosse una classe di builder separata per ogni classe di messaggio.
Per un campo intero foo
, C++ uscita dal ProtoC includerà un metodo void set_foo(int32 value)
nella classe di messaggio dato.
L'uscita Java genererà invece due classi. Uno rappresenta direttamente il messaggio, ma ha solo getter per il campo. L'altra classe è la classe del costruttore e ha solo setter per il campo.
L'output Python è diverso ancora. La classe generata includerà un campo che puoi manipolare direttamente. Mi aspetto che i plug-in per C, Haskell e Ruby siano anche molto diversi. Finché tutti possono rappresentare una struttura che può essere tradotta in bit equivalenti sul filo, hanno fatto il loro lavoro.Ricordare che questi sono "buffer di protocollo", non "buffer di API".
L'origine del plug-in C++ è fornita con la distribuzione protoc. Se si desidera modificare il tipo di ritorno per la funzione , è possibile farlo. Normalmente evito le risposte che equivalgono a "È open source, quindi chiunque può modificarlo" perché di solito non è utile raccomandare che qualcuno apprenda un progetto completamente nuovo abbastanza bene da apportare grandi cambiamenti solo per risolvere un problema. Tuttavia, non mi aspetto che sarebbe molto difficile in questo caso. La parte più difficile sarebbe trovare la sezione di codice che genera setter per i campi. Una volta che lo trovi, fare il cambiamento che ti serve sarà probabilmente semplice. Modificare il tipo di reso e aggiungere un'istruzione return *this
alla fine del codice generato. Dovresti quindi essere in grado di scrivere codice nello stile dato in Hrnt's answer.
fonte
2010-02-26 16:17:58
Penso che sia probabile la preferenza personale dell'implementatore C++. I costruttori non sono (nella mia esperienza, almeno) disapprovati nel codice C++, e infatti li uso ovunque nel punto in cui un oggetto può avere a) molti parametri o (più probabilmente) b) molti parametri opzionali. – moswald
una cosa che non hai notato nella tua domanda è che la classe Person è immutabile. –