Saya mengevaluasi Buffer Protokol Google untuk layanan berbasis Java (tetapi saya mengharapkan pola agnostik bahasa). Saya punya dua pertanyaan:
Yang pertama adalah pertanyaan umum yang luas:
Pola apa yang kita lihat digunakan orang? Pola tersebut terkait dengan organisasi kelas (mis., Pesan per file .proto, pengemasan, dan distribusi) dan definisi pesan (misalnya, bidang berulang vs. bidang terenkapsulasi berulang *) dll.
Ada sangat sedikit informasi semacam ini di halaman Bantuan Google Protobuf dan blog publik sementara ada banyak informasi untuk protokol yang dibuat seperti XML.
Saya juga memiliki pertanyaan spesifik atas dua pola berikut:
Mewakili pesan dalam file .proto, mengemasnya sebagai toples terpisah, dan mengirimkannya untuk menargetkan konsumen layanan - yang pada dasarnya adalah pendekatan standar yang saya kira.
Lakukan hal yang sama tetapi juga sertakan pembungkus kerajinan tangan (bukan sub-kelas!) Di sekitar setiap pesan yang menerapkan kontrak yang mendukung setidaknya dua metode ini (T adalah kelas pembungkus, V adalah kelas pesan (menggunakan generik tetapi sintaksis yang disederhanakan untuk singkatnya) :
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()); }
Satu keuntungan yang saya lihat dengan (2) adalah bahwa saya dapat menyembunyikan kerumitan yang diperkenalkan oleh V.newBuilder().addField().build()
dan menambahkan beberapa metode yang berarti seperti isOpenForTrade()
atau isAddressInFreeDeliveryZone()
dll di pembungkus saya. Keuntungan kedua yang saya lihat (2) adalah bahwa klien saya berurusan dengan objek yang tidak dapat diubah (sesuatu yang dapat saya terapkan di kelas wrapper).
Satu kekurangan yang saya lihat dengan (2) adalah saya menduplikasi kode dan harus menyinkronkan kelas pembungkus saya dengan file .proto.
Adakah yang punya teknik yang lebih baik atau kritik lebih lanjut tentang salah satu dari dua pendekatan ini?
* Dengan merangkum bidang yang diulang, maksud saya pesan seperti ini:
message ItemList {
repeated item = 1;
}
message CustomerInvoice {
required ShippingAddress address = 1;
required ItemList = 2;
required double amountPayable = 3;
}
alih-alih pesan seperti ini:
message CustomerInvoice {
required ShippingAddress address = 1;
repeated Item item = 2;
required double amountPayable = 3;
}
Saya suka yang terakhir tetapi saya senang mendengar argumen menentangnya.