如何分解大班

问题描述 投票:0回答:4

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

我尝试对 Shape 类进行子类化,但所有“域”对象仍将继承该子类。

如何解散课堂? (这是 300 行文本,C#)

oop
4个回答
9
投票

300 行对我来说似乎很合理。

如果您确实需要更好的帮助,请发布代码


8
投票

一些想法(更像启发式):

  1. 检查类的字段。 如果一组字段仅在少数方法中使用,这可能表明该组字段和使用它的方法可能属于另一个类。

  2. 假设有一个名称良好的类,将类的名称与类的实际功能进行比较。 如果您发现方法执行的操作超出了类名称的预期,则可能表明这些方法属于不同的类。 例如,如果您的类代表 Customer,但也打开、关闭和写入日志文件,请将日志文件代码分解为 Logger 类。 另请参阅:单一职责原则 (PDF) 了解一些有趣的想法。

  3. 如果某些方法主要调用另一个类上的方法,这可能表明这些方法应移至它们经常使用的类(例如,Feature Envy)。

注意:就像他们说的,分手很难。 如果存在破坏类的风险,您可能需要进行一些测试,以便您知道在重构时不会破坏任何内容。 考虑阅读“有效处理遗留代码”和“重构”书。


2
投票

您可以通过将函数委托给其他帮助器类来分解。

但我同意 300 行代码并不可怕。

+1 发布代码


1
投票

感谢您的代码。

以下是您可以尝试的一些方法:

1)重构重复代码。 这种代码被重复了大约七次:

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

注意:PinY 也计算 pinX,但不使用其值。

类似的重复存在于:Pos{X,Y}{Start,End}

这个类更难分解,因为它是一个已经很复杂的类的包装。

不太了解该领域(尽管我是形状、圆形、方形概念的专家),我很想将类分成几个类,每个类共享相同的核心 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
}

我不会立即直接公开这些对象(例如 public ShapeCollection GetChildren()),但我会开始将 EnvironShape 委托给这些对象。

© www.soinside.com 2019 - 2024. All rights reserved.