Domanda

sono stato esposto principalmente alla programmazione OO finora e non vedo l'ora di imparare un linguaggio funzionale. Le mie domande sono:

  • Quando si fa a scegliere la programmazione funzionale over orientata agli oggetti?
  • Quali sono le tipiche definizioni dei problemi in cui la programmazione funzionale è una scelta migliore?
È stato utile?

Soluzione

  

Quando si fa a scegliere la programmazione funzionale oltre ad oggetti?

Quando si prevede un diverso tipo di evoluzione del software:

  • linguaggi orientati agli oggetti sono buoni quando si dispone di un insieme fisso di Operazioni su le cose , e il tuo codice si evolve, si aggiungono nuove cose in primo luogo. Questo può essere ottenuto con l'aggiunta di nuove classi che implementano metodi esistenti, e le classi esistenti sono lasciati soli.

  • I linguaggi funzionali sono buoni quando si dispone di un insieme fisso di le cose , e il tuo codice si evolve, è in primo luogo Aggiungi nuovo operazioni su cose esistenti. Questo può essere ottenuto con l'aggiunta di nuove funzioni che calcolano con i tipi di dati esistenti, e le funzioni esistenti sono lasciati soli.

Quando l'evoluzione va nella direzione sbagliata, avete problemi:

  • Aggiunta di una nuova operazione di un programma orientato agli oggetti possono richiedere la modifica di molte definizioni di classe per aggiungere un nuovo metodo.

  • L'aggiunta di un nuovo tipo di cosa per un programma funzionale può richiedere la modifica di molte definizioni di funzioni per aggiungere un nuovo caso.

Questo problema è stato ben noto da molti anni; nel 1998, Phil Wadler soprannominato il "problema espressione" . Anche se alcuni ricercatori pensano che il problema espressione può essere affrontato con tali caratteristiche del linguaggio come mixins, una soluzione ampiamente accettata non ha ancora colpito il mainstream.

  

Quali sono le tipiche definizioni dei problemi in cui la programmazione funzionale è una scelta migliore?

I linguaggi funzionali eccellere a manipolare i dati simbolici in forma di albero. Un esempio preferito è compilatori, dove lingue di partenza e intermedie cambiano raramente (per lo più le stesse le cose ), ma gli scrittori del compilatore sono sempre l'aggiunta di nuove traduzioni e migliorie al codice o ottimizzazioni (nuove operazioni sulle cose). Compilazione e di traduzione, più in generale sono "killer application" per linguaggi funzionali.

Altri suggerimenti

Non dovete necessariamente scegliere tra le due paradigmi. È possibile scrivere software con un'architettura OO utilizzando molti concetti funzionali. FP e OOP sono ortogonali in natura .

Prendiamo ad esempio C #. Si potrebbe dire che è per lo più OOP, ma ci sono molti concetti e costrutti FP. Se si considera Linq , i costrutti più importanti che permettono di esistere Linq sono funzionali in natura:. Espressioni lambda

Un altro esempio, F #. Si potrebbe dire che è per lo più FP, ma ci sono molti concetti OOP e costrutti disponibili. È possibile definire le classi, classi astratte, interfacce, che fare con l'ereditarietà. Si può anche utilizzare mutevolezza quando si rende il codice più chiaro o quando aumenta notevolmente le prestazioni.

Molte lingue moderne sono multi-paradigma.

Letture consigliate

Come io sono nella stessa barca (sfondo OOP, imparare FP), io suggerisco di alcune letture che ho molto apprezzato:

Object Oriented Programming offerte:

  1. incapsulamento, per
    • Controllo mutazione stato interno
    • accoppiamento limite alla rappresentazione interna
  2. Sottotipizzazione, permettendo:
    • sostituzione di tipi compatibili (polimorfismo)
    • un mezzo greggio di condivisione di realizzazione tra le classi (attuazione di successione)

programmazione funzionale, in Haskell o anche a Scala, può permettere la sostituzione attraverso più meccanismo generale delle classi di tipo. Mutevole stato interno o è scoraggiato o proibito. Incapsulamento di rappresentazione interna può anche essere raggiunto. Vedere Haskell vs OOP per un buon confronto.

L'affermazione di Norman che "Aggiunta di un nuovo genere di cose ad un programma funzionale può richiedere la modifica di molte definizioni di funzioni per aggiungere un nuovo caso." dipende da classi di tipo quanto bene il codice funzionale applicate. Se Pattern Matching su un particolare tipo astratto di dati è diffusa in tutto una base di codice, sarete davvero soffre di questo problema, ma è forse una cattiva progettazione per cominciare.

CURA Rimosso riferimento alle conversioni implicite quando si parla di classi di tipo. In Scala, classi di tipo sono codificati con parametri impliciti, non conversioni, anche se conversioni implicite sono un altro mezzo per acheiving sostituzione di tipi compatibili.

  1. Se siete in un ambiente fortemente concorrente, quindi la programmazione funzionale pura è utile. La mancanza di stato mutabile fa concorrenza quasi banale. Vedere Erlang.

  2. In un linguaggio multiparadigma, si consiglia di modellare alcune cose funzionalmente se l'esistenza dello stato mutabile è necessario un dettaglio di implementazione, e quindi FP è un buon modello per il dominio del problema. Ad esempio, vedere list comprehension in Python o std.range nel linguaggio di programmazione D . Questi sono ispirati dalla programmazione funzionale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top