造夢西游3代碼怎么用 代碼怎么用( 三 )


class DtaRcrd102 {private Date genymdhms;private Date modymdhms;private final String pszqint = "102";/*...*/};和class Customer {private Date generationTimestamp;private Date modificationTimestamp;private final String recordId = "102";/*...*/};
現在讀起來就像人話了:“喂,Mikey,看看這條記錄!生成時間戳(generation timestamp)[9]被設置為明天了!不能這樣吧?”
— 05 —
使用可搜索的名稱
對于單字母名稱和數字常量,有一個問題,就是很難在一大篇文字中找出來 。
找MAX_CLASSES_PER_STUDENT很容易,但想找數字7就麻煩了,它可能是某些文件名或其他常量定義的一部分,出現在因不同意圖而采用的各種表達式中 。如果該常量是個長數字,又被人錯改過,就會逃過搜索,從而造成錯誤 。
同樣,e也不是一個便于搜索的好變量名,它是英文中最常用的字母,在每個程序、每段代碼中都有可能出現 。由此而見,長名稱勝于短名稱,搜得到的名稱勝于用自造編碼代寫就的名稱 。
竊以為單字母名稱僅用于短 *** 中的本地變量 。名稱長短應與其作用域大小相對應 [N5] 。若變量或常量可能在代碼中多處使用,則應賦予其便于搜索的名稱 。再比較:
for (int j=0; j<34; j++) {s += (t[j]*4)/5;}和int realDaysPerIdealDay = 4;const int WORK_DAYS_PER_WEEK = 5;int sum = 0;for (int j=0; j < NUMBER_OF_TASKS; j++) {int realTaskDays = taskEstimate[j] * realDaysPerIdealDay;int realTaskWeeks = (realTaskdays / WORK_DAYS_PER_WEEK);sum += realTaskWeeks;}
注意,上面代碼中的sum并非特別有用的名稱,不過至少搜得到它 。采用能表達意圖的名稱,貌似拉長了函數代碼,但要想想看,WORK_DAYS_PER_WEEK比數字5好找得多,而列表中也只剩下了體現作者意圖的名稱 。
— 06 —
避免使用編碼
編碼已經太多,無謂再自找麻煩 。把類型或作用域編進名稱里面,徒然增加了解碼的負擔 。沒理由要求每位新人都在弄清要應付的代碼之外(那算是正常的),還要再搞懂另一種編碼“語言” 。這對解決問題而言,純屬多余的負擔 。帶編碼的名稱通常也不便發音,容易打錯 。
匈牙利語標記法
在往昔名稱長短很重要的時代,我們毫無必要地破壞了不編碼的規矩,如今后悔不迭 。Fortran語言要求首字母體現出類型,導致了編碼的產生 。BASIC語言的早期版本只允許使用一個字母再加上一位數字 。匈牙利語標記法[10](Hungarian Notation,HN)將這種態勢愈演愈烈 。
在Windows的C語言API的時代,HN相當重要,那時所有名稱要么是一個整數句柄,要么是一個長指針或者void指針,要不然就是string的幾種實現(有不同的用途和屬性)之一 。那時候編譯器并不做類型檢查,程序員需要匈牙利語標記法來幫助自己記住類型 。
現代編程語言具有更豐富的類型系統,編譯器也記得并強制使用類型 。而且,程序員趨向于使用更小的類、更短的 ***,好讓每個變量的定義都在視野范圍之內 。
Java程序員不需要類型編碼,因為對象是強類型的,代碼編輯環境已經先進到在編譯開始前就能監測到類型錯誤的程度!所以,如今HN和其他的類型編碼形式都純屬多余 。它們增加了修改變量、函數或類的名稱或類型的難度,它們增加了閱讀代碼的難度,它們制造了讓編碼系統誤導讀者的可能性 。
PhoneNumberphoneString;//name not changed when type changed!
成員前綴
也不必用m_前綴來標明成員變量 。應當把類和函數做得足夠小,以消除對成員前綴的需要 。你應當使用某種可以高亮或用顏色標出成員的編輯環境 。
public class Part {private String m_dsc; // The textual descriptionvoid setName(String name) {m_dsc = name;}}--------------------------------------------------------------------------------------public class Part {String description;void setDescription(String description) {this.description = description;}}
此外,人們會很快學會無視前綴(或后綴),而只看到名稱中有意義的部分 。代碼讀得越多,眼中就越沒有前綴 。最終,前綴變作了不入法眼的廢料,變作了舊代碼的標志物 。
接口和實現
有時也會出現采用編碼的特殊情形 。比如,你在做一個創建形狀用的抽象工廠(Abstract Factory),該工廠是一個接口,要用具體類來實現 。你怎么來命名工廠和具體類呢?IShapeFactory和ShapeFactory嗎?我喜歡不加修飾的接口 。前導字母I被濫用到了說好聽點兒是干擾,說難聽點兒根本就是廢話的程度 。
我不想讓用戶知道我給他們的是接口,而就想讓他們知道那是一個ShapeFactory 。如果在接口和實現中必須選其一來編碼的話,我寧肯選擇實現 。ShapeFactoryImp,甚至是丑陋的CShapeFactory,都比對接口名稱編碼好 。

推薦閱讀