Digamos que tienes una interfaz IFoo
:
public interface IFoo {
void Bar(string s);
int Quux(object o);
}
En la versión 2 de su API, debe agregar un método Glarg
a esta interfaz. ¿Cómo lo hace sin romper sus usuarios API existentes y mantener la compatibilidad con versiones anteriores? Esto está dirigido principalmente a .NET, pero también puede aplicarse a otros marcos e idiomas.
versioning
interfaces
thecoop
fuente
fuente
Respuestas:
¿Por qué?
Las interfaces definidas para su uso con una API tienen dos roles completamente diferentes:
Ahora, para una versión dada de una API, la misma interfaz puede actuar como ambas. Aún así, en versiones futuras, esto se puede desacoplar.
Desea "devolver más", es decir, la abstracción de un objeto "más rico" de su API. Aquí tienes dos opciones:
Defina una nueva interfaz, si es posible, derivada de la anterior. Si tal derivación es imposible, cree métodos separados para consultar instancias de la nueva interfaz o use la composición:
fuente
DirectX agregó números de versión a sus interfaces. En su caso, la solución sería algo así como
La API todavía se referiría a IFoo y a IFoo2 solo en métodos, etc., donde se requiere la funcionalidad de IFoo2.
La implementación de la API debe verificar en los métodos existentes (= versión 1) si un objeto de parámetro IFoo realmente implementa IFoo2, si la semántica del método es diferente para IFoo2.
fuente
Agregar un nuevo método (o métodos) a su API debe hacerse de tal manera que no tenga ningún efecto secundario en la API existente. Lo que es más importante, alguien que continúe usando la antigua API como si la nueva API no existiera, no debería verse afectada por ella. Usar la API anterior no debería tener efectos secundarios inesperados en la nueva API.
Si alguno de los métodos existentes en la API es reemplazado por los nuevos, no los elimine de inmediato. Márquelos como obsoletos y proporcione una explicación de lo que debe usarse en su lugar. Eso les advierte a los usuarios de su código que futuras versiones ya no lo admitirán en lugar de romper su código sin previo aviso.
Si las API nuevas y antiguas son incompatibles y no pueden vivir juntas sin efectos secundarios no deseados, sepárelas y documente que si se va a adoptar la nueva API, la antigua API debe retirarse por completo. Esto es menos deseable ya que siempre habrá alguien que intente usar ambos y se sienta frustrado cuando no funciona.
Dado que usted preguntó acerca de .NET específicamente, es posible que desee leer este artículo sobre desuso en .NET, que se vincula a
ObsoleteAttribute
(utilizado en el siguiente ejemplo):fuente
Los cambios en la interfaz pública implican roturas. La estrategia común es hacer esto solo en las versiones principales y después de un período de congelación (para que no ocurra por capricho). Puede escapar sin interrumpir a sus clientes si agrega adiciones a una nueva interfaz (y su implementación puede proporcionar ambos en la misma clase). Eso no es lo ideal, y si sigues haciéndolo tendrás un desastre.
Sin embargo, con otros tipos de modificación (eliminación de métodos, cambio de firmas), está atascado.
fuente
Una interfaz es un contrato, por lo tanto, no debe tener versiones. ¿Qué sucede si un jugador de fútbol obtiene un nuevo contrato? ¿Sigue siendo válido el anterior? No. Si uno cambia la interfaz, el contrato cambia y el contrato anterior (interfaz) ya no es válido.
Aunque podría utilizar la estrategia IFoo2, eventualmente eso se volverá complicado cuando tenga:
Yuck
Una API es diferente. Doy biblioteca de código para usar. El mes que viene te doy una biblioteca actualizada. Como ha dicho otro póster, no rompa lo que ya estoy usando, solo agregue nuevas funciones / métodos.
Si quieres versionar algo, usa una clase abstracta en lugar de una interfaz.
fuente