Pergunta

Eu recentemente fiz esta pergunta: Expor XML ou objetos -. agradece a todos pelas respostas

Um ponto a esclarecer.

  • A API vai sempre ser acessada remotamente (ou seja, como um serviço), provavelmente via webservices ou WCF.

Eu concordo que, em teoria, uma API fortemente tipado expondo objetos como as entradas / saídas é a direito caminho a percorrer. No entanto, sinto que ainda há um argumento a ser feito para expor XML. A meu ver as razões para usar XML são:

  1. As regras de negócio podem ser escritos por analistas de negócios em Schematron.
  2. A interface é fracamente tipado, mas assim como é chamado, os dados podem ser validados contra dados e regras de negócios.
  3. A implementação do serviço será mais simples. Não haverá qualquer necessidade de criar um modelo de objeto de domínio.
  4. O esquema XML já está definido (temos um dicionário de dados de esquema).
  5. Usando serviços web meios tecnológicos que uma API XML baseada não vai precisar alterar como o carro novo 'tipos' são adicionados, por exemplo,

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

    Se usássemos uma API baseada em objetos, em seguida, adicionar um novo tipo exigiria um novo método de consulta que define os possíveis tipos derivados que poderiam ser devolvidos (ver estendendo serviços web ). Atualizando o serviço web como isso exigiria este serviço e todas clientes existente para ser reconstruído e reimplantado.

O que faz uma API baseada em objetos nos dá? Uma interface declarativa fortemente tipado. Ele não fornece mais de abstração do que XML (XML é em si uma abstração). O que faz o custo API baseada em objeto? Custa todo um conjunto de objetos de domínio que terão regras de negócio e validação de dados.

Então, o que é a minha pergunta? Dá-me, uma razão indiscutível un-defeatble por que eu deveria ir com objetos.

Foi útil?

Solução

  • Os objetos podem ter um melhor desempenho (pensando serialização binária aqui).
  • Os objetos podem ter fortes validações do tipo simples.
  • Objetos permitem que você coloque as regras de validação e de negócios mais perto da definição da estrutura de dados.
  • Objetos pela sua natureza, permitem que você escreva regras de negócio mais simples e de validação, desde que muito do que está incorporado na definição de objeto em si.
  • Objetos podem também definir comportamentos.
  • Net torna mais simples para transformar objetos em XML e de volta via serialização, dando objetos mais dos mesmos benefícios como XML.

Outras dicas

Se você está procurando um argumento a favor de XML (não que eu estou particularmente em favor de XML) são:

  • A exposição do XML e fornecendo um XSD é auto-explicativo quando se trata de dados. Você pode passar todos os dados nessa forma, é auto documentar e pode ser validado razoavelmente simples.

  • Eu posso escrever um monte de código seguro contra o meu banco de dados ou código do modelo e posso liberar os dados em uma auto-contido e forma segura para outras unidades de negócio que requer mais documentações ou explicação mínimo.

  • É tão fácil de ler que muitas vezes você pode lê-lo tão facilmente como você pode ler a documentação ou o código comentários.

Os argumentos contra ela no entanto, continuar e continuar ... para citar os piores criminosos:

  • excessivamente detalhado.
  • enorme sobrecarga da rede.
  • exigem uma compreensão de uma tecnologia extra, talvez desnecessariamente (?).
  • A mais complexa de fazer alguma coisa, a maior oportunidade para erros existem.

tipagem forte, de facto, qualquer digitação em tudo para que a matéria existe pela simples razão de que o programador não cometer erros estúpidos (ex. Passar uma string para uma função esperando um int etc). No topo do que isso acontece em tempo de compilação e não custa nada em tempo de execução produzindo código eficiente, evitando verificações de tempo de execução (por exemplo. Para moldes adequados) e evitando comportamento anormal em tempo de execução para código não gerenciado.

Como você disse XML pode ser usado para definir um modelo de objeto de substituição, mas este objeto modelo precisa se submeter as mesmas verificações em tempo de execução para garantir a fiabilidade até um certo ponto. Mas isso tem uma certa sobrecarga de tempo de execução finito.

Tendo dito que tudo o que eu quero dizer é que a escolha final é sua. Você está disposto a abandonar a segurança (e, por vezes, a paz de espírito) oferecido por um modelo de objeto "rígido" ou você vai ser mais confortável com um mais flexível, mas pode-shoot-yourself-in-the-pé modelo de objeto? XML requer maior disciplina programador e estado de alerta (tornando-se assim uma tarefa para uso IMHO).

A API "baseada em objeto" não é tão rígida como você pensa, esquemas XML gerados automaticamente maynot estar fazendo o que você realmente quer fazer. APIs baseadas objeto pode ser feito tão flexível como API baseada em XML se eles foram concebidos bem. tipagem dinâmica pode ajudar também, às vezes.

Quando você expor XML simples, todos os seus clientes terão de escrever código para gerar e analisar esse XML. Fácil em algumas línguas, uma PITA em outros.

Mas a maioria das línguas têm APIs de serviços web que podem levar WSDL / XSD e gerar uma biblioteca cliente completo em segundos. Claro, eles vão ter que escrever um utilitário de mapeamento para mapear a partir de seu modelo interno para o seu modelo para interagir com você, mas isso é de se esperar.

O seu serviço web vai lidar com todo o objeto <-> material XML internamente (para vista do cliente), você não vai precisar se preocupar com SOAP e tudo isso. Você vai definir sua interface:

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

que faz muito sentido para seus clientes. Eles pegue o seu WSDL e gerar suas bibliotecas cliente em Java, C #, PHP, Python, etc.

Não há nada que impeça você de acrescentar:

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

Mas por adicionar dois níveis de cruft webservice - primeiro o WSDL, então os xsds para o XML schema ...

Dê uma olhada na web para artigos sobre Contrato-primeiro projeto, o site da Primavera tem um bom exemplo. Estou desenvolvendo um novo web site agora e ter tomado a abordagem de começar com e Schema XML e usá-lo para projetar o meu modelo de domínio de aplicação. XML é um excelente para o envio de dados entre sistemas diferentes ou mesmo camadas de suas aplicações. Ele está programando agnóstico linguagem e existem muitas ferramentas para edição, concepção e implementação de projetos baseado em XML.

É detalhado, mas no esquema das coisas a verbosidade é um menor aborrecimento. Ele pode criar arquivos grandes, apenas comprimi-lo. Há mais sobrecarga no processamento, mas nós desenvolvedores estão sempre trocando desempenho puro para facilidade de uso, facilidade de manutenção, extensibilidade, etc.

Aqui está outro pensamento aleatório - utilização não ;-p Estou pensando em outros formatos de câmbio. Eu fiz um monte de trabalho ultimamente com buffers de protocolo - este ofertas uso de contrato de primeira (através de uma definição ".proto"), mas é projetado com extensibilidade em segurança em mente - ou seja, você pode projetar coisas para passar por dados inesperados sem quebrar ou perda. Infelizmente, os principais buffers de protocolo especificação na verdade não incluem herança, mas minha aplicação (protobuf-net) calços esta via extensões.

Se é maduro o suficiente depende do cenário - Eu só pensei que poderia ser de interesse. Como um aparte, (Protobuf-líquido) também se conecta a WCF para a conveniência de um RPC pré-laminados pilha ;-p

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top