2015-06-14

[Clean Code] 閱讀筆記 - 2

第二章討論的主題是有意義的命名(Meaningful Names)。命名真的是很大的學問,看看The 9 hardest things programmers have to do,第一名就是“命名”,就連母語是英語的人,也會覺得寫程式的時候命名很困難。

命名可以分成兩個面向,一個是意義(meaning);另一個則是樣式(style)。意義是很主觀的,會因為變數或函式的功能不同而改變命名的用字。Clean Code這本書將命名的重點集中在如何使命名有意義,但是變數或函式的命名會隨著使用的時機及其存在的範圍(scope)而有所調整,因此很難有一固定的命名方法。作者列出一些參考的方向,有好的也有不好的。例如dayd容易了解,而finishDay又比day描述得更清楚;但是用finishDay或是completeDay則需是使用狀況而定,很難說哪一個比較好。我認為有意義的命名就像寫文章時的用字遣詞一樣,要表達同一個意思,有人用字精準,也有人喜歡華麗的辭藻,但是重點就是要讓人看得懂,而不只是一堆文字的堆疊,這樣的好處是讓閱讀的人可以更快看懂程式碼。

Mosky五月在Taipei.py的演講Beyond the Style Guides,也跟有意義的命名有關。

命名的樣式是屬於比較客觀的部分,主要用於定義名稱的結構。例如同樣是指account data,可以有很多寫法:accountdata, AccountData, accountData, account_data。很多團隊會事先定義好固定的樣式,希望大家遵守,只是為了閱讀習慣。Python PEP8也提供了命名樣式的規則讓大家參考。

另外之前一直以為匈牙利標誌法(Hungarian Notation, HN)包含CamelCase的規則,後來才發現是自己誤會了。匈牙利標誌法是指在各個變數之前,加上資料型別的小寫字母縮寫,讓閱讀程式碼的人得以快速知道該變數的資料型別。寫程式會常用到Windows C API的人應該知道,MSDN上的API說明,每個變數前面都有一串資料型別,例如DeviceIoControl

看完第二章的感想是除了讓命名有意義外,我覺得一致性也很重要,命名的一致性可以降低閱讀的人的疑惑。書上也舉例:manager, controller, driver這三者的目的是類似的,如果沒有特別的差異不要混用,否則會讓看的人更困擾。看懂別人寫的程式碼已經有點困難了,還要去猜這裡的controller跟那裡的driver有什麼不一樣,那就太浪費時間了。
Post a Comment