Pregunta

Hace poco hice esta pregunta: Exponer XML u objetos - gracias a todos por las respuestas.

Un punto para aclarar.

  • Siempre se accederá a la API de forma remota (es decir,como servicio), muy probablemente a través de servicios web o WCF.

Estoy de acuerdo en que, en teoría, una API fuertemente tipada que expone objetos como entradas/salidas es la bien camino a seguir.Sin embargo, creo que todavía hay argumentos a favor de exponer XML.A mi modo de ver, las razones para usar XML son:

  1. Las reglas comerciales pueden ser escritas por analistas comerciales en Schematron.
  2. La interfaz tiene tipos débiles, pero tan pronto como se llama, los datos se pueden validar con respecto a los datos y las reglas comerciales.
  3. La implementación del servicio será más sencilla.No será necesario crear un modelo de objetos de dominio.
  4. El esquema XML ya está definido (tenemos un diccionario de datos de esquema).
  5. El uso de tecnología de servicios web significa que una API basada en XML no necesitará cambiar a medida que se agreguen nuevos "tipos" de automóviles, p.

    void AddNewCar( string newCarXml )    
    string[] GetCars( /* some query conditions */ )
    

    Si usáramos una API basada en objetos, agregar un nuevo tipo requeriría un nuevo método de consulta que defina los posibles tipos derivados que podrían devolverse (consulte ampliando los servicios web).Actualizar el servicio web de esta manera requeriría estos servicios y todo los clientes existentes se reconstruirán y reimplementarán.

¿Qué nos aporta una API basada en objetos?Una interfaz declarativa fuertemente tipada.No proporciona más abstracción que XML (XML es en sí mismo una abstracción).¿Cuánto cuesta la API basada en objetos?Cuesta un conjunto completo de objetos de dominio que necesitarán reglas comerciales y validación de datos.

Entonces, ¿cuál es mi pregunta?Dame una razón invencible e indiscutible por la que debería optar por los objetos.

¿Fue útil?

Solución

  • Los objetos se obtienen mejores resultados (pensando serialización binaria aquí).
  • Los objetos pueden tener validaciones de tipo simple más fuertes.
  • Los objetos le permiten poner las reglas de validación y de negocios más cercanos a la definición de la estructura de datos.
  • objetos por su naturaleza le permiten escribir más simple de reglas de negocio y de validación, ya que gran parte de los que está incrustado en la propia definición del objeto.
  • Los objetos también pueden definir comportamientos.
  • .Net hace que sea fácil de convertir objetos a XML y viceversa a través de la serialización, lo que la mayoría de los objetos de los mismos beneficios que el XML.

Otros consejos

Si lo que buscas es un argumento a favor de XML (no es que me siento particularmente a favor de XML) son:

  • La exposición del XML y proporcionando un XSD es auto explicativo cuando se trata de datos. Puede pasar todos los datos de esa forma, que es uno mismo la documentación y se puede validar razonablemente simple.

  • Puedo escribir un montón de código de seguridad en contra de mi base de datos o código de modelo y puedo liberar los datos en una independiente y de manera segura a otras unidades de negocio que requiere más documentación o explicación mínima.

  • Es tan fácil de leer que a menudo se puede leer tan fácilmente como se podía leer la documentación o código de comentarios.

Los argumentos en su contra, sin embargo, siguen y siguen ... para nombrar los peores:

  • excesivamente prolijo.
  • enorme sobrecarga de la red.
  • Exigir a la comprensión de una tecnología adicional, quizás innecesariamente (?).
  • El más complejo de hacer algo, la mayor oportunidad para que los errores no son.

La tipificación estricta, de hecho, tener que escribir nada en absoluto para que la materia existe por la única razón de que el programador no cometer errores estúpidos (por ejemplo. Pasar una cadena a una función que espera un int, etc). Por encima de todo esto sucede en tiempo de compilación y no cuesta nada en tiempo de ejecución produciendo así un código eficiente, evitando los controles de tiempo de ejecución (por ejemplo. Para moldes apropiados) y evitar un comportamiento anormal durante la ejecución de código no administrado.

