L'interfaccia a metodo singolo e la definizione del tipo di funzione sono le stesse?

3

In una lingua in cui è possibile definire interfacce e typedef (utilizzando Dart qui):

abstract class Receiver {
  void receive(int quantity);
}

typedef void Receive(int quantity);

abstract class Transport {
  void deliver(Receiver receiver);
  void deliver(Receive receive);
}

Concettualmente, l'interfaccia a metodo singolo e la definizione del tipo su funzioni sono la stessa cosa? C'è qualche vantaggio nell'usare l'uno sull'altro?

    
posta ebelanger 21.02.2015 - 18:40
fonte

2 risposte

4

Le interfacce e le funzioni dei singoli metodi (o le definizioni dei tipi di funzioni) sono quasi le stesse. Le definizioni del tipo di funzione sono solo interfacce anonime . Le interfacce e le definizioni dei tipi di funzione hanno entrambi lo stesso scopo. E insieme alla loro implementazione potrebbero essere descritti come duali matematici . Un oggetto (o in questo caso un'interfaccia di un singolo metodo con implementazione) è data (stato) con comportamento e una funzione è comportamento con dati, chiamata chiusura quando i dati vengono parzialmente applicati. In C #, ad es. il codice IL compilato è simile in entrambi i casi (almeno quando è in reverse engineering). Questa e la corrispondenza al concetto di duali è descritta da Mark Seemann qui . Nota che ciò vale per C # e potrebbe essere diverso in altre lingue o con altri compilatori.

Nei linguaggi orientati agli oggetti l'intento delle interfacce è quello di disaccoppiare il codice e di essere in grado di invertire il controllo (come in IoC). Questo ti dà molti vantaggi come dipendenze ridotte e quindi manutenibilità, evolvibilità, testabilità, ecc. Nella programmazione funzionale la stessa cosa si ottiene usando le definizioni dei tipi di funzioni. In alcune lingue puoi fare entrambe le cose.

Le principali differenze sono che le interfacce sono un po 'più prolisse con qualche codice della piastra della caldaia. Le funzioni sono più concise. Non sono sicuro che tutti i contenitori IoC possano gestire le funzioni come parametri. Inoltre, e ancora più importante, il modo di programmazione potrebbe diventare molto diverso quando si va per l'uno o l'altro a seconda del contesto. Se non è conveniente (nel senso non idiomatico) nella lingua usare le definizioni di tipo, ad es. può complicare le cose quando si lavora in una squadra. Quindi un buon consiglio è probabilmente quello di verificare le linee guida e le convenzioni della codifica della lingua. (Non conosco Dart quindi non posso aiutarti qui.)

    
risposta data 21.02.2015 - 22:09
fonte
1

Conceptually, are single method interface and type definition on functions the same thing?

No.

Nella maggior parte delle lingue che consentono entrambi, la funzione typedef definisce un tipo i cui valori sono e nient'altro. La classe astratta definisce un'interfaccia che ha una funzione (e probabilmente, altre cose).

Le cose possono essere confuse con le chiusure (che sono funzionano, ma spesso hanno altre funzioni) e / o i funtori di stile C ++ (classi che hanno overloading dell'operatore), o anche con conversioni implicite per funzionare tipi.

Ma i due meccanismi hanno scopi diversi e dovrebbero essere concettualmente diversi, anche se meccanicamente possono essere fatti per fare le stesse cose.

    
risposta data 21.02.2015 - 20:39
fonte

Leggi altre domande sui tag