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

ArmadaDrive

我尝试过寻找答案,但是很难用短语表达,许多问题都与如何创建类或如何做非常具体的事情有关。我需要更多的实用概述-我是自学成才的,并且我了解什么是对象(以及如何创建对象),但是我从未见过有关何时创建对象的很好的解释

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

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

罗布·纳皮尔

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

OOP的重点是封装复杂性。艾伦·凯(Alan Kay)最初是根据生物细胞来设想它的,其中细胞的所有机械都是与外界隔离的,并且您只能通过传入和传出的消息与细胞进行交互。因此,一个对象封装了一个完整的系统,它本身将由对象组成,并且可以与其他对象组成甚至更大的对象。一切都将与消息进行交流,没有人可以窥视其他任何人。这就是面向对象程序设计的意思,而且很多写作仍受此想法影响。但大多数事情自称OOP不这样做(事要做 这种方式的工作在当今通常被称为“演员模型”,它可以是一种非常有效且健壮的编程方式,以Erlang等语言为代表。

如今,大多数OOP系统都认为对象不是一件有趣的事情(至少在我看来):仅是数据和可以对这些数据起作用的方法的组合。对于这是否是一个特别有用的构造(与将数据与方法分开的功能范式,还是纯粹侧重于功能而不是类的鸭子式范式),业内存在着巨大的争论。

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

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

关于“封装责任”,这是我们所谓的“单一责任”原则。一个对象应对您可以命名的“事物”负全部责任。例如,“事物”可能是“网络连接”,也可能是“绘制此窗口”。您有一个Connection类和一个Window类,等等。真正的关键是命名。您可以轻松地命名它,而且您所做的一切似乎都源于您给它的名字,因此您知道自己的班级很好。当很难命名时,您可能创建了错误的类。

类层次结构的关键课程称为“替代原理”(由Barbara Liskov正式提出)。如果要创建子类,则必须能够在可以使用其超类的任何地方使用它。因此,Corgi IS-A狗是因为狗可以做的一切,因此,Corgi可​​以做。但是,令人惊讶的是,正方形不是矩形。可以创建具有两个长度的矩形。正方形不能。方矩形问题可能是继承错误的最常见原因。一个很好的教训是,继承是解决许多问题的错误工具。您应该倾向于组合多个对象而不是继承。因此,在创建新类时,浅层次结构通常是最好的。

正如您所发现的,您所看到的称为“ OOP”的大部分只是封装在对象中的过程编程。这对于新来者来说非常令人困惑。这让我们这些已经从事数十年的人感到困惑。您只需要查看即可。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我什么时候应该在StratifiedKFold中洗牌

什么时候应该在python中引发LookupError?

什么时候我们应该在 android 中创建新的布局

什么时候应该在Node.js中创建Redis客户端?

什么时候应该在Rails中创建单独的控制器而不是自定义操作?

什么时候我应该在 C++ 中添加“类”这个词来创建指针?

什么时候应该在Java中使用接口?

什么时候应该在Scala中选择Vector?

Tkinter TopLevel应该在什么时候不显示

什么时候应该在Python中使用'assert'?

什么时候应该在Python中使用类?

BufferedReader应该在什么时候不声明“就绪”

什么时候应该在ExecutorService上使用CompletionService?

什么时候应该在C ++中使用“朋友”?

我什么时候应该在 '$this' 上使用 'self'?

什么时候应该在QListView上使用QListWidget?

什么时候应该在Go中使用`new`?

什么时候应该在元组上使用记录?

JwtSecurityToken应该在什么时候到期

什么时候应该在 Android 中使用 KeyChain?

什么时候应该在mongo中使用$ limit?

摩卡测试应该在什么时候失败

Raft follower 应该在什么时候记录 RPC?

应该在什么时候找不到Java符号

as.Date应该在什么时候出错

什么时候应该在Python中使用split()?

什么时候应该在 .NET 中使用 SemaphoreSlim?

什么时候应该使用Array,什么时候应该在Scala中使用ArrayBuffer?

什么是“意识”?什么时候应该在班级名称中包含?