Sto sviluppando un sistema su cui ci sono due requisiti che sembra essere in conflitto. Poiché questa sembra essere una situazione che può essere più generale, ho pensato che fosse valido chiedere qui.
Il sistema in questione è destinato alla gestione delle finanze di un'azienda.
Nel sistema i clienti sono registrati e nei dati del cliente è possibile specificare i servizi che l'azienda sta fornendo per loro.
Il sistema ha anche un modulo di fatturazione, in cui l'azienda registra i suoi servizi e invia fatture ai clienti selezionando il servizio che hanno registrato.
I due requisiti in conflitto sono:
-
Nel modulo di registrazione del cliente, i servizi sono predefiniti. Si scelgono i servizi forniti per ciascun cliente e le proprietà del servizio corrispondente, che ottimizzano la modalità di fornitura del servizio. Il punto è che ogni servizio ha alcune proprietà di definizione. Inoltre, in altre aree del sistema, esiste una logica aziendale che deve conoscere tali servizi e proprietà. Questo rende i servizi terminati con hardcoded.
-
Nel modulo di fatturazione, l'utente finale desidera registrare i servizi autonomamente. Vogliono essere in grado di registrare i servizi e categorizzare i servizi che fatturano a modo loro.
Ora, questi due sono in conflitto perché è richiesta l'integrazione. Nel senso che quando un servizio viene fornito a un cliente, l'utente finale desidera che la fattura venga emessa automaticamente.
Un esempio: se c'è un servizio di supporto, sulla registrazione del cliente potrebbe esserci una classe che rappresenta il servizio o una proprietà del Cliente, indicante se il servizio è fornito o meno. Ciò consentirà al sistema di prendere decisioni e svolgere una logica di business correlata al Supporto fornito a questo Cliente.
D'altra parte, sulla parte di fatturazione del sistema, l'utente finale ha aggiunto manualmente un registro "Supporto". Ora, se abbiamo bisogno di automatizzare, non c'è modo in cui il sistema possa automaticamente sapere che il "Supporto" che è hardcoded lì, in una classe o in una proprietà, corrisponde alla voce "Supporto" sul database.
Secondo me, il modo corretto di risolvere questo problema è quello di rimuovere la possibilità per l'utente finale di registrare i servizi stessi. Ma poi c'è il problema: cosa succede se l'utente finale non vuole sentirlo e lo vuole in quel modo, non importa quale?
Come posso conciliare questi due requisiti? Come posso affrontare la situazione in cui in due parti del sistema appare lo stesso concetto, in uno deve essere effettivamente codificato e nell'altro l'utente vuole avere la libertà di registrarlo da solo? Credo che i contesti del DDD possano aiutare qui, ma non so ancora come.