Suponga que tiene un gran proyecto respaldado por una base API. El proyecto también incluye una API pública que los usuarios finales (ish) pueden usar.
En ocasiones, debe realizar cambios en la base de API que admite su proyecto. Por ejemplo, debe agregar una función que necesite un cambio de API, un nuevo método o requiera la alteración de uno de los objetos, o el formato de uno de esos objetos, pasado ao desde la API.
Suponiendo que también esté utilizando estos objetos en su API pública, los objetos públicos también cambiarán cada vez que lo haga, lo que es indeseable ya que sus clientes pueden confiar en que los objetos API permanecen idénticos para que su código de análisis funcione. (tos C ++ clientes WSDL ...)
Entonces, una posible solución es versionar la API. Pero cuando decimos "versionar" la API, parece que esto también debe significar versionar los objetos de la API, así como proporcionar llamadas a métodos duplicados para cada firma de método modificada. Entonces tendría un objeto clr viejo y simple para cada versión de mi api, lo que de nuevo parece indeseable. E incluso si hago esto, seguramente no construiré cada objeto desde cero, ya que eso terminaría con grandes cantidades de código duplicado. Más bien, es probable que la API extienda los objetos privados que estamos usando para nuestra API base, pero luego nos encontramos con el mismo problema porque las propiedades agregadas también estarían disponibles en la API pública cuando no se supone que lo estén.
Entonces, ¿qué es la cordura que generalmente se aplica a esta situación? Sé que muchos servicios públicos, como Git para Windows, mantienen una API versionada, pero tengo problemas para imaginar una arquitectura que soporte esto sin grandes cantidades de código duplicado que cubra los diversos métodos versionados y objetos de entrada / salida.
Soy consciente de que procesos como el control de versiones semántico intentan poner algo de cordura cuando se producen interrupciones de API públicas. El problema es más que parece que muchos o la mayoría de los cambios requieren romper la API pública si los objetos no están más separados, pero no veo una buena manera de hacerlo sin duplicar el código.
I don't see a good way to do that without duplicating code
- Su nueva API siempre puede llamar a métodos en su antigua API, o viceversa.