高度重複的代碼通常是一件壞事,並且有一些設計模式可以幫助最大限度地減少這種情況。但是,由於語言本身的限制,有時它是不可避免的。從java.util.Arrays
採取下面的例子:在Java中管理高度重複的代碼和文檔
/**
* Assigns the specified long value to each element of the specified
* range of the specified array of longs. The range to be filled
* extends from index <tt>fromIndex</tt>, inclusive, to index
* <tt>toIndex</tt>, exclusive. (If <tt>fromIndex==toIndex</tt>, the
* range to be filled is empty.)
*
* @param a the array to be filled
* @param fromIndex the index of the first element (inclusive) to be
* filled with the specified value
* @param toIndex the index of the last element (exclusive) to be
* filled with the specified value
* @param val the value to be stored in all elements of the array
* @throws IllegalArgumentException if <tt>fromIndex > toIndex</tt>
* @throws ArrayIndexOutOfBoundsException if <tt>fromIndex < 0</tt> or
* <tt>toIndex > a.length</tt>
*/
public static void fill(long[] a, int fromIndex, int toIndex, long val) {
rangeCheck(a.length, fromIndex, toIndex);
for (int i=fromIndex; i<toIndex; i++)
a[i] = val;
}
上面代碼段出現在源代碼的8倍,對每個根的在文檔/方法簽名非常小的變化,但完全相同的方法體,一個陣列類型int[]
,short[]
, char[]
,byte[]
, boolean[]
,double[]
,float[]
和Object[]
。
我相信,除非有人反思(這本身就是一個完全不同的主題),這種重複是不可避免的。我知道作爲一個實用程序類,這種高度重複的Java代碼非常不典型,但即使採用最佳做法,重複也會發生!重構不總是可行的,因爲它不總是可能的(明顯的情況是當重複在文檔中時)。
顯然維護這個源代碼是一場噩夢。文檔中的輕微錯字或執行過程中的小錯誤會增加很多次,但重複次數很多。其實,最好的例子發生在涉及這個確切類:
bug是一個令人驚訝的微妙的,在什麼許多人認爲只是一個簡單而直接的算法發生。
// int mid =(low + high)/2; // the bug
int mid = (low + high) >>> 1; // the fix
上面一行出現11次在源代碼中!
所以我的問題是:
- 如何這些類型的重複Java代碼/文件在實踐中如何處理?他們如何開發,維護和測試?
- 您是否以「原創」開始,儘可能成熟,然後根據需要複製粘貼,並希望您沒有犯錯?
- 如果您確實在原始文件中犯了錯誤,那麼您只需在任何地方修復它,除非您願意刪除副本並重復整個複製過程?
- 並且您也將相同的過程應用於測試代碼?
- Java會受益於某種有限用途的源代碼預處理這種事情嗎?
- 也許Sun有自己的預處理器來幫助編寫,維護,記錄和測試這類重複的庫代碼?
註釋請求另一個例子,所以我把這個來自谷歌類別:com.google.common.base.Predicates線276-310(AndPredicate
)與線312-346(OrPredicate
)。
源這兩個類是相同的,除了:
AndPredicate
VSOrPredicate
(每個出現在其類5次)"And("
VSOr("
(在各自的toString()
方法)#and
VS#or
(在@see
Javadoc註釋)true
VSfalse
(在apply
;!
可以在hashCode()
&=
VS|=
在hashCode()
聽起來好像你特別擔心由於處理原始數組的代碼而導致的重複。就個人而言,我只是通過使用泛型集合和自動裝箱來避免這種重複(並鼓勵其他人做同樣的事情),避免數組和基元,除非絕對必要。你有沒有這種重複的例子,*不涉及原始數組? – 2010-02-25 20:08:38
爲好的帖子+1和http://netlib.bell-labs.com/cm/cs/pearls/ – stacker 2010-02-25 20:15:28
由於提供完整的重載,重複性僅僅是一個例子。我在非重載和非原始數組處理場景中也看到了這種重複。 – polygenelubricants 2010-02-25 21:54:08