2010-03-21 84 views
4

我有一個項目(與圖算法有關)。它是由別人寫的。Java:將外國恐怖代碼轉化爲清潔API的最佳實踐...?

的代碼是可怕的:

  • 公共領域,沒有getter/setter方法
  • 龐大的方法,所有的公共
  • 有的班級有超過20場
  • 一些類有超過5層構造(其也很大)
  • 其中一些構造函數只是留下很多字段null
    (所以我不能讓一些字段最終,因爲,然後每隔構造函數信號錯誤)
  • 方法和類兩個方向

互相依賴我要改寫到一個乾淨的和可以理解的API這一點。

問題是:我自己對此代碼中的任何內容都不瞭解。

請給我提示分析和理解這樣的代碼。

我在想,也許,還有一些執行靜態代碼分析 ,給我打電話的圖表和這樣的事情的工具。

+3

,前後不要忘記單元測試的功能。 – BalusC 2010-03-21 21:16:57

+1

只需添加到BalusC的評論,並從經驗來講,當你「修復」不正確的代碼時,準備「打破」單元測試。當然,是否支持修復或單元測試取決於您的情況。 – 2010-03-21 22:34:33

回答

8

哦親愛的:-)我羨慕你,而不是在同一時間..讓我們一次採取一件事。在你設置一個代碼分析工具之前,你可以自己解決這些問題。這樣,您將獲得更好的理解,並能夠更進一步進行比一個簡單的工具

  • 公共領域,沒有getter/setter方法
    • 讓一切私人。您的規則應該是限制訪問儘可能
  • 龐大的方法,所有的公共
    • 分裂,使私人的地方是有道理這樣做
  • 一些類有超過20個字段
    • ugh ... Effective Java 2nd Ed中的Builder模式是一個優秀的候選人e爲此。
  • 一些類有超過5個構造函數(也是巨大的)
    • 聽起來像伸縮式構造,相同的圖案,上面會幫助
  • 其中的一些施工人員剛剛離開多字段null
    • 是的它是伸縮式構造函數:)
  • 方法和類兩個方向
    • 這互相依賴將是最有趣的。嘗試刪除繼承,除非你完全清楚 ,要求,並通過適用的接口使用組成,而不是

最好的運氣,我們來這裏是爲了幫助

3

那麼,日食中的清理嚮導將會清除一個明顯的污泥百分比。

然後,你可以指向Sonar並修復它抱怨的所有事情,如果你活得夠長。

+0

嗯,嚮導說:「重構不改變任何代碼」;)此嚮導接縫集中在丟失或多餘的東西,不壞建築。 – 2010-03-21 21:04:21

+0

來源/清理確實會更改代碼。例如,它會添加getter和setter。 – bmargulies 2010-03-21 21:22:15

+0

好的,我已經在封裝了字段後運行它) – 2010-03-21 21:30:48

6

哇!

我會建議:編寫單元測試,然後開始通過使他們的私人和「感覺」的編譯器錯誤的度量性重構

* public fields, no getters/setters 

開始。

* huge methods, all public 

瞭解它們的語義,儘量introdue接口

* some classes have over 20 fields 

複雜appilcations很常見,沒什麼worrie

* some classes have over 5 constructors (which are also huge) 

由Builder也隨之取代他們/創建者模式

* some of those constructors just left many fields null 

見上答案

* methods and classes rely on each other in both directions 

決定是否要改寫一切(老實說,我面臨的套管,其中需要只有10%的代碼)

+2

你必須瞭解業務需求,這會給你重構代碼的技能,沒有其他人可以這樣做,對於壞消息抱歉 – stacker 2010-03-21 21:20:08

+0

我絕對同意單元測試是開始的地方。我想看看它是如何運行的,如果它在改變任何事情之前真正運行。在電影「銀翼殺手」中解釋泰瑞爾「我想看到它在一個人身上運作,我希望看到一個消極之前,我會給你一個積極的。」 – Vinny 2010-03-22 18:16:54

2

對於靜態分析和調用圖(沒有圖形,但圖形結構) ,你可以使用Dependency Finder

+0

看起來不錯,我會試試看。但我擔心,只有一點我的問題可以解決。 – 2010-03-21 21:16:10

+0

確實。我不確定你會找到解決所有這些問題的單一工具/方法:-) – 2010-03-22 08:25:53

1

答案可能是:耐心&咖啡。

1

這是我會做的方式:

  1. 開始使用的代碼,例如從main方法中,就好像它被其他類使用 - 相同的參數,相同的調用順序。在調試器中執行此操作,正如您看到此類所做的每個步驟。
  2. 開始爲該功能編寫單元測試。一旦你達到了合理的覆蓋範圍,你會開始注意到這個班可能有太多的責任。

while (responsibilities != 1) {

  1. 提取物,其表示這個類的一個責任的接口。
  2. 使所有呼叫者使用該接口而不是具體的類型;
  3. 將實現提取到一個單獨的類;
  4. 將新類傳遞給使用新接口的所有呼叫者。

}

1

不是說像聲納工具,FindBugs的等等,有些已經mentiones沒有幫助,但目前還沒有魔術。從你理解的事情開始,爲它創建一個單元測試,一旦它開始運行,開始逐個重構。記住隨着時間的推移模擬依賴關係。

2

使用,知道的東西一個IDE關於重構,比如IntelliJ。你不會有移動一個方法和其他五個類的抱怨的情況,因爲IntelliJ足夠聰明,可以進行所有必需的更改。

單元測試是必須的。沒有單元測試的人重構就像一個沒有安全網的高線程執行者。在開始漫長而艱難的攀登之前獲取一個。

0

有時更容易重寫從頭開始。這個'可怕的代碼'是按照預期工作還是充滿了錯誤?它被記錄在案?

在我當前的項目,刪除幾乎全部我predessor的工作,從頭開始重寫它,是最有效的方法。誠然,這是代碼混淆的極端情況,完全缺乏有意義的評論,並且完全無能,所以你的里程可能會有所不同。

0

雖然有些舊代碼可能是幾乎聽不懂的,仍然可以進行重構,並階段性地提高易讀性。你看過Joshua Kerievsky的Refactoring To Patterns書嗎? - 這很好。無論答案如何