2012-10-26 11 views
13

Mi sono imbattuto in Google Guice e non ho potuto davvero capirlo e cosa ha fatto, anche se sembra che ci sia un sacco di clamore intorno ad esso. Speravo di ottenere una prospettiva clojurian della libreria e del perché fosse necessaria/non necessaria nelle applicazioni di clojure e se ci fosse qualcosa di simile incorporato nella lingua.Qual è il clojure equivalente a google guice?

risposta

14

A causa del sistema OO e del tipo di Java, il passaggio dinamico tra diverse implementazioni sottostanti (ad esempio per scopi di test (di simulazione)) può essere difficile da gestire. Le librerie come Google Guice hanno lo scopo di gestire questi dependency injections in Java con più grazia.

In Clojure e in altri linguaggi funzionali è possibile aggirare le funzioni, il che rende molto più semplice l'utilizzo di diverse implementazioni.

Ci sono diversi modi in cui questo può essere fatto in Clojure:

  • Utilizzando la vostra scelta di funzione di parametri nelle funzioni di ordine superiore.
  • (Re) Associare la scelta della funzione a una var.
  • Incapsulamento della scelta della funzione all'interno di chiusure che possono essere passate e chiamate.

Il capitolo 12 di Clojure Programming ha alcuni esempi di modelli OO come l'iniezione di dipendenza e i modi alternativi per gestirli in Clojure.

Sean Devlin ha anche un Full Disclojure video su Iniezione di dipendenza in Clojure. Il suo esempio avrebbe potuto essere scelto meglio, però. Invece di utilizzare implementazioni di funzioni completamente diverse nella sua chiusura, utilizza una fabbrica che restituisce diverse "versioni" di una funzione. L'essenza rimane lo stesso però.

Fondamentalmente, l'iniezione di dipendenza è un modello che è un male necessario in OOP e può essere risolto facilmente (o non è nemmeno un problema) in FP.

6

Gli equivalenti Clojure grezzi sono ancora in fase di sviluppo. Ci sono due librerie attualmente in sviluppo (a partire dal 12 ottobre): Prismatic's Graph (non ancora open source) e Flow di Stuart Sierra.

Nota che considero Guice un'iniezione maggiore della dipendenza. Fornisce un framework per la configurazione/modularizzazione dell'applicazione. Le biblioteche di cui sopra mirano a raggiungere questo obiettivo.

+3

Grazie per i collegamenti alle librerie; sembrano piuttosto interessanti. Sono d'accordo con la tua valutazione sul fatto che Guice fornisce una soluzione oltre l'iniezione della dipendenza, anche se ritengo che con alcuni dei pattern che Clojure ti consente di non aver bisogno di quelle librerie tanto quanto è quasi banale da creare sei tu stesso (guarda Noir per un esempio, come funziona il costrutto defpage e combina lo spazio dei nomi automatizzato che carica e aggrega la raccolta di pagine in una mappa avvolta da un ref o un atomo). – deterb

+1

concordato. Penso che questo sia il motivo per cui Rich Hickey parla di "semplicità" e perché così tanti sviluppatori si lamentino delle mostruosità della configurazione del quadro di primavera. In ogni caso, alcune applicazioni Clojure sono (apparentemente) sufficientemente grandi da richiedere framework come questo. – noahlz

Problemi correlati