C# 重构某些遗留代码时出现问题
所以我试图重构这个有很多不同职责的类。上面所示的方法似乎是一个开始精简此类的好地方,因此我考虑将其放在一个特定于IO的类中(并在需要时方便地允许模拟) 问题是,我们的系统有一个错误记录机制,它的工作原理与编译器的类似(它会报告错误,但一切都应该继续工作。当您尝试编译程序时,它不会在第一次遇到错误时停止编译过程) 我想让我的IO类不知道这个错误报告的事情,所以我的想法是从IO方法抛出异常,然后让C# 重构某些遗留代码时出现问题,c#,java,oop,refactoring,C#,Java,Oop,Refactoring,所以我试图重构这个有很多不同职责的类。上面所示的方法似乎是一个开始精简此类的好地方,因此我考虑将其放在一个特定于IO的类中(并在需要时方便地允许模拟) 问题是,我们的系统有一个错误记录机制,它的工作原理与编译器的类似(它会报告错误,但一切都应该继续工作。当您尝试编译程序时,它不会在第一次遇到错误时停止编译过程) 我想让我的IO类不知道这个错误报告的事情,所以我的想法是从IO方法抛出异常,然后让m()捕获它并执行其余的错误处理。问题是IOException和SecurityException都不会
m()
捕获它并执行其余的错误处理。问题是IOException
和SecurityException
都不会告诉我文件的名称
我知道我可以创建我自己的异常,但是如果我开始为这么简单的事情创建我自己的异常,我还必须为我的其余代码创建数百个异常
我希望重构尽可能简单
您将如何处理重构?显然,要做的第一件事是设计和实现允许非致命错误记录的错误处理 我建议创建一个包含所遇到错误列表的类(就像编译器一样)。当I/O遇到问题时,它将传递给错误类,该类将其弹出到错误列表中,并返回以进行进一步处理 这样,您就不必从在任何给定点抛出错误中进行恢复——每个可以生成错误的地方都负责处理错误,或者将错误提交给错误记录器,以便以后存储和处理
有了这个错误记录器,重构应该是轻而易举的事 显然,要做的第一件事是设计和实现允许非致命错误日志记录的错误处理 我建议创建一个包含所遇到错误列表的类(就像编译器一样)。当I/O遇到问题时,它将传递给错误类,该类将其弹出到错误列表中,并返回以进行进一步处理 这样,您就不必从在任何给定点抛出错误中进行恢复——每个可以生成错误的地方都负责处理错误,或者将错误提交给错误记录器,以便以后存储和处理
有了这个错误记录器,重构应该是轻而易举的事 我将检查以下几点
- 单一责任
- 不要从方法返回null;返回空对象/集合
- 保持方法简单和小
- 方法签名中传递的参数不要超过2-3个
- 仅向调用方抛出异常;如果对它有意义的话。 否则,只能在这里处理
重构不起作用;这并不意味着只从较大的方法中创建较小的方法,我们需要检查这些东西。还有更多取决于我们的设计结构。我将检查以下几点
- 单一责任
- 不要从方法返回null;返回空对象/集合
- 保持方法简单和小
- 方法签名中传递的参数不要超过2-3个
- 仅向调用方抛出异常;如果对它有意义的话。 否则,只能在这里处理
重构不起作用;这并不意味着只从较大的方法中创建较小的方法,我们需要检查这些东西。还有更多取决于我们的设计结构。Legacy Java?我觉得自己老了。遗留Java?我觉得自己老了。我读了你的答案,我想知道-为什么你建议返回object而不是null?虽然我理解你关于空对象的观点,但在编译器设计中,这确实是一件有用的事情,因为你总是处理哈希表中的数据,如果没有指针,则返回null。因为返回null会增加调用方法代码检查null指针的负担。主要是关于集合。我读了你的答案,我想知道-为什么你建议返回object而不是null?虽然我理解你关于空对象的观点,但在编译器设计中,这确实是一件有用的事情,因为你总是在处理哈希表中的数据,如果没有指针,则返回null。因为返回null会增加调用方法代码检查null指针的负担。主要是收藏。
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);
}
}
}
}
}