有时对象由纯数据组成。此类对象具有字段、访问器,并且几乎没有其他方法。
有时对象由纯粹的行为组成。它们有其他对象来表示它们的状态,或者数据作为方法参数传递。通常这样的对象代表算法或某种策略。
您更喜欢哪种状态/行为比率?
什么更可维护?
什么更容易出错?
我喜欢做一个或另一个的对象——要么代表具有行为的东西(理想情况下,只公开 void 方法),要么代表纯状态(理想情况下,是不可变的,除了维护其状态和可能的验证之外没有代码)。
第一种类型的对象相互传递另一种类型。这与 Actor 模型非常接近,这样做可以解决很多问题。(如果在 Java/C# 中执行此操作,您可以将接口作为“值”传递给第一种类型。)
我发现你遇到问题的是中间的对象(状态和行为)......行为对象中的某些状态是可以的,只要它的主要目的不是被查询。
如果您正在设计的对象都是行为而没有状态或所有状态且没有行为,我认为您的设计存在缺陷。在现实世界中遇到这类对象真的不常见,如果这些不是您描述的补充对象而是现实世界对象的表示,那么我认为某处有问题。
我没有任何状态/行为的固定比率。我认为每个物体都有自己的形状,这在物体之间可能会有很大的不同。但我认为随着时间的推移,如果你经常处理对象,动词往往会比名词/形容词更多,即行为将主导状态。
这就是我在我的程序中观察到的。
我喜欢以下对象(按优先级排序):
当这些措施到位时,就很难把事情搞砸了。
没有行为的对象也可以是哈希表,没有状态的对象也可以是函数的集合。
只有当行为是通用的并且可以应用于不同类的对象时,它才应该作为一个单独的类来实现。如果是这种情况,您将无法选择“比率” - 它仅取决于特定系统中通用策略的数量。
否则,就会出现过早泛化的情况,甚至更糟糕的是,无端违反 OO 原则。是的,它很容易出错。