Tutto ha un'interfaccia [duplicata]

8

Sto rilevando un progetto in cui ogni singola classe reale sta implementando un'interfaccia. La maggior parte di queste interfacce è implementata da una singola classe che condivide un nome simile e gli stessi identici metodi (ad es. MyCar e MyCarImpl). Quasi 2 classi nel progetto implementano più dell'interfaccia che condivide il suo nome.

So che la raccomandazione generale è quella di codificare un'interfaccia piuttosto che un'implementazione, ma non è forse un po 'troppo lontano? Il sistema potrebbe essere più flessibile in quanto è più facile aggiungere una nuova classe che si comporta in modo molto simile a una classe esistente. Tuttavia, è molto più difficile analizzare il codice e le modifiche al metodo ora richiedono 2 modifiche anziché 1.

Personalmente, normalmente creo solo interfacce quando è necessario che più classi abbiano lo stesso comportamento. Mi iscrivo a YAGNI , quindi non creo qualcosa a meno che non ne vedo il reale bisogno. Sto sbagliando tutto o questo progetto sta andando in porto?

    
posta Shane 15.10.2012 - 21:01
fonte

5 risposte

7

Questa è una violazione diretta del principio YAGNI e raccomando vivamente di non farlo in questo modo. È così facile introdurre un'interfaccia in un secondo momento quando ne hai davvero bisogno che non dovresti nemmeno preoccuparti di crearlo in anticipo. Ho sentito che questo è un modello abbastanza comune tra le persone di Java, ma non chiedermi perché, non ne ho idea.

Tuttavia, se questo è un progetto di squadra sul quale collabori, dovresti seguire gli standard stabiliti, anche se sono pessimi.

    
risposta data 15.10.2012 - 21:09
fonte
5

Questo è comune con le applicazioni parziali dei principi SOLID a un progetto e non necessariamente una cosa negativa.

La codifica delle interfacce anziché delle classi è un modo ragionevole per mantenere Dependency Inversion ed è molto utile (alcuni dicono necessario) per creare componenti software testabili.

Tuttavia, se il tuo sistema ha esattamente 1 interfaccia per ogni classe, e viceversa, probabilmente non stai rispettando la segregazione di interfaccia, e stai quasi certamente violando le linee guida di You Is not Gonna Need It.

Considerare il costo nei tempi di sviluppo (ora e in futuro) della creazione di interfacce per ogni classe e valutare se una migliore segregazione dell'interfaccia possa portare benefici al progetto. Questi principi e linee guida esistono solo per consentirti di comprendere i compromessi in vari progetti e di comunicarli in modo efficace. La decisione su quali convenzioni seguire e quanto rigorosamente è nelle tue mani.

    
risposta data 15.10.2012 - 21:10
fonte
1

Sì, questo progetto sta andando in porto. Ci sono due ragioni principali per cui questo può accadere:

  • Il programmatore stava seguendo ciecamente alcuni dogmi senza capire dove avrebbe effettivamente prodotto dei benefici e dove non
  • Il programmatore sta facendo uno sviluppo basato su test e fa un uso pesante di un framework di simulazione per i test, e che il framework di simulazione non lo ha (o non lo è stato, quando il progetto è stato creato o quando il programmatore ha appreso la tecnica) lezioni concrete.
risposta data 15.10.2012 - 21:09
fonte
1

Avere un'interfaccia per ogni classe è estrema. Hai notato bene.

Tuttavia, avere interfacce implementate solo da una singola classe non è così insolito come si potrebbe pensare. Se hai familiarità con i principi Agile, di solito dicono che le interfacce appartengono al cliente, che è sia logicamente corretto che tecnicamente pratico. Quindi è possibile creare interfacce per definire il comportamento al client e compilare i client senza le classi reali disponibili e quindi ridurre i tempi di compilazione o la consegna dei moduli. Poiché i moduli dipenderanno dalle interfacce, saranno disponibili indipendentemente e senza un'implementazione concreta. Di quanto puoi semplicemente scambiare le implementazioni come desideri.

Se prendi questo in modo estremo, tu e in alto con ciò che vedi. Non va affatto bene, ma sarebbe peggio non avere alcuna interfaccia.

    
risposta data 15.10.2012 - 21:10
fonte
1

I know the general recommendation is to code to an interface rather than an implementation, but isn't this taking it a bit too far?

(IMO) sì. Se hai un'interfaccia con un solo implementor, allora non hai davvero bisogno dell'interfaccia.

Detto questo , molti posti richiedono sempre 2 implementatori. L'implementazione effettiva e un'implementazione simulata per consentire il collaudo dell'unità delle cose che lo consumano. Se il tuo oggetto è solo dati, o può essere usato da test in isolamento, ottimo.

L'altro caso in cui le interfacce hanno senso è un'interfaccia pubblica per un'API. Ciò può fungere da protezione per i tuoi consumatori anche se esiste un solo implementatore (per ora).

    
risposta data 15.10.2012 - 21:11
fonte

Leggi altre domande sui tag