Como has dicho XML se puede utilizar para definir un modelo de objetos de reemplazo, pero este modelo de objetos tiene que someterse a los mismos controles en tiempo de ejecución para garantizar la fiabilidad en cierta medida. Pero esto tiene una cierta sobrecarga de tiempo de ejecución finito.

Una vez dicho esto todo lo que quiero decir es que la elección final es suya. ¿Está dispuesto a abandonar la seguridad (y, a veces la paz de la mente) se obtiene mediante un modelo de objeto "rígido" o va a ser más cómodo con un sistema más flexible, pero puede disparar-usted mismo-en-el-pie modelo de objetos? XML requiere una mayor disciplina programador y el estado de alerta (por lo que es una tarea para usar en mi humilde opinión).

El "objeto basado" API no es tan rígida como se piensa, los esquemas XML generados automáticamente maynot estar haciendo lo que realmente quiere que hagan. API basada en objetos se pueden hacer tan flexible como API basada en XML si han sido diseñados también. tipado dinámico puede ayudar también a veces.

Al exponer XML llanura, con todos sus clientes tendrán que escribir código para generar y analizar el XML. Fácil en algunos idiomas, un PITA en otros.

Sin embargo, la mayoría de las lenguas tienen las API de servicios web que pueden tomar WSDL / XSD y generar una biblioteca de cliente completo en cuestión de segundos. Sin duda, van a tener que escribir una utilidad de mapeo para mapear de su modelo interno para su modelo de interactuar con ustedes, pero eso es de esperar.

El servidor web se encargará de todo el objeto <-> XML cosas internamente (para la vista del cliente), usted no tiene que preocuparse de SOAP y todo eso. Vas a definir su interfaz:

void addCar(Car newCar);
Car getCar(String make, String model, String year);
void removeCar(...);
List<Car> getAllCars();

que hace un montón de sentido para sus clientes. Se agarran su WSDL y generar sus bibliotecas de cliente en Java, C #, PHP, Python, etc.

No hay nada que le para añadir:

int addCarXML(String carXML);
String getCarXML(int carID);

Pero ¿por qué añadir dos niveles de servicio web cruft - primero el WSDL, a continuación, los XSD para el esquema XML ...

Eche un vistazo en la web para ver artículos sobre Contract-First Design; el sitio web de Spring tiene un buen ejemplo.Estoy desarrollando un nuevo sitio web en este momento y he adoptado la estrategia de comenzar con un esquema XML y usarlo para diseñar el modelo de dominio de mi aplicación.XML es excelente para enviar datos entre sistemas dispares o incluso capas de sus aplicaciones.Es independiente del lenguaje de programación y existen muchas herramientas para editar, diseñar e implementar diseños basados ​​en XML.

Es prolijo, pero en el orden de las cosas la verbosidad es una molestia menor.Puede crear archivos grandes, simplemente comprimirlos.Hay más gastos generales en su procesamiento, pero los desarrolladores siempre intercambiamos rendimiento puro por facilidad de uso, mantenibilidad, extensibilidad, etc.

Aquí hay otro pensamiento al azar - utilizar ni ;-P Estoy pensando en otros formatos de intercambio. He hecho mucho trabajo últimamente con búferes de protocolo - esto ofrece el uso del contrato y uno (a través de una definición "Proto"), pero se ha diseñado con la extensibilidad de seguridad en mente - es decir, puede diseñar cosas para pasar a través de los datos inesperados sin romper o pérdida. Desafortunadamente, la especificación principal búferes de protocolo en realidad no incluyen la herencia, pero mi aplicación (protobuf-net) cuñas esto a través de extensiones.

Si es lo suficientemente maduro depende del escenario - Sólo pensé que podría ser de su interés. Como acotación al margen, él (protobuf-net) también se conecta a WCF para la comodidad de una RPC ;-P pila pre-laminado

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top