【问题标题】:Refactoring: Nested class or separate classes?重构:嵌套类还是单独的类?
【发布时间】:2009-08-11 08:05:21
【问题描述】:

我目前正在对我们的一些框架类进行一些重构(+ 添加新功能)。情况是我们有一个(类似上帝的)类,它执行我们想要拆分的一堆逻辑。该类表示类似财务代码的验证规则。所以它会验证人名、生日等。

我要做的是将其拆分为单个规则,基本上是一个规则,它根据财政代码验证人的名字,另一个验证生日等等。对于最后的程序员来说,它看起来几乎相同。他不会调用 FiscalCode 规则的巨大构造函数,而是执行FiscalCode.GetRules(...) 之类的操作并在此处传递参数。然后GetRules(...) 将在内部构造单个规则并将它们作为数组传回。这对我们来说完全正确。

你的背景就这么多。现在我的问题如下。 FiscalCode 类(这是我们当前强大的神级)有很多实用方法,我将要创建的更多单一“规则类”将需要这些方法。我所知道的是,我仍然需要 FiscalCode 类来做 GetRules(...) 的事情(这是为了程序员保持不变,而不是他们必须做一个全新的事情)。

我想到了两个选择:

  1. 创建我的新规则类并访问 FiscalCode 类的公共静态实用程序方法
  2. 将我的新规则类创建为 FiscalCode 类 s.t. 的内部嵌套类。我已经访问了实用方法(因此无需公开我的实用方法)

我已经有一个最喜欢的了,但我想先听听你们中的一些人的意见。

谢谢

【问题讨论】:

    标签: c# refactoring nested-class


    【解决方案1】:

    随着您的方法变成“实用方法”,您需要将它们设为静态和公开,但您可能需要将 FiscalCode 重命名为 FiscalCodeUtil。所以很明显它包含了什么样的方法。

    【讨论】:

    • 好吧,问题是这些是实用方法,但它们只会在 FiscalCode 规则组中使用。因此,公开暴露它们并不是真正正确的,尽管它不会是一个问题。使用嵌套类,我可以直接访问 FiscalCode 规则的私有静态方法。
    【解决方案2】:

    我还建议查看Specification Pattern,它为如何解决此类问题提供了一些指导。 This post 也给出了一些 C# 的例子。

    建议的Specification Pattern 将引导您选择选项#1。

    【讨论】:

    • 感谢您对模式的建议。我还不知道那个模式。我去看看。
    • 如果您有机会尝试,请告诉我们进展如何。祝你好运!
    【解决方案3】:

    这些实用程序方法对 FiscalCode 类或规则类有什么依赖关系?他们有没有保存状态?

    如果没有任何依赖项,我建议将这些实用程序方法移至单独的类,并让 FiscalCode 类或规则类酌情调用这些方法。

    对于您提供的选项,1) 和 2) 之间的唯一区别是规则类是否对不使用它们的类可见。我不认为这真的是一个重要的目标。以前做c++的时候一直担心这个……太浪费时间了。

    【讨论】:

      【解决方案4】:

      IMO 您应该选择第一个选项,因为这样,您可以将新创建​​的类公开给外部世界,并且可以编写可在其他地方重用的代码。如果您选择第二个选项,您将创建非常专业的类。您的外部代码甚至可能不知道它的存在,但这可能有利于封装。尽管如此,在某些时候,您可能会决定在您的大班范围之外使用专门的规则,对于这种情况,您最好使用第一个选项。不过你的选择是什么?

      【讨论】:

        【解决方案5】:

        如果该类不会在FiscalCode 类之外使用,则使其嵌套。重要的是把这个新类的职责从FiscalCode中拉出来;那么它在哪里就变成了一个单纯的选择问题。当新类获得更多依赖时,您可以将其设为外部类。

        【讨论】:

          【解决方案6】:

          我会这样处理(我不擅长 OOP,所以持保留态度):

          规则类(嵌套在 FiscalCode 中)实现了一个 IRule 接口,公开了规则方法(如 Validate(),无论返回类型如何,您的船都可以浮动)。税控码 有一个 AddRule() 方法,该方法管理内部规则集合并返回对 self 的引用以允许方法链接:

          FiscalCode fc = new FiscalCode();
          fc.AddRule(new RuleClass1(<params specific to RuleClass1>)
            .AddRule(new RuleClass2(<params specific to RuleClass2>)
            ...
          

          此外,FiscalCode 有一个 Validate() 方法,该方法遍历每个规则的 Validate() 并管理错误。

          IMO 这使用起来非常方便,并且仍然允许嵌套规则类访问 FiscalCode 的实用程序方法。

          【讨论】:

          • :) 已经实现。我们已经有了一个带有规则等的功能齐全的层次结构。我在这里的目的只是关于如何将 FiscalCode 规则与专门的更细粒度的规则联系起来。无论如何谢谢。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-07
          • 2016-08-23
          • 1970-01-01
          相关资源
          最近更新 更多