2010-01-05 10 views
24

La casella Le mie domande correlate si sovrappone a domande di programmazione funzionale. Dopo aver esaminato le più rilevanti, sono comunque curioso di sentire opinioni su quanto segue:Pensiero architettonico in lingue funzionali

Come pensi di strutturare un'applicazione in un linguaggio funzionale?

Non sto parlando di una grammatica specifica della lingua. Sono interessato ai paradigmi organizzativi concettuali (ad esempio l'orientamento agli oggetti).

Come molti, la mia prima esposizione all'incapsulamento e al riutilizzo del codice proveniva dallo sfondo di OO. Poiché ho svolto ricerche su linguaggi diversi, la programmazione funzionale ha catturato la mia attenzione. Sto iniziando a cogliere i vantaggi dell'immutabilità, delle funzioni di ordine superiore, eccetera. Ma continuo a perdere il senso di come strutturare un'applicazione funzionale senza ricorrere ai concetti di OO. In realtà, molti degli esempi funzionali che ho visto hanno più in comune con il codice spaghetti, anche se sono sicuro che ciò è dovuto alla semplicità degli esempi piuttosto che a un difetto intrinseco nell'approccio funzionale.

Questa domanda è familiare a "quando dovrei usare la programmazione funzionale", ma mi sono già accontentato del fatto che l'approccio funzionale, nonostante i pro e i contro in alcuni domini, sia utilizzabile per qualsiasi cosa tu voglia. Ho solo difficoltà a immaginare l'organizzazione di grandi dimensioni di un'app complessa.

+0

duplicato: http://stackoverflow.com/questions/1549017/advice-on-learning-how-to-think-functional http://stackoverflow.com/questions/192090/how-do-you-design- a-functional-program –

+0

prova a cercare prima di pubblicare una nuova domanda: http://www.google.com/search?hl=it&q=structure+functional+language+site:stackoverflow.com –

+8

Grazie per il collegamento a un utile filo. Tuttavia, ho cercato il sito per un po 'e non ho trovato nulla che sembrasse direttamente rilevante. Ovviamente, non ho usato i termini giusti per produrre il link sopra. È prassi normale su SO supporre che un utente non abbia nemmeno tentato una ricerca se non fosse stato in grado di individuare una domanda simile tra quasi 500.000? – DanielMason

risposta

2

La maggior parte dei modelli di progettazione complessivi sono completamente applicabili:

separazione degli interessi; Model-Control-Presentation (in tutte le sue varianti); Architettura stratificata; Input-Process-Output, ecc.

Una volta che si è decomposto un grosso problema in problemi più piccoli, i problemi minori sono una questione di lavoro attraverso le varie trasformazioni dalla rappresentazione di origine a quella di destinazione.

trovo che il input-processo-output modello e trasformazione gasdotto schemi di aiuto.

+0

Grazie per l'ottima risposta. Sono piuttosto nuovo alla programmazione, quindi molti di questi termini non mi erano familiari: è una buona cosa, più da esplorare. Niente poche ore su Wikipedia non può curare. – DanielMason

21

Alla fine degli anni '70, Barbara Liskov e altri hanno sviluppato un'imbarcazione di tecniche di "progettazione orientata agli oggetti" su larga scala che sono ancora ampiamente utilizzate oggi e che si applicano immutate alla programmazione funzionale. Sono più facili da applicare con un linguaggio che ha interfacce e implementazioni esplicite, il che significa Standard ML (dove le interfacce sono chiamate "firme" e le implementazioni sono chiamate "strutture" o "functors") o Objective Caml (dove le interfacce sono chiamate "tipi di modulo") "e le implementazioni sono chiamate" moduli "). Se si preferisce Scheme, il linguaggio "unitario" sviluppato da Matthew Flatt e Matthias Felleisen è incorporato in PLT Scheme ed è un ottimo modo per esprimere funzioni su larga scala.

In breve:

  • organizzare le applicazioni in tutto tipi astratti (classi in OO, "tipi astratti" in FP) e le operazioni su tali tipi.

  • Utilizzare i meccanismi di incapsulamento (classi in OO, moduli in FP) per nascondere le rappresentazioni dei tipi di astratti.

  • Struttura dell'applicazione in modo che ogni implementazione dipenda indirettamente da altre implementazioni, attraverso le loro interfacce. In questo modo limiti la quantità di codice che devi capire per costruire o modificare qualsiasi pezzo della tua applicazione.

  • Vai in città!

La differenza principale è che quando si scrivono programmi funzionali, non si utilizza l'ereditarietà per riutilizzare le implementazioni. Invece si utilizzano le funzioni di ordine superiore o si utilizza modules which take other modules as parameters.

Sommario: a livello di architettura, non c'è molta differenza, ma quando si utilizzano i linguaggi funzionali potrebbe essere necessario cercare un po 'più difficile per trovare i meccanismi di incapsulamento di cui si ha bisogno.

+0

Risposta stupenda. In generale, ci sono degli svantaggi in termini di prestazioni rispetto all'approccio al parametro module-taking-module, o ti costa solo un puntatore? (Javascript è il modello mentale di cui dispongo) – DanielMason

+0

@DanielMason: per un compilatore ingenuo, si paga lo stesso overhead in un linguaggio orientato agli oggetti: il modulo è rappresentato da un puntatore a un vtable. Ma i migliori compilatori fanno un buon lavoro inserendo piccole funzioni oltre i limiti del modulo, in modo da avere meno overhead. E MLton è un compilatore veramente valido per l'intero programma, quindi non c'è assolutamente nessun sovraccarico di run-time. http://mlton.org/ –

+0

Grazie per il follow-up. Questo mi dà molto da approfondire. – DanielMason

Problemi correlati