Nuestros clientes pueden elegir cuándo actualizar. Por lo tanto, mi equipo, literalmente, tiene que mantener y admitir docenas de versiones de nuestro producto de software. Como se puede imaginar, esto genera una gran cantidad de ramificaciones y fusiones, ya que las correcciones urgentes y paquetes de servicios deben propagarse en todos estos sabores. No estoy contento con la situación. La solución obvia es simplemente no mantener tantas versiones diferentes de nuestro producto, pero esa solución obvia no está disponible para mí. Entonces, estoy explorando opciones creativas para reducir el trabajo de mantenimiento del equipo. Estoy considerando usar una combinación de Feature Toggling e IoC como una forma de implementar n-número de versiones de nuestro producto de software. La idea es que podría usar una única base de código para mi producto y gestionar comportamientos y características a través de la administración de la configuración. Esto sería en lugar de tener que propagar código a través de múltiples ramas. ¿Es este un enfoque razonable o estoy intercambiando un problema por otro?Uso de alternancia de funciones y IoC en lugar de código de ramificación: ¿buena o mala idea?
Respuesta
Eso suena razonable, ya que esta sería la forma en que abordaría un problema de este tipo en un entorno completamente nuevo.
No lo llamemos Feature Toggle, though. Como su nombre lo indica, un Feature Toggle es un interruptor on/off, que puede no ser lo que necesita.
A veces, una actualización también implica cambió comportamiento en características existentes. Eso implica que probablemente va a necesitar algo más sofisticado que un interruptor on/off.
La Strategy pattern es una forma más flexible de modelar la variación en el comportamiento. Cada estrategia puede representar una versión particular de un comportamiento particular, y si no desea el comportamiento en absoluto, puede proporcionar una implementación de Null Object. En otras palabras, Feature Toggle se puede implementar con una estrategia.
Puede inyectar las Estrategias en su kernel de aplicación usando Inyección de Dependencia, y puede hacer la elección de Estrategias configurables a través de un sistema de configuración. La mayoría de los Contenedores DI de los que he oído hablar (en .NET y Java) admiten configuraciones basadas en archivos.
Esto describe esencialmente una complemento de arquitectura.
Ahora, incluso para una aplicación greenfield, esto no es tarea fácil de realizar. Si tiene un sistema sin cabeza, no es que es difícil, pero una vez que tiene la interfaz de usuario implicada, comienza a darse cuenta de que también va a necesitar un componente de la arquitectura de la interfaz de usuario para poder conectar los elementos de la interfaz de usuario a través de estrategias .
En una base de código de una década, esto sería lo que yo llamaría un "desafío interesante", por decir lo menos.
- 1. Base de datos con "Esquema abierto" - ¿Buena o mala idea?
- 2. JSON en URL Hash - ¿Una mala o buena idea?
- 3. Singleton con un delegado: ¿Buena o mala idea?
- 4. Usando <noscript> dentro de <head>: ¿Buena idea o mala idea?
- 5. Uso de las declaraciones "friend" para pruebas unitarias. ¿Mala idea?
- 6. ¿Buena o mala idea para incluir números en los nombres de las tablas SQL?
- 7. Buffer de salida PHP: parece una mala idea, ¿o sí?
- 8. ¿Los parámetros de constructor primitivo son una mala idea cuando se utiliza un contenedor de IoC?
- 9. ¿Es una mala idea poner funciones en los mapas de Clojure, como en JavaScript?
- 10. Operador ternario: ¿mala o buena práctica?
- 11. ¿Es una mala idea ini_set ('max_execution_time', 0) una mala idea?
- 12. ASP.NET MVC - TempData - Buena o mala práctica
- 13. Regla horizontal: buena o mala decisión de diseño
- 14. Perl: ¿Es buena o mala expresión regular y cómo mejorarla?
- 15. Compresión de Memcache: ¿buena/mala?
- 16. Git stategy ramificación de las ramas de funciones y código común
- 17. Señales e hilos: ¿decisión de diseño buena o mala?
- 18. Guardando el progreso del juego con NSUserDefault: ¿Buena o mala idea?
- 19. Inicialización global de NUnit: ¿mala idea?
- 20. contentDescription = "@ null" una mala idea?
- 21. Cuándo utilizar propiedades en lugar de funciones
- 22. Singletons para facilar pruebas unitarias en una base de código heredada. Una buena idea o no?
- 23. Prisma: ¿mala idea usarlo?
- 24. Jerarquía de herencia de clases profundas: ¿mala idea?
- 25. rastreo de ASP.NET y System.Diagnostics: ¿me he perdido algo o es una mala idea?
- 26. Cookies de sesión firmadas. ¿Una buena idea?
- 27. ¿Es buena idea usar gerrit para alojar el repositorio de git en lugar de gitolita o gitosis?
- 28. Reutilización del código del servidor SQL a través de procedimientos almacenados: ¿buena o mala práctica?
- 29. MySQL 1,000 's de o declaraciones (buena idea?)
- 30. Análisis de hilos estáticos: ¿Buena idea?
Suena razonable. Estarías intercambiando varias sucursales por una única base de código, activando y desactivando las funciones. Teóricamente, puede activar o desactivar las características con la configuración. Si realmente necesita un código diferente para ejecutar, puede usar un contenedor IoC con diferentes implementaciones de código. Su pregunta sería más fácil de responder si fue más específico en su pregunta, dando ejemplos de su estilo actual frente a un estilo propuesto. –
Gracias RaulG, lo resumió bien y aprovechar IoC para hacer frente a distintas implementaciones es exactamente lo que tenía en mente. No estoy seguro de cómo responder a tu pregunta sobre estilos. La aplicación tiene más de una década de antigüedad, por lo que no refleja ningún estilo en particular. Probablemente aplicaría la estrategia anterior a los componentes rediseñados. No parece que la estrategia propuesta esté levantando banderas rojas. -- Gracias. –