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.
+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. –
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++. –