2010-12-14 10 views
19

In che modo Clojure fa scattare la separazione delle preoccupazioni? Poiché il codice è dati, le funzioni possono essere passate come parametri e utilizzate come resi ...In che modo Clojure fa scattare la separazione delle preoccupazioni?

E, poiché esiste il principio "Migliori 1000 funzioni che funzionano su 1 struttura di dati, di 100 funzioni su 100 strutture di dati" (o qualcosa del genere).

Voglio dire, comprimere tutto una mappa, dargli una parola chiave come chiave, e basta? funzioni, scalari, raccolte, tutto ...

L'idea di Separazione delle preoccupazioni è implementata, in Java, mediante Aspetti (programmazione orientata agli aspetti) e annotazioni. Questa è la mia visione del concetto e potrebbe essere un po 'limitata, quindi non darla per scontata.

Qual è la strada giusta (modo gergale) per andare su in Clojure, per evitare le WTFs di colleghi programmatori _

+3

Potresti essere un po 'più specifico su quello che stai chiedendo. Separazione delle preoccupazioni è un termine usato per indicare 100 cose diverse. – Sami

+1

Gli aspetti sono un modo per modificare il comportamento del codice esistente senza accesso alla sua origine. Clojure e altri Lisps forniscono qualcosa di simile attraverso variabili dinamiche, che sono essenzialmente globali con i propri stack. Le funzioni di livello superiore (quelle create con defn) sono variabili dinamiche e possono essere associate a 'binding'. La sintassi di 'binding' assomiglia a' let', ma il binding è usato all'interno di chiamate all'interno del modulo di binding. – Zak

risposta

60

In un linguaggio funzionale, il modo migliore per gestire la separazione degli interessi è quello di convertire qualsiasi problema di programmazione in un insieme di trasformazioni su una struttura di dati. Ad esempio, se si scrive un'app Web, l'obiettivo generale è di prendere una richiesta e trasformarla in una risposta, che può essere pensata come semplicemente trasformando i dati della richiesta in dati di risposta. (In un'applicazione web non banale, i dati di partenza probabilmente includeranno non solo la richiesta, ma anche le informazioni su sessione e database). La maggior parte delle attività di programmazione può essere pensata in questo modo.

Ogni "preoccupazione" sarebbe una funzione in una "pipeline" che aiuta a rendere possibile la trasformazione. In questo modo, ciascuna funzione viene completamente disaccoppiata dagli altri passaggi.

Nota che questo significa che i tuoi dati, poiché subiscono queste trasformazioni, devono essere ricchi nella sua struttura. In sostanza, vogliamo mettere tutta l'"intelligenza" del nostro programma nei dati, non nel codice. In un complicato programma funzionale, i dati ai diversi livelli possono essere abbastanza complessi da dover apparire come un linguaggio di programmazione a sé stante. È qui che entra in gioco l'idea di "linguaggi specifici del dominio".

Clojure ha un eccellente supporto per manipolare strutture dati eterogenee complesse, che rende meno ingombrante di quanto possa sembrare (cioè non è ingombrante affatto se fatto a destra)

Inoltre, il supporto di Clojure per strutture dati pigri permette questi strutture di dati intermedi per essere effettivamente (concettualmente) di dimensioni infinite, il che rende possibile questo disaccoppiamento nella maggior parte degli scenari. Vedere il seguente articolo per informazioni sul motivo per cui avere strutture dati infinite è così prezioso in questa situazione: http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

Questo approccio "pipeline" può gestire il 90% delle esigenze per separare i dubbi. Per il restante 10% è possibile utilizzare macro Clojure, che, ad alto livello, possono essere considerate uno strumento molto potente per la programmazione orientata agli aspetti.

Ecco come credo che tu possa meglio disaccoppiare le preoccupazioni in Clojure. Nota che "oggetti" o "aspetti" non sono concetti veramente necessari in questo approccio.

+0

Ben detto!Come nota aggiuntiva, se la maggior parte delle tue funzioni è pura, puoi facilmente testarle in modo indipendente. –

+0

così, invece di Oggetti (in lingue OO), ottieni strutture (in lingue funzionali). Questo è il corrispondente "concetto" di incapsulamento (per ottenere un'elevata coesione, un basso accoppiamento, scatole nere, modularità)? Ha un nome ? – Belun

+0

una buona lettura che parla di un approccio simile alla pipeline (anche se in Python): http://www.dabeaz.com/generators/Generators.pdf – szx

Problemi correlati