2009-11-25 17 views
14

Estamos presentando búferes de protocolo como el nuevo transporte para algunos servicios RPC de back-end. Debido a que existe resistencia a la transferencia manual de datos entre diferentes formas de objetos similares, puedo evitar que las instancias de Protocol Buffer pasen por la pila un poco más allá de la interfaz del servidor RPC.Usando el búfer de protocolo como objeto de datos general?

¿Es esto algo que debo tratar de evitar? ¿Es seguro tratar un objeto de búfer de protocolo como un soporte de datos simple, con la agradable conveniencia de que se puede transformar de forma rápida y eficiente en binario?

La otra razón por la que veo que es una buena forma de generar objetos de datos es la noción de campos obligatorios/opcionales y la interfaz del constructor generada automáticamente.

Respuesta

9

Bueno, no son terriblemente conveniente de usar de esa manera, ya que son inmutables, podría pasar los constructores alrededor, pero eso hace que los nombres de los tipos sean bastante largos. También significa que está limitado a los tipos de datos admitidos por los búferes de protocolo (y sus propios mensajes).

Es seguro para hacer esto, pero no siempre crea el más bonito de los diseños. Por otro lado, a veces es justo lo que ordenó el médico :)

Te sugiero que experimentes: aquí no hay "ajustes de una talla".

+0

Creo que el hecho de que sean inmutables realmente ayuda, no duele, cuando se trata de usar memorias intermedias de protocolos como esta. Son objetos de valor inmutables como String. –

+0

Ciertamente ayuda en algunos casos, cuando puede escribir código en un estilo funcional. En parte depende del problema y en parte de los desarrolladores :) –

+0

Immutable realmente ayuda en algunos casos, por razones desconocidas existen algunas construcciones públicas con una docena de parámetros más o menos, todos asignados a los campos finales. Un constructor es genial pero tedioso y repetitivo para escribir cada vez. También es complicado obtener la lógica de derecho requerido frente a derecho opcional, de modo que el método build() explote si se han omitido los campos obligatorios. –

0

En general, diseño las capas de mis sistemas para que los detalles de implementación de una capa no se filtren entre sí. No tengo experiencia directa con los Buffers de Protocolo de Google, pero parece que quiere usar la misma representación para el transporte y en las capas superiores de su sistema.

Si decidió dejar de utilizar los búferes de protocolo como representación de transporte, ¿qué tan fácil sería usar algo más?

+0

Esto es realmente un paso hacia eso exactamente. En este momento, un conjunto de interfaces dicta nuestra capa de datos, back-end RPC * y * hasta cierto punto una capa de servicio web RESTful. *DOLOR*. El paso n. ° 1 es reemplazar el back-end con búferes de protocolo para desacoplarlo del resto. Pero ese es un excelente punto. Si simplemente cambio todo a protobufs, lo único que desacoplé es el enlace entre el cliente y los servicios de RPC, mientras que las demás capas dependerán de los objetos de mensaje ... MALO. –

Cuestiones relacionadas