Jestem nowy w Clojure. Rozumiem kod, który piszę, ale później staje się zbyt trudny do zrozumienia.
Trudno dopasować nawiasy.
Jakie są ogólne konwencje dotyczące konwencji nazewnictwa i wcięć w różnych sytuacjach?
Na przykład napisałem przykładowy przykład de-strukturyzacji, aby go zrozumieć, ale za drugim razem wygląda on całkowicie nieczytelny.
(defn f [{x :x y :y z :z [a b c] :coll}] (print x " " y " " z " " a " " b " " c))
Czy w przypadku dekstrukturyzacji lepiej jest to zrobić bezpośrednio na poziomie parametru lub uruchomić formularz let, a następnie kontynuować?
readability
clojure
Amogh Talpallikar
źródło
źródło
Odpowiedzi:
Konwencje nazewnictwa
użyj
-
do dzielenia wyrazów (podkreślenia lub wielbłąda w innych językach).(defn add-one [i] (inc i))
Predykaty (tj. Funkcje zwracające wartość prawda lub fałsz) kończą się na
?
przykładach:odd?
even?
nil?
empty?
Procedury zmiany stanu kończą się za
!
. Pamiętaszset!
prawda? lubswap!
Wybierz krótkie nazwy zmiennych w zależności od ich zasięgu. Oznacza to, że jeśli masz naprawdę małą zmienną pomocniczą, często możesz użyć tylko jednej litery.
(map (fn [[k v]] (inc v)) {:test 4 :blub 5})
w razie potrzeby wybieraj dłuższe nazwy zmiennych, zwłaszcza jeśli są one używane w wielu wierszach kodu i nie można od razu odgadnąć ich celu. (moja opinia).Wydaje mi się, że wielu programistów Clojure używa raczej ogólnych i krótkich nazw. Ale to oczywiście nie jest obiektywna obserwacja. Chodzi o to, że wiele funkcji clojure jest w rzeczywistości dość ogólnych.
drop
,take
,assoc
, itd. Wtedy nie ma ładny artykuł opisujący sposoby wyboru znaczącą nazwę: http://ecmendenhall.github.io/blog/blog/2013/09/ 02 / clean-clojure-znaczące-nazwy /Funkcje Lambda
Możesz nazwać funkcje lambda. Jest to wygodne w przypadku debugowania i profilowania (moje doświadczenie z ClojureScript).
(fn square-em [[k v]] {k (* v v)})
Używaj wbudowanych funkcji lambda
#()
jako wygodnychBiała przestrzeń
Nie powinny istnieć wiersze zawierające tylko pareny. Od razu zamknij nawiasy. Pamiętaj, że pareny są dostępne dla edytora i kompilatora, wcięcie jest dla ciebie.
Listy parametrów funkcji idą w nowym wierszu
Ma to sens, jeśli myślisz o ciągach dokumentów. Znajdują się między nazwą funkcji a parametrami. Poniższy ciąg dokumentów prawdopodobnie nie jest najmądrzejszy;)
(Możesz również wpisać,
,
jak chcesz, ale wydaje się to nieciekawe).Do wcięcia użyj wystarczająco dobrego edytora. Wiele lat temu był to emacs do edycji lisp, vim jest także świetny dzisiaj. Typowe środowiska IDE clojure powinny również zapewniać tę funkcjonalność. Po prostu nie używaj losowego edytora tekstu.
W vimie w trybie poleceń możesz użyć
=
polecenia, aby poprawnie wciąć.Jeśli polecenie będzie zbyt długie (zagnieżdżone itp.), Możesz wstawić nowy wiersz po pierwszym argumencie. Teraz poniższy kod jest dość bezsensowny, ale ilustruje sposób grupowania i wcięcia wyrażeń:
Dobre wcięcie oznacza, że nie trzeba liczyć nawiasów. Nawiasy kwadratowe dotyczą komputera (w celu interpretacji kodu źródłowego i jego wcięcia). Wcięcie służy do łatwego zrozumienia.
Funkcje wyższego rzędu vs.
for
idoseq
formyPochodząc ze schematu, byłem raczej dumny z tego, że zrozumiałem
map
funkcje lambda itp. Tak często pisałem coś takiego(map (fn [[k x]] (+ x (k data))) {:a 10 :b 20 :c 30})
To jest dość trudne do odczytania.
for
Forma jest zdecydowanie ładniejszy:`map ma wiele zastosowań i jest naprawdę fajny, jeśli używasz nazwanych funkcji. To znaczy
Użyj makr wątków
Użyj makr wątków,
->
a->>
także,doto
jeśli dotyczy.Chodzi o to, że makra wątków sprawiają, że kod źródłowy wydaje się bardziej liniowy niż skład funkcji. Poniższy fragment kodu jest dość nieczytelny bez makra wątków:
porównać z
Używając makra wątków, zwykle można uniknąć wprowadzania zmiennych tymczasowych, które są używane tylko raz.
Inne rzeczy
źródło
doc
lubsource
w REPL). Koniec rant, dla skądinąd doskonałej odpowiedziapples
zamiast argumentuxs
wydawało się, że jest specyficzny dla jabłek. Następnie rozważałbym również, że nazwy argumentów funkcji są bardziej sięgające niż powiedzmy zmienną pętli for. więc w razie potrzeby możesz mieć je dłużej. Jako ostatnia myśl: zostawię wam „Nazwa kodu nie wartości” concatenative.org/wiki/view/Concatenative%20language/…