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 - Fatal编程技术网

Oop 如何解散一个大班

Oop 如何解散一个大班,oop,Oop,我有一个很大的Shape类,它的实例可以(应该)做很多事情。我有许多“域”形状类,它们继承自这个类,但除了绘图本身之外,不提供任何其他功能 我已经尝试过对Shape类进行子类化,但是所有的“域”对象仍然会继承这个子类 我该如何分班?(这是300行文字,C#)300行对我来说似乎是合理的 如果您确实想要更好的帮助,请发布代码您可以通过将函数委托给其他帮助器类来分解代码 但我同意300行代码并不可怕 +1用于发布代码的几个想法(更像是启发式): 1) 检查类的字段。如果一组字段只在少数几个方法中使用

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

我已经尝试过对Shape类进行子类化,但是所有的“域”对象仍然会继承这个子类


我该如何分班?(这是300行文字,C#)

300行对我来说似乎是合理的


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

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

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

+1用于发布代码的几个想法(更像是启发式):

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

2) 假设一个命名良好的类,将该类的名称与该类实际执行的操作进行比较。如果您发现方法所做的事情超出了您对类名称的期望,那么这可能表明这些方法属于不同的类。例如,如果您的类代表一个客户,但也打开、关闭并写入日志文件,则将日志文件代码分解为一个Logger类。另请参见:了解一些有趣的想法

3) 如果一些方法主要调用另一个类上的方法,这可能是一个迹象,表明这些方法应该被移动到它们经常使用的类(例如,Feature Envy)

警告:就像他们说的,分手很难。如果分解类存在风险,您可能希望在适当的位置放置一些测试,以便在重构时知道您没有破坏任何东西。考虑阅读“”和“书”。

< P>谢谢代码。

以下是一些您可以尝试的事情:

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

       Visio.Cell pinX = GetLayoutCell(Visio.VisCellIndices.visXFormPinX);
        if (pinX != null)
        {
            pinX.set_Result("cm", value);
        }
注意:PinY也计算pinX,但不使用其值

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

使这个类更具挑战性的是它是一个已经很复杂的类的包装器

由于不太了解这个领域(尽管我是形状、圆、正方形概念的专家),我很想把这个类分成几个类,每个类共享同一个核心形状对象

这是一张草图:

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()),但我会开始将Environment Shape委托给这些对象。

感知可能是欺骗!也许300行中有298行是用rot13写的?@snekay我不知道你在说什么。