我有一个很大的 Shape 类,它的实例可以(应该)能够做很多事情。我有许多从此类继承的“域”形状类,但除了绘制自身之外不提供任何不同的功能。
我尝试对 Shape 类进行子类化,但所有“域”对象仍将继承该子类。
如何解散课堂? (这是 300 行文本,C#)
300 行对我来说似乎很合理。
如果您确实需要更好的帮助,请发布代码
一些想法(更像启发式):
检查类的字段。 如果一组字段仅在少数方法中使用,这可能表明该组字段和使用它的方法可能属于另一个类。
假设有一个名称良好的类,将类的名称与类的实际功能进行比较。 如果您发现方法执行的操作超出了类名称的预期,则可能表明这些方法属于不同的类。 例如,如果您的类代表 Customer,但也打开、关闭和写入日志文件,请将日志文件代码分解为 Logger 类。 另请参阅:单一职责原则 (PDF) 了解一些有趣的想法。
如果某些方法主要调用另一个类上的方法,这可能表明这些方法应移至它们经常使用的类(例如,Feature Envy)。
注意:就像他们说的,分手很难。 如果存在破坏类的风险,您可能需要进行一些测试,以便您知道在重构时不会破坏任何内容。 考虑阅读“有效处理遗留代码”和“重构”书。
您可以通过将函数委托给其他帮助器类来分解。
但我同意 300 行代码并不可怕。
+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 委托给这些对象。