什么时候课程太大了?

mtg*_*res 29 oop

我倾向于创建具有30-40(或更多)方法的非常大的类.有多少方法太多了?是否有任何"气味"或经验法则可供使用?

Joh*_*soe 46

第一步是坚持单一责任原则.如果你不能用一句话说出你的班级做了什么,那么它可能做得太多了.

一旦你缩小了范围,我不知道方法的数量真正重要,只要你的方法不做太多.

  • 同意+1.但不是"一句话"规则,我更喜欢鲍勃叔叔对SRP的定义:一个班级应该只有一个改变的理由. (2认同)
  • 第二个链接不再可用,问题已删除。 (2认同)

Nic*_*rey 23

我会咬人的.除了涉足OO设计深水的浅层边缘之外,我还要做一些我的经验法则:

  1. 静态属性非常值得怀疑.强烈质疑他们是否真的需要他们.

  2. 类的大多数属性/属性应该是私有的(只能由对象实例访问)或受保护,只能由类或派生类(子类)的实例访问.

  3. 如果一个类的属性/属性对公众可见,则它很可能是只读的.在大多数情况下,对象实例的状态应该仅通过响应一个方法来改变,要求它做一些有用的事情(例如,你请求一个窗口移动自己,而不是显式设置是坐标平面上的原点).

  4. 公共Getter/Setter方法或属性是有问题的,因为它们主要暴露对象状态(参见上面的第2项).

  5. 公共方法应主要公开对象实例响应的逻辑操作(消息).这些操作应该是原子的(例如,对于处于逻辑上一致的内部状态的对象,它不应该依赖于向其发送特定消息序列的外部参与者).对象状态应该更改是响应这些消息的结果,并且应该作为消息的副作用公开(例如,报告其位置作为要求移动的副作用的窗口是可接受的).

上面应该大大减少对象的公共接口.

最后,如果你的对象有多个它响应的消息,你可能有一个重构的候选者:它真的是一个整体对象,还是一个离散对象的集合?当然,"不止一些"是一个非常主观(和上下文)的数字 - 我会把10-12作为一个合理的限制.

希望这可以帮助.

在OO设计,分析和建模方面有很多书籍.

  • @Nicholas Carey 如何在没有 getter 和 setter 的情况下将数据传递到对象中?您仍然必须以某种方式填充这个对象,并且公共属性是“禁止的”..? (2认同)
  • @NicholasCarey但是将对象数据保存到持久性(例如数据库)并从中获取呢?为了“填充”或“读取”,DB Mapper类必须具有某种访问对象属性的权限。对象不应该知道谁将其保存在何处。 (2认同)
  • @NicholasCarey我认为依赖注入框架有时(通常是)依赖于setter。 (2认同)

Bob*_*mer 8

正如其他人所说的那样,当一个班级试图做不止一件事而违反单一责任原则时,它就太大.

关于这个主题和其他主题(以及我强烈建议任何开发人员使用的一本)的优秀书籍是Bob Martin的Clean Code.


pet*_*ust 6

像Math这样的静态类可能有很多方法.拆分它们会让人感到困惑.


sim*_*aun 0

这取决于您是否可以将类拆分为子类。

编辑:我的意思是你应该问自己“这个方法适用于这个类还是属于一个子类?”

例如,

动物类
  - 狗吠()
Dog_bark() 可以移至名为 Dog 的类,并将该方法重命名为 bark()