<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          我被噴了:這樣寫代碼是多此一舉?

          共 2595字,需瀏覽 6分鐘

           ·

          2021-05-01 23:19

          二分鐘,教你一個寫代碼的好習慣。

          大家好,我是魚皮,今天通過一件事情,分享寫代碼時的一個重要小技巧。

          前段時間,我在編程導航項目中開源了一段代碼,實現(xiàn)的功能是,當用戶的操作失敗時,會在頁面上彈出一個錯誤框,并提示 “操作失敗”,代碼如下:

          // 錯誤提示
          const ERROR_MESSAGE = "操作失敗";

          // 刪除資源
          const result = deleteResource(); 
          if(!result) {
            alert(ERROR_MESSAGE);
          }

          然而沒想到,有位同學直接留言說我這么寫代碼是多此一舉!為什么要單獨給 “操作失敗” 這個字符串定義一個常量呢?直接這么寫不就好了:

          // 刪除資源
          const result = deleteResource(); 
          if(!result) {
            alert("操作失敗");
          }

          似乎代碼變得更精簡了,但其實這是一個常見的編程誤區(qū),魔法值 問題。

          魔法值

          什么是魔法值呢?聽起來有點像游戲的藍槽 MP 哈哈。

          其實,魔法值和 MP 一點關系都沒有!

          魔法值指的是代碼中沒有任何定義,直接像魔法一樣憑空出現(xiàn)的值,可以是數(shù)字、字符串等,比如:

          // 輸出
          console.log(1);
          // 彈出警告框
          alert("dog");

          為什么要給這種值一個名號 “魔法值” 呢,因為它對代碼的影響非常惡劣!

          魔法值的問題

          首先,魔法值會嚴重影響代碼的 可讀性可維護性。

          像上面的魔法字符串看起來好像沒什么問題,但如果魔法值是數(shù)字,就必須通過閱讀其他代碼才能推斷出來,比如:

          if (a == 1) {
            alert("good");
          else if (a == 2) {
            alert("bad");
          else if (a == 3) {
            ...
          }

          只憑這樣一段代碼,你能知道數(shù)字 1、2、3 分別是什么意思嗎?

          有同學說了,我自己寫的代碼難道還會看不懂么?別急,過一個月你再來閱讀下這段代碼。

          如果你的記憶力很好,自己一個做項目的時候追求點效率倒也無所謂了。但要是和其他同學一起做項目、維護代碼,寫帶有魔法值的代碼無疑會讓他人難以理解,如果再不寫注釋,可能他們連殺了你的心都會有了。

          第二,魔法值還會影響開發(fā)的 效率和準確性。

          還是拿開頭那段代碼為例,噴我的同學根本沒有把代碼文件完整讀完,其實在該文件中,我不止一次使用到了 ERROR_MESSAGE 這一常量:

          // 錯誤提示
          const ERROR_MESSAGE = "操作失敗";

          // 刪除資源
          const result = deleteResource(); 
          if(!result) {
            alert(ERROR_MESSAGE);
          }
          // 修改資源
          const result = updateResource(); 
          if(!result) {
            alert(ERROR_MESSAGE);
          }

          ...

          如果像他說的一樣,不去定義常量,而是直接用魔法字符串,那么每次要彈出 “操作失敗” 時,我都要重復去打這幾個字,浪費時間的同時,還存在打錯字的風險。而如果使用預定義的常量,就能很輕松地利用開發(fā)工具提供的代碼提示和補全功能。

          代碼補全

          此外,魔法值還會影響代碼的 易修改性。

          假如說同一個魔法字符串在代碼中多次出現(xiàn),那當我要修改字符串文案時,就要人工一個個地去找到這個字符串進行修改,即使可以用開發(fā)工具提供的搜索和全局替換功能,但也要去檢查一遍,非常麻煩。

          alert("你操作失敗了");
          alert("你操作失敗了");
          alert("你操作失敗了");

          而如果將字符串定義為常量,只用在定義處修改它的值即可。此時的常量名,倒像是魔法值的一個指針了。

          const ERROR_MESSAGE = "你操作失敗了"
          alert("ERROR_MESSAGE");
          alert("ERROR_MESSAGE");
          alert("ERROR_MESSAGE");

          解決魔法值

          正因為魔法值對代碼有很大的危害,所以各種代碼規(guī)范中,都建議開發(fā)者不要使用魔法值。

          解決魔法值的方式很簡單,其實上面已經(jīng)講到了,就是為一系列相同的值定義一個 常量。注意是常量,不是變量!因為魔法值的內容一般是固定的,其本身結構不會被修改。

          對于一系列的魔法值,建議定義為一個枚舉或單獨的常量類,比如資源有很多審核狀態(tài),可以把所有狀態(tài)集中定義。

          JavaScript 代碼:

          const REVIEW_STATUS = {
            // 待審核
            WAITING0,
            // 通過
            PASS1,
            // 拒絕
            REJECT2
          }

          Java 代碼:

          public enum ReviewStatus {
            WAITING, PASS, REJECT
          }


          希望本期分享對大家有幫助,千萬不要再寫爛代碼啦!

          往期推薦

          B 站面試官:“啥是重定向?”

          我工作中不可或缺的寶貝們!

          小知識,啥是熱數(shù)據(jù)探測?

          瀏覽 45
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  爱搞搞就搞搞 | 亚州天堂| 香蕉久久成人国产精品 | 婷婷五月天亚洲天堂 | 欧美日韩免费观看一区=区三区 |