Ho l'opportunità di riscrivere un pezzo fondamentale di un progetto (C #) che è pesantemente legato all'ereditarietà 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 esiste anche una classe BaseTask astratta di cui tutte le attività ereditano. 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. Oppure, per dare un altro esempio, alcune attività devono inviare notifiche e-mail quando vengono soddisfatte determinate condizioni, quindi, di nuovo, il BaseTask fornisce l'accesso alle funzionalità di smtp principale dell'applicazione 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 sbagliata, architettonicamente, si è dimostrata inflessibile e scomoda.
Dove inizieresti con qualcosa di simile? Come affronteresti il problema e quali principi o schemi di progettazione sceglieresti? Grazie mille