ฉันกำลังประเมินบัฟเฟอร์ของ Google Protocol สำหรับบริการบน Java (แต่คาดว่าจะมีรูปแบบของผู้ไม่เชื่อเรื่องภาษา) ฉันมีสองคำถาม:
คำถามแรกคือคำถามทั่วไปที่กว้างขวาง:
เราเห็นรูปแบบอะไรที่ผู้คนใช้? รูปแบบดังกล่าวเกี่ยวข้องกับองค์กรระดับ (เช่นข้อความต่อไฟล์ .proto, บรรจุภัณฑ์และการจัดจำหน่าย) และคำจำกัดความของข้อความ (เช่นเขตข้อมูลซ้ำแล้วซ้ำกับเขตข้อมูลที่ห่อหุ้มซ้ำ *) เป็นต้น
มีข้อมูลประเภทนี้น้อยมากในหน้าความช่วยเหลือของ Google Protobuf และบล็อกสาธารณะในขณะที่มีข้อมูลจำนวนมากสำหรับโปรโตคอลที่กำหนดเช่น XML
ฉันยังมีคำถามเฉพาะเหนือรูปแบบที่แตกต่างกันสองแบบ:
แสดงข้อความในไฟล์ .proto, จัดเก็บเป็น jar แยกต่างหากและจัดส่งไปยังผู้บริโภคเป้าหมายของบริการ - ซึ่งเป็นวิธีการเริ่มต้นที่ฉันเดา
ทำเช่นเดียวกัน แต่รวมถึงการห่อด้วยมือที่สร้างขึ้น (ไม่ใช่คลาสย่อย!) รอบ ๆ แต่ละข้อความที่ใช้สัญญาที่สนับสนุนอย่างน้อยสองวิธีนี้ (T คือคลาส wrapper, V คือคลาสของข้อความ (ใช้ชื่อสามัญ :
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()); }
ข้อได้เปรียบอย่างหนึ่งที่ฉันเห็นด้วย (2) คือฉันสามารถซ่อนความซับซ้อนที่แนะนำV.newBuilder().addField().build()
และเพิ่มวิธีการที่มีความหมายเช่นisOpenForTrade()
หรือisAddressInFreeDeliveryZone()
อื่น ๆ ในห่อของฉัน ข้อได้เปรียบที่สองที่ฉันเห็นด้วย (2) คือลูกค้าของฉันจัดการกับวัตถุที่ไม่เปลี่ยนรูป (สิ่งที่ฉันสามารถบังคับใช้ในคลาส wrapper)
ข้อเสียอย่างหนึ่งที่ฉันเห็นด้วย (2) คือฉันทำซ้ำรหัสและต้องซิงค์คลาส wrapper ของฉันกับไฟล์. proto
ใครบ้างมีเทคนิคที่ดีกว่าหรือวิจารณ์เพิ่มเติมเกี่ยวกับวิธีการใดวิธีการหนึ่งในสอง?
* การห่อหุ้มฟิลด์ซ้ำฉันหมายถึงข้อความเช่นนี้:
message ItemList {
repeated item = 1;
}
message CustomerInvoice {
required ShippingAddress address = 1;
required ItemList = 2;
required double amountPayable = 3;
}
แทนข้อความเช่นนี้:
message CustomerInvoice {
required ShippingAddress address = 1;
repeated Item item = 2;
required double amountPayable = 3;
}
ฉันชอบคนหลัง แต่ดีใจที่ได้ยินข้อโต้แย้ง