Spesso mi imbatto in progetti che definiscono rigorosamente un'interfaccia per ogni classe. Il 90% di tali interfacce presenta solo una singola implementazione . I fautori di queste "interfacce preventive" difendono questo approccio come segue:
- In Java si dovrebbe sempre programmare le interfacce per ridurre al minimo gli sforzi di refactoring, quando è richiesta un'implementazione aggiuntiva.
- Il test è molto più semplice con le interfacce, dato che puoi stubare o simulare facilmente gli oggetti.
- Quadri, ad es. Spring utilizza i proxy dinamici proprietari di Java e quindi richiede interfacce.
Anche se tutti questi punti sembrano avere alcuni meriti, penso che non giustificano il massiccio aumento del numero di classi che le interfacce di definizione implicano in modo preventivo. Inoltre:
- Factoring out interfacce una volta che sono necessarie più implementazioni è questione di secondi con IDE contemporanei.
- Classi di derisione senza interfacce è facile con Mockito o altri Quadri di verifica delle unità.
- I framework come Spring possono utilizzare librerie di generazione di byte byte come CGLIB o Javaassist invece del meccanismo proprietario di Dynamic Proxy di Java.
Tenendo presente tutto questo, c'è davvero una ragione convincente per la definizione di "interfaccia preventiva" o è un relitto del passato e potrebbe anche essere considerato un anti-modello?