重構 (Refactoring) 學習心得筆記 — 壞味道 (Bad Smell / Code Smell)

何謂壞味道 (Bad Smell / Code Smell)

  • 難以理解
  • 難以修改
  • 難以擴張

如何判斷程式中有壞味道?

重複了

太長了

名不符其實

公開太多了

不太像是物件導向

壞味道與重構

  • 搜尋與確認程式碼中的壞味道
  • 搜尋重構目錄,找出此壞味道應透過何種重構方法解決
  • 根據重構方式進行程式碼之修改

有哪些壞味道?

Bloaters (肥哥的味道)

  • 指的是函式中有太多行程式碼,通常超過10行就會讓人開始想問說這個Method或Function在做什麼
  • 老是用 Primitives (int, String, etc.) 而不使用小的Class來處理一些簡單的事
  • 用太多常數(Constant),像是用USER_ADMIN_ROLE = 1來表示管理者權限
  • 在資料陣列中以字串常數做為屬性名稱,喜歡用String來表示任何東西
  • 方法的參數超過三個或四個,越來越長,越長就越難讀
  • 通常是慢慢加上去的,想多傳入一個參數就直接加在後面
  • 常常一起出現的資訊,這個問題常常是Long Parameter ListPrimitive Obsession發生的原因
  • 一個Long Parameter + Primitive Obsession 的範例: String printAddress( String country, String state, String city, String address1, String address2, String zipCode) {…} (什麼都String就是怎樣)
  • 像地址本身就可以用一個class Address來取代變成只傳入Address就好: String printAddress(Address address) {…}

Object-Orientation Abusers (物件導向濫用者的味道)

  • 用了太多層或太複雜的Switch或If-else statements讓整個程式流程很混亂
  • 通常可以利用OOP的多型的特性解決
  • 只有在某些特定情況才需要用到的暫時性Field,其他情況不需要,讓人困惑
  • 濫用繼承,子類別只用到了父類的某些方法或欄位,不需要用的到就像是被拒絕的遺產
  • 例如Bird類別有Fly這個方法,有一個子類別是駝鳥但不會Fly,跟不需要這個方法
  • 多個methods存在於不同的classes但做一樣的事

Change Preventers (改不動的味道)

  • 當你只改了類別的一個東西,你發現你還需要改同類別的其他方法,舉例來說,當你新增了一個新的product type,你必需再去改其他的方法像是finding, displaying及ordering product,這並不是你這個change的重點
  • 做一個小修改需後,還需要再對其他不同的類別做額外的小修改
  • 當你加了一個subclass到某個類別,你同時必需加另一個類似的subclass到另一個類別下

Couplers (緊密耦合的味道)

  • 一個類別用了其他的類別方法勝過使用自己的,有點像是迷戀了別的類別的Feature
  • 一個類別用了太多其他類別的細節,例如直接使用別的類別的public fields
  • 一個方法串太多層去拿到結果,像是: $a->b()->c()->d()
  • 一個類別只做了一件事:就是去叫另一個類別做事,那要他幹嘛?

Dispensables (多餘的味道)

  • Comment 通常都會說謊XD
  • 不該有沒用的Comment,程式最好是不需要註解就能理解
  • 同樣的程式出現在不同的地方
  • Class做的事太少,根本不需要它的存在
  • 一些變數、參數、方法、類別已經沒有人在使用的
  • 現階段根本用不到的程式,只是幻想以後會用到
  • YAGNI: Your ain’t gonna need it

Other Smells (其他壞味道)

  • 不久或遲早,一些老舊的 libraries 會無法滿求需求,必需要換掉或升級

心得

參考資料

--

--

我是Oscar (卡哥),前Yahoo Lead Engineer、Mensa會員,超過十年的工作經驗,服務過Yahoo關鍵字廣告業務部門、電子商務及搜尋部門,喜歡彈吉他玩音樂,也喜歡投資美股、虛擬貨幣,樂於與人分享交流!

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
卡哥

卡哥

我是Oscar (卡哥),前Yahoo Lead Engineer、Mensa會員,超過十年的工作經驗,服務過Yahoo關鍵字廣告業務部門、電子商務及搜尋部門,喜歡彈吉他玩音樂,也喜歡投資美股、虛擬貨幣,樂於與人分享交流!