為資料命名
- 三種情況
- 簡短命名 (short name) 與自証命名 (self-evident name) 的選用
- 常用的『組合命名法』
三種情況
在寫 Clojure 時,有三種情況,會需要為資料取名:
varlet-boundfunction 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 |


