我应该何时在OOP中创建对象?

时间:2015-08-15 16:26:11

标签: oop object

我已经尝试过寻找答案,但很难说出来,很多问题都是关于如何创建课程或如何做非常具体的事情。我需要更多实用的概述 - 我自学成才,我理解对象是什么(以及如何创建它们),但我从未见过何时到创建一个对象

这可能听起来像一个奇怪的问题,有一个总是"的答案,但我注意到我的OOP代码往往在某个时候开始看起来程序化。如何结合我对两种范例的理解,以便编写结构良好的面向对象代码?在某些时候,有一些主要的函数或代码体需要创建变量并实例化对象然后执行诸如执行条件测试之类的事情,因此我很难弄清楚应该将什么作为对象放入代码中。

也许答案是我刚才提到的所有这些要点都应该由另一个对象封装。我不知道 - 这是我从理解的角度努力向前迈进的地方。

1 个答案:

答案 0 :(得分:1)

这可能不适合Stackoverflow,但这是一个非常好的问题,应该加以解决。您不小心偶然发现了编程中的常见问题:大多数“OOP”程序实际上并不是面向对象的。

OOP的重点是封装复杂性。艾伦凯最初设想的是生物细胞,细胞的所有机器都与外界隔绝,你只能通过信息进出细胞。因此,一个对象封装了一个完整的系统,它本身就是由对象组成的,并且可以与其他对象组合以制作更大的对象。一切都会与消息沟通,没有人可以偷看其他任何人。这就是面向对象编程意味着什么,而且很多写作仍然受到这个想法的影响。但是大多数自称为OOP的事情并没有这样做(这种方式的工作今天通常被称为“演员模型”,它可以是一种非常有效和强大的编程方式,在像这样的语言中集中体现二郎)。

今天大多数OOP系统认为对象是一个不那么有趣的东西(至少在我看来):只是可以对该数据起作用的数据和方法的组合。业内人士对于这是否是一个特别有用的结构(与将数据与方法分离的功能范例,或纯粹关注能力而不是类的鸭子类型范例)进行了激烈争论。

但是对于你在实践中的问题,我会说在大多数情况下我们创建对象有两个原因:聚集数据和封装责任。这些是非常不同的东西,但在许多流行的语言中,它们都被视为“对象”。

在“clump数据”的情况下,当您拥有逻辑上应该在一起的数据集合时,可以创建一个新对象。例如,Point是两个坐标的集合,这是一个非常好的“数据对象”。

关于“封装责任”,这指的是我们所谓的“单一责任”原则。对象应该对您可以命名的一个“事物”负全部责任。例如,“东西”可能是“网络连接”或可能是“绘制此窗口”。你有一个Connection类和一个Window类等。真正的关键是命名。你知道你有一个好的课程,当它很容易命名,它所做的一切似乎都来自你给它的名字。当它很难命名时,你可能创建了错误的类。

类层次结构的关键教训称为替换原则(由Barbara Liskov正式化)。如果你要创建一个子类,它必须能够无处不在才能使用它的超类。因此,柯基犬IS-A狗,因为狗可以做的一切,柯基犬可以做。但是,令人惊讶的是,Square不是不是一个矩形。可以使用两种长度创建Rectangle。广场不可能。 Square-Rectangle问题可能是继承错误的最常见原因。值得一提的是,继承是许多问题的错误工具。您应该支持组合多个对象而不是继承。因此,在创建新类时,浅层次结构通常是最佳的。

正如您所发现的,您所看到的大部分内容称为“OOP”,只是程序编程包含在对象中。这对新人来说非常困惑。这对我们这些已经这么做了几十年的人来说非常困惑。你只需要看一下。