Estou avaliando o Google Protocol Buffers para um serviço baseado em Java (mas estou esperando padrões agnósticos de linguagem). Eu tenho duas perguntas:
A primeira é uma ampla questão geral:
Que padrões estamos vendo as pessoas usarem? Os referidos padrões estão relacionados à organização da classe (por exemplo, mensagens por arquivo .proto, empacotamento e distribuição) e definição de mensagem (por exemplo, campos repetidos vs. campos encapsulados repetidos *) etc.
Há muito poucas informações desse tipo nas páginas de Ajuda e nos blogs públicos do Google Protobuf, enquanto há uma grande quantidade de informações para protocolos estabelecidos, como XML.
Também tenho perguntas específicas sobre os dois padrões diferentes a seguir:
Representar mensagens em arquivos .proto, empacotá-las como um frasco separado e enviá-las para os consumidores do serviço - que é basicamente a abordagem padrão, eu acho.
Faça o mesmo, mas também inclua wrappers criados à mão (não subclasses!) Em torno de cada mensagem que implementa um contrato que suporte pelo menos esses dois métodos (T é a classe do wrapper, V é a classe da mensagem (usando genéricos, mas com sintaxe simplificada por questões de concisão) :
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()); }
Uma vantagem que vejo em (2) é que posso ocultar as complexidades introduzidas por V.newBuilder().addField().build()
e adicionar alguns métodos significativos, como isOpenForTrade()
ou isAddressInFreeDeliveryZone()
etc., nos meus wrappers. A segunda vantagem que vejo com (2) é que meus clientes lidam com objetos imutáveis (algo que posso impor na classe wrapper).
Uma desvantagem que vejo em (2) é que duplico o código e tenho que sincronizar minhas classes de wrapper com arquivos .proto.
Alguém tem melhores técnicas ou críticas adicionais sobre qualquer uma das duas abordagens?
* Ao encapsular um campo repetido, quero dizer mensagens como esta:
message ItemList {
repeated item = 1;
}
message CustomerInvoice {
required ShippingAddress address = 1;
required ItemList = 2;
required double amountPayable = 3;
}
em vez de mensagens como esta:
message CustomerInvoice {
required ShippingAddress address = 1;
repeated Item item = 2;
required double amountPayable = 3;
}
Gosto do último, mas fico feliz em ouvir argumentos contra.