This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2024-02-01
Channels
- # aleph (6)
- # announcements (37)
- # aws (1)
- # beginners (67)
- # calva (9)
- # clerk (5)
- # clj-kondo (3)
- # clojure (19)
- # clojure-europe (40)
- # clojure-nl (1)
- # clojure-norway (36)
- # clojure-uk (5)
- # clojuredesign-podcast (7)
- # clojurescript (28)
- # datomic (9)
- # emacs (8)
- # figwheel-main (4)
- # fulcro (6)
- # hyperfiddle (19)
- # integrant (4)
- # java (9)
- # lsp (131)
- # malli (9)
- # missionary (85)
- # off-topic (13)
- # pathom (3)
- # polylith (11)
- # releases (1)
- # sci (4)
- # shadow-cljs (7)
- # specter (2)
- # vscode (1)
- # xtdb (2)
Uansett, det fikk meg til Ă„ skrive
Don't use the clock
Calling out to System/currentTimMillis, t/now, t/today and friends is a great way to make your code hard to test, because you're basically relying on an impure fn (yes, asking for time is impure). To get around this, we add :user-time to the ctx upon its creation, so whenever you need time in your code, use (:user-time ctx) which then allows for passing in whatever time you want when testing.
I vĂ„r âBackend coding conventionsâNei, det vil jeg ikke pĂ„stĂ„. Dette er jo bare imperative shell, functional-core applisert til tid.
Veldig fornuftig. Og kan utvides til Ă„ inkludere alle funksjoner som defaulter noe som helst som har med tid Ă„ gjĂžre - feks tidssone.
Spennende for meg đ Gir liksom en kombinasjon av pragmatikk, âdet er bare dataâ, immutability og isolasjon av sideeffekter. Jeg ville ikke kommet pĂ„ Ă„ gjĂžre det sĂ„nn. Hvis det er modus operandi / Ă„penbart / trivielt for dere, er jo det flott for dere!
Det er vel sÄvidt lite Äpenbart/trivielt for meg at jeg finner det verdt Ä dele her. OgsÄ fordi jeg merker at jeg er litt stolt over Ä ha innfÞrt dette arkitektoniske grepet
En annen mulighet er Ä sette en instans av java.time.Clock pÄ :ctx
, f.eks Clock/fixed
. Mange java.time-metoder tar Clock som argument. Da kan du lage testbare funksjoner som hÄndterer tid, men som likevel er pure.
"A clock providing access to the current instant, date and time using a time-zone." https://docs.oracle.com/javase/8/docs/api/java/time/Clock.html
Har bare brukt en eksplisitt Clock i forbindelse med testing (`Clock/fixed`), men hele java.time bruker en implisitt systemklokke som baserer seg pÄ hardware + JVM-konfigurasjon for tidssone - hvis du ikke overstyrer ved Ä sende med en klokke. Se f.eks. Instant now()
og Instant now(Clock clock)
: https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html#now--
Interessant. Jeg har lÞst dette litt tungvindt ved Ä vÊre eksplisitt pÄ now og tidssone.
Eksempel pÄ bruk i test: https://github.com/msolli/proletarian/blob/d34aa863f89dfcdf563a7690fcdb8f971ea26d02/test/proletarian/retry_test.clj
Funksjonen som testes, retry-data
, gjÞr tidsaritmetikk, men er likevel pure siden den fÄr inn Clock utenfra.
In other news. Vi legger snart ut to Clojurebackendutviklerstillinger. My DMs are open som de sier.
Helt uironisk trodde jeg ogsÄ at do-at
var en skedulerings-funksjon, og blir irrasjonelt irritert dersom det stemmer at den ikke gjĂžr det đ
Og du tok feil pĂ„ to begge punkter. Den er ikke en funksjon og den skedulerer ikke đ
Jeg tror til vÄrt forsvar at vÄr bruk av clj-time er fra fÞr java.time var en greie (man brukte vel Joda time pÄ den tiden). Og jeg har ikke helt sett verdien av Ä bytte det ut, det stÞrste problemet er jo folk som insisterer pÄ Ä spÞrre om tiden bÄde her og der, og det ungÄr du jo ikke med java.time heller.