Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该什么时候在OOP中创建对象?_Oop_Object - Fatal编程技术网

我应该什么时候在OOP中创建对象?

我应该什么时候在OOP中创建对象?,oop,object,Oop,Object,我试着寻找答案,但很难表达,很多问题要么是关于如何创建类,要么是关于如何做非常具体的事情。我需要一个更实用的概述-我自学成才,我知道什么是对象以及如何创建它们,但我从来没有看到过关于何时创建对象的好解释 这听起来像是一个奇怪的问题,答案是“总是”,但我注意到我的OOP代码在某一点上开始看起来是程序化的。如何结合我对这两种范式的理解,从而编写结构良好的面向对象代码?在某些时候,有一些主要的函数或代码体需要创建变量和实例化对象,然后执行条件测试之类的操作,所以我很难弄清楚应该将什么作为对象放入代码中

我试着寻找答案,但很难表达,很多问题要么是关于如何创建类,要么是关于如何做非常具体的事情。我需要一个更实用的概述-我自学成才,我知道什么是对象以及如何创建它们,但我从来没有看到过关于何时创建对象的好解释

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


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

这可能不太适合Stackoverflow,但这是一个非常好的问题,应该加以解决。您无意中遇到了编程中的一个常见问题:大多数OOP程序实际上并不是面向对象的

OOP的全部目的是封装复杂性。艾伦·凯(Alan Kay)最初是从生物细胞的角度来设想的,在生物细胞中,细胞的所有机械都与外部世界隔离,你只能通过进出的信息与细胞互动。因此,一个对象封装了一个完整的系统,它本身就是由对象组成的,可以与其他对象组合成更大的对象。所有的东西都会通过信息交流,没有人能窥视别人的内心。这就是面向对象编程的含义,很多写作仍然受到这种思想的影响。但是大多数称自己为OOP的东西并不能做到这一点,而以这种方式工作的东西今天通常被称为Actor模型,它可以是一种非常有效和健壮的编程方式,以Erlang等语言为代表

今天大多数OOP系统认为一个对象至少是一个有趣的东西,至少在我看来,只是数据和方法的组合,可以对数据起作用。对于这是一个特别有用的构造还是将数据与方法分离的函数范式,或者是只关注功能而不是类的duck类型范式,业内存在着很大的争论

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

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

关于封装责任,这是指我们所说的单一责任原则。一个对象应该完全负责一件您可以命名的事情。例如,该对象可能是网络连接,也可能正在绘制此窗口。您有一个连接类和一个窗口类等等。真正的关键是命名。你知道你有一个很好的类,当它很容易命名的时候,它所做的每一件事似乎都跟随着你给它的名字。当很难命名时,您可能创建了错误的类

类层次结构的关键一课叫做Barbara Liskov形式化的替换原则。如果你要创建一个子类,它必须能够在任何可以使用它的超类的地方使用。所以柯基犬就是狗,因为狗能做的一切,柯基犬都能做。但是,令人惊讶的是,正方形不是矩形。可以创建两个长度的矩形。正方形不能是正方形。正方形-矩形问题可能是导致继承错误的最常见原因。一个很好的教训是继承对于许多问题来说都是错误的工具。您应该喜欢组合多个对象,而不是继承。因此,在创建新类时,浅层次结构通常是最好的


正如您所发现的,您所看到的很多所谓的OOP都只是包在对象中的过程编程。这对新来的人来说非常混乱。对于我们这些几十年来一直在做这件事的人来说,这是相当令人困惑的。您只需要看看。

我通常会遵循“如果类开始有多个职责,我会将其分成两部分,也许其中一个类会委托给另一个。这个问题是否更适合StackExchange上的其他站点?”?我认为可能有一些具体的例子说明什么是好的实用OOP,所以希望我们能够避免意见。但它可能很宽。谢谢,这只母鹿
让我们从一个经验丰富的程序员的角度来帮助澄清一些事情。大多数OOP都不是纯粹的——我有一个喜欢Scala的好朋友,但他坦率地承认他的代码不一定是纯粹的FP。这个问题是否应该以某种方式转移到程序员身上。StackExchange或类似的问题?@ArmadDrive这个问题对程序员来说不太合适——很快就会被否决并在那里结束,请参阅推荐阅读:许多有经验的程序员应该在开始编写代码之前阅读过这篇文章。