重构:嵌套类还是单独的类?

时间:2009-08-11 08:05:22

标签: c# refactoring nested-class

我正在为我们的一些框架类做一些重构(+添加新功能)。情况是我们有一个(类似神)的类,它做了一堆我们想分开的逻辑。该类表示类似于财务代码的验证规则。所以它确认了人名,生日等。

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

非常适合你的背景。现在我的问题如下。 FiscalCode类(我们当前强大的神级)有许多实用方法,我将要创建的更多单个“规则类”将需要它们。我所知道的是,我会以某种方式仍然需要FiscalCode类来执行GetRules(...)事情(这是为程序员保持不变,而不是他们必须做一个全新的事情)。

我有两种选择:

  1. 创建我的新规则类并访问FiscalCode类的公共静态实用程序方法
  2. 将我的新规则类创建为FiscalCode类s.t的内部嵌套类。我已经访问了实用程序方法(因此不需要公开我的实用程序方法)
  3. 我已经很喜欢了,但我想首先听听你们中的一些人的意见。

    THX

6 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我还建议对Specification Pattern进行审核,这会就如何解决这类问题提供一些指导。 This post还在C#中提供了一些示例。

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

答案 2 :(得分:0)

这些实用程序方法对FiscalCode类或规则类有哪些依赖关系?他们是否保留了国家?

如果没有依赖关系,我建议将这些实用程序方法移到单独的类中,并让FiscalCode类或规则类适当地调用这些方法。

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

答案 3 :(得分:0)

IMO你应该选择第一个选项,因为这样,你可以将新创建​​的类暴露给外界,并且可以编写可在其他地方重用的代码。如果你选择第二个选项,那么你将创建非常专业的类。您的外部代码可能甚至不知道它的存在,但这可能有利于包围。但是,在某些时候,您可能决定使用较大类范围之外的专用规则,对于该方案,您可以更好地使用第一个选项。你选择了什么?

答案 4 :(得分:0)

如果该类不在FiscalCode类之外使用,则将其嵌套。重要的是将这个新课程的责任从FiscalCode中拉出来;它所在的地方只是一个选择问题。当新类获得更多依赖项时,您可以将其作为外部类。

答案 5 :(得分:0)

我会像这样(我不是那么擅长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的实用程序方法。