Interfacce preventive in Java: buone, cattive o "una questione di gusti"

2

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?

    
posta Fritz Duchardt 19.07.2016 - 12:44
fonte

3 risposte

3

Le interfacce esistono (parlando della parola chiave interface ), quindi puoi definire un'API per le classi, in cui l'implementazione non ha importanza, solo gli argomenti, i tipi di ritorno e le eccezioni generate.

Dovresti trattare le classi e i loro metodi pubblici esattamente allo stesso modo, indipendentemente dal fatto che implementino o meno un'interfaccia. Una volta capito, vedrai anche una classe senza implementare un'interfaccia e in un certo senso è un'interfaccia.

A meno che una classe sia definita come final , provare un normale class invece di interface è altrettanto semplice estendendolo.

    
risposta data 19.07.2016 - 13:20
fonte
3

Un vecchio saggio una volta disse:

  • Di solito non crei un'interfaccia per ogni classe, sarebbe un ripensamento.
  • Crei interfacce come esercizio di progettazione, quindi crei classi che implementano tali interfacce.
  • Devi pensare che ciò che stai creando è sempre una base su cui qualcun altro può crearne di più.
  • Non creare piccoli programmi, creare progetti che possano crescere in modo organico.
  • Sappiamo che sei perfettamente in grado di hackerare una soluzione rapida, intelligente ed efficiente a un problema. Sei troppo qualificato per quello. Quello che dovresti cercare è creare un design, una fondazione, un'API, un framework, per quanto umili possano essere.
  • La parte del design è una delle poche cose divertenti ed edificanti che rimangono ancora di questa nostra spesso impersonale carriera.

Detto questo, puoi sempre ottenere il tuo IDE per estrarre un'interfaccia di una classe esistente se ne hai bisogno, ma ottieni il punto.

In conclusione: non si disegna un progetto dopo la costruzione di un edificio. Disegni il progetto e poi hai costruito l'edificio basandoti su quel progetto. Ma l'ingenuità civile è una disciplina matura.

    
risposta data 19.07.2016 - 14:14
fonte
-1

Non hai bisogno di un'interfaccia per ogni classe. Quello che faccio è creare interfacce per iniettabili e implementare le novità senza interfacce link .

    
risposta data 19.07.2016 - 12:54
fonte

Leggi altre domande sui tag