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.)