亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么是神奇的數字,為什么它是壞的?

什么是神奇的數字,為什么它是壞的?

什么是神奇的數字,為什么它是壞的?什么是魔術數字?為甚麼要避免呢?有合適的案例嗎?
查看完整描述

4 回答

?
拉莫斯之舞

TA貢獻1820條經驗 獲得超10個贊

幻數是代碼中數字的直接用法。

例如,如果您有(在Java中):

public class Foo {
    public void setPassword(String password) {
         // don't do this
         if (password.length() > 7) {
              throw new InvalidArgumentException("password");
         }
    }}

這應重新考慮到:

public class Foo {
    public static final int MAX_PASSWORD_SIZE = 7;

    public void setPassword(String password) {
         if (password.length() > MAX_PASSWORD_SIZE) {
              throw new InvalidArgumentException("password");
         }
    }}

它提高了代碼的可讀性,并且更易于維護。假設我在GUI中設置了密碼字段的大小。如果我使用一個神奇的數字,每當最大尺寸發生變化時,我必須在兩個代碼位置進行更改。如果我忘了一個,這會導致不一致。

JDK中滿是示例,如IntegerCharacterMath上課。

PS:像FindBugs和PMD這樣的靜態分析工具可以在代碼中檢測到神奇數字的使用,并建議進行重構。


查看完整回答
反對 回復 2019-05-30
?
人到中年有點甜

TA貢獻1895條經驗 獲得超7個贊

魔術數字是一個硬編碼的值,可能會在稍后階段改變,但因此很難更新。

例如,假設您有一個頁面,它在“您的訂單”概述頁中顯示最后50個訂單。50是這里的魔術數字,因為它不是通過標準或慣例來設定的,這是一個你在規范中列出的原因組成的數字。

現在,您要做的是在不同的地方擁有50-您的SQL腳本(SELECT TOP 50 * FROM orders),您的網站(最后50個訂單),您的訂單登錄(for (i = 0; i < 50; i++)可能還有很多其他地方。

現在,當某人決定改變50到25的時候會發生什么呢?還是75歲?或者153?你現在必須在所有的地方替換50,你很可能會錯過它。查找/替換可能不起作用,因為50可能用于其他事情,而盲目地用25替換50可能會產生其他一些不良副作用(例如,Session.Timeout = 50調用,也被設置為25,用戶開始報告太頻繁的超時)。

此外,代碼可能很難理解,即“if a < 50 then bla-如果您在一個復雜的函數中遇到這種情況,其他不熟悉代碼的開發人員可能會問自己“WTF是50?”

這就是為什么最好把這些模棱兩可的任意數字放在第一位-“const int NumOrdersToDisplay = 50“,因為這樣可以提高代碼的可讀性(”if a < NumOrdersToDisplay“,這也意味著您只需要在一個定義良好的地方更改它。

魔術數字合適的地方是通過標準定義的一切,即SmtpClient.DefaultPort = 25TCPPacketSize = whatever(不確定這是否標準化)。而且,僅在1函數中定義的所有內容都可能是可以接受的,但這取決于上下文。


查看完整回答
反對 回復 2019-05-30
  • 4 回答
  • 0 關注
  • 769 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號