oop - 封装: allow accessing of fields of any other than the current receiver object

标签 oop coding-style smalltalk

一些面向对象的语言(例如 Smalltalk)不允许访问 当前接收者对象以外的任何字段。例如: 像 this.good 或 this.like:=false 这样的表达式是合法的,但是像 x.like 或 this.like.good 这样的表达式是非法的。

我不明白的是:为什么??

这种限制的理由是什么?

最佳答案

这就是OOP的核心思想之一,叫做封装。除了对象本身,没有人知道它的内部状态。

这提供了更好的隔离,因为内部状态可以随着时间的推移而改变,如果你直接访问它——你就完蛋了。此外,如果有人可以直接扰乱您的对象的状态,您永远不知道在运行时是否会发生您不期望的变化。

一般来说,定义访问器并不难,最后你会得到:x likex like: false in smalltalk 和 x。 like(), x.setLike(false) 类 C 语言。 Ruby 和 Scala 允许您使用空格定义方法并在不使用括号的情况下调用它们,因此它们看起来就像字段访问:x.likex.like = false。如果您被迫编写访问器,您不会有很大的开销,但如果您允许程序员对对象状态做他们想做的任何事情,那么您的代码就会变得困惑,这实际上是一个大问题。

要了解如果不使用它可能会发生的所有坏事需要一些时间。当您开始开发时,您不明白如果将字段公开会发生什么。这就是为什么 C++ 是一门糟糕的语言,因为对于初学者来说,处理直接字段访问更容易。

此外,如果您考虑直接访问字段,那么 OOP 的整个概念就被打破了。因为您可以像在过程语言中一样使用您拥有的任何数据,而类则只起到定义数据结构的分组功能的作用。

您可以在 wikipedia 上阅读有关封装的更多信息. 还有一篇关于 What is Object Oriented Programming: A Critical Approach 的非常有趣的帖子

关于oop - 封装: allow accessing of fields of any other than the current receiver object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15586303/

相关文章:

arrays - Pharo 3 中文字数组和动态数组的区别

c# - C# 中静态只读变量和集合的奇怪行为

oop - 我应该编写利用 Intellisense 的代码吗?

java - java中对象的大小是多少

reflection - 在 Squeak 中,我在哪里可以找到消息处理算法的代码?

Smalltalk型系统

php - 静态实例变量的析构函数方法?

关于组织文件的 JavaScript 风格指南

java - 数据传输对象中的公共(public)字段

design-patterns - 将算法封装到一个类中