【问题标题】:if public properties breaks encapsulation concept, why do they exist?如果公共属性打破了封装概念,它们为什么存在?
【发布时间】:2021-06-13 08:22:43
【问题描述】:

封装有两种常见的definitions

  • 一种语言机制,用于限制直接访问某些 对象的组件。
  • 一种便于将数据与 操作该数据的方法(或其他函数)。

通常的做法是从不使用公共属性,而是使用 getter/setter。如果公共属性打破了封装,为什么现代编程语言提供了使用它们的可能性?

【问题讨论】:

  • 我能想到一些,尽管它们并不适用于所有语言。 1. 它们不会完全破坏封装(您可以在 getter/setter 中包含调试代码或副作用)。 2. 对于某些语言,通过静态分析很难知道 setter/getter 是什么。 3. 许多语言在某种程度上是多范式。 4. 有时尊重封装是不可取的——例如在编写小程序时。 5. Getter/Setter 是不同的东西,它们都减少了封装。但是按值获取的 getter 仍然不允许您修改源对象。
  • 您将公共字段与公共属性混合在一起。公共属性是“限制直接访问某些对象组件的语言机制”。有些语言没有属性的概念,它们唯一的机制是使用 getter/setter。属性是实现封装的更高级机制,它们可以由 getter/setter 支持,但它们不一定是 - 使用由字段和字段支持的属性之间的主要区别在于,您可以在不破坏公共的情况下将 getter/setter 添加到属性API。

标签: oop


【解决方案1】:

主要原因是像 Java 这样的旧语言中的公共字段是透明的,即表达式 obj.field 总是 获取字段的值而不做其他任何事情,而 obj.field = value 总是 为该字段分配一个值而不做其他任何事情。现代语言通常具有允许覆盖这些语法形式的机制,以便字段访问或分配的语法可以具有用户定义的行为。这意味着一个类可以公开地公开一个字段,而无需对其自己的实现做出任何保证,因此这些语言中的属性违反封装。 (从技术上讲,这是 fieldproperty 之间的区别,您应该说 public fields 违反封装但 public properties 不要。)

其他几个原因:

  • 封装是一种面向对象的设计原则,但大多数现代语言并非严格面向对象。现代语言通常是多范式的,不会强迫程序员采用特定的范式。
  • 封装具有一些好处,在某些情况下应该权衡违反封装的好处。比如Java有反射,绝对违反封装;但反射对于序列化或对象关系映射等事情非常有用。
  • 封装的主要好处之一是,通过让每个类负责保存自己的invariant,所有负责该职责的代码都在一个地方,并且更容易确保保留不变量。从这个意义上讲,暴露不可变字段并不违反封装,因为仅仅访问一个字段并不能破坏一个类的不变量;如果从字面上看,一个字段的每个可能值都可以被不变量接受,那么可以说暴露一个可变字段也不会违反这种意义上的封装。

【讨论】:

    猜你喜欢
    • 2023-03-09
    • 2010-10-10
    • 1970-01-01
    • 2015-12-27
    • 2018-09-20
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    相关资源
    最近更新 更多