我有一个很大的Shape类,其中的实例可以(应该)能够做很多事情。我有许多继承自这个类的“域”形状类,但除了绘制自己之外,不提供任何不同的功能。
我已经尝试过对Shape类进行子类化,但是所有“域”对象仍然会继承这个子类。
我如何分手? (它是300条文字行,C#)
答案 0 :(得分:8)
300行对我来说似乎是合理的。
如果您真的想要更好的帮助,请发布代码
答案 1 :(得分:7)
一些想法(更像是启发式):
1)检查班级的字段。如果一组字段仅用于少数方法,则可能表示该组字段和使用它的方法可能属于另一个类。
2)假设一个命名良好的类,将类的名称与类实际执行的名称进行比较。如果您发现的方法超出了您对类名称的期望,那么这可能表明这些方法属于不同的类。例如,如果您的类表示客户,但也打开,关闭和写入日志文件,请将日志文件代码分解为Logger类。另请参阅:Single Responsibility Principle (PDF)了解一些有趣的想法。
3)如果某些方法主要在另一个类上调用方法,那么这可能表明这些方法应该移动到他们经常使用的类(例如Feature Envy)。
注意:就像他们说的那样,分手是很难的。如果在分类时存在风险,您可能需要进行一些测试,以便在重构时知道自己没有破坏任何东西。请考虑阅读“Working Effectively with Legacy Code”和“Refactoring”一书。
答案 2 :(得分:2)
你可以通过将函数委托给其他帮助程序类来解散。
但我同意300行代码并不可怕。
+1发布代码
答案 3 :(得分: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,Circle,Square概念的专家),我很想将这个类分成几个类,每个类共享相同的核心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委托给这些对象。