Ho l'opportunità di riscrivere un pezzo principale di un progetto (C #) che è pesantemente legato all'eredità e si sente sempre più restrittivo nel modo in cui è progettato. Lo scenario è piuttosto semplice, immagina un'applicazione creata per gestire varie piccole attività. Ogni attività è unica nella sua funzionalità, quindi implementa un'interfaccia ITask con alcuni semplici metodi che vengono implementati da ogni classe di attività (ad esempio Init (), Start (), Stop (), ecc.)
Oltre all'interfaccia ITask c'è anche una classe BaseTask astratta da cui ereditano tutte le attività. Questa classe BaseTask è una sorta di approccio "tutto tranne che in cucina" che contiene utili funzionalità che le attività richiedono spesso. Ad esempio, tutte le attività registrano il loro stato e procedono allo stesso modo, quindi questa logica è definita nel BaseTask e disponibile per tutti i bambini attraverso un metodo protetto. O per dare un altro esempio, alcune attività devono inviare notifiche e-mail quando vengono soddisfatte determinate condizioni, quindi ancora una volta, il BaseTask fornisce l'accesso alle funzionalità core smtp dell'app per questo scopo. Esistono molti esempi di questo tipo di metodi / proprietà "helper"
Il problema, naturalmente, è che questa classe base è già diventata ingombrante e ingombra di proprietà e metodi che non sono universali per tutte le attività e sta iniziando a introdurre più problemi di quanti ne risolva. Ad esempio, ogni volta che viene richiesta una modifica alla classe base, ti trovi in una posizione in cui potresti finire per interrompere alcune (o tutte) delle attività. Sembra anche il suo incapsulamento irrinunciabile e il principio di responsabilità singola. È anche abbastanza chiaro come ciò sia successo in primo luogo (e anche un evento comune). Inizialmente si trattava di un'applicazione molto piccola e specializzata, ma è esplosa molto rapidamente in termini di portata e dimensioni e ciò che inizialmente non era probabilmente una decisione errata architettonicamente si è rivelato inflessibile e scomodo.
Dove inizieresti con qualcosa di simile? Come affronteresti il problema e quali principi o schemi di progettazione sceglieresti? Grazie mille