所以我试图重构这个具有许多不同职责的SomeClass
。上面显示的方法似乎是开始修剪此类的好地方,因此我考虑将其放入 IO 特定类中(并在需要时轻松允许模拟)。
class SomeClass{
...
public void m() {
...
emptyDirectory(something);
...
}
private void emptyDirectory(File dir) {
File[] dirContent = dir.listFiles();
if (dirContent != null)
for (File f : dirContent) {
if (f.isDirectory())
emptyDirectory(f);
try {
if (!f.delete()) {
IOError problem = new IOError(symbolTable.getRefinement().getFileName(),
f.toString(), f.isDirectory());
problemManager.add(problem);
}
} catch (SecurityException e) {
IOError problem = new IOError(symbolTable.getRefinement().getFileName(),
f.toString(), f.isDirectory());
problemManager.add(problem);
}
}
}
}
}
问题是我们的系统有一个错误记录机制,它的工作方式就像编译器的一样(它会报告错误,但一切都应该继续工作。当你尝试编译一个程序时,它不会停止编译过程第一次遇到错误时)。
我想让我的 IO 类不知道这个错误报告的事情,所以我的想法是从 IO 方法抛出异常,然后让 m()
捕获它并执行其余的操作错误处理。问题是 IOException
和 SecurityException
都不会告诉我文件的名称是什么。
我知道我可以创建自己的异常,但是如果我开始为如此简单的事情创建自己的异常,我还必须为其余代码创建数百个异常!
我希望重构尽可能简单。
你会如何处理重构?
最佳答案
显然要做的第一件事是设计和实现允许非 fatal error 日志记录的错误处理。
我建议创建一个包含遇到的错误列表的类(就像编译器一样)。当 I/O 遇到问题时,它会传递到错误类,该类将其弹出到错误列表中并返回以进行进一步处理。
通过这种方式,您将无法从在任何给定点抛出错误中恢复 - 每个可能生成错误的位置都负责处理它或将其交给错误记录器以便稍后存储和处理。
有了这个错误记录器,您的重构应该变得轻而易举。
关于c# - 重构一些遗留代码时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6838930/