如何打破一大类(How to break up a large class)

2019-09-20 15:45发布

我有一个大形类,它的实例可以(应该)能够做很多事情。 我有一个从该类继承了许多“域”形状类,但不提供比绘制自己以外的任何不同的功能。

我曾试图继承Shape类,但后来所有的“域”的对象仍然会继承这个子类。

如何分手的课吗? (它是300个文本行,C#)

Answer 1:

一对夫妇的想法(更像是试探法):

1)检查类的字段。 如果一组字段只在几个方法使用,这可能是一个迹象,表明该组字段和使用它的方法可能会在另一个类属。

2)假定一个良好命名的类,比较之类的什么类实际执行的名字。 如果你发现做的事情超出你会从类名称会发生​​什么方法,这可能是一个迹象,表明这些方法在不同的类属。 例如,如果你的类代表一个客户,但也打开,关闭,并写入日志文件,打出来的日志文件中的代码放到一个Logger类。 :又见单一职责原则(PDF)的一些有趣的想法。

3)如果一些方法主要是呼吁一个其他类的方法,这可能是一个迹象,表明这些方法应该被移到他们经常使用(如功能嫉妒)的类。

注意:就像他们说的,分手是很难做到的。 如果在分手类风险,你可能想要把一些检查到位,让你知道当你重构你不打破任何东西。 考虑阅读“ 修改代码的工作 ”和“ 重构 ”一书。



Answer 2:

300线似乎是合理的我。

发布代码,如果你真的想更好地帮助



Answer 3:

你可以通过委派功能,其他辅助类分手。

但我认为,300行代码并不可怕。

+1张贴代码



Answer 4:

感谢您的代码。

以下是你可以尝试的几件事情:

1)重构重复代码。 这种代码被复制的七倍:

       Visio.Cell pinX = GetLayoutCell(Visio.VisCellIndices.visXFormPinX);
        if (pinX != null)
        {
            pinX.set_Result("cm", value);
        }

注:松树的也算品克斯但不使用它的价值。

类似的重复中存在:波什{X,Y} {开始,结束}

是什么让这个类更具挑战性的向上突破是它的周围已经复杂类的包装。

不知道域名非常好(虽然我随形,圆形,方形概念的专家),我会忍不住打破了全班分成若干个班,每班份额相同的核心Shape对象。

这里是一个草图:

class EnvironShape {
   private ShapeProperties _properties;   // contains property management code
   private ShapeCollection _children;     // contains code for acting on children
   private Decorators      _decorators;   // code for accessing decorators
   private Layers          _layers;       // layer management code
   private Position        _position;     // code for working with the shape's position
   // Other code omitted
}

我不会立即和直接公开这些对象(如公共ShapeCollection的GetChildren()),但我会开始制作EnvironShape委托这些对象。



文章来源: How to break up a large class
标签: oop