Ultimamente sono preoccupato per l'uso di classi astratte.
A volte una classe astratta viene creata in anticipo e funziona come modello di come funzionerebbero le classi derivate. Ciò significa, più o meno, che forniscono alcune funzionalità di alto livello ma tralasciano alcuni dettagli che devono essere implementati dalle classi derivate. La classe astratta definisce la necessità di questi dettagli mettendo in atto alcuni metodi astratti. In tali casi, una classe astratta funziona come un progetto, una descrizione di alto livello della funzionalità o come si desidera chiamarla. Non può essere utilizzato da solo, ma deve essere specializzato per definire i dettagli che sono stati esclusi dall'implementazione di alto livello.
Altre volte, accade che la classe astratta sia creata dopo la creazione di alcune classi "derivate" (dal momento che la classe genitore / astratta non è lì, non sono state ancora derivate, ma sai cosa intendo). In questi casi, la classe astratta viene generalmente utilizzata come luogo in cui è possibile inserire qualsiasi tipo di codice comune contenuto nelle attuali classi derivate.
Dopo aver fatto le osservazioni di cui sopra, mi chiedo quale di questi due casi dovrebbe essere la regola. Qualunque tipo di dettaglio dovrebbe essere gorgogliato nella classe astratta solo perché attualmente sono comuni in tutte le classi derivate? Dovrebbe esserci un codice comune che non fa parte di una funzionalità di alto livello?
Il codice che potrebbe non avere alcun significato per la classe astratta stessa dovrebbe essere lì solo perché sembra essere comune per le classi derivate?
Lasciatemi fare un esempio: la classe astratta A ha un metodo a () e un metodo astratto aq (). Il metodo aq (), in entrambe le classi derivate AB e AC, utilizza un metodo b (). B () dovrebbe essere spostato su A? Se sì, allora nel caso in cui qualcuno guardi solo A (facciamo finta che AB e AC non ci siano), l'esistenza di b () non avrebbe molto senso! è una cosa negativa? Qualcuno dovrebbe essere in grado di dare un'occhiata in una classe astratta e capire cosa sta succedendo senza visitare le classi derivate?
Ad essere onesti, al momento di chiederlo, tendo a credere che scrivere una classe astratta che abbia un senso senza dover guardare nelle classi derivate sia una questione di codice pulito e architettura pulita. Ι Non mi piace l'idea di una classe astratta che si comporta come una discarica per qualsiasi tipo di codice sembra essere comune in tutte le classi derivate.
Cosa ne pensi / pratica?
Writing an abstract class that makes sense without having to look in the derived classes is a matter of clean code and clean architecture.
-- Perché? Non è possibile che, nel corso della progettazione e dello sviluppo di un'applicazione, scopro che diverse classi hanno funzionalità comuni che possono essere naturalmente refactorizzate in una classe astratta? Devo essere abbastanza chiaroveggente da anticiparlo sempre prima di scrivere un codice per le classi derivate? Se non riesco ad essere così astuto, mi sarà vietato eseguire un tale refactoring? Devo lanciare il mio codice e ricominciare da capo?