重构一些遗留代码的问题

时间:2011-07-27 02:46:31

标签: c# java oop refactoring

所以我试图重构那个有很多不同职责的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()捕获它并执行其余的错误处理。问题是IOExceptionSecurityException都不会告诉我文件的名称是什么。

我知道我可以创建一个我自己的例外,但是如果我开始为这些简单的事情创建我自己的例外,我也必须为我的其余代码创建数百个例外!

我想让重构尽可能简单。

你将如何处理重构?

2 个答案:

答案 0 :(得分:3)

显然,首先要做的是设计和实现错误处理,以便进行非致命错误记录。

我建议创建一个包含遇到错误列表的类(就像编译器一样)。当I / O遇到问题时,它会传递给错误类,错误类会在错误列表中弹出它并返回进行进一步处理。

通过这种方式,您无法从任何给定点抛出错误中恢复 - 每个可以生成错误的地方都负责处理它或者让错误记录器稍后存储和处理。

有了这个错误记录器,你的重构应该是轻而易举的。

答案 1 :(得分:1)

我会检查以下几点。

  • 单一责任

  • 不要从方法返回null;返回空对象/集合

  • 保持方法简单

  • 不要在方法签名中传递超过2-3个参数

  • 仅向调用者抛出异常;如果它对它有意义。 否则只在此处理。

重构并不意味着只从较大的方法创建较小的方法,我们需要检查这些事情。还有更多依赖于我们的设计结构。