為資料命名
- 三種情況
- 簡短命名 (short name) 與自証命名 (self-evident name) 的選用
- 常用的『組合命名法』
三種情況
在寫 Clojure 時,有三種情況,會需要為資料取名:
var
let-bound
function parameter
var
近似於其它語言的全域變數、或是物件的私有變數 。let-bound
近似於其它語言的區域變數。
這邊有一個比較表: O
表示,我們在命名時可以控制。X
表示,我們在命名時無法掌握。sign
表示的是命名的文字本身。referent
表示的是命名所指向的值本身。
sign | referent | |
---|---|---|
var | O | O |
let-bound | O | O |
function paramter | O | X |
很明顯的是,function parameter
與其它兩者最大的差異在於,我們可以為它命名,卻無法在命名時掌握 function parameter
日後會指向的『值』。這件事該如何改善呢? 尤其 Clojure 又是一種動態型別的語言。如果我們知道合理的值,它應該有一些不變的特性的話,我們可以用 schema 來檢查。
簡短命名與自証命名的選用
命名如果可以使用清楚的自証命名 (self-evident name),當然很好,看到名字就可以理解意涵。然而,如果一個值會被重複地使用,我們傾向使用簡短命名,而非自証命名。
比方說,下列這一段程式碼,g
因為會被多次使用,刻意使用簡短命名。
(doseq [g (->> planets
(remove gas-planet?)
(map surface-gravity))]
...)
那,有沒有可以魚與熊掌兼得的方法呢? 又使用自証命名來突顯意涵,又使用簡短命名,讓程式碼容易撰寫。有時候也是可以的,比方說,改成這樣子:
(let [surface-gravities (->> planets
(remove gas-planet?)
(map surface-gravity))]
(doseq [g surface-gravities]
...))
常用的命名組合法
value | name |
---|---|
任意值 | x |
任意值的序列 | xs |
函數 | f |
函數的序列 | fs |
映射 | m |
映射的序列 | ms |
兩個不同的值 a 與 b 構成的向量 | a+b |
兩個不同的值 student 與 tutor 構成的向量的序列 | student+tutors |