不,对象不必代表实体。
实际上,我会辩称,当您停止将对象视为物理实体时,就是您最终获得了OOP所承诺的好处。
这不是最好的例子,但是Coffee Maker的设计可能是开始为我点亮的地方。
对象是关于消息的。他们是关于责任的。它们与汽车,用户或订单无关。
我知道我们以这种方式教OO,但是在尝试了MVC,MVVM或MVWhatever之后,经过几次尝试弄清楚事情的去向是多么令人沮丧,这一点变得显而易见。您的模型变得非常肿,或者控制器变得如此。为了便于导航,很高兴知道所有涉及Vehicles的内容都在Vehicle.ext文件中,但是当您的应用程序涉及Vehicles时,该文件中不可避免地会出现3000行意大利面条。
当您有新消息要发送时,您至少有一个新对象,也许是一对。因此,在您对一堆方法的问题中,我认为您可能正在谈论一堆消息。每个人都可以成为自己的对象,并且要完成自己的工作。没关系。当您将事物分开时,这些事情真的,真的需要在一起,这将变得显而易见。然后你把它们放在一起。但是,为了方便起见,为了方便起见,您不会立即将每种方法都放到一个适当的抽屉中。
让我们谈谈功能包
对象可以只是方法的集合,并且仍然是面向对象的,但是我的 “规则”非常严格。
馆藏应负有单一责任,并且这种责任不能像“对电动机有影响”那样普遍。我可能会做诸如服务层外观之类的事情,但是我敏锐地意识到,由于导航性/发现性原因,我很懒,而不是因为我试图编写OO代码。
所有方法都应位于一致的抽象层。如果一种方法检索Motor对象,而另一种方法返回Horsepower,则可能相差太远。
对象应该处理相同的“种类”的数据。这个对象对电动机起作用(启动/停止),这个对曲柄长度起作用,这个对点火顺序进行处理,这个采取html形式。可以想象,该数据可能是对象上的字段,并且看起来具有凝聚力。
通常,在进行转换,合成或只是不想担心可变性时,我会构建此类对象。
我发现专注于对象责任使我朝着凝聚力迈进。一个对象必须具有一定的凝聚力,但是它不需要任何字段,也不需要太多行为即可成为对象。如果我要构建一个需要这5种电机方法的系统,那么我将以5种不同的对象开始做这些事情。当我发现通用性时,我要么开始将事物合并在一起,要么使用通用的“ helper”对象。这使我陷入了开放/关闭的顾虑-如何提取这一点功能,这样我就不必再次修改该特定文件,而仍在需要的地方使用它?
对象是关于消息的
字段与对象无关紧要-获取和设置寄存器不会改变程序之外的世界。与其他对象协作即可完成工作。但是,OO的优势在于我们可以创建抽象,因此我们不必一次考虑所有单个细节。泄漏或没有意义的抽象是有问题的,因此我们对创建与我们的心理模型匹配的对象进行了深思(也许太多)。
关键问题:为什么这两个对象需要互相交谈?
将对象视为人体中的器官-它具有默认用途,并且仅在收到其关心的特定消息时才更改行为。
设想一下您在人行横道上并且汽车驶速很快的情况。作为大脑的对象,我检测到压力源。我告诉下丘脑发送促肾上腺皮质激素释放激素。垂体得到该信息并释放肾上腺皮质营养激素。肾上腺得到该信息并产生肾上腺素。当肌肉对象收到肾上腺素信息时,它就会收缩。当心脏得到相同的信息时,它会跳动得更快。整个街道上都有众多参与者参与冲刺的复杂行为,而这是重要的信息。大脑对象知道如何使下丘脑发出警报,但它不知道最终会导致行为发生的对象链。同样,心脏也不知道肾上腺素来自何处,
因此,在这个(简化的)示例中,肾上腺对象只需要知道如何服用ACTH并制造肾上腺素。它不需要任何字段来执行此操作,但对我来说仍然像是一个对象。
现在,如果我们的应用程序仅设计用于在街道上冲刺,则可能不需要垂体和肾上腺物体。或者,我只需要一个垂体对象,该对象只占我们在概念上可以称为“垂体模型”的一小部分。这些概念都以概念实体的形式存在,但是它是软件,我们可以制作AdrenalineSender或MuscleContractor或其他任何东西,而不必担心模型的“不完整性”。