2009-12-04 14 views
16

Spesso ascolto/leggo sulla programmazione basata sull'interfaccia, ma non sono esattamente chiaro su cosa significhi realmente. La programmazione basata sull'interfaccia è un argomento autonomo che in realtà contiene libri scritti su di esso? Se è così, qualcuno può raccomandare qualcuno di buono?Che cos'è esattamente la "programmazione basata su interfaccia"?

Mi sono imbattuto in una programmazione basata sull'interfaccia mentre stavo leggendo su come sono state progettate buone API e vorrei saperne di più. Al momento non sono chiaro come procedere correttamente sulla progettazione di un'API attorno alle interfacce.

Qualsiasi informazione è molto apprezzata.

+0

Questo è un duplicato. Vedi, ad esempio, la domanda 1413543 (http://stackoverflow.com/questions/1413543). – jason

+0

Si consiglia di controllare il libro Head First Design Patterns. Sebbene gli esempi siano scritti in Java, è un buon inizio. – kragan

+1

@Jason: la programmazione su un'interfaccia non equivale necessariamente alla programmazione basata su interfaccia. C'è di più nella "programmazione basata sull'interfaccia" piuttosto che semplicemente nell'uso di interfacce, in genere si intende più una decisione architettonica. –

risposta

24

È fondamentalmente una questione di esprimere le vostre dipendenze in termini di interfacce invece di classi concrete (o peggio, metodi statici). Quindi se una delle tue classi ha bisogno di eseguire l'autenticazione, dovrebbe essere fornita una IAuthenticator (o qualsiasi altra cosa).

Questo significa che:

  • si può scrivere il codice prima di attuare la vera dipendenza
  • È possibile verificare tramite beffardo molto facilmente (senza dover classi finte, che diventa brutto)
  • E 'chiaro che cosa dipendono dal punto di vista dell'API anziché dall'implementazione (ad esempio, l'accoppiamento è più flessibile)
+0

C'è un buon libro che spiega questo "stile" di programmazione in C#? – koumides

+1

@koumides: non specificamente, ma cercare "inversion of control" e "dependency injection" per trovare molti articoli. –

9

Il capitolo 6 di "Practical API Design" by Jaroslav Tulach è intitolato "Codice contro interfacce, non Implementazioni". Spiega che, codificando in base a un'interfaccia anziché a un'implementazione specifica, è possibile separare moduli (o componenti) in un sistema e quindi aumentare la qualità del sistema.

Bertrand Meyer in OOSC2 spiega chiaramente perché "chiudere" un sistema e renderlo più modulare aumenta la sua qualità.

3

Se cerchi google per le interfacce, troverai molte informazioni su come possano essere utili le interfacce.

Il concetto è di definire interfacce chiare, che saranno utilizzate dai vari componenti/parti/classi/moduli per comunicare e interagire. Una volta definito ciò che dovrebbe essere l'input/output di queste interfacce, è possibile consentire ai vari team di sviluppare tutto ciò che è necessario per soddisfare i requisiti dell'interfaccia, inclusi i test di input/output, ecc ...

Se si segue questo schema, vari team possono iniziare a sviluppare la loro parte senza aspettare che le altre parti siano pronte. In aggiunta a ciò è possibile utilizzare il test dell'unità (usando oggetti falsi per simulare le altre parti che non si stanno sviluppando e testare la propria parte).

Questo metodo è lo standard per qualsiasi nuovo progetto di programmazione e tutti lo daranno per scontato.

2

Questo è qualcosa che non consiglio di utilizzare molto nello sviluppo di C#.

Interface-based programming è fondamentalmente la programmazione di interfacce. Sviluppate le interfacce per utilizzare i Contratti e l'effettiva implementazione delle interfacce è nascosta dietro questi contratti.

Prima di .NET era molto comune, in quanto il modo migliore per ottenere componenti riutilizzabili in Windows era tramite COM, che funzionava tramite interfacce ovunque. Tuttavia, dato.La capacità di NET di supportare più lingue con un singolo runtime (il CLR), oltre al suo supporto superiore per il controllo delle versioni rispetto al codice nativo, l'utilità della programmazione basata sull'interfaccia viene drasticamente ridotta quando si programma in C# (a meno che non siate cercando di creare componenti COM, in tal caso, continuerai a creare le interfacce COM indirettamente dalle tue classi C#).

+0

Per i downvoters: non sto suggerendo che le interfacce, di per sé stesse, siano cattive - piuttosto, che l'utilità di progettare l'intera API attorno alle interfacce, che è spesso a cui si riferisce la "programmazione basata sull'interfaccia", non è necessariamente valido per gli sviluppatori C# com'era nei giorni COM. –

+0

Il mocking è molto più semplice contro le interfacce rispetto alle classi concrete (in particolare quelle sigillate senza metodi virtuali). Inoltre, credo ancora che chiarisca di cosa tu realmente dipenda ... –

+0

@Jon SKeet: True. Il mocking può essere più semplice contro le interfacce rispetto alle classi sigillate o non virtuali, ma le classi astratte possono essere derise con la stessa facilità e avere alcuni vantaggi quando si esegue il controllo delle versioni, se si utilizza C# (che è stato taggato nella domanda). –

3

Quello a cui si fa riferimento come "programmazione basata su interfaccia" è più comunemente definito come programmazione di un'interfaccia. Ecco un esempio qui sotto. Il vantaggio sta nascondendo l'effettiva implementazione dell'interfaccia e consentendo al vostro codice di essere più flessibile e facilmente manutenibile in futuro.

YourInterface foo = CreateYourInterface(); 
foo.DoWork(); 
foo.DoMoreWork(); 

CreateYourInterface() restituisce un'implementazione concreta di YourInterface. Questo consente di modificare la funzionalità dell'applicazione modificando una riga:

YourInterface foo = CreateYourInterface(); 
+0

Qui hai modificato una riga di codice? Quale? Forse potresti chiarire? – DOK

+0

YourInterface foo = CreateYourInterface() è la linea a cui mi riferivo. Stavo solo sottolineando che se assegnassi un oggetto diverso a foo che implementava anche l'interfaccia avresti diverse funzionalità con lo stesso codice. –

0

interfaccia di programmazione basato può essere pensato come disaccoppiamento l'implementazione di funzionalità e di come si accede alla funzionalità.

si definisce un'interfaccia
interface ICallSomeone { public bool DialNumber(string number); }

e si scrive l'implementazione

public class callsomeone: ICallSomeone {
public bool DialNumber(string number) {
//dial number, return results }}

si utilizza l'interfaccia, senza preoccuparsi della realizzazione. Se si modifica l'implementazione, non importa perché utilizza solo l'interfaccia.

0

Da una vista molto astratta, la programmazione basata sull'interfaccia è simile ai componenti utilizzati da un idraulico (giunti di tubi e tubi).

Finché i tubi ei giunti sono costruiti secondo l'interfaccia specificata (il numero di fili e la distanza, ecc) vari produttori può fornire giunti di tubi che sono stati potenzialmente fabbricati da un altro fornitore (ma aderente alla interfaccia giuntura/tubo sopra menzionata).

Quindi, c'è maggiore interoperabilità dei componenti e libertà per l'idraulico di scegliere tra vari fornitori, fasce di prezzo ecc. Al fine di creare un sistema idraulico funzionale.

Sostituire tubi e giunti con componenti software ei paralleli sono sorprendentemente semplici.

Problemi correlati