Sto valutando i buffer del protocollo di Google per un servizio basato su Java (ma mi aspetto modelli di linguaggio agnostico). Ho due domande:
La prima è un'ampia domanda generale:
Quali schemi stiamo vedendo la gente usare? Detti schemi sono collegati all'organizzazione della classe (ad es. Messaggi per file .proto, impacchettamento e distribuzione) e alla definizione del messaggio (ad es. Campi ripetuti vs. campi incapsulati ripetuti *) ecc.
Ci sono pochissime informazioni di questo tipo nelle pagine della Guida di Google Protobuf e nei blog pubblici, mentre ci sono un sacco di informazioni per protocolli consolidati come XML.
Ho anche domande specifiche sui seguenti due diversi schemi:
Rappresenta i messaggi nei file .proto, li impacchetta come un vaso separato e li spedisce ai destinatari del servizio, che è fondamentalmente l'approccio predefinito immagino.
Fai lo stesso ma includi anche wrapper fatti a mano (non sottoclassi!) Attorno a ciascun messaggio che implementa un contratto che supporti almeno questi due metodi (T è la classe wrapper, V è la classe del messaggio (usando generici ma sintassi semplificata per brevità) :
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()); }
Un vantaggio che vedo con (2) è che posso nascondere le complessità introdotte V.newBuilder().addField().build()
e aggiungere alcuni metodi significativi come isOpenForTrade()
o isAddressInFreeDeliveryZone()
ecc. Nei miei wrapper. Il secondo vantaggio che vedo con (2) è che i miei clienti hanno a che fare con oggetti immutabili (qualcosa che posso applicare nella classe wrapper).
Uno svantaggio che vedo con (2) è che duplico il codice e devo sincronizzare le mie classi wrapper con i file .proto.
Qualcuno ha tecniche migliori o ulteriori critiche su uno dei due approcci?
* Incapsulando un campo ripetuto intendo messaggi come questo:
message ItemList {
repeated item = 1;
}
message CustomerInvoice {
required ShippingAddress address = 1;
required ItemList = 2;
required double amountPayable = 3;
}
invece di messaggi come questo:
message CustomerInvoice {
required ShippingAddress address = 1;
repeated Item item = 2;
required double amountPayable = 3;
}
Mi piace il secondo, ma sono felice di sentire argomenti contrari.