Questa è una domanda molto generica: l'ereditarietà e le annotazioni sono due cose completamente diverse. In generale, quando si crea una nuova classe si utilizza inheritance per due motivi: per la funzionalità inherit e per renderlo un sottotipo . Insieme e integrati da funzioni come overriding del metodo , questi due elementi rappresentano un potente mezzo di riutilizzo del codice ed estensiblità .
Annotazioni , d'altra parte, sono solo un modo per aggiungere dichiarazioni personalizzate alle classi (e ad altre entità di codice, ovviamente). I framework, come Spring, possono interpretarli come vogliono.
Questo è il punto in cui queste due sovrapposizioni: i framework possono scegliere di utilizzare le annotazioni per consentire anche il riutilizzo del codice ed estensibilità . Spring, ad esempio, utilizza le annotazioni per aggiungere una particolare funzionalità a una classe oa un blocco di codice , come dici tu, ad esempio tramite AOP.
Quindi, la tua domanda potrebbe essere in realtà se utilizzare AOP rispetto a subclassing / ereditarietà. E la risposta a questo è: dipende.
C'è un problema principale di ereditarietà: puoi scegliere solo una singola classe base. Quindi, se vuoi riutilizzare ed estendere le funzionalità da più componenti diversi, la sottoclasse semplicemente non funziona . Come secondo problema, non è possibile riutilizzare la funzionalità tramite l'ereditarietà senza che la rispettiva classe diventi un sottotipo. Poiché la sottotipizzazione implica la sostituibilità, l'ereditarietà potrebbe effettivamente aggiungere più vincoli di quelli che vuoi o di cui hai bisogno.
Invece, in puro OOP, ti viene spesso detto di usare composizione sull'eredità . Compilando componenti anziché ereditandoli, eluderai il problema della singola classe base, ma questo è a costo di
- più codice standardplan e
- meno estensibilità - non puoi più ignorare i metodi protetti.
I framework come Spring aiutano a ridurre il codice boilerplate componendo automaticamente i componenti per te e forniscono funzionalità di programmazione orientate all'aspetto per darti più punti di estensione. Quindi, ti daranno i benefici dell'ereditarietà (e altro), ma senza il problema della singola classe base. Tuttavia, non tutto è grandioso, ma aggiunge una certa complessità al codice; è necessario comprendere la struttura e i suoi concetti per capire come Spring interpreterà le annotazioni. Ragionare su come si comporterà il tuo codice potrebbe diventare più difficile.
Quindi, quale preferire? Ecco alcune linee guida che posso fornire.
- Non ereditare da classi non pensate per la sottoclasse. Usa il loro meccanismo di estensibilità previsto, se ce n'è uno.
- Favorisci la composizione dell'oggetto sull'ereditarietà. Utilizzare l'ereditarietà principalmente per la sottoclasse (vale a dire, per ottenere la sostituibilità), non per il riutilizzo.
- Non utilizzare AOP se esiste un'alternativa più semplice.
- Utilizza AOP e altre funzionalità basate su annotazioni se rende il tuo codice più dichiarativo e più facile da leggere.
- Leggi la documentazione dei tuoi framework e prova a seguire le loro migliori pratiche.