【发布时间】:2016-10-25 11:04:54
【问题描述】:
我有这种情况。我开始使用一个“处理”文档的系统。问题是,它似乎是典型的场景,它开始时很小,然后越来越大,一次构建一个块,现在需要重构。
每个文档类型都有一个标识符 (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 个类)肯定是要走的路。面向对象意味着每个实体都有自己的类。不要创建"God" classes。
-
我可能想说
Result的返回是非常不必要的,因为您仍在处理您确实传递给方法的Result的同一实例 -
策略模式应该是这里的方法,IMO。是的,它确实需要您为每个不同的实现创建一个类,但同时它以一种在需要新实现时不会破坏现有代码并且也很容易插入到应用程序。
-
策略模式看起来不错,但确实会增加类数。此外,如果
Result类不能轻松地进行子分类,并且如果此代码已本地化,那么Visitor 模式将是很好的选择。您介意分享调用这些private方法的代码吗?也许是为您提供Resultinstances 的代码。然后我会写一个anwser。 -
你有单元测试吗?
标签: java design-patterns