2010-05-18 3 views

risposta

8

Niente da fare! Ha zero effetti dannosi e un giorno qualcuno può scambiare un'implementazione senza dover refactoring tonnellate di codice.

+0

Per "tonnellate di codice", intendi che un'altra classe potrebbe essere scritta con un'implementazione diversa dell'interfaccia e potrebbe essere passata in metodi che prevedono una variabile che implementa tale interfaccia senza cambiare le firme dei metodi?Qualche altro esempio di refactoring che potrebbe essere evitato mantenendo l'interfaccia e implementando una nuova classe? – user343587

+0

@ user343587 Sì, ma se sono necessarie due diverse implementazioni di tale interfaccia e devono essere sostituite dal runtime? Certo, potresti astrarre base ma poi sei ancora nella stessa barca. – jfar

0

Sì, c'è un punto di interfacce, in quanto potrebbe esserci in futuro più di un'implementazione. Ovviamente puoi andare fuori bordo qui e creare interfacce per tutto, quindi c'è un equilibrio da trovare.

3

Oggi no. Sei mesi da adesso, dopo che il progetto è cresciuto di dieci volte in complessità? Chissà. Per il tuo punto, se questo è un codice legacy, c'è un piccolo valore per un'interfaccia che viene implementata una sola volta, ma non ha senso passare attraverso il refactoring coinvolto nella sua rimozione. "Se funziona, non aggiustarlo".

+1

Più sottile, codice meno confuso? Non è un punto di refactoring? – user343587

+1

L'interfaccia serve per organizzare, documentare o identificare? Se è così, lascia stare! Se è solo un disordine, allora il refactoring potrebbe essere in ordine. –

+0

Non so cosa potrebbe essere così confuso. Ho un sacco di interfacce monouso nel mio codice. – jfar

0

Oltre alle motivazioni fornite nelle altre risposte, solo l'implementazione di un'interfaccia consente di intercettare i metodi creando i proxy senza utilizzare la strumentazione. Questo è usato per la registrazione, incapsulare operazioni in una transazione, ecc. È usato da diversi framework.

-1

Anche se le persone non sono completamente d'accordo sul numero di bug per 1000 righe di codice, questi due sembrano correlati (https://stackoverflow.com/questions/862277/what-is-the-industry-standard-for-bugs-per-1000-lines-of-code). Meno linee == meno bug.

Inoltre, cambiare il nome dell'implementazione per il nome dell'interfaccia dovrebbe essere tutto quello che c'è da fare qui.

Se lo sforzo di refactoring è minimo e riduce il codice, mi occuperò piuttosto della supressione dell'interfaccia.

2

Dato che menzioni una base matura, vorrei menzionare un altro esempio del mondo reale: la Sessione di Hibernate.

Session un'interfaccia implementata solo da una classe: SessionImpl. Tuttavia, se hai già utilizzato la modalità ibernazione o hai letto il suo codice sorgente, probabilmente hai notato come Session è usato ovunque, invece di SessionImpl.

Questa progettazione è errata? Sicuramente no. Si chiama "Il principio di sostituzione" o "programmazione verso interfacce". Significa che utilizzando l'interfaccia invece dell'implementazione, è possibile estendere il codice senza alcuno sforzo, semplicemente istanziando le nuove classi di conseguenza, ma sempre utilizzando l'interfaccia. Sarà ancora sbagliato se nessuno crea una nuova classe implementando Session? No, ancora non sbagliato.

I miei due centesimi.

4

In aggiunta alle buone risposte già fornite - se in un certo momento nel futuro una classe deve essere derisa a scopo di test, è molto più facile farlo quando è già disponibile un'interfaccia!

1

Direi che dipende, ma nella maggior parte dei casi un'interfaccia è una buona idea su alcune classi. Il mocking è reso più semplice dall'uso di interfacce e quando si utilizza un contenitore IoC, le interfacce iniziano a dare un senso, soprattutto quando si avvia l'implementazione dei servizi condivisi attraverso il contenitore. Sarai quindi in grado di disaccoppiare l'implementazione del servizio dalla classe che necessita del servizio.