In contrapposizione a tutti i no-sayers, supponiamo che il vero bisogno di affari.
(ad esempio, deliverable è il codice sorgente, i clienti provengono dalla stessa linea di business e quindi concorrenti l'uno dall'altro e il tuo modello di business promette di mantenere segreti i loro segreti)
Inoltre, supponiamo che la tua azienda abbia gli strumenti per mantenere tutte le filiali, ovvero manodopera (diciamo 100 sviluppatori dedicati alla fusione, ipotizzando un ritardo di rilascio di 5 giorni; oppure 10 sviluppatori supponendo che il ritardo di rilascio di 50 giorni sia OK), oppure tali prove impressionante automatizzato che unioni automatici sono veramente testati sia per spec nucleo ed estensione spec in ogni ramo, e quindi solo le modifiche che non fondono "pulito" richiedono l'intervento umano. Se i tuoi clienti pagano non solo per le personalizzazioni ma per la loro manutenzione, questo può essere un modello di business valido.
La mia domanda (e no-sayers) è: hai una persona dedicata responsabile della consegna a ciascun cliente? Se siete, diciamo, un'azienda da 10.000 persone, potrebbe essere il caso.
Questo potrebbe essere gestito dall'architettura del plugin in alcuni casi, diciamo che il tuo core è trunk, i plugin potrebbero essere conservati in trunk o rami e la configurazione per ogni cliente è un file con un nome univoco o è conservata nella filiale del cliente.
I plugin possono essere caricati in fase di esecuzione o integrati in fase di compilazione.
Veramente molti progetti sono fatti in questo modo, fondamentalmente si applica lo stesso problema: semplici modifiche di base sono banali da integrare, le modifiche ai conflitti devono essere ripristinate o sono necessarie modifiche a molti plugin.
Ci sono casi in cui i plugin non sono abbastanza buoni, è allora che è necessario modificare così tanti interni del core che il conteggio dell'interfaccia del plugin diventa troppo grande da gestire.
Idealmente, questo dovrebbe essere gestito da una programmazione orientata all'aspetto , dove trunk è un codice core e rami sono aspetti (ovvero un codice extra e istruzioni su come collegare gli extra al core)
Un semplice esempio, è possibile specificare che la personalizzazione foo
viene eseguita prima o dopo il core klass.foo
o che la sostituisce o che la avvolge e può modificare l'input o l'output.
Ci sono moltissime biblioteche per questo, tuttavia il problema dei conflitti di unione non scompare: le fusioni pulite sono gestite dall'AOP e i conflitti necessitano ancora dell'intervento umano.
Infine, tali attività devono veramente occuparsi della manutenzione delle filiali , vale a dire, la caratteristica X specifica del cliente è così comune che è più economico spostarla nel core, anche se non tutti i clienti la stanno pagando?