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.