我被喷了:这样写代码是多此一举?
今天通過一件事情,分享寫代碼時的一個重要小技巧。
前段時間,我在編程導航項目中開源了一段代碼,實現的功能是,當用戶的操作失敗時,會在頁面上彈出一個錯誤框,并提示 “操作失敗”,代碼如下:
//?錯誤提示 const?ERROR_MESSAGE?=?"操作失敗";//?刪除資源 const?result?=?deleteResource();? if(!result)?{alert(ERROR_MESSAGE); }然而沒想到,有位同學直接留言說我這么寫代碼是多此一舉!為什么要單獨給 “操作失敗” 這個字符串定義一個常量呢?直接這么寫不就好了:
//?刪除資源 const?result?=?deleteResource();? if(!result)?{alert("操作失敗"); }似乎代碼變得更精簡了,但其實這是一個常見的編程誤區,魔法值 問題。
魔法值
什么是魔法值呢?聽起來有點像游戲的藍槽 MP 哈哈。
其實,魔法值和 MP 一點關系都沒有!
魔法值指的是代碼中沒有任何定義,直接像魔法一樣憑空出現的值,可以是數字、字符串等,比如:
//?輸出 console.log(1); //?彈出警告框 alert("dog");為什么要給這種值一個名號 “魔法值” 呢,因為它對代碼的影響非常惡劣!
魔法值的問題
首先,魔法值會嚴重影響代碼的 可讀性 和 可維護性。
像上面的魔法字符串看起來好像沒什么問題,但如果魔法值是數字,就必須通過閱讀其他代碼才能推斷出來,比如:
if?(a?==?1)?{alert("good"); }?else?if?(a?==?2)?{alert("bad"); }?else?if?(a?==?3)?{... }只憑這樣一段代碼,你能知道數字 1、2、3 分別是什么意思嗎?
有同學說了,我自己寫的代碼難道還會看不懂么?別急,過一個月你再來閱讀下這段代碼。
如果你的記憶力很好,自己一個做項目的時候追求點效率倒也無所謂了。但要是和其他同學一起做項目、維護代碼,寫帶有魔法值的代碼無疑會讓他人難以理解,如果再不寫注釋,可能他們連殺了你的心都會有了。
第二,魔法值還會影響開發的 效率和準確性。
還是拿開頭那段代碼為例,噴我的同學根本沒有把代碼文件完整讀完,其實在該文件中,我不止一次使用到了 ERROR_MESSAGE 這一常量:
//?錯誤提示 const?ERROR_MESSAGE?=?"操作失敗";//?刪除資源 const?result?=?deleteResource();? if(!result)?{alert(ERROR_MESSAGE); } //?修改資源 const?result?=?updateResource();? if(!result)?{alert(ERROR_MESSAGE); }...如果像他說的一樣,不去定義常量,而是直接用魔法字符串,那么每次要彈出 “操作失敗” 時,我都要重復去打這幾個字,浪費時間的同時,還存在打錯字的風險。而如果使用預定義的常量,就能很輕松地利用開發工具提供的代碼提示和補全功能。
代碼補全此外,魔法值還會影響代碼的 易修改性。
假如說同一個魔法字符串在代碼中多次出現,那當我要修改字符串文案時,就要人工一個個地去找到這個字符串進行修改,即使可以用開發工具提供的搜索和全局替換功能,但也要去檢查一遍,非常麻煩。
alert("你操作失敗了"); alert("你操作失敗了"); alert("你操作失敗了");而如果將字符串定義為常量,只用在定義處修改它的值即可。此時的常量名,倒像是魔法值的一個指針了。
const?ERROR_MESSAGE?=?"你操作失敗了" alert("ERROR_MESSAGE"); alert("ERROR_MESSAGE"); alert("ERROR_MESSAGE");解決魔法值
正因為魔法值對代碼有很大的危害,所以各種代碼規范中,都建議開發者不要使用魔法值。
解決魔法值的方式很簡單,其實上面已經講到了,就是為一系列相同的值定義一個 常量。注意是常量,不是變量!因為魔法值的內容一般是固定的,其本身結構不會被修改。
對于一系列的魔法值,建議定義為一個枚舉或單獨的常量類,比如資源有很多審核狀態,可以把所有狀態集中定義。
JavaScript 代碼:
const?REVIEW_STATUS?=?{//?待審核WAITING:?0,//?通過PASS:?1,//?拒絕REJECT:?2 }Java 代碼:
public?enum?ReviewStatus?{WAITING,?PASS,?REJECT }有道無術,術可成;有術無道,止于術
歡迎大家關注Java之道公眾號
好文章,我在看??
總結
以上是生活随笔為你收集整理的我被喷了:这样写代码是多此一举?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM:我就想知道我是怎么没的
- 下一篇: leetcode-654-最大二叉树