Clojure: decomposizione della registrazione, delle metriche e della logica aziendale da una funzione

1

Stavo leggendo il post A Modern Architecture for FP che includeva un frammento di codice che l'autore voleva decomporre ulteriormente. Non conosco Haskell, ma riconosco abbastanza per sapere che ho scritto molte funzioni come questa, combinando log relativi, metriche e business logic in un'unica funzione:

saveFile :: Path -> Bytes -> IO Unit
saveFile p f = do
  log ("Saving file" ++ show (name p) ++ " to " ++ show (parentDir p))
  r <- httpPost ("cloudfiles.fooservice.com/" ++ (show p)) f
  if (httpOK r) then log ("Successfully saved file " ++ show p)
  else let msg = "Failed to save file " ++ show p
  in log msg *> throwException (error msg)

Capisco che Haskell, con solo funzioni pure, richiede tecniche speciali per avere effetti collaterali. (Sto ancora studiando le monadi e la teoria delle categorie per capire perché contano.) Clojure non richiede funzioni pure, ma voglio ancora sapere come decomporre ulteriormente questo metodo.

Qual è il modo più idiomatico Clojure per dividere una funzione come sopra? Non capisco abbastanza le monadi o Haskell per sapere come applicare quell'articolo a Clojure; Posso vedere altre due possibilità generali:

  • Scrivi più funzioni per ogni funzione composita, ogni nuova funzione rappresenta una piccola unità di registrazione, pubblicazione di metriche, logica aziendale, ecc. Ho un albero di chiamate che compone quelle tutte nel comportamento del componente reale che desidero e un altro (? !) call tree che compone solo la versione puramente funzionale del componente (se lo si desidera). Questo sembra irragionevole per qualsiasi componente di scala.
  • Scrivi le funzioni composite come mostrato sopra e associa dinamicamente i componenti no-op quando vuoi ottenere una funzione pura.

Il secondo sembra il più ragionevole quando si scrive un software aziendale, ma in realtà non decompone nulla.

    
posta MonkeyWithDarts 05.11.2016 - 17:38
fonte

0 risposte

Leggi altre domande sui tag