2009-09-08 5 views
5

In un componente OO, quando si dispone di una sola implementazione disponibile per una classe e quella classe non viene "pubblicata" su altri componenti, è comunque consigliabile avere un'interfaccia e lavorare con l'interfaccia?(Programmazione su un'interfaccia v/s che lavora con classe di calcestruzzo) quando esiste una sola classe di calcestruzzo

Sono pienamente consapevole del principio di progettazione "programmazione in un'interfaccia" e lo utilizzo anche estensivamente.

Ultimamente, ho osservato che la maggior parte delle volte una implementazione diversa (anche se possibile e avrebbe senso) non è mai necessaria. Come risultato del lavoro sempre con le interfacce, il codice dell'applicazione avrebbe una discreta quantità di interfacce con una sola implementazione per ciascuna e l'interfaccia sembrerebbe una sorta di overhead.

Invece, è preferibile lavorare solo con la classe concreta e introdurre l'interfaccia solo quando è necessaria una seconda implementazione? Ad ogni modo, oggigiorno estrarre un'interfaccia usando gli IDE è un gioco da ragazzi. E quando viene introdotta la nuova interfaccia, i riferimenti alla vecchia classe concreta possono essere modificati per utilizzare invece la nuova interfaccia.

Cosa ne pensi?

+0

Possibile dupe - http://stackoverflow.com/questions/720115/should-you-create-an-interface-when-there-currently-is-only-going-to-be-one-cla – Nate

risposta

0

Per quanto ne so, ci sono tre situazioni in cui l'interfaccia è giustificato:

  1. E 'parte dell'architettura (lo ammetto questo non è molto ben definito).
  2. Hai più di 1 implementazione.
  3. È un'interfaccia pubblica.

Non aver paura di usare lezioni concrete. Non generare automaticamente un'interfaccia per ogni singola classe.

6

La creazione di interfacce per i tipi concreti è un delicato bilanciamento in quanto è possibile creare facilmente un'esplosione dell'interfaccia che non fornisce alcun vantaggio e complica lo spazio del dominio solo con tipi ridondanti.

La mia regola generale consiste nel creare interfacce solo per i tipi che fanno parte di un'API pubblica. Tutti i tipi che sono dedicati all'implementazione dell'API e non sono mai esposti dall'API non hanno bisogno di un'interfaccia.

+0

+1 b/c quando si spostano cose da non-usare-un'interfaccia a using-an-interface, potrebbe essere impossibile se fa parte della tua API pubblica e hai rilasciato il tuo codice agli utenti esterni. – Shizzmo

13

Una ragione per cui continuo a programmare un'interfaccia anche con una sola implementazione è perché rende più facile la scrittura dei miei test a lotto. Posso configurare i proxy per testare ciò che voglio testare e non devo preoccuparmi dell'accoppiamento stretto.

Questo non è sempre consigliabile, ma è qualcosa su cui vale la pena riflettere quando stai cercando di decidere. Pensi che dovrai testare ampiamente intorno a questa classe/oggetto? Se pensi di esserlo, può essere molto più semplice gestire l'interfaccia rispetto alla classe concreta.

L'alternativa sarebbe quella di non utilizzare l'interfaccia e la sottoclasse della classe concreta, che funziona anch'essa, ma di nuovo dipende.

+0

D'accordo, ultimamente sono uscito da "qual è la soluzione più testabile e ripetibile"? Pensare a ciò ha permesso alla mia base di codice di essere molto più semplice e allo stesso tempo molto guidata, sui fronti più importanti, dalle interfacce. – nyxtom

+1

Sia EasyMock che JMock supportano il mocking della classe in modo che l'argomento di test sia un muto imho. –

+1

Questo tende a mettere in interfaccia l'inferno. Se non hai bisogno di dichiarare i tuoi metodi definitivi, puoi usare classextension di easymock. Se questa non è un'opzione, puoi usare powermock. Oggi non ci sono scuse per aggiungere interfacce solo per rendere più facile il test. Almeno non nelle circostanze sopra menzionate. – Buhb

3

Le interfacce devono essere sviluppate, non create. Dovresti avere un'esigenza specifica per un'interfaccia prima di crearne una. Se non hai avuto bisogno di più di un'implementazione, non hai bisogno di un'interfaccia. Ricordate sempre, YAGNI

+2

Sono d'accordo. Ricordati solo di mettere il cappello del tuo cliente in fase di sviluppo - se la tua classe sarà usata da altri, ti maledirà se non fornisci un'interfaccia. Potresti non averne bisogno, ma lo faranno se la classe ha qualche funzionalità/dipendenza di significato. – SingleShot

+0

@SingleShot D'accordo, dipende dal tipo di software che stai scrivendo. Un sacco di software "applicativo" non è scritto pensando a attori esterni – Kevin

0

In aggiunta alle buone risposte fornite già (facilità di test e API pubbliche) Mi piace usare le interfacce perché rende più facile concentrarsi su "cosa" dovrebbero fare le classi di "come" lo stanno facendo.

0

Generalmente: No. Non hai bisogno di un'interfaccia se stai semplicemente impiantando la funzionalità una volta. Le interfacce come tutto hanno un compromesso: introducono un po 'più di lavoro (costo) e potrebbero introdurre ulteriori vantaggi. Se il costo supera il vantaggio, probabilmente non dovresti farlo!