Uso dei delegati come lambda nominati

4

Supponiamo di avere un dominio in cui possiamo generalizzare alcune operazioni passando una funzione, come le funzioni Select \ map . Supponiamo ora che la funzione che passiamo abbia un nome specifico per il dominio e tipi di parametri fissi. Chiamiamolo a BazFunction

Possiamo avvicinarci alla definizione di BazFunction in due modi:

  • Come delegato: Bar delegate BazFunction(int x)
  • Come lambda: Func<int, Bar>

Il loro utilizzo quando si chiama l'operazione è identico ( Foo((x) => x) ) ma la definizione della funzione è diversa

public Bar Foo(Func<int, Bar> baz) 
public Bar Foo(BazFunction baz)

L'evidente vantaggio dell'utilizzo di un delegato è la leggibilità, almeno per qualcuno che abbia familiarità con il dominio.

Quali sono gli aspetti negativi di un simile approccio? Sia tecnico che non tecnico.

    
posta Andy Hunt 29.03.2016 - 16:01
fonte

1 risposta

5

Faccio programmazione funzionale a tempo pieno, dove le funzioni di ordine superiore vengono utilizzate frequentemente. Se altre lingue hanno funzionalità che ti consentono di scrivere codice come lo stile del tuo delegato, non l'ho mai visto utilizzato perché è completamente illeggibile.

Posso vedere una firma di funzione come public Bar Foo(Func<int, Bar> baz) e sapere immediatamente come chiamarla, senza dover fare riferimento a qualsiasi altra documentazione, o tassare la mia memoria. baz fornisce un nome semantico sintetico e utile per il suo scopo. Ha quella sintassi di tipo brutta parametrizzata, ma questa è un'eredità della famiglia C perché ha insistito per mettere le proprie firme del tipo .

D'altra parte, public Bar Foo(BazFunction baz) , sembra più carina, ma è completamente inutile. Devi cercare altrove per scoprire come usare effettivamente la cosa. Dagli un nome di tipo ridondante con il nome del parametro. Inoltre, non so come dichiarare uno di questi delegati, ma suppongo che ciò implichi un po 'di fastidioso piatto d'acciaio, per qualcosa che potrebbe essere usato solo in uno o due posti.

Ovviamente, i programmatori OO sono più abituati ad avere cose come le dichiarazioni di interfacce boilerplate separate da dove vengono utilizzate, quindi potrebbe non essere un grosso problema. Ciò non significa che non sia un problema di usabilità, però.

    
risposta data 29.03.2016 - 18:40
fonte

Leggi altre domande sui tag