Non so se ci sia effettivamente un modello di design, o più insieme, o forse quello che sto chiedendo è anti-pattern.
Contesto (semplificato): la mia azienda vende servizi SaaS (tramite un'API) a diversi clienti, che a loro volta vendono questo servizio agli utenti finali. Ogni client utilizza il servizio, ma alcuni vogliono comportamenti personalizzati in diverse funzionalità. Ovviamente, il comportamento personalizzato dovrebbe verificarsi solo per quel cliente specifico. L'utente finale è collegato a un cliente specifico, quindi quando si utilizza il servizio, sappiamo quale sia l'identificativo del client, quindi quale comportamento deve avere sulla funzione richiesta.
La mia domanda è: mantenendo una sola base di codice, come faccio a gestire comportamenti diversi a seconda dell'identificatore del client?
L'attuale implementazione è ovviamente ingenua e sporca (semplificata):
function someFeature() {
// common code
if(clientId === 'someClient') {
// does something
} else if(clientId === 'otherClient') {
// does something else
} // else if ... for every other custom behaviour, or on other parts of the feature
// common code
}
Ho letto degli schemi di progettazione, ma sembrano tutti concentrati su parti del mio problema, e non vedo come usarli tutti insieme ...
Se dovessi scavare una soluzione probabilmente andrei con un'implementazione di Bridge e una Factory per instanciare varie classi (per ogni client) che implementerebbero una stessa funzionalità in modo diverso (comportamento personalizzato di ogni cliente). Tenendo presente questo, quando un utente vuole utilizzare una funzione, la classe appropriata, grazie alla fabbrica, verrà instatata e utilizzata con il comportamento personalizzato desiderato.
Questa implementazione sembra il modo corretto per farlo, ma penso che incoraggerebbe la duplicazione del codice (per i bit di "codice comune") e richiederebbe ai programmatori di creare forse migliaia di nuove interfacce / classi per ogni funzionalità moltiplicata dal comportamento personalizzato di ogni cliente, a volte solo per una semplice riga di codice personalizzato.
Quale pensi che sarebbe il modo corretto per risolvere il mio problema?