Per coloro che non conoscono i principi SOLIDI puoi iniziare a leggere qui: articolo di Wikipedia . Tuttavia, la maggior parte della mia comprensione deriva da: link
Indipendentemente da ciò, sembra che ogni interfaccia della GUI in Java (anche quella di Adobe Flex onestamente) sia piena di dozzine di metodi che sono duplicati in molte classi. Le gerarchie di ereditarietà profonde sono la norma e la composizione non è decisamente preferita all'ereditarietà . Questa sembra essere una chiara violazione di SRP e ISP .
Quello che mi piacerebbe sapere è, ho ragione nel ritenere che queste strutture stiano violando i principi di progettazione SOLID? Se è così, allora perché?
Risposta a Snowman
Non sono d'accordo che SWING sia un esempio di SOLID. Consente di utilizzare l'esempio JButton:
1) SRP: il metodo isDoubleBuffered va oltre la responsabilità di JButton di rappresentare un pulsante dell'interfaccia utente. Questo metodo rappresenta un dettaglio di implementazione che non ha nulla a che fare con il concetto astratto di un pulsante dell'interfaccia utente.
2) OCP: se voglio cambiare il modo in cui JButton gestisce gli eventi, devo sostituire completamente la classe JButton.
3) LSP: l'implementazione di JButton non può essere facilmente sostituita con altre implementazioni. JButton eredita la maggior parte dei dettagli di implementazione direttamente. Se voglio cambiare il modo in cui JButton crea tooltip, assegna i listener di azioni, o accedo al contesto grafico, devo buttare via tutto di SWING. Non posso semplicemente rilasciare una nuova classe che gestisce quelle cose poiché JButton eredita direttamente da JComponent.
4) ISP: l'interfaccia pubblica JButton è disseminata di dozons di metodi da ogni classe da cui eredita. È letteralmente un gruppo di dumping di metodi pubblici da JComponent, Container, Compound, ecc. Se l'interfaccia di JButton aderisce all'ISP, saranno disponibili solo 10 metodi pubblicamente esposti.
5) DIP: JButton espone pubblicamente i metodi dei suoi dettagli di implementazione concreti. Se applicasse la vera inversione di dipendenza, elementi come icone, layout, gestione degli eventi, ecc. Sarebbero delegati a classi separate che l'utente potrebbe facilmente cambiare per ottenere nuove funzionalità.