Utilizzo dell'eredità vecchio stile rispetto alle annotazioni in Java

0

Quali sono i vantaggi reali dell'utilizzo di un'annotazione che aggiunge una particolare funzionalità a una classe oa un blocco di codice (a parte ovviamente scopi di sviluppo rapido)? Questo può arrivare a preferenze ma non uso affatto le annotazioni, in quanto possono mettere un limite allo sviluppatore. Si può facilmente perdere la libertà di personalizzazione .

La mia situazione specifica.

Siamo una grande piattaforma di e-commerce basata su Spring Framework . Ora ovviamente abbiamo scelte migliori come Spring4 ma usiamo ancora il deprecato (Spring 2.5) JAR solo perché sono stato in grado di estendere la classe SimpleFormController e aggiungere funzionalità personalizzate ad esso. Ora che JAR non è nemmeno disponibile nel repository di Maven. Qui abbiamo assunto un grosso rischio e abbiamo scelto l'API obsoleta quando sono disponibili alternative migliori.

Come ho già detto, questa domanda è più legata alle preferenze. Posso sapere dove le annotazioni sono meglio utilizzate e quali sono i suoi vantaggi, considerando il mio punto di vista?

    
posta Jay 28.08.2016 - 18:28
fonte

1 risposta

3

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.
risposta data 28.08.2016 - 21:32
fonte

Leggi altre domande sui tag