日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

也说魔数与魔字符串

發布時間:2025/3/17 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 也说魔数与魔字符串 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

???????? 看了敘遠兄寫的.net中的魔字符串,還有birdsome的評論,頗有啟發。
???????? 所謂魔數和魔字符串就是在代碼中直接使用某一個數字或者字符串,而不是常量。譬如一個很簡單的根
據職位計算薪水的方法:

public?int?getSalary(String?title, int grade)?{
????
if?("Programmer"
.equals(title))?
????????
return?grade?*?500?+?700
;
????
else?if?("Tester"
.equals(title))
????????
return?grade?*?500?+?800
;
????
else?if?("Analyst"
.equals(title))
????????
return?grade?*?800?+?1000
;
}

????????在這個方法里面,"Programmer","Tester"和"Analyst"是所謂的魔字符串(Magic String),而500, 700,800和1000就是所謂的魔數(Magic Number)了。 咋一看,代碼這樣寫也沒有什么問題,但是,仔細思考一下就會發現,如果這種隨手捻來的字符串和數字散布于程序當中,隨處可見的話,是會有很多弊病的。我們先來分析三個魔字符串。雖然三個Magic String的意義很明顯,并不影響到代碼的可讀性,但是這樣卻增加了出錯的概率,并且忽略了具體的語義環境。我們很容易就會想到,像"Programmer"這個單詞散布在多個方法中,一個大小寫的筆誤就會產生bug。同時,"Programmer"在計算薪水的方法中代表著職位,但是在統計公司訂閱的雜志的方法中,也許就要代表一本雜志的名稱了。然而這種語義環境是無法通過一個單純的"Programmer"就能體現出來的。
??????? 而Magic Number的問題就更大了,首先是影響了代碼的可讀性,誰會知道500和800是薪水基數,700是補
貼呢?而且更糟糕的是,如果薪水基數發生改變的時候,那么就得找人把這些500,700,800的數字找出來一個一個地update,那可是一件夠郁悶的事情了。
?????? ?如果我們擁有一個常量定義的interface,代碼就會變漂亮起來了:

public?int?getSalary(String?title, int grade)?{
????
if
?(Constants.TITLE_PROGRAMMER.equals(title))?
????????
return?grade?*?Constants.BASE_SALARY_LOW?+
?Constants.ALLOWANCE_LOW;
????
else?if?(Constants.TITLE_TESTER
.equals(title))
????????
return?grade?*?Constants.BASE_SALARY_LOW?+
?Constants.ALLOWANCE_MEDIUM;
????
else?if?(Constants.TITLE_ANALYST
.equals(title))
????????
return?grade?*?Constants.BASE_SALARY_HIGH?+
?Constants.ALLOWANCE_HIGH;
}

??????? 從以上的分析,在一個Project里面,避免使用魔數(Magic Number)和魔字符串(Magic String)是相當必要的。通過定義的常量去access特定的字符串和數字也已經是軟件開發的standard。那么是不是所有的數字和字符串都應該定義成常量呢?或許有朋友會認為所有的數字和字符串都應該定義成常量,但是我覺得,每個字符串確實是應該定義成常量的,但是對于數字而言,如果數字本身的語義沒有得到延伸,那么就不應該定義成常量。譬如數組的index就不應該定義成變量。?像這樣的代碼:

String?building?=?address[Constants.ONE];?
????????????//
?在Constants這個interface中,ONE的定義為?final?int?ONE?=?1;

??????? 你一定會覺得這樣的代碼就是畫蛇添足, 因為ONE就是1,它沒有其他特別的含義,不像上面代碼中的500和700。而且如果真的要這樣定義的話,出現了有上百個元素的數組的時候,那么你就得定義上百個沒有任何意義的常量了。是不是很FT呢?
??????? 總之,任何策略的使用,還是一個度最重要。

新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!

總結

以上是生活随笔為你收集整理的也说魔数与魔字符串的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。