Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 解散一个有凝聚力的大班级_Oop_Design Patterns - Fatal编程技术网

Oop 解散一个有凝聚力的大班级

Oop 解散一个有凝聚力的大班级,oop,design-patterns,Oop,Design Patterns,我有一节课,我觉得太长了。我真的不知道太长意味着什么,但它大约有2500行代码。然而,所有的方法都至少使用一个或多个变量,所以我认为它非常内聚。我还在考虑把这个类分成几个更小的类,使用三个相同的变量。这是糟糕的设计还是代表了一种模式 class MyClass { ... MyVar1 myVar1; MyVar2 myVar2; public void DoStuff() { ... MyPart1 myPart1

我有一节课,我觉得太长了。我真的不知道太长意味着什么,但它大约有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();
    }
}

除非你要分离的部分有一个容易定义的、合理的单一责任,否则我不会那样分割。如果您可以在一行中描述细分的类,并且该行不是“用于管理var1和var2”,那么您可能已经了解了一些内容

2500行代码也不算太大——有时只需要那么多清晰和内聚的代码就可以完成一些事情

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

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

    • 一般来说,2500行代码对于一个类来说是不够的

      但是,您可以说,一个用于10个不同操作的类是非常单一的。这里有人说每个类应该只有一个功能。这些人会把“10”读成二进制

      现在,如果你看不到将你的类一分为二的机会,那么可以先把一些小的功能部分分开。通过这种方式,您可以更好地了解类功能的真正本质

      首先看看你的方法:如果你的类有几个基本上属于同一范围的方法(例如XML-I/O或类似于播放/暂停/停止/重置函数集的东西),你可以为这些方法创建一个子类。
      如果你所有的方法都是相同的(也就是上面的相反),我会说你的班级不是太大。 但最重要的是不要在代码中迷失方向。尝试构建您的类,并按最适合的顺序排列您的方法。别忘了对这个顺序进行注释,这样你就可以很容易地再次进入这个顺序…

      想想“单一责任”(SR)。我敢打赌,一个有2500行代码的类至少可以做20种不同的事情,这些事情很容易分离

      首先,所有私有方法通常是一个等待释放的新SR类。 第二,一个变量被用在很多地方,并不意味着其他人(另一个类)不能持有和处理它。 第三,像这样的一个大类必须接近不可能测试。SR类通常非常简单

      所以,我唯一能推荐的就是开始蚕食你的怪物类,让几十个小小的单打独斗奇观见效:-)

      问候,,
      Morten

      我将冒着被否决的风险,声明2500行代码中97%的类都太大了:-)这取决于您的问题域。在相当基础的算法研究中,数字运算代码最终超过这个极限并不罕见。在纯应用程序代码中,如果没有几个合理的“断行”将类转换为几个较小的类,几乎不可能获得2500行代码。@MadKeithV现在是第三段。还是最后一段?其他一些长方法的例子,因此类是按位图像和音频处理-虽然最后也是算法…该死:)是的,我说的是第三段,但最后一段也是合理的建议。所有私有(虚拟)方法通常都是模板方法实现。从我的C++畸形思考,当然: