Contrastando a todos los nay-sayers, asumamos una verdadera necesidad comercial.
(por ejemplo, entregable es el código fuente, los clientes pertenecen a la misma línea de negocios y, por lo tanto, son competidores entre sí, y su modelo de negocio promete mantener sus secretos en secreto)
Además, supongamos que su empresa tiene las herramientas para mantener todas las sucursales, es decir, mano de obra (digamos 100 desarrolladores dedicados a la fusión, suponiendo un retraso de lanzamiento de 5 días; o 10 devs suponiendo retraso de publicación de 50 días está bien), o tales pruebas automáticas tan impresionantes que las fusiones automáticas se prueban realmente tanto con especificación básica como especificación de extensión en cada Rama, y por lo tanto, solo los cambios que no se fusionan "limpiamente" requieren la intervención humana. Si sus clientes pagan no solo por las personalizaciones, sino también por el mantenimiento de las mismas, este puede ser un modelo de negocio válido.
Mi pregunta (y ninguna respuesta) es: ¿tienes una persona dedicada responsable de la entrega a cada cliente? Si usted es, digamos, una compañía de 10,000 personas, puede ser el caso.
Esto puede ser manejado por arquitectura de complementos en algunos casos, digamos que su núcleo es troncal, los complementos podrían mantenerse en troncales o sucursales, y la configuración para cada cliente es un archivo con un nombre único o es celebrado en la sucursal del cliente.
Los complementos pueden cargarse en tiempo de ejecución o incorporarse en tiempo de compilación.
En realidad, muchos proyectos se realizan de esta manera, fundamentalmente se aplica el mismo problema: los cambios básicos simples son triviales de integrar, los cambios de conflicto deben revertirse o se necesitan cambios para muchos complementos.
Hay casos en que los complementos no son lo suficientemente buenos, que es cuando se deben ajustar tantos elementos internos del núcleo que el recuento de la interfaz del complemento es demasiado grande para manejar.
Idealmente, esto se manejaría mediante programación orientada a aspectos , donde la troncal es el código principal, y las ramas son aspectos (es decir, código adicional e instrucciones sobre cómo conectar los extras al núcleo)
En un ejemplo sencillo, puede especificar que se ejecute foo
personalizado antes o después del núcleo klass.foo
o que lo reemplace, o que lo envuelva y pueda cambiar la entrada o la salida.
Hay un montón de bibliotecas para eso, sin embargo, el problema de los conflictos de fusión no desaparece: las fusiones limpias son manejadas por AOP y los conflictos aún necesitan la intervención humana.
Finalmente, este tipo de negocio realmente tiene que preocuparse por el mantenimiento de la sucursal , es decir, es una característica específica del cliente X tan común que es más económico pasarla al núcleo, aunque no todos los clientes la están pagando ?