我有這種情況。我開始使用「處理」文檔的系統。問題是,它似乎是一個典型的場景,它開始很小,並且越來越大,一次構建一塊,現在需要重構。適當的Java設計模式以避免重複方法
每種文檔類型都有一個標識符(docID),它們都共享相同的底層結果結構。
有一個巨大的主類可以完成所有的工作,但是在這個類裏有幾種方法(每個站點幾乎都有一個方法)和它自己的邏輯。它們都做了幾乎相同的修改(例如,在將字符串設置爲結果結構中的字段或進行一些計算然後在結果結構中設置字段之前格式化字符串)。
例如:
private Result processDocGeneric(Result result){
result.setField1("value1");
result.setField2("value2");
result.setField3("value3");
return result;
}
private Result processDoc1(Result result){
result.setField1("VALUE1");
return result;
}
private Result processDoc2(Result result){
result.setField2("V-A-L-U-E-2");
return result;
}
private void processDocs(){
Result result = new Result();
result = processDocGeneric(result);
if(docID == 1){
result = processDoc1(result);
}
else if(docID == 2){
result = processDoc2(result);
}
...
}
好了,所以我打算重構這個和我正在考慮一些設計模式,我知道,但我不想說我殺蟑螂的感覺與火箭筒。
命令模式可能是我想到的第一個,也是戰略模式。我主要關心的是,我將不得不爲每個具有其自己的processDoc方法實現的文檔類型(目前大約有15個)創建一個類。我的意思是,如果這是要走的路,那就是這樣,但如果有一種我不知道的更簡單的方法,那會更好(因爲改變是在單一方法中)。
我可以做的另一件事是將所有這些方法移動到'方法'類,並且將if-else塊移動到具有docID參數(process(int docID)
的單個方法,然後從主類中調用它。但那只是分裂了這個龐大的階級。這將是「更清潔」,但不是最佳。
什麼是最好的方法來清理和分割這個龐大的類,並使其可擴展(因爲將來會添加新的文檔類型)?
這(寫15班)肯定是要走的路。面向對象意味着每個實體都有自己的類。不要創建[「上帝」類](https://en.wikipedia.org/wiki/God_object)。 – RealSkeptic
我可能想說,因爲您仍然在處理同樣的實例「Result」,所以'Result'的返回是非常不必要的,您確實將其傳遞給方法 – SomeJavaGuy
策略模式應該是這裏的方法IMO。是的,它確實要求您爲每個獨特的實現創建一個類,但同時它以一種方式簡化代碼,只要需要新實現,就不會破壞現有代碼,並且也很容易插入應用。 –