2010-02-11 11 views
9

Me interesan las estrategias que las personas han ideado para separar toda la lógica simplificada que es necesaria para mantener la compatibilidad con versiones anteriores del código principal de una aplicación. En otras palabras, las estrategias que le permiten acercarse a la apariencia de su código como si no hubiera problemas de compatibilidad con versiones anteriores, excepto para los archivos de origen independientes separados que son claramente para esa tarea. Por ejemplo, si su aplicación lee un formato de archivo particular, en lugar de una función de análisis de archivo de bocina gigante, podría hacer que su código itere primero una lista de entradas/objetos "extravagantes", donde cada peculiaridad revisa el archivo para ver si se trata de un archivo al que se aplicaría, y si es así invoca su propia lógica de análisis en lugar de la lógica de caso normal.¿Cómo se puede separar limpiamente el código de compatibilidad con versiones anteriores del código principal?

Quirks es una estrategia bien pero tienes que trabajar para poner ganchos para cheques especiales en todos los lugares apropiados en tu aplicación, y como parecerán los cheques variará para diferentes tipos de peculiaridades, etc. Casi parece como debería haber bibliotecas dedicadas a la repetición para esta tarea. Otro problema es cómo hacer que las peculiaridades no se utilicen como anzuelos de propósito general en trozos arbitrarios de la aplicación.

Respuesta

10

Mi estrategia habitual es tener algo separado que traduzca la entrada de compatibilidad hacia atrás en la nueva entrada de implementación, y luego use el nuevo código de implementación con esta información traducida.

+2

+1: Ese también es mi enfoque. Un contenedor simple (para el código) y un convertidor de formato (para los datos) suele ser suficiente para crear una capa de compatibilidad decente. –

+1

Probablemente la estrategia más limpia, aunque sería complicado si tienes datos enormes. Entonces creo que va a querer implementar vistas de adaptador en lugar de hacer una conversión real, y ponerlas en capas podría ser doloroso en un lenguaje sin reflexión como C++. –

0

Esto dependería del marco de tiempo hasta la retirada de dichas características de compatibilidad con versiones anteriores. Está bastante seguro de que en un par de meses va a lanzar otra versión de su software que ya no tendrá esos caprichos, puede simplemente mantener el código anterior si es lo suficientemente disciplinado como para eliminarlo todo el material en el siguiente ciclo de desarrollo. Estoy manteniendo dos componentes de servidor back-end por separado donde trabajo y aunque no se pueden actualizar al mismo tiempo, por lo general pueden estar dentro de un par de semanas el uno del otro. Esto significa que la comunicación entre ellos debe ser compatible con versiones anteriores, pero solo una versión anterior, y en cada versión puedo eliminar el código anterior que dejé por razones de compatibilidad con versiones anteriores en la versión anterior.

Sin embargo, la capa de compatibilidad está ahí para quedarse por mucho tiempo o incluso indefinidamente (piense en formatos de archivo binarios de Word) Intentaré refactorizar el código de tal manera que la nueva funcionalidad y la anterior términos en esto Creo que tanto el formato anterior (o el comportamiento) como el nuevo formato son parte de los requisitos del sistema y no hay ninguna razón para que el formato antiguo sea un ciudadano de segunda clase (aparte de ser viejo, es decir, juego de palabras).

Cuestiones relacionadas