10

Abbiamo un libro GoF molto bello (Pattern di progettazione: elementi del software orientato agli oggetti riutilizzabile) sui pattern nella programmazione orientata agli oggetti e un sacco di articoli e risorse nel web su questo soggetto.Modelli per la programmazione funzionale, dinamica e orientata all'aspetto

Esistono libri (articoli, risorse) sui modelli (best practice) per la programmazione funzionale?

Per la programmazione dinamica in linguaggi come Python e Ruby?

Per AOP?

risposta

14

Una domanda correlata è stata posta prima: "Does functional programming replace GoF design patterns", con grandi risposte.

L'equivalente di "modelli di progettazione" è molto vago in FP. In generale, ogni volta che vedi un "pattern" nel tuo codice dovresti creare qualcosa per coprire tutti i suoi usi in modo uniforme. Spesso sarà una funzione di ordine superiore.

Ad esempio, il seguente codice C

for (int i = 0; i < n; i++) 
    if (a[i] == 42) 
    return true; 
return false; 

può essere pensato un po 'di base "modello di progettazione" - controllare se c'è qualche elemento speciale nella lista.Questo frammento potrebbe apparire molte volte nel codice con condizioni diverse. In FP, si usa semplicemente una funzione di ordine superiore più volte. Non è più un "modello".

La programmazione funzionale ha le sue pratiche, ma sono molto diverse da "schemi di progettazione" in OOP. Includono l'uso di polimorfismo, elenchi, funzioni di ordine superiore, immutabilità/purezza, pigrizia [non tutti sono essenziali o specifici per FP] ... Vedi anche "what are core concepts of FP". Inoltre, digitare classi (Haskell), moduli e funtori (OCaml), continuations, monads, zippers, finger trees, monoids, arrows, applicative functors, monad transformers, molti purely functional data structures (book) ecc Functional pearls, già menzionati da Randall Schulz, formare un molto ricco risorsa di FP al suo meglio.

Per apprendere come scrivere codice idiomatico, qualsiasi libro/risorsa su un linguaggio di programmazione funzionale sarà sufficiente per IMHO (ad esempio, RWH e LYAH); le differenze tra il pensiero imperativo e funzionale sono sempre spiegate lì.

In lingue dinamiche, il collegamento di Jeff Foster è una buona raccolta; here è un uso molto intelligente della memoizzazione in JavaScript che potrebbe essere considerato un "modello di progettazione".

2
+1

Sono l'unico che ha un problema con l'utilizzo di "Programmazione dinamica" per descrivere la programmazione in lingue dinamiche? Il termine è già preso. È come se le persone .NET usassero "caratteri forti" quando significano "tipizzazione statica". – orip

+0

^No. Mi disturba anche molto. – Sneakyness

1

Non sono le Perle Funzionali (uno dei) set (i) canonici di schemi di progettazione per la programmazione funzionale?

6

L'elenco di schemi di progettazione descritto in GoF è scritto per linguaggi come C++ e Java. Talvolta viene considerato un elenco di soluzioni alternative per rendere più dinamici i linguaggi inflessibili. Ad esempio, il pattern Visitor non è veramente necessario in Ruby perché puoi semplicemente aggiungere le funzioni membro alla tua classe in fase di runtime. Il pattern Decorator è obsoleto se puoi usare mixins.

È la mia esperienza che quando sto implementando una soluzione in C++ tendo a passare la maggior parte del mio tempo a scrivere codice per scaffolding. Comincio con la creazione di una piattaforma che mi permetta di pensare nel dominio del programma della mia applicazione. Probabilmente i modelli di progettazione sono stati sviluppati come un modo per classificare diversi tipi di scaffolding.

Devo dire che quando sto programmando in Ruby non ho molto codice di supporto. Non sembra esserci un bisogno per questo.

La mia teoria è che altri linguaggi non enfatizzano il concetto di modelli di progettazione semplicemente perché i loro costrutti linguistici di base sono sufficienti. In difesa di Java e C++: forse questo è dovuto al fatto che i linguaggi funzionali e AOP sono spesso usati in domini o nicchie di problemi più specifici, mentre Java e C++ sono usati per tutto.

E ora qualcosa di diverso. Se ti stai annoiando un po 'con il design OO e vuoi imparare qualcosa di nuovo, potresti essere interessato al libro Elements of Programming scritto da Stepanov. In questo libro spiega come la programmazione può essere affrontata da un punto di vista matematico. Per un'anteprima, controlla il suo Class notes per Adobe (che si trova tra gli altri su this page). Potresti anche essere interessato a Adobe Collected Papers.

+0

Parzialmente d'accordo con te. Ma, per esempio, i linguaggi funzionali hanno caratteristiche simili per affrontare compiti comuni sul campo - considerano monad/workflow o pattern matching o pipelining. Inoltre, ad esempio, un linguaggio dinamico e flessibile come Python trasmette il pattern Decorator anche se è incorporato nel linguaggio. –

0

Personalmente il mio schema più importante per le lingue dinamiche: test di scrittura. È ancora più importante rispetto alle lingue tipizzate staticamente.

Problemi correlati