Devo creare un nuovo modello generico per due modelli simili esistenti?

0

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:

  1. 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).
  2. 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 classe Filter dal modello di report.
  3. 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 classe Filter ). 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?

    
posta mulllhausen 08.08.2016 - 08:41
fonte

1 risposta

1
  • Si dovrebbero modellare app basate su POJOS, interfacce, classi astratte, ecc.
  • Quindi questi pezzi possono essere utilizzati nel "modello" (MVC)

Ma sembra che tu abbia progettato l'app come se il modello fosse un namespace o un'entità in sé. Il modello è uno scafolding architettonico in cui si utilizza la logica già esistente in POJOS, le interfacce e le classi astratte per creare un'app architettonica MVC. Potresti usare questi POJOS, interfacce e classi astratte in un'app non MVC e dovrebbero funzionare allo stesso modo.

Detto questo, la mia raccomandazione è di organizzare il codice in spazi dei nomi logici in base a ciò che fanno POJOS, interfacce e classi astratte. Quindi usa questi componenti nei tuoi modelli tramite l'importazione, il riutilizzo ecc. (Non conosco la lingua che stai usando).

Bottomline: andrei con l'opzione # 2.

    
risposta data 08.08.2016 - 13:56
fonte

Leggi altre domande sui tag