Gestione delle modifiche specifiche per un cliente

3

Il problema

Progetto C # costituito da servizi WCF utilizzati da un Flex applicazione.

Un cliente può richiedere una modifica di funzionalità che richiede di modificare il codice per funzionare solo per loro. Potrebbe essere una singola riga di codice in un metodo o forse un metodo agisce in modo totalmente diverso per il cliente x.

Le mie idee

  1. Utilizza le filiali per i clienti che dispongono di una personalizzazione. Quando una versione è pronta, unire alle filiali del cliente e cercare di non rompere / dimenticare ciò che la loro personalizzazione era per. Utilizziamo SVN . Non sono un grande fan di questo dato che il codice base è molto grande.

  2. Utilizza inversione del controllo , injection dependency e MEF . Creare un'interfaccia per le classi che devono essere modificate. Creare un nuovo progetto di libreria di classi (ovvero customerabc), aggiungere una nuova classe che implementa la classe appena creata, sovrascrivere il / i metodo / i come necessario per le modifiche del cliente. Aggiungi un'esportazione MEF. Quindi posto questo in una cartella di personalizzazione e punto MEF lì. Se trova un file DLL nella cartella, lo utilizza invece dell'esportazione dall'assembly in esecuzione.

Mi piace l'opzione 2.

Pro:

  1. Installazione di distribuzione semplice e normale, quindi rilasciare il file DLL.
  2. Ovvio: potrebbe non essere eccessivamente chiaro se un cliente sta eseguendo o meno un codice dal proprio ramo. Con questa opzione potrei semplicemente guardare la cartella di personalizzazione.
  3. Pulisci - esistono solo i file che devono essere personalizzati. Non c'è bisogno di una copia completa del bagagliaio. d. Promuove meglio SOLID per lo sviluppo futuro e il refactoring (questo progetto ha poco OOP )
  4. .

Contro:

  1. Sarà più difficile gestire le modifiche nel trunk out ai progetti del cliente.
  2. Non risolve necessariamente il mio problema con le modifiche al database o le modifiche sul lato Flex.
  3. Se la modifica è una singola riga di codice in un metodo a 500 righe, non vedo alcuna altra opzione che sovrascrivere quel metodo, copia incolla il codice sull'override del cliente e apporta la modifica di una riga. Questo non è un buon uso di DEY per me, ma c'è un buon modo per aggirare questo?
  4. OK, un uso migliore dei principi OOP e SOLID potrebbe mitigare un po 'di questo, ma significa anche che per implementare una semplice richiesta del cliente, devo eseguire alcuni importanti refactoring per l'intera classe ... potenzialmente molte classi.

Che cosa dovrei fare?

    
posta Paul Wade 21.01.2014 - 20:11
fonte

1 risposta

4

L'opzione n. 1 è ragionevole, ma rappresenta una grande seccatura.

L'opzione # 2 dovrebbe essere la definizione del dizionario di overengineering.

Opzione n. 3 : considera questo:

Invece di più insiemi di requisiti disgiunti, (uno per ogni cliente,) supponiamo di avere un singolo set di requisiti, che copra tutti i clienti, con il requisito aggiuntivo che ogni data installazione della tua applicazione dovrebbe soddisfare un singolo cliente, che è specificato nella configurazione.

È vero, questo significa che i problemi specifici del cliente saranno sparsi in tutto il codebase e che ogni cliente riceverà funzionalità inattive, forse anche tabelle e colonne di database inutilizzate, ma hanno bisogno di sapere? E se hanno bisogno di sapere, a loro importa? Ti dispiace? Potrebbero far piacere ai loro affari e lasciarti fare il tuo lavoro in qualsiasi modo è più produttivo per te?

Il mio motore dell'auto ha alcuni ganci. Non ho alcun uso per questi ganci, ma sono lì perché hanno reso molto più facile installare il motore in fabbrica, e molto più sicuro per gli operai lì, quindi la presenza di questi ganci ha effettivamente abbassato il prezzo finale che ho pagato per la mia auto. Quindi, sto perfettamente bene con questi ganci altrimenti inutili.

    
risposta data 09.12.2015 - 00:10
fonte

Leggi altre domande sui tag