2009-11-25 15 views
14

Wir führen Protokollpuffer als neuen Transport für einige Back-End-RPC-Dienste ein. Da es Widerstände gibt, Daten zwischen verschiedenen Formen ähnlicher Objekte manuell hin- und herzuschieben, kann ich vorhersagen, dass die Protokollpufferinstanzen den Stapel etwas höher als nur an die RPC-Serverschnittstelle weitergegeben werden.Protokollpuffer als allgemeines Datenobjekt verwenden?

Ist das etwas, was ich vermeiden sollte? Ist es sicher, ein Protokoll-Puffer-Objekt wie einen reinen Datenbehälter zu behandeln, mit der netten Annehmlichkeit, dass es schnell und effizient in binäre Daten umgewandelt werden kann?

Der andere Grund, ich sehe es als eine nette Möglichkeit zum Generieren von Datenobjekten ist, dass die erforderlichen/optionalen Felder und die automatisch generierte Builder-Schnittstelle.

Antwort

9

Nun, sie sind nicht schrecklich bequem so zu verwenden, da sie unveränderlich sind - Sie könnten die Erbauer herumreichen, aber das macht für ziemlich lange Typnamen. Es bedeutet auch, dass Sie auf die Datentypen beschränkt sind, die von Protokollpuffern (und Ihren eigenen Nachrichten) unterstützt werden.

Es ist sicher dies zu tun, aber es schafft nicht immer die schönsten Designs. Auf der anderen Seite ist es manchmal genau das, was der Arzt bestellt hat :)

Ich schlage vor, Sie experimentieren - es gibt keine "one size fits all" hier.

+0

Ich denke, die Tatsache, dass sie unveränderlich sind, hilft tatsächlich, nicht weh, wenn es darum geht, Protokollpuffer wie diese zu verwenden. Sie sind unveränderliche Wertobjekte wie String. –

+0

Es hilft sicherlich in einigen Fällen, wenn Sie Code in einem funktionalen Stil schreiben können. Es hängt teilweise vom Problem und teilweise von den Entwicklern ab :) –

+0

Unveränderlich hilft in manchen Fällen, aus unbekannten Gründen gibt es einige öffentliche Konstruktionen mit einem Dutzend + oder so Parametern, die alle endgültigen Feldern zugeordnet sind. Ein Baumeister ist großartig, aber langweilig und Standard, um jedes Mal zu schreiben. Es ist auch schwierig, die Logik von erforderlichem und optionalem Recht zu erhalten, so dass die build() -Methode in die Luft geht, wenn erforderliche Felder weggelassen wurden. –

0

Im Allgemeinen entwerfe ich die Schichten meiner Systeme so, dass Implementierungsdetails von einer Schicht nicht ineinander übergehen. Ich habe keine direkte Erfahrung mit Googles Protokollpuffer, aber es klingt so, als ob Sie die gleiche Darstellung für den Transport und auf höheren Ebenen Ihres Systems verwenden möchten.

Wenn Sie beschlossen haben, die Protokollpuffer nicht mehr als Transportdarstellung zu verwenden, wie leicht wäre es dann, etwas anderes zu verwenden?

+0

Dies ist eigentlich ein Schritt in Richtung genau das. Im Moment diktieren eine Reihe von Schnittstellen unsere Datenschicht, Back-End-RPC * und * bis zu einem gewissen Grad eine REST-konforme Web-Service-Schicht. *SCHMERZEN*. Schritt # 1 besteht darin, das Back-End durch Protokollpuffer zu ersetzen, um diese vom Rest zu entkoppeln. Aber das ist ein ausgezeichneter Punkt. Wenn ich nur alles auf protobufs umschalte, ist die einzige Sache, die ich entkoppelt habe, die Verbindung zwischen Klienten- und RPC-Dienstleistungen, während alle anderen Schichten von den Nachrichtenobjekten abhängen ... SCHLECHT. –