Я оцінюю буфери протоколів Google для служби на базі Java (але очікую мовних агностичних моделей). У мене є два питання:
Перше - широке загальне питання:
Які моделі ми бачимо, як люди використовують? Зазначені зразки пов'язані з організацією класу (наприклад, повідомлення за файлом .proto, упаковкою та розповсюдженням) та визначенням повідомлення (наприклад, повторювані поля проти повторних інкапсульованих полів *) тощо.
На сторінках довідки Google Protobuf та загальнодоступних блогах є дуже мало такої інформації, тоді як є багато інформації для встановлених протоколів, таких як XML.
У мене також є конкретні запитання щодо наступних двох різних моделей:
Представляйте повідомлення у файлах .proto, упаковуйте їх як окрему банку та надсилайте їх цільовим споживачам послуги - що, напевно, я вважаю підходом за замовчуванням.
Зробіть те саме, але також включіть оброблені вручну обгортки (не підкласи!) Навколо кожного повідомлення, що реалізує контракт, що підтримує принаймні ці два способи (T - клас обгортки, 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), полягає в тому, що мої клієнти мають справу з незмінними об'єктами (те, що я можу застосувати в класі обгортки).
Одним з недоліків, які я бачу з (2), є те, що я дублюю код і повинен синхронізувати свої класи обгортання з файлами .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;
}
Мені подобається останнє, але я радий почути аргументи проти цього.