我有一个关于数据隐藏的 OOP 原则的问题。
据我了解,数据隐藏=将结构的内部字段限制在某个可见区域。动机:如果更改结构内容,则只需更改可见性区域中的实现。
为了强制执行数据隐藏原则,oop 设计者大多决定这样做:
方法一:
封装 = 使可见区域成为结构本身(类),将对其进行操作的函数(方法)放入其中。
这对我来说似乎是一个非常大的要求。并创造了很多不必要的不对称。为什么 OOP 设计者不决定以这种方式定义封装:
方法二:
让程序员控制可见区域应该是什么。一个可见区域可能包括多个结构,而不仅仅是一个。在这个可见区域中定义可以在多个结构之间运行的函数。这种方式结构和函数更独立地存在,有更多的对称性,可能需要更少的 getter/setter。
让我举个例子:如果你有一个玻璃物体和一个瓶子物体,里面有一些水。假设您想要实现从瓶子中填充玻璃的能力。
使用方法 1,你被迫做一些不对称的事情,你必须要么实现 glass.fill(bottle) 要么实现 bottle.fill(glass),所以听起来你有一个不必要的困境需要解决。不仅如此,假设你实现了 glass.fill(bottle),现在你在 glass 的范围内,你不能访问瓶子的内部,所以你不得不在瓶子里写一个方法,以便能够更新它。在我看来,这听起来像是很多不必要的工作,而且这种强制的 bottle.update 方法听起来更不利于数据隐藏。
使用方法 2,您可以只定义一个独立的填充(玻璃,瓶子),它可能只知道玻璃和瓶子的内部结构,因为玻璃、瓶子和填充可能是同一可见区域的一部分。听起来是不是容易多了?请注意,您仍然可以使用这种方法定义协议(接口),在外部,您只需要知道玻璃和瓶子是未指定的东西,而填充是对两个东西进行操作的操作:玻璃和瓶子。
我的论点有任何缺陷吗?是否有任何强调这种方法的编程语言尝试?