gpt4 book ai didi

oop - 在 OOP 中,类封装是进行数据隐藏的正确方法吗?

转载 作者:行者123 更新时间:2023-12-02 02:43:54 25 4
gpt4 key购买 nike

我有一个关于数据隐藏的OOP原理的问题。

据我了解,数据隐藏 = 将结构的内部字段限制在特定可见区域。动机:如果改变结构内容,只需要改变可见区域的实现。

为了执行数据隐藏原则,oop 设计者大多决定这样做:

方法一:

封装 = 使可见区域成为结构本身(类),将对其进行操作的函数(方法)放在内部。

这对我来说似乎是一个非常高的要求。并造成许多不必要的不​​对称。 为什么 OOP 设计者不决定以这种方式定义封装:

方法二:

让程序员控制可见区域。可见区域可能包括多个结构,而不仅仅是一个。在这个可见区域定义可以在多个结构之间运行的函数。通过这种方式,结构和函数更加独立,对称性更高,可能需要更少的 getter/setter。

让我举个例子:如果你有一个玻璃对象和一个瓶子对象,它们内部装有一些水。假设您想要实现从瓶子中倒满玻璃杯的功能。

对于方法 1,您被迫做一些不对称的事情,您必须实现 glass.fill(bottle) 或实现 bottle.fill(glass),所以听起来您有一个不必要的难题需要解决。不仅如此,假设你实现了 glass.fill(bottle),现在你在 glass 的范围内,你无法访问 bottle 的内部结构,所以你不得不在 bottle 中编写一个方法,以便能够更新它。在我看来,这听起来像很多不必要的工作,而且这种强制的 bottle.update 方法听起来更不利于数据隐藏。

使用方法 2,您可以只定义一个独立的填充物(玻璃、瓶子),它可能只知道玻璃和瓶子的内部结构,因为玻璃、瓶子和填充物可能属于同一可见区域。听起来是不是容易多了?请注意,您仍然可以使用这种方法定义协议(protocol)(接口(interface)),在外部,您只需要知道玻璃和瓶子是未指定的事物,而填充是对两个事物进行操作的操作:玻璃和瓶子。

我的论点有什么缺陷吗?有没有强调这种排序方式的编程语言的尝试?

最佳答案

一般来说,瓶子不能自动装满玻璃杯,玻璃杯也不能自己装满瓶子。有一个外部协调员负责从瓶子中填充玻璃的过程。

这反射(reflect)在你的第二种方法中,你提出了方法 fill(),它接受一个 Glass g 和一个 Bottle b

从 OOAD 的角度来看,您现在需要做的就是 - 创建外部协调器类(可能是 Person),它将瓶子的内容物倒入玻璃杯中。 fill(Glass g, Bottle b) 方法属于 Person 类。

关于oop - 在 OOP 中,类封装是进行数据隐藏的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57235225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com