这是非常基本的东西,但在这里。我发现我无法同意我自己是否我的方式拆分成较小的类使事情更容易维护或更少维护。我熟悉设计模式,虽然没有详细说明,并且还有面向对象设计的概念。抛开所有奇特的规则和准则,我期待着通过一个非常简单的示例场景来思考我缺少的东西。基本上是这样的:“......这样的设计会让它变得更加困难”等等......所有我不期望的事情,因为本质上缺乏经验。如何将代码拆分为组件......大类?小班?
假设您需要编写一个基本的“文件读取器/文件写入器”风格类来处理某种类型的文件。我们称之为文件YadaKungFoo文件。 YadaKungFoo文件的内容与INI文件基本相似,但有细微差别。
有部分和值:
[Sections]
Kung,Foo
Panda, Kongo
[AnotherSection]
Yada,Yada,Yada
Subtle,Difference,Here,Yes
[Dependencies]
PreProcess,SomeStuffToPreDo
PreProcess,MoreStuff
PostProcess,AfterEight
PostProcess,TheEndIsNear
PostProcess,TheEnd
行,所以这可以产生3基本类:
public class YadaKungFooFile
public class YadaKungFooFileSection
public class YadaKungFooFileSectionValue
后两种类实质上唯一的数据结构与一个ToString()重写到吐出使用几个通用列表存储的值的字符串列表。这足以实现YadaKungFooFile保存功能。
随着时间的推移,YadaYadaFile开始增长。一些重载保存为不同的格式,包括XML等,文件开始推向800线左右。 现在真正的问题:我们想添加一个功能来验证YadaKungFoo文件的内容。首先想到的是显然要补充的:
var yada = new YadaKungFooFile("C:\Path");
var res = yada .Validate()
我们完成了(我们甚至可以从构造函数中调用该方法)。麻烦的是验证是相当复杂的,并使得类非常大,所以我们决定创建一个新的类是这样的:
var yada = new YadaKungFooFile("C:\Path");
var validator = new YadaKungFooFileValidator(yada);
var result = validator.Validate();
现在这个样本显然是非常简单,琐碎和微不足道。不管是哪一种可能是两个方面不会做出太大的差别,但我不喜欢的是:
- 的YadaKungFooFileValidator类和YadaKungFooFile类似乎非常强烈地受到这种设计加上。看起来一个班的变化,可能会引发另一班的变化。
- 我知道诸如“验证器”,“控制器”,“经理”等词组表示与其他对象的状态相关的类别而不是其“自己的业务”,因此违反了分离关注原则和消息发送。
总而言之,我想我觉得我没有经验去了解设计糟糕的原因,在什么情况下它并不重要,什么样的担忧会带来更多的重量:更小的班级或更有凝聚力的班级。他们似乎是矛盾的要求,但也许我错了。也许验证器类应该是一个复合对象?
本质上,我要求对上述设计可能带来的好处/问题提出意见。什么可以做不同? (基本的FileValidator类,FileValidator接口,等等。你把它命名)。想象随着时间的推移,YadaKungFooFile功能会不断增长。
“我不认为一个班级的大小是一个问题。”理论上我很想同意。在实践中,我从来没有见过我喜欢的超过2000行的课程。 – PeterAllenWebb 2009-06-25 21:43:21