2010-07-05 30 views
2

我們有一個遺留系統,由A,B和C類組成.A非常可怕。 B和C也是! (這是公司內部公認的,我們正試圖在未來重新考慮它們)。對傳統代碼添加更改

更可怕的是A和B擴展了C,他們真的不應該,因爲它們不是真正的同樣的事情。一位開發者(稱他爲X)承認他這樣做是爲了讓A和B可以使用C的一些方法!

現在客戶想要更新遺留系統和變化要求我加入到A和B相同的變化有什麼我能做的就是添加更改爲C,那麼A和B可以看到它。但是如果我這樣做,我將會像X一樣做同樣的事情。

我心目中什麼是寫另一個類d,所以A和B可以有自己的d,並得到了改變。你怎麼看?

提前致謝!

莎拉

回答

4

有道理。 Josh Bloch還建議在有效的Java中使用合成而不是繼承。當你在檢查它時,檢查你是否不能移動其他共享例程。許多小步驟覆蓋了很大的距離。

+1

如果你以前可以添加一些單元測試,它會更好,爲了更有信心在你的重構... – 2010-07-05 16:25:22

1

很難給出一個明確的答案這樣一個籠統的問題。

將普通(無狀態)方法轉換爲幫助類的想法是一個很好的方法。同樣,將一個類的調用委託給另一個類調用可以通過來減少已經膨脹的類的大小。

然而,這是很難說的輔助類或委派是否是在這種特殊情況下的最佳解決方案。例如,如果現有類中的方法緊密耦合,則可能很難將它們分爲不同的類。

也許最好的解決方案是提出重構現有的類並擺脫不合適的(如你所報告的)基類。

+0

是的,我想要做的是 - 提出重構。然而事實是,我們必須首先推出這些變化...... :( – sarahTheButterFly 2010-07-05 08:06:41

+0

@sarahTheButterFly請小心這種態度:確保您所做的每一項更改都會使代碼比開始之前更乾淨。不要在代碼更清潔之前先發布代碼它不一定是一塵不染,只是簡單一點而已,請記住下面的話:「如果你發現自己在一個洞裏,首先要做的就是停止挖掘。」 – 2010-07-05 23:25:38

+0

@Peter是的,我理解你的意思,我完全同意但是我不是決策者,我希望我是這樣的!我在開始之前試着讓代碼清理乾淨,這就是爲什麼我在這裏問這個問題的原因: – sarahTheButterFly 2010-07-05 23:58:22

0

薩拉,

這是很難不知道A,B之間的確切關係給予具體建議,並C.我要去承擔,如果他們需要確切的B必須以某種方式相似同樣的變化。因此,假設A和B與C類似,但與C不同,您可能需要執行以下操作:

  1. 創建一個A類和B類擴展的父類D。此父級包含A和B共享的功能(您計劃進行更改)。
  2. 要麼創建包含功能A,B,和C共享和具有C和d獨立的類具有它的一個實例或創建另一個父類,E,對於C和d包含函數A,B和C有共同之處。

同樣,如果我的假設是錯誤我的建議可能是無效的。你能否給我們提供A,B和C如何相關的更好的想法?

+0

謝謝Jake回覆是的,我認爲A和B可能有一個父類D,但是這兩個類都需要重新考慮並分解成許多小類,我希望能夠清楚地概述A,B, C就像一個nd他們是如何相關的,但我不能,因爲他們太麻煩和複雜。我們正在考慮重寫它們,但我確實記得Joel關於Netscape故事的文章......我認爲這篇文章應該被關閉,這樣我就不會混淆更多的人。 – sarahTheButterFly 2010-07-05 23:23:27

+0

不是問題,莎拉。我想我們都和你現在所處的位置處於類似的位置。你只需要對你提供的東西做出適當的迴應,並希望在這個過程中使系統更好一些。 – 2010-07-06 13:20:29