Abbiamo due moduli molto simili nel nostro progetto MVC: uno per i report e uno per le esportazioni. Solo per spiegare la nostra nomenclatura: le esportazioni vengono utilizzate solo per generare file flat e i report vengono utilizzati solo per visualizzare i dati nella GUI e per generare file PDF tramite la GUI.
Questi moduli sono distinti nel codice, ma gran parte della logica e alcune parti dei modelli sono simili. Ad esempio, sia il report che i modelli di esportazione hanno una classe Field
contenente proprietà come il nome del campo e il tipo del campo, mentre entrambi i modelli di esportazione e di report hanno una classe Filter
con proprietà come il filtro univoco nome, l'etichetta che accompagna il filtro nella GUI, ecc.
I due moduli sono stati scritti da persone diverse: io e un collega. Alcune classi di modelli sono letteralmente identiche (la classe Filter
è una di queste classi) ma altre sono simili ma presentano differenze necessarie. Ad esempio, la classe Field
nel modello di esportazioni ha la proprietà Width
per memorizzare il numero massimo consentito di caratteri nell'esportazione a larghezza fissa, tuttavia la classe Field
nel modello di report non ha questa proprietà Width
perché non esiste un campo di larghezza fissa in un report. Al contrario, la classe Field
nel modello di report ha una proprietà chiamata Grouping
per indicare se questo campo viene utilizzato per le aggregazioni di gruppo nel report risultante, mentre questo non è applicabile nelle nostre esportazioni.
Si spera che da ciò si ottenga l'immagine: due modelli con classi simili. Inoltre parte della logica è simile anche tra i due moduli. Ad esempio, i filtri vengono ricevuti dalla GUI e elaborati allo stesso modo sia per le esportazioni che per i report. Questa è l'eccezione piuttosto che la regola, tuttavia la maggior parte della logica è diversa in quanto i moduli eseguono compiti diversi.
Quindi ora abbiamo alcune opzioni diverse:
- Mantieni entrambi i moduli completamente separati - questo è il codice attualmente. Tutto il codice è distinto (eccetto per la funzionalità comune a tutti i moduli del progetto, come ottenere dati dal database, autenticazione dell'utente, manipolazione dei tipi, ecc., Ma tale codice non è l'argomento di questa domanda).
- Bit di riferimento di un modulo dall'altro. Ad esempio, entrambi potremmo utilizzare la classe
Filter
come definita nel modello di esportazione ed eliminare la classeFilter
dal modello di report. - Crea un nuovo modello (ad esempio
ExportsAndReports.cs
) per contenere solo i bit del modello che possono essere condivisi tra le esportazioni e i report (ad esempio la classeFilter
). Crea anche nuove funzioni logiche da utilizzare sia per le esportazioni sia per i moduli di report in cui la funzionalità è identica.
Capisco che non c'è una risposta giusta, ma sto cercando consigli da coloro che hanno già seguito questa strada. Che cosa mi consiglia? Cosa ti penti?
Anche il Principio della singola responsabilità sembra essere applicabile qui. Darebbe comunque moduli completamente separati? O permetterebbe di condividere i componenti di un modello e / o solo la logica?