打破一个庞大的,有凝聚力的课程

时间:2011-02-28 14:28:25

标签: oop design-patterns

我认为课程太长了。我真的不知道什么是太久意味着它只有2500行代码。但是,所有方法都使用至少一个或多个变量,因此我认为它非常有凝聚力。我想仍然把这个类分成几个较小的类,它们会使用三个相同的变量。这是一个糟糕的设计,还是代表一种模式?

class MyClass
{
    ...
    MyVar1 myVar1;
    MyVar2 myVar2;

    public void DoStuff()
    {
         ...
         MyPart1 myPart1 = new MyPart1(this,myVar1,myVar2);
         myPart1.DoStuff();

         MyPart2 myPart2 = new MyPart2(this,myVar1,myVar2);
         myPart2.DoStuff();
    }
}

3 个答案:

答案 0 :(得分:7)

你通常不会说2500行代码对于一个类来说太多了。

然而,你可以说一个用于10种不同动作的类是非常单一的。这里的一些人说每个类应该只有一个功能。这些人会阅读" 10"作为二元...

现在,如果你没有机会将你的班级分成两半,可能首先要拆掉小功能部件。通过这种方式,您可以更好地了解对您的课程至关重要的内容。功能。

从查看方法开始:如果您的类有多个基本属于同一范围的方法(例如XML-I / O或类似播放/暂停/停止/重置功能集),您可以创建一个子类这些。
如果你的所有方法都相同(即与上述方法相反),我说你的课程不是太大。

最重要的是,您不会在代码中失去方向。尝试构建您的课程并按照最合适的方式订购您的方法。并且不要忘记评论这个订单,这样你就可以轻松地进入它......

答案 1 :(得分:4)

思考“单一责任”(SR)。我敢打赌,一个拥有2500行代码的类至少可以完成20种不同的东西,可以很容易地分开。

首先,所有私有方法通常都是等待爆发的新SR类。 第二,变量被用在很多地方,并不意味着,其他人(另一个类)无法持有并处理它。 第三,像这样的大班必须几乎无法测试。 SR类通常很容易。

所以我唯一可以推荐它开始蚕食你的怪物类,让几十个相当小的一击奇迹看到白昼:-)

此致 的Morten

答案 2 :(得分:3)

除非你分开的部分有一个容易定义的,明智的单一责任,否则我不会那样分开。如果您只能在一行中描述细分类,并且该行不是“用于管理var1和var2”,那么您可能会遇到一些问题。

2500行并不是那么大 - 有时它只需要那么清晰和有凝聚力的代码来完成某些事情。

编辑:有些方法可以让你发现课堂上有些东西可疑。

  • 如果您在课堂体内多次重复相同或非常相似的代码,您可以将重复部分分解出来,使课程更短(可能更具自我描述性)
  • 如果有明确的成员函数集使用变量的特定子集,并且这些成员函数不重叠(即成员函数1-10使用var1,成员函数2-20使用var2和var3),则可能有隐含双重责任。找到它究竟是什么并把它分开可能并不容易,但至少你可以弄清楚要看什么。
  • 如果其他几个函数是其他函数的微小变化,那么该类的接口可能过于宽泛。你可以通过调用其他两个成员函数来做与成员函数相同的事情吗?如果是这样,请考虑删除冗余成员函数,可能只记录如何使用其他更基本的成员函数。