En contraste con todos los que no lo dicen, asumamos una necesidad comercial real.
(por ejemplo, entregable es el código fuente, los clientes son de la misma línea de negocios y, por lo tanto, 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 desarrolladores suponiendo que el retraso de lanzamiento de 50 días está bien), o tal prueba impresionante automatizado que se funde automatizados están verdaderamente a prueba tanto a las especificaciones del núcleo y la especificación de extensión en cada rama, y por lo tanto sólo los cambios que no se funden "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 comercial válido.
Mi pregunta (y negativa) es: ¿tiene 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 podría ser manejado por la arquitectura de complementos en algunos casos, digamos que su núcleo es troncal, los complementos podrían mantenerse en troncal o ramas, y la configuración para cada cliente es un archivo con un nombre único o se mantiene en la rama del cliente.
Los complementos pueden cargarse en tiempo de ejecución o incorporarse en tiempo de compilación.
Realmente muchos proyectos se hacen así, fundamentalmente el mismo problema aún se aplica: los cambios básicos simples son triviales para 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, es decir, cuando se deben ajustar tantas partes internas del núcleo que el recuento de la interfaz del complemento se vuelve demasiado grande para manejar.
Idealmente, esto se manejaría mediante programación orientada a aspectos , donde el enlace troncal es el código central y las ramas son aspectos (es decir, código adicional e instrucciones sobre cómo conectar los extras al núcleo)
Un ejemplo simple, puede especificar que la costumbre foo
se ejecute antes o después del núcleo klass.foo
o que la reemplace, o que la 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: AOP maneja las fusiones limpias y los conflictos aún necesitan la intervención humana.
Finalmente, este negocio realmente tiene que preocuparse por el mantenimiento de la sucursal , a saber, ¿la característica X específica del cliente es tan común que es más barato moverla al núcleo, a pesar de que no todos los clientes pagan por ella?