Ich evaluiere Google Protocol Buffers für einen Java-basierten Dienst (erwarte jedoch sprachunabhängige Muster). Ich habe zwei Fragen:
Die erste ist eine allgemeine Frage:
Welche Muster sehen wir Menschen verwenden? Diese Muster stehen im Zusammenhang mit der Klassenorganisation (z. B. Nachrichten pro .proto-Datei, Paketierung und Verteilung) und der Nachrichtendefinition (z. B. wiederholte Felder im Vergleich zu wiederholten gekapselten Feldern *) usw.
Auf den Google Protobuf-Hilfeseiten und in öffentlichen Blogs finden sich nur sehr wenige Informationen dieser Art, während für etablierte Protokolle wie XML eine Menge Informationen zur Verfügung stehen.
Ich habe auch spezielle Fragen zu den folgenden zwei verschiedenen Mustern:
Stellen Sie Nachrichten in .proto-Dateien dar, verpacken Sie sie als separate JAR-Datei und senden Sie sie an die Zielgruppe des Dienstes. Dies ist meiner Meinung nach der Standardansatz.
Tun Sie dasselbe, schließen Sie jedoch auch handgefertigte Wrapper (keine Unterklassen!) In jede Nachricht ein, die einen Vertrag implementieren, der mindestens diese beiden Methoden unterstützt (T ist die Wrapper-Klasse, V ist die Nachrichtenklasse). :
public V toProtobufMessage() { V.Builder builder = V.newBuilder(); for (Item item : getItemList()) { builder.addItem(item); } return builder.setAmountPayable(getAmountPayable()). setShippingAddress(getShippingAddress()). build(); } public static T fromProtobufMessage(V message_) { return new T(message_.getShippingAddress(), message_.getItemList(), message_.getAmountPayable()); }
Ein Vorteil, den ich bei (2) sehe, ist, dass ich die Komplexität, die durch meine Wrapper eingeführt wurde, verbergen V.newBuilder().addField().build()
und einige sinnvolle Methoden wie isOpenForTrade()
oder isAddressInFreeDeliveryZone()
in meine Wrapper einfügen kann. Der zweite Vorteil, den ich mit (2) sehe, ist, dass meine Clients mit unveränderlichen Objekten umgehen (etwas, das ich in der Wrapper-Klasse erzwingen kann).
Ein Nachteil, den ich bei (2) sehe, ist, dass ich Code dupliziere und meine Wrapper-Klassen mit .proto-Dateien synchronisieren muss.
Hat jemand bessere Techniken oder weitere Kritiken zu einem der beiden Ansätze?
* Mit dem Einkapseln eines wiederholten Feldes meine ich Nachrichten wie diese:
message ItemList {
repeated item = 1;
}
message CustomerInvoice {
required ShippingAddress address = 1;
required ItemList = 2;
required double amountPayable = 3;
}
anstelle von Nachrichten wie dieser:
message CustomerInvoice {
required ShippingAddress address = 1;
repeated Item item = 2;
required double amountPayable = 3;
}
Letzteres gefällt mir, aber ich freue mich über Argumente dagegen.