2014-09-22 14 views
13

Qual è la differenza nella pratica? Perché dovresti usarne uno sull'altro? Sembra che entrambi i tipi verrebbero usati per risolvere gli stessi problemi.Interfaccia vs record di funzioni

La mia domanda se riguarda solo il codice funzionale F #. Per i componenti di F # che sono esposti a parti esterne ho scoperto che Component Design Guidelines suggerisce di preferire l'approccio delle interfacce al registro delle funzioni.

risposta

17

Concettualmente, le registrazioni di funzioni sono molto simili alle interfacce e la maggior parte delle volte è possibile utilizzarle entrambe per risolvere un dato problema (quindi questa è una valida domanda valida per &).

Se si osservano solo gli aspetti tecnici, la più grande differenza è che le interfacce possono avere metodi generici. Questo è qualcosa che non può essere fatto utilizzando record - per esempio, non v'è alcun modo per definire una semplice registrazione di funzioni che corrispondono alla seguente:

type IFoo<'T> = 
    abstract Bar<'R> : 'R -> 'T 

Tuttavia, in pratica, credo che le differenze più importanti sono relative all'interoperabilità e design:

  • Interfacce interagire piacevolmente con C# e altri componenti di .NET
    (costruzione di un # record di F di funzioni da C# sarebbe molto difficile e brutta)
  • Interfacce esprimere un'intenzione diversa - sono l'interfaccia che può essere soddisfatta e implementata.
    D'altra parte, i record sono raccolte di funzioni che sono create.
  • I record sono utili se è necessario utilizzare la struttura { oldValue with NewFunction = newFunction } per sostituire una funzione.

In generale, utilizzo principalmente record quando è necessario mantenere uno stato durante ad es. elaborazione ricorsiva di alcune strutture dati e ho bisogno del costrutto with. Per le API pubbliche, credo che l'utilizzo di interfacce e classi semplici sia una migliore astrazione rispetto all'utilizzo di record.