虽然我创建的某些对象正在对真实世界的对象进行建模,但是OOP之前的代码会不会这样做?
OOP和OOP之前的代码之间的最大区别在于,前者将现实世界建模为一组相互交互的不同实体,每个实体在执行功能上具有有限的“权力”,并且还能够“做出反应”具有自己动作的外部事件。后者将所有事物建模为一大堆数据,它们本身并不做任何事情,而计算则代表“正在发生的事情”,并且会影响其中的任何一个或全部。
是否更好地模拟现实世界,这实际上取决于您要模拟世界的哪个方面。例如,如果您要描述一个物理模拟,则您要描述被周围的物体点燃的火可能会产生的影响,因此最好用“传统”方法来表示,因为光和热都很好,定义的过程会影响其他对象的内部和外部状态,并且不会根据每个特定对象的行为而变化,而仅受其属性影响。
另一方面,如果您正在建模交互相互作用以产生所需行为的不同组件,则将它们视为代理而不是被动的事情可以使正确操作更容易,而不会丢失任何内容。如果要打开电视,只需按一下按钮,如果拔下电源线,TV.turnOn
它将为我检查一下。因此,没有转动齿轮的风险,而忘了转动其他与之接触的齿轮,因为齿轮本身(如果编程正确)将负责由于主齿轮而引起的次要交互作用。
但是OO确实是关于如何对事物建模的方法,而这种建模方法对我来说似乎并不受现实世界的启发。
我认为,这与我们对世界的看法有关,而不是与世界的实际情况有关。有人可能会争辩说,一切都只是一堆原子(或能量,或波浪,等等),但这无助于我们完成处理所面临问题,了解周围环境并预测未来事件的任务(或描述过去的内容)。因此,我们建立了世界的“心理模型”,通常这些心理模型比“数据+处理”模型更能与OO对应-可以说它“更好地”模拟了现实世界的实际运行方式。
有趣的是,大多数人都将OOP视为“经典OOP”的同义词,在该类中,我们通过分类学来创建事物的集合和子集,并将对象明确地放置在非常特定的集合中。这对于创建可重用的新类型非常有用,但是当您要建模的实体几乎是独立的并且在启动与其他对象的交互时,很少(如果有的话)是交互的目标,那么就不是很好。或更糟糕的是,当该实体的实例很少(也许只有一个)时,或者实例的组成,行为或两者差异很大。
但是,还有“原型OOP”,其中通过选择一个相似的对象并枚举它们不同的方面来描述一个对象。我建议这篇文章是对思想过程的很好且不是太技术的解释(即使对于史蒂夫·耶格(Steve Yegge)的标准,整个文章也太大了,所以我要指向相关的部分:P)。再次,这与我们的心理模型很好地匹配,当通过与已知实例进行比较来想象未知实例时,却不一定是现实世界的“工作原理”……(即使我们意识到它们,两头母牛实际上是完全分离的实体)在很多方面都是“相同”的)