Suponha que você tenha um grande projeto suportado por uma base de API. O projeto também envia uma API pública que os usuários finais (ish) podem usar.
Às vezes, você precisa fazer alterações na base da API que suporta seu projeto. Por exemplo, você precisa adicionar um recurso que precise de uma alteração na API, um novo método ou exija a alteração de um dos objetos ou o formato de um desses objetos, passados para ou a partir da API.
Supondo que você também esteja usando esses objetos em sua API pública, os objetos públicos também serão alterados sempre que você fizer isso, o que é indesejável, pois seus clientes podem confiar nos objetos da API que permanecem idênticos para que seu código de análise funcione. (tosse clientes C ++ WSDL ...)
Portanto, uma solução potencial é a versão da API. Mas quando dizemos "version" a API, parece que isso também deve significar a versão dos objetos da API, além de fornecer chamadas de método duplicadas para cada assinatura de método alterada. Então, eu teria um objeto clr antigo e simples para cada versão da minha API, o que novamente parece indesejável. E mesmo que eu faça isso, certamente não construirei cada objeto do zero, pois isso acabaria com grandes quantidades de código duplicado. Em vez disso, é provável que a API estenda os objetos particulares que estamos usando para a API base, mas depois enfrentamos o mesmo problema, porque propriedades adicionadas também estariam disponíveis na API pública quando não deveriam.
Então, que sanidade geralmente é aplicada a essa situação? Conheço muitos serviços públicos, como o Git for Windows, que mantém uma API com versão, mas estou tendo problemas para imaginar uma arquitetura que suporte isso sem grandes quantidades de código duplicado que abrangem os vários métodos e objetos de entrada / saída.
Estou ciente de que processos como o controle de versão semântico tentam melhorar a integridade quando ocorrem quebras de API públicas. O problema é mais: parece que muitas ou a maioria das alterações exigem quebra da API pública se os objetos não estiverem mais separados, mas não vejo uma boa maneira de fazer isso sem duplicar o código.
I don't see a good way to do that without duplicating code
- Sua nova API sempre pode chamar métodos em sua API antiga ou vice-versa.