Fork me on GitHub
#clojure-italy
<
2019-04-23
>
reborg05:04:01

mdallastella07:04:57

Sondaggino - cosa usate: Component, Mount, System, Integrant o nessuno dei precedenti

mdallastella07:04:24

Usiamo anche noi Mount, ma non ne sono soddisfatto al 100%

mdallastella07:04:51

E' bello che lasci risolvere le dipendenze da Clojure, ma ogni tanto sento la mancanza di una mappa esplicita che mi dica chi dipende da cosa

mdallastella07:04:22

(sarà il mio passato da Pythonista, "Explicit is better than implicit")

helios07:04:52

hm, secondo me si puo' fare qualcosa per printare il dependency graph

helios07:04:22

issue gia' aperta 😛

mdallastella07:04:57

Sicuro, ma non è la mia idea di explicit 😅

helios07:04:35

Component allora fa piu' al caso tuo. A me non piace molto l'implementazione come record

mdallastella07:04:59

Stavo valutanto Integrant a dire il vero

helios07:04:38

Mai sentito a dir la verita'

reborg07:04:20

Argh, dependency graphs? Mi ricorda dei bei tempi di Spring e dependency inversion in generale. Siete tornati agli oggetti?

mdallastella07:04:02

Che c'entrano gli oggetti?

reborg07:04:36

cos’e’ un component?

mdallastella08:04:27

Non è che tutto ciò che contiene uno stato sia necessariamente un oggetto

mdallastella08:04:54

@reborg dici che sia meglio un global state come una volta?

reborg08:04:06

Che sappia io, tutti i component frameworks hanno da qualche parte un global state (che poi puo’ piu’ o meno avere states satelliti in altri namespaces). Mi piace usare components (per REPL dev/testing), ma sto ben alla larga da qualunque offerta di dependency injection (tipo, dimmi cosa component-A vuole e il framework te lo fa arrivare). Quello e’ il punto in cui per capire cosa fa l’app devo basarmi su una configurazione “esterna” e seguire 2 flussi invece di 1: codice e dependency graph. Ma non vedo il vantaggio di fare una cosa del genere.

reborg08:04:27

Quindi quello che ho nelle mie app e’ tipo: (ns2 (:require [ns1.state :refer [system]])) (db/query system/conn "select * from blah")

mdallastella09:04:44

Capisco ma non concordo

reborg09:04:41

@mdallastella contento di saperne di piu’

mdallastella09:04:52

@reborg preferisco tenere lo stato di un componente all'interno del namespace a cui serve e forse non sono abbastanza skillato da usare tecniche differenti tra dev/testing e production. Per quando riguarda la dependency injection, siamo ben lontani da Spring o da Guice: Component, Mount & co non fanno nulla di magico in questo senso.

mdallastella09:04:37

Nel caso di Integrant (come in Component) le dipendenze (quindi il dependency graph) devono essere esplicitate

mdallastella09:04:51

Non è il caso di Mount, che, lasciando la risoluzione ai require di Clojure può portare a dei loop nelle dipendenze

mdallastella09:04:33

E a dire la verità, ogni tanto il REPL development frega in qualche caso

reborg10:04:09

Un component framework deve darmi come minimo: 1. un (reset) per il REPL 2. non costringermi ad esplicitare dipendenze. Alcuni dei tool citati penso siano ok per entrambe i punti.

reborg10:04:21

Se poi si vogliono gestirsi lo stato in frammenti o globalmente, diventa relativo.

mdallastella10:04:26

Certo. Mount da questo punto di vista è quello che si avvicina di più a quello che chiedi.

reborg10:04:59

Se quindi il component framework non e’ contagioso (cioe’ un component e’ tale solo se e’ stateful e non perche’ e’ client di un component) il “dependency graph” di una app arbitrariamente complessa non dovrebbe mai superare gli 8-10 nodi.

Lu17:04:27

@mdallastella noi in Juxt usiamo integrant con edge che è una in house made library che offre production ready code.. la usiamo per tutti i nostri progetti in production .. se vuoi dagli una occhiata .. è open source -> github/juxt/edge

mdallastella17:04:40

Sì, l'avevo notata, grazie mille! ☺️

Lu17:04:04

Non c è di che :)

andrea.crotti19:04:15

Anche io uso integrant parecchio ed è ottimo

andrea.crotti19:04:06

La libreria component non mi piace molto ed è troppo invasiva Imho ma con integrant ci troviamo molto bene

andrea.crotti19:04:32

Non c'è proprio niente di magico