2009-11-13 15 views
17

Dopo aver guardato come Go gestisce le interfacce e piacerà, ho iniziato a pensare a come si potrebbe raggiungere simili anatra tipizzazione in C# come questo:Implementazione sicura anatra tipizzazione in C#

Il metodo DuckTyper.Adapt userebbe System.Reflection.Emit per creare un adattatore al volo. Forse qualcuno ha già scritto qualcosa di simile. Immagino che non sia troppo diverso da ciò che i quadri beffardi già fanno.

Tuttavia, questo genererebbe eccezioni a run-time se Mallard non ha effettivamente i metodi IDuck corretti. Per ottenere l'errore prima al momento della compilazione, dovrei scrivere un MallardToDuckAdapter che è esattamente quello che sto cercando di evitare.

C'è un modo migliore?

modificare: a quanto pare il termine corretto per quello che io chiamo "sicuro duck-typing" è structural typing.

+0

Ho desiderato in precedenza, adattando il sistema System.xml.serialization ai file di formattazione generici system.runtime.serialization. –

+1

Inoltre: Go controlla questo in fase di compilazione, o solo in fase di esecuzione? Se quest'ultimo non ha fornito nuove soluzioni al problema, solo il codice Adapt extra che hai già menzionato. –

+0

Sì, scrivere l'adattatore non si qualifica come digitazione anatra, perché è normale digitando C# ... –

risposta

13

Come fai a sapere se una mucca cammina come un'anatra e fa la cacca come un'anatra se non hai una mucca viva e respiratrice di fronte a te?

Duck-typing è un concetto utilizzato in fase di esecuzione. Un concetto simile in fase di compilazione è structural typing che è AFAIK non supportato dal CLR. (Il CLR è centrata intorno nominative typing.)

[un sistema di tipo strutturale] contrasta con sistemi nominative, dove i confronti si basano sulle dichiarazioni esplicite o i nomi dei tipi e tipizzazione anatra, in cui solo la parte di la struttura a cui si accede in fase di esecuzione viene verificata per compatibilità.

Il modo usuale per garantire che la digitazione anatra non faccia eccezione in fase di esecuzione sono i test unitari.

+0

In Go, la digitazione anatra è qualcosa che viene verificato staticamente. Il compilatore esamina la classe Cow e si lamenta se non ha i metodi duck. –

+3

Questa è esattamente la definizione dell'ereditarietà strutturale :-) – dtb

+0

In .NET, la digitazione anatra viene utilizzata in modo diverso dal solito significato del termine. Sfortunatamente, i termini tecnici stabiliti dal re-branding sono diventati qualcosa di un hobby aziendale in Microsoft (o almeno nel reparto CLR), il che è estremamente fastidioso. –

5

DuckTyping for C#

Reflection.Emit viene utilizzato per emettere IL che chiama direttamente l'oggetto originale

Non credo che questa libreria vi darà compilare errori di pensiero, non sono sicuro sarebbe del tutto fattibile. Utilizzare i test unitari per compensare ciò.

+2

Rilasciato sotto la Licenza Artistica 2.0! –

+0

+1 Mi piace l'idea di utilizzare i test unitari qui. In questo modo si scambia il sovraccarico (potenzialmente grande) della scrittura di una classe dell'adattatore per il piccolo sovraccarico di scrittura di un test di unità a linea singola. –

1

Non penso ci sia un altro modo in cui si otterrebbe un errore in fase di compilazione.

Tuttavia, questo è un aspetto per cui Unit Testing è ideale. Dovresti scrivere un test unitario per verificare che

DuckTyper.Adapt<Mallard, IDuck>(mallard); 

mappe riuscite.

1

So che le interfacce implicite (che sono le interfacce Go) sono state pianificate per VB 10 (nessuna idea di C#). Sfortunatamente, sono stati scartati prima del rilascio (penso che non siano nemmeno riusciti a trasformarli in beta ...). Sarebbe bello vedere se appariranno in una versione futura di .NET.

Ovviamente, i nuovi tipi dynamic possono essere utilizzati per ottenere lo stesso risultato, ma questo non è ancora lo stesso: le interfacce implicite consentono comunque una digitazione forte, che ritengo importante.

+0

Potresti fornire collegamenti per supportare il tuo reclamo relativo alle interfacce implicite in VB? – Dario