我正在为我们的一些框架类做一些重构(+添加新功能)。情况是我们有一个(类似神)的类,它做了一堆我们想分开的逻辑。该类表示类似于财务代码的验证规则。所以它确认了人名,生日等。
我要做的是将其分解为单一规则,基本上是一个规则,用于验证人员对财务代码的名字,另一个用于生日,等等。对于程序员来说,它看起来几乎一样。他没有调用FiscalCode规则的巨大构造函数,而是执行FiscalCode.GetRules(...)
之类的操作并在此处传递参数。然后GetRules(...)
将在内部构造单个规则并将它们作为数组传回。这对我们来说完全正确和正确。
非常适合你的背景。现在我的问题如下。 FiscalCode类(我们当前强大的神级)有许多实用方法,我将要创建的更多单个“规则类”将需要它们。我所知道的是,我会以某种方式仍然需要FiscalCode类来执行GetRules(...)
事情(这是为程序员保持不变,而不是他们必须做一个全新的事情)。
我有两种选择:
我已经很喜欢了,但我想首先听听你们中的一些人的意见。
THX
答案 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的实用程序方法。