指導原則: 防止在代碼中出現重復. 為了達到這個目標, 需要做到如下幾個方面:
- 寫可重用代碼
- 寫泛型代碼
- 重用現存的方法或函數
因為拷貝代碼, 可能導致 bug 修復時需要多處修改. 并且要經常問自己, 這個東西已經是存在的了, 為什么還要去重復寫?
必須意識到, 重復本身就是一個問題. 但是說了這么多, 到底什么才是重復呢, 下面就來看看.
1 重復的種類
實際就是兩種重復: 模式上的重復, 邏輯上的重復.
模式上的重復(type1)包括完全相同的代碼, 和在結構上完全相同的代碼.
而邏輯上的重復(type2)更難判斷.
Type1 型重復代碼定義為: 在兩段代碼中至少 6 行是一模一樣的, 一模一樣的意思是一個模式的. 當然這樣的重復是去掉了空行以及注釋之后來看的.
這種重復有一個子類型是 復制-粘貼 型的重復. 但不一定 type1 型的重復都是復制粘貼的. 因為?有時只是標識符發生了變化, 但代碼功能完全一樣, 卻在?不同地方都寫著, 這時也可以判斷為 type1 型重復, 但這時就沒辦法通過工具來檢測了.(復制粘貼的可以通過工具來檢測.)
另外還有 type2 型重復, 即在意義上是相同的, 這個就更難判斷了...
重復有時很難進行檢測和判斷, 這才是最難的地方.
本次所要講的是如何從代碼中移除 type1 型重復, 因為:
可維護性的提升, 絕大多數時候都是靠移除 type1 型重復來達到的.
type1 型重復更加容易檢測和識別.(無論計算機還是人, 要判斷 type2 型重復都需要完全地進行句法分析)
另外對于 type1 型的 6 行限值是平衡的結果.
2 移除重復代碼的好處
下面來看減少代碼中重復的數量為什么會提升系統可維護性.
- 重復的代碼更難分析, 特別是在修復 bug 的時候.
- 重復的代碼更加難修改, 因為許多時候都要多處去改.
3 如何在實際工作中減少代碼中的重復
首先, 要堅決杜絕在代碼中直接復制粘貼代碼! 要重用代碼的時候就把代碼放到一個方法中, 然后在多個地方調用.
需要多用 將功能分解到方法中 這種重構手段.
另外還有一種重構方法是: 將重復的功能移動到父類或接口默認實現中.
這種方法的主要思路就是?將重復功能進行抽象, 移動到同一棵樹的上層或是橫向抽象的上層(接口)中.