过大的类
一个类含有太多的函数,字段或者行,就称之为过大的类。
原因
类通常开始时很小,但随着时间的推移,随着程序的增长,类变得越来越多。
与长方法的情况一样,程序员通常发现在现有类中放置一个新特性比为该特性创建一个新类要更轻松。
方法
- 抽取类:
- 确定某项功能
- 创建新旧类之间的连接,最好是单向的,如果没办法,双向关系也可以。【上述步骤都是逻辑】
- 把该功能有关的字段、方法都移到一个新类中【实践】
- 还要考虑从外部进入新类的可访问性。您可以通过将该类设置为私有,并通过旧类的字段管理它,从而完全向客户机隐藏该类。或者,您可以通过允许客户端直接更改值使其成为公共的。这里的决定取决于当对新类中的值进行意外的直接更改时,对旧类的行为是否安全。
- 抽取子类,如果有某些方法可以用不同的方式实现或者极少数情况下才会使用:
- 如果需要额外的数据来从子类创建对象,那么创建一个构造函数并向其添加必要的参数。不要忘记调用构造函数的父实现
- 查找对父类的构造函数的所有调用。当需要子类的功能时,用子类构造函数替换父构造函数
- 将必要的方法和字段从父类移动到子类。从移动方法开始比较简单。这样,字段在整个过程中都可以访问: 在移动之前从父类访问,在移动完成之后从子类本身访问。
弊端
尽管看起来很简单,但是如果您必须分离几个不同的类层次结构,继承可能会导致死胡同。例如,如果你的类Dog
的行为取决于Dog
的大小和毛皮,你可以梳理出两个层次结构:
size: 大、中、小
furs: 光滑和蓬松
一切看起来都很好,只是当您需要创建一个既大又平滑的狗时,问题就会突然出现,因为您只能从一个类创建一个对象。也就是说,您可以通过使用 组合
而不是 继承
来避免这个问题(可以使用设计模式中的策略模式)。换句话说,Dog 类将有两个组件字段: size 和 furs。您将从必要的类中将组件对象插入到这些字段中。所以你可以创建一个狗有大尺寸和毛茸茸的皮毛