Voglio creare due applicazioni che avranno molte funzionalità comuni. Fondamentalmente, un sistema è una versione più avanzata dell'altro sistema. Chiamiamoli Simple
e Advanced
. Il sistema Advanced
aggiungerà, estenderà, modificherà e talvolta sostituirà la funzionalità del sistema Simple
. Ad esempio, il sistema Advanced
aggiungerà nuove classi, aggiungerà proprietà e metodi alle esistenti classi Simple
, cambierà il comportamento delle classi, ecc.
Inizialmente pensavo che le classi Advanced
venissero semplicemente ereditate dalle classi Simple
, ma posso vedere che la funzionalità diverge in modo abbastanza significativo man mano che lo sviluppo procede, pur mantenendo una funzionalità di base. Ad esempio, il sistema Simple
potrebbe avere una classe Project con una proprietà Sponsor mentre il sistema Advanced
ha un elenco di Project.Sponsors. Sembra una cattiva pratica ereditare da una classe e quindi nascondere, alterare o buttare via parti significative delle sue caratteristiche.
Un'alternativa è solo per eseguire due basi di codice separate e copiare il codice comune tra di loro, ma ciò sembra inefficiente, arcaico e irto di pericoli. Sicuramente siamo passati oltre i giorni dell'eredità "copia e incolla".
Un altro modo per strutturarlo sarebbe usare le classi parziali e avere tre progetti: Core
che ha la funzionalità comune, Simple
che estende le classi parziali Core
per il sistema semplice e Advanced
che anche estende le classi parziali Core
per il sistema avanzato. Oltre a tre progetti di test per ogni sistema. Questo sembra un approccio più pulito.
Quale sarebbe il modo migliore per strutturare la soluzione / i progetti / il codice per creare due versioni di un sistema simile? Diciamo che più tardi voglio creare un terzo sistema chiamato Extreme
, in gran parte basato sul sistema Advanced
. Creo quindi un progetto AdvancedCore
che sia Advanced
che Extreme
estendono utilizzando classi parziali? C'è un modo migliore per farlo?
Se è importante, è probabile che sia un sistema C # / MVC, ma sarei felice di farlo in qualsiasi linguaggio / framework adatto.