Tôi đang đánh giá Bộ đệm giao thức Google cho một dịch vụ dựa trên Java (nhưng tôi đang mong đợi các mẫu bất khả tri ngôn ngữ). Tôi có hai câu hỏi:
Đầu tiên là một câu hỏi chung chung:
Những mô hình nào chúng ta đang thấy mọi người sử dụng? Các mẫu đã nói có liên quan đến tổ chức lớp (ví dụ: thư trên mỗi tệp .proto, bao bì và phân phối) và định nghĩa thông báo (ví dụ: các trường lặp lại so với các trường được đóng gói lặp lại *), v.v.
Có rất ít thông tin thuộc loại này trên các trang Trợ giúp Google Protobuf và blog công khai trong khi có rất nhiều thông tin cho các giao thức đã được thiết lập như XML.
Tôi cũng có câu hỏi cụ thể về hai mẫu khác nhau sau đây:
Thể hiện các thông điệp trong các tệp .proto, đóng gói chúng dưới dạng một lọ riêng biệt và gửi nó đến các khách hàng mục tiêu của dịch vụ - về cơ bản đó là cách tiếp cận mặc định mà tôi đoán.
Thực hiện tương tự nhưng cũng bao gồm các trình bao bọc thủ công (không phải các lớp con!) Xung quanh mỗi thông báo thực hiện hợp đồng hỗ trợ ít nhất hai phương thức này (T là lớp trình bao bọc, V là lớp thông báo (sử dụng cú pháp chung nhưng đơn giản hóa cú pháp để đơn giản) :
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()); }
Một lợi thế tôi thấy với (2) là tôi có thể che giấu sự phức tạp được giới thiệu V.newBuilder().addField().build()
và thêm một số phương thức có ý nghĩa như isOpenForTrade()
hoặc isAddressInFreeDeliveryZone()
vv trong trình bao bọc của mình. Ưu điểm thứ hai tôi thấy với (2) là các khách hàng của tôi xử lý các đối tượng bất biến (điều mà tôi có thể thực thi trong lớp trình bao bọc).
Một nhược điểm tôi thấy với (2) là tôi sao chép mã và phải đồng bộ hóa các lớp trình bao bọc của mình với các tệp .proto.
Có ai có kỹ thuật tốt hơn hoặc phê bình thêm về bất kỳ trong hai cách tiếp cận?
* Bằng cách đóng gói một trường lặp lại, tôi có nghĩa là các tin nhắn như trường này:
message ItemList {
repeated item = 1;
}
message CustomerInvoice {
required ShippingAddress address = 1;
required ItemList = 2;
required double amountPayable = 3;
}
thay vì các tin nhắn như thế này:
message CustomerInvoice {
required ShippingAddress address = 1;
repeated Item item = 2;
required double amountPayable = 3;
}
Tôi thích cái sau nhưng rất vui khi nghe những lập luận chống lại nó.