¿Qué es la alternancia de funciones o cómo deshacerse de las morsas insoportables y las ramas de larga vida?

Suponga que desea desarrollar una nueva función, pero no está seguro de que a los usuarios les gustará y necesita tener una forma de ocultarla sin problemas. O suponga que está trabajando en una nueva gran característica y desea evitar las confirmaciones de monstruos. O simplemente desea que el comportamiento del sitio sea fácilmente configurable. ¿Cómo puedo resolver todos estos problemas? Lee debajo del gato.

El problema


Imagine que los ciclos de desarrollo de su equipo duran dos semanas, y la implementación de una nueva característica requerirá 3 meses de desarrollo por parte del equipo. A primera vista, hay dos posibles esquemas de acción:

  • Cree una rama separada y haga todo el trabajo en ella durante tres meses, haciendo periódicamente extracción desde la rama principal
  • Utilice el concepto de integración continua ( Integración continua o CI para abreviar ): descomponga la tarea y congele el código en pequeñas porciones

Ambos enfoques tienen sus ventajas y desventajas obvias:

VentajasDesventajas
Rama de larga vidaEl código de su característica no preparada no estará en la rama principal y no será una molestia para otros desarrolladores
  • Conflictos de fusión permanentes que necesita resolver
  • Solicitud de extracción monstruosa inadecuada para revisión de código

Muchos compromisos de corta vida de las sucursalesLa tarea está bien descompuesta y congelada en pequeñas porciones; no hay necesidad de resolver conflictos de fusiónSu característica no preparada desconcertará a otros desarrolladores y, posiblemente, causará efectos de terceros en la interfaz de usuario

Usar conmutadores de funciones para resolver problemas


Tal problema se encuentra con bastante frecuencia en el desarrollo y hay una solución elegante que le permite tomar lo mejor de los enfoques descritos anteriormente: alternar características o alternar características .

Esencialmente, un conmutador de características es un indicador booleano que se almacena en la base de datos y contiene información sobre si una característica debe estar habilitada o no. El valor de este indicador se puede recuperar de la base de datos por clave. La conveniencia de usar conmutadores de funciones es que un usuario comercial puede cambiarlos fácilmente durante el tiempo de ejecución a través del panel de administración sin tener que volver a implementar la aplicación.

El siguiente es un ejemplo del uso de alternar características en Java:

if (configurationManager.getParameter("is.some.functionality.enabled")) { // do some stuff } else { // do default logic } 

En el ejemplo anterior, configurationManager es una clase que le permite recuperar el valor de un conmutador de características específico de la base de datos por su clave.

Además, con la ayuda de los conmutadores de funciones, puede mostrar / ocultar ciertos elementos en la interfaz. Para hacer esto, debe poner el valor del indicador en Modelo y pasarlo a Ver como se muestra a continuación:

 @ModelAttribute("isSomeFunctionalityEnabled") public void isSomeFunctionalityEnabled() { return configurationManager.getParameter("is.some.functionality.enabled"); } 

Luego use el valor pasado para representar este o aquel código HTML:

 <c:choose> <c:when test="${isSomeFunctionalityEnabled}"> <!-- Render some stuff --> </c:when> <c:otherwise> <!-- Render some other stuff --> </c:otherwise> </c:choose> 

Tipos de conmutadores de funciones


El concepto descrito del uso de conmutadores de funciones es solo un posible caso de uso y dichos conmutadores de funciones se denominan conmutadores de liberación. En total, se distinguen 3 tipos diferentes de conmutadores de funciones:

  • alternar entre versiones : le permite ocultar funciones implementadas de forma incompleta durante su desarrollo
  • alternar experimento - interruptores para pruebas A / B
  • alternar permisos : funciones de encendido / apagado para varios grupos de usuarios

Por lo tanto, al usar conmutadores de características, puede construir dos versiones diferentes del sitio en la misma base de código, usando diferentes bases de datos y diferentes conjuntos de conmutadores de características. Por ejemplo, en un sitio europeo tiene sentido incluir todas las funciones relacionadas con GDPR, pero en un sitio ruso no puede hacer esto.



Problemas al usar alternar funciones


Como trabajo en un proyecto en el que se usan activamente los conmutadores de funciones, además de las ventajas obvias de usarlos, comencé a notar problemas asociados con ellos:

  • Complejidad de la prueba : cuando se lanza una nueva versión, los ingenieros de control de calidad prueban todas las funciones que se incluyen en ella y también intentan activarlas y desactivarlas mediante conmutadores de funciones. Esto requiere mucho tiempo adicional, ya que es aconsejable probar todo tipo de combinaciones de banderas
  • La apariencia del código muerto : los valores de muchas funciones alternan no cambian por largos períodos de tiempo o no cambian en absoluto, y por lo tanto, el código escrito para un valor de bandera diferente en realidad se convierte en "muerto"
  • Desgloses inesperados del sitio : muchos de los conmutadores de funciones obsoletos tienen la desafortunada propiedad de romper algo al cambiar su valor (ya que nadie ha verificado durante mucho tiempo que funcionan). Dado que los conmutadores de características se almacenan en la base de datos y los usuarios comerciales pueden cambiarlos fácilmente desde el panel de administración, a menudo se producen averías debido a un cambio en su valor. El rendimiento de los conmutadores de funciones no utilizados durante mucho tiempo debe verificarse primero en un entorno de prueba

Soluciones a algunos de los problemas descritos.


Las siguientes acciones pueden ayudar a resolver los problemas anteriores:

  • Documentación de los conmutadores de funciones disponibles: para comprender qué efecto tiene un conmutador de funciones en particular y por qué clave buscarlo en la base de datos, debe crear documentación detallada con una descripción de todos los conmutadores de funciones.
  • Revisión periódica de los conmutadores de funciones: para evitar la aparición de código muerto, elimine periódicamente los conmutadores de funciones obsoletos y el código asociado

Resumen


El conmutador de características es un mecanismo muy simple y al mismo tiempo potente que le permite evitar confirmaciones monstruosas, cambiar fácilmente los comportamientos de las aplicaciones o ensamblar varias aplicaciones diferentes en la misma base de código utilizando diferentes configuraciones de alternancia de características.

Sin embargo, también vale la pena recordar que este patrón de desarrollo tiene algunos inconvenientes que resultan en un código difícil de leer y difícil de mantener, por lo tanto, se debe evitar el uso excesivo de este patrón y documentar periódicamente los conmutadores de características y sus revisiones para eliminar los no utilizados y, como resultado, borre el proyecto del código "muerto".

Enlaces utiles


Source: https://habr.com/ru/post/464021/


All Articles