Oceniam bufory protokołu Google dla usługi opartej na Javie (ale oczekuję wzorców agnostycznych języka). Mam dwa pytania:
Pierwsze to ogólne pytanie ogólne:
Jakie wzory widzimy, ludzie używają? Wspomniane wzorce są powiązane z organizacją klas (np. Wiadomości na plik .proto, pakowanie i dystrybucja) i definicją wiadomości (np. Pola powtarzane vs. pola powtarzane *) itp.
Na stronach pomocy Google Protobuf i blogach publicznych jest bardzo mało tego rodzaju informacji, podczas gdy istnieje mnóstwo informacji o ustalonych protokołach, takich jak XML.
Mam również konkretne pytania dotyczące następujących dwóch różnych wzorów:
Reprezentuj wiadomości w plikach .proto, pakuj je jako osobny słoik i wysyłaj do docelowych klientów usługi - co jest w zasadzie domyślnym podejściem.
Zrób to samo, ale dołącz również ręcznie wykonane opakowania (nie podklasy!) Wokół każdej wiadomości, która implementuje kontrakt obsługujący co najmniej te dwie metody (T to klasa opakowania, V to klasa wiadomości (używająca ogólnych, ale uproszczonej składni dla zwięzłości) :
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()); }
Jedną z zalet, które widzę w (2), jest to, że mogę ukryć złożoność wprowadzoną przez V.newBuilder().addField().build()
i dodać kilka znaczących metod, takich jak isOpenForTrade()
lub isAddressInFreeDeliveryZone()
itp. W moich opakowaniach. Drugą zaletą, którą widzę w (2), jest to, że moi klienci radzą sobie z niezmiennymi obiektami (coś, co mogę wymusić w klasie opakowania).
Jedną wadą, którą widzę w (2), jest to, że duplikuję kod i muszę zsynchronizować swoje klasy opakowań z plikami .proto.
Czy ktoś ma lepsze techniki lub dalsze krytyki któregokolwiek z tych dwóch podejść?
* Przez enkapsulację powtarzającego się pola mam na myśli takie wiadomości jak ten:
message ItemList {
repeated item = 1;
}
message CustomerInvoice {
required ShippingAddress address = 1;
required ItemList = 2;
required double amountPayable = 3;
}
zamiast wiadomości takich jak ten:
message CustomerInvoice {
required ShippingAddress address = 1;
repeated Item item = 2;
required double amountPayable = 3;
}
Podoba mi się to drugie, ale cieszę się, że mogę wysłuchać argumentów przeciwko niemu.