C# 重构某些遗留代码时出现问题

C# 重构某些遗留代码时出现问题,c#,java,oop,refactoring,C#,Java,Oop,Refactoring,所以我试图重构这个有很多不同职责的类。上面所示的方法似乎是一个开始精简此类的好地方,因此我考虑将其放在一个特定于IO的类中(并在需要时方便地允许模拟) 问题是,我们的系统有一个错误记录机制,它的工作原理与编译器的类似(它会报告错误,但一切都应该继续工作。当您尝试编译程序时,它不会在第一次遇到错误时停止编译过程) 我想让我的IO类不知道这个错误报告的事情,所以我的想法是从IO方法抛出异常,然后让m()捕获它并执行其余的错误处理。问题是IOException和SecurityException都不会

所以我试图重构这个有很多不同职责的类。上面所示的方法似乎是一个开始精简此类的好地方,因此我考虑将其放在一个特定于IO的类中(并在需要时方便地允许模拟)

问题是,我们的系统有一个错误记录机制,它的工作原理与编译器的类似(它会报告错误,但一切都应该继续工作。当您尝试编译程序时,它不会在第一次遇到错误时停止编译过程)

我想让我的IO类不知道这个错误报告的事情,所以我的想法是从IO方法抛出异常,然后让
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);
                }
            }
        }
    }
}