Quy ước đặt tên
- viết thường cho các chức năng
sử dụng -
cho dấu gạch nối (những gì sẽ là dấu gạch dưới hoặc trường hợp lạc đà trong các ngôn ngữ khác).
(defn add-one
[i]
(inc i))
Vị ngữ (nghĩa là các hàm trả về đúng hoặc sai) kết thúc bằng ?
Ví dụ:odd?
even?
nil?
empty?
Thủ tục thay đổi nhà nước kết thúc vào !
. Bạn nhớ set!
đúng không? hoặc làswap!
Chọn độ dài tên biến ngắn tùy thuộc vào phạm vi của họ. Điều đó có nghĩa là nếu bạn có một biến phụ thực sự nhỏ, bạn thường chỉ có thể sử dụng tên một chữ cái. (map (fn [[k v]] (inc v)) {:test 4 :blub 5})
chọn tên biến dài hơn nếu cần, đặc biệt nếu chúng được sử dụng cho nhiều dòng mã và bạn không thể đoán ngay mục đích của chúng. (quan điểm của tôi).
Tôi cảm thấy rằng rất nhiều lập trình viên clojure có xu hướng sử dụng tên chung và ngắn. Nhưng điều này tất nhiên không thực sự là một quan sát khách quan. Vấn đề là rất nhiều chức năng clojure thực sự khá chung chung.
Hàm Lambda
Bạn thực sự có thể đặt tên hàm lambda. Điều này thuận tiện cho việc gỡ lỗi và định hình (kinh nghiệm của tôi ở đây là với ClojureScript).
(fn square-em [[k v]] {k (* v v)})
Sử dụng chức năng lambda nội tuyến #()
là thuận tiện
Khoảng trắng
Không nên có các dòng chỉ parens. Tức là đóng dấu ngoặc ngay lập tức. Hãy nhớ parens có sẵn cho trình soạn thảo và trình biên dịch, thụt lề là dành cho bạn.
Danh sách tham số chức năng đi trên một dòng mới
(khuyết điểm
[ab]
(danh sách ab))
Điều này có ý nghĩa nếu bạn nghĩ về các chuỗi doc. Chúng nằm giữa tên hàm và tham số. Chuỗi doc sau có lẽ không phải là khôn ngoan nhất;)
(khuyết điểm
"Ghép đôi mọi thứ"
[ab]
(danh sách ab))
- Dữ liệu được ghép có thể được phân tách bằng một dòng mới miễn là bạn giữ lại việc ghép nối
(không biết
[{x: x
y: y
z: z
[abc]: coll}]
(in x "" y "" z "" a "" b "" c))
(Bạn cũng có thể nhập ,
theo ý muốn nhưng điều này cảm thấy không hợp lý).
Đối với thụt lề sử dụng một trình soạn thảo đủ tốt. Nhiều năm trước đây là emacs để chỉnh sửa lisp, vim cũng rất tuyệt ngày hôm nay. IDE clojure điển hình cũng nên cung cấp chức năng này. Chỉ không sử dụng một trình soạn thảo văn bản ngẫu nhiên.
Trong vim trong chế độ lệnh, bạn có thể sử dụng =
lệnh để thụt lề đúng cách.
Nếu lệnh quá dài (lồng nhau, v.v.), bạn có thể chèn một dòng mới sau đối số đầu tiên. Bây giờ đoạn mã sau khá vô nghĩa nhưng nó minh họa cách bạn có thể nhóm và biểu thức thụt lề:
(+ (if-let [age (: coll-age coll)]
(nếu (> 18 tuổi)
tuổi tác
0)
(đếm (phạm vi (- 3 b)
(giảm +
(phạm vi b 10)))))
Lõm tốt có nghĩa là bạn không phải đếm dấu ngoặc. Dấu ngoặc dành cho máy tính (để giải thích mã nguồn và thụt lề). Sự thụt lề là để bạn dễ hiểu.
Hàm bậc cao hơn so với for
và doseq
biểu mẫu
Xuất thân từ nền tảng Scheme tôi khá tự hào vì đã hiểu map
và các hàm lambda, v.v ... Vì vậy, khá thường xuyên, tôi sẽ viết một cái gì đó như thế này
(map (fn [[k x]] (+ x (k data))) {:a 10 :b 20 :c 30})
Điều này khá khó đọc. Hình for
thức là cách đẹp hơn:
(for [[k x] {:a 10 :b 20 :c30}]
(+ x (k data)))
`map có rất nhiều công dụng và thực sự rất hay nếu bạn đang sử dụng các hàm được đặt tên. I E
(map inc [12 30 10]
(map count [[10 20 23] [1 2 3 4 5] (range 5)])
Sử dụng macro phân luồng
Sử dụng các macro luồng ->
và ->>
cũng như doto
khi áp dụng.
Vấn đề là các macro luồng làm cho mã nguồn xuất hiện tuyến tính hơn thành phần chức năng. Đoạn mã sau đây khá khó đọc nếu không có macro luồng:
(f (g (h 3) 10) [10 3 2 3])
so sánh với
(->
(h 3)
(g 10)
(f [10 3 2 3]))
Bằng cách sử dụng macro luồng, người ta thường có thể tránh đưa ra các biến tạm thời chỉ được sử dụng một lần.
Những thứ khác
- Sử dụng tài liệu
- giữ chức năng ngắn
- đọc mã clojure khác