我們的項目中是否充斥著類似下面的代碼呢?定義一個專門存放常量的java類(接口),很多其他類依賴該常量類。
使用該常量的代碼,大致具有如下形式:
為什么要把0和""定義成一個常量呢?這是沒有正確理解到底什么是魔鬼數字和硬編碼。使用常量,出于如下幾個原因:
1、為了可讀性,一個好的名字顯然比一串寫死的數字更容易理解。
2、避免冗余,讓代碼更容易修改,實現一處該,處處該的效果。
3、避免程序員手寫常量,不小心寫錯。比如多寫了個0或者是少寫了個0等。
4、常量必須是被多個地方使用,而且在不同的地方代表相同的含義。
如果定義的常量沒有達到這4個要求中的任意一個,那么可以說這個常量的使用是沒有意義的,會導致另一中代碼壞味道:沒有必要的復雜性。
上面我們舉的例子中:0代表的是列表的長度,也代表數組的第一個元素。不滿足第1個要求,因為對于程序員來說,這只是最基本的語法,額外定義變量不能提高可讀性;不滿足第2個要求,因為這些東西是不會變的,不存在修改的可能;不滿足第3個要求,有IDE的編譯提示,而且常量0并不復雜,不存在寫錯的可能;不滿足第4個要求,因為0一會兒代表長度,一會兒代表數組索引,根本沒有辦法給0取一個有意義的名稱。
第4點需要特別注意:一個常量名稱只能代表一個業務含義!讓列表長度和數組索引“復用”常量值0,這種做法非常不好。雖然減少了常量的個數,貌似實現了"復用",實際上是增加了代碼之間的耦合。舉個極端的例子,假如java的語法發生重大改變,數組的第一個元素從1開始而不是0,那我們能將常量ZERO修改成1嗎?顯然不能,如果修改了,是能夠保證數組的正確使用,但是會導致列表長度的判斷錯誤。這種場景下,我們定義的常量ZERO完全沒有意義。