前言
反模式 是指對反復出現的設計問題的常見的無力而低效的設計模式,俗話說就是重蹈覆轍。 這篇文章描述了 JavaScript 中常見的一些反模式,以及避免它們的辦法。
硬編碼
硬編碼(Hard-Coding)的字符串、數字、日期…… 所有能寫死的東西都會被人寫死。 這是一個婦孺皆知的反模式,同時也是最廣泛使用的反模式。 硬編碼中最為典型的大概是 平臺相關代碼(Platform-Related), 這是指特定的機器或環境下才可以正常運行的代碼, 可能是只在你的機器上可以運行,也可能是只在 Windows 下可以運行。
例如在 npm script 中寫死腳本路徑 /Users/harttle/bin/fis3, 原因可能是安裝一次非常困難,可能是為了避免重復安裝,也可能僅僅是因為這樣好使。 不管怎樣,這會讓所有同事來找你問“為什么我這里會報錯”。 解決辦法就是把它放到依賴管理,如果有特定的版本要求可以使用 package-lock,如果實在搞不定可以視為外部依賴可以放到本地配置文件并從版本控制(比如 Git) 移除。
例如在 cli 工具中寫死特殊文件夾 /tmp, ~/.cache,或者路徑分隔符 // 或 /。 這類字符串一般可以通過 Node.js 內置模塊(或其他運行時 API)來得到, 比如使用 os.homedir, os.tmpdir, path.sep 等。
重復代碼
重復代碼(Duplication)在業務代碼中尤為常見,初衷幾乎都是維護業務的穩定性。 舉個例子:在頁面 A 中需要一個漂亮的搜索框,而頁面 B 中恰好有一個。 這時程序員小哥面臨一個艱難的選擇(如果直接拷貝還會有些許感到不安的話):
把 B 拷貝一份,改成 A 想要的樣子。 把 B 中的搜索框重構到 C,B 和 A 引用這份代碼。由于時間緊迫希望早點下班,或者由于改壞 B 需要承擔責任 (PM:讓你做 A 為啥 B 壞了?回答這個問題比較復雜,這里先跳過), 經過一番思考后決定采取方案 2。
至此整個故事進行地很自然也很順利,這大概就是重復代碼被廣泛使用的原因。 這個故事中有幾點需要質疑:
B 這么容易被改壞,說明 B 的作者 并未考慮復用。這時不應復用 B 的代碼,除非決定接手維護它。 B 改壞的責任不止程序員小哥:B 的作者是否有 編寫測試,測試人員是否 回歸測試 B 頁面? 時間緊迫不必然導致反模式的出現,不可作為說服自己的原因。短期方案也存在優雅實現。解決辦法就是:抽取 B 的代碼重新開發形成搜索框組件 C,在 A 頁面使用它。 同時提供給日后的小伙伴使用,包括敦促 B 的作者也遷移到 C 統一維護。
假 AMD
模塊化本意是指把軟件的各功能分離到獨立的模塊中,每個模塊包含完整的一個細分功能。 在 JavaScript 中則是特指把腳本切分為獨立上下文的,可復用的代碼單元。
新聞熱點
疑難解答
圖片精選