c# - 需要重构大类的建议

标签 c# refactoring

我们的 C# 应用程序生成各种类型的报告。每种类型的报告都有一个定义可用选项和功能的 xml 架构,因此用户可以创建一个 xml 文档来描述他们想要的报告。有些元素对于多种报告类型是通用的,有些元素之间存在相互依赖性。

我们目前只有一个充满静态方法的类来处理 xml 的解析。它将采用模式验证的文档,并返回一个表示报告类型及其配置选项的对象。该类看起来像这样:

public class ReportFactory
{
    //let's say 4 types of reports
    public static ReportType1 CreateReportType1(XDocument document)
    {
        //logic to create this type of report, calling private methods in this class
    }
    ....

    public static ReportTypeN CreateReportTypeN(XDocument document)
    {
        //logic to create this type of report
    }


    //several dozen private methods, which get called from the public methods or from each other
    private static Feature1 CreateFeature1(XElement element)
    {
        //create some feature of a report 
    }

    private static FeatureN CreateFeatureN(XElement element, FeatureM m)
    {
        //create some feature which relies on another previously built feature
    }

    private static FeatureX CreateFeatureX(ReportType2 report, XElement elementForX, XElement elementRelatedToX)
    {
        //create some feature, which relies on 
        //more than one element and/or a partially built report of a given type
    }

    private static void UpdateFeatureNWithStuffFromFeatureM(FeatureN n, FeatureM m)
    {
        //modify parts of the built report, based on some other parts of the report 
    }
    ...
}

我相信其目的是封装 xml 结构的细节,我想确实如此。它也不会受到重复代码的影响。但它非常大且难以阅读,而且随着我们添加更多功能,情况会变得更糟。它也很难测试,因为它在很大程度上依赖于按正确顺序完成的事情。

我想重构它,但到目前为止我唯一能想到的就是将它拆分成多个类;比如,每个报告类型都有一个类,还有一个用于常见内容的辅助类。但它仍然会很困惑,甚至可能更难阅读。有没有好的方法来组织这样的事情?任何可能有帮助的模式?我研究了很多创建模式,但没有真正找到适合的东西。

更新:抱歉,我没有时间或预算来实际处理这部分重构,但感谢您的建议。我想得越多,就越喜欢(类似)责任链的想法。起点(公共(public)函数)将创建返回对象并填写一些基本内容,然后将对象和 xml 交给下一个部分。每一 block 都会知道对象的哪些部分和它需要的 xml,并且每 block 都可以通过查看对象的更改来独立测试。

最佳答案

我猜想您将需要多种模式和原则来增强您的类(class)。您已经在使用工厂模式。您似乎要描述的问题是处理事件的特定顺序并将您的类分解为更小的 block 。

为了处理事件的排序,看起来你可以 use a chain of responsibility pattern. .

关于解决方案“部分”由于依赖性而导致的可测试性,其中一部分是测试设置(您需要更好的模拟或 stub 来支持方法的事件),也许更好的设计有望从您为测试应用程序所做的努力。

关于c# - 需要重构大类的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5842302/

相关文章:

c# - 用多态替换条件 - 当你的类型改变时如何处理?

java - 如何将Optional.isPresent()+Optional.get()重构为Optional.ifPresent()?

c# - LINQ Join 仅适用于 Orderby

JavaScript forEach 语法和长度

c# - 如何手动设置 MSBuild 标志目标的密码?

c# - 发送什么来调用 $.post.fail()

java - 重构代码以抛出 RuntimeException 而不是返回值

iphone - XCode iPhone 自动属性、合成和 delloc

c# - .NET Core 3 迁移的其他探测路径

c# - 为什么在呈现局部 View 之前不运行 _PageStart.cshtml?