Java tabanlı bir hizmet için Google Protokol Tamponlarını değerlendiriyorum (ancak dil agnostik kalıpları bekliyorum). İki sorum var:
Birincisi geniş bir genel soru:
İnsanların hangi kalıpları kullandığını görüyoruz? Sözü edilen kalıplar sınıf organizasyonu (örn. .Proto dosyası, paketleme ve dağıtım başına mesajlar) ve mesaj tanımı (örneğin tekrarlanan alanlar veya tekrarlanan kapsüllenmiş alanlar *) vb.
Google Protobuf Yardım sayfalarında ve genel bloglarda bu türden çok az bilgi bulunurken, XML gibi yerleşik protokoller için bir ton bilgi vardır.
Ayrıca aşağıdaki iki farklı örnekle ilgili özel sorularım var:
.Proto dosyalarındaki mesajları temsil edin, ayrı bir kavanoz olarak paketleyin ve temel olarak tahmin ettiğim varsayılan yaklaşım olan hizmetin tüketicilerini hedefleyin.
Aynı şeyi yapın, ancak en azından bu iki yöntemi destekleyen bir sözleşme uygulayan her mesajın etrafına el yapımı sargılar (alt sınıflar değil!) Ekleyin (T sarıcı sınıfıdır, V mesaj sınıfıdır (jenerikler kullanarak kısalık için basitleştirilmiş sözdizimi) :
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()); }
Ben getirdiği karmaşık uzak gizleyebilirsiniz ben (2) ile bakın bir avantajı olduğunu V.newBuilder().addField().build()
ve bu şekilde bazı anlamlı yöntemleri eklemek isOpenForTrade()
veya isAddressInFreeDeliveryZone()
vb benim sarma. (2) ile gördüğüm ikinci avantaj, müşterilerimin değişmez nesnelerle (ambalaj sınıfında uygulayabileceğim bir şey) uğraşmalarıdır.
(2) ile gördüğüm bir dezavantajı, kodu çoğaltmak ve sarma sınıfları .proto dosyaları ile eşitlemek zorunda olmasıdır.
İki yaklaşımdan herhangi biri hakkında daha iyi teknikler veya eleştiriler var mı?
* Tekrarlanan bir alanı kapsülleyerek, bunun gibi mesajlar kastediyorum:
message ItemList {
repeated item = 1;
}
message CustomerInvoice {
required ShippingAddress address = 1;
required ItemList = 2;
required double amountPayable = 3;
}
bunun gibi mesajlar yerine:
message CustomerInvoice {
required ShippingAddress address = 1;
repeated Item item = 2;
required double amountPayable = 3;
}
İkincisini seviyorum ama buna karşı tartışmaları duymaktan mutluluk duyuyorum.