1
10
在面向对象的世界里,是的。
对象旨在成为包含数据和行为的内聚实体,其他对象可以通过公共接口以受控方式访问这些数据和行为。如果一个类不封装它的数据和行为,它就不再控制被访问的数据,并且不能与公共接口所隐含的其他对象完成它的契约。 这方面的一个大问题是,如果一个类必须在内部进行更改,那么公共接口就不必更改。这样它就不会破坏任何代码,其他类也可以像以前一样继续使用它。
下面是一个Java示例:
这里的问题是因为我还没有封装
|
2
3
封装背后的全部思想是,与类相关的所有知识(接口除外)都在类本身中。例如,允许直接访问属性将使您有责任确保执行分配的代码上的任何分配都是有效的。如果什么是有效的定义发生了变化,则必须使用类检查并审核所有内容,以确保它们一致。将规则封装在“setter”方法中意味着您只需在一个地方对其进行更改,任何尝试任何有趣操作的调用方都会得到一个异常。当属性更改时,您可能还需要做很多其他的事情,而setter就是您要做的地方。
是否允许直接访问没有任何规则来绑定它们的属性(例如,任何适合于整数的属性都可以),这是一个很好的实践,值得商榷。为了一致性,我认为使用getter和setter是一个好主意,也就是说,您总是知道可以调用
就我个人而言,我认为必须使用getter和setter看起来很笨拙。我宁愿写信
|
3
1
关于如何实现“好的ood”的意见不计其数,而且经验丰富的程序员和设计师往往在设计选择和理念上存在分歧。如果你问不同语言背景和范例的人,这可能是一场火焰战的开始。 是的,理论和实践是一样的,所以语言的选择不应该对高层次的设计产生很大的影响。但在实践中,它们确实存在,因此会发生好的和坏的事情。 我再加一句: 这要看情况而定。封装(在支持语言中)使您可以控制如何使用类,因此 可以 告诉人们:这是API,你必须使用它。在其他语言(如python)中,官方API和非正式(可能会发生变化)接口之间的区别仅在于命名约定。( after all, we're all consenting adults here ) 封装不是安全功能。 |
4
1
另一个思考 带访问器的封装在将来也提供了更好的可维护性。在上面的Feanor的回答中,执行安全检查(假设您的instvar是私有的)非常有效,但是它可以有更多的好处。
考虑以下情况:
如果每个人都在代码中使用访问器方法,那么实现这一点就变得非常简单。像这样: MyAPI 1.0版
API的现有用户对其代码不做任何更改,新功能(审计跟踪)现在可用。
|
5
1
在 对象定向编程 有一个原则被称为(http://en.wikipedia.org/wiki/open/closed_principle): PoC 开闭原理 . 这一原则适用于: 一个好的类设计应该为可扩展性(继承)打开,但为修改内部成员(封装)关闭。 . 这意味着,如果不注意对象的状态,就无法对其进行修改。 因此,新的语言只通过属性(C++/Java中的GETTER和SETTES方法)修改内部变量(字段)。在C属性中,编译为MSIL中的方法。 C:
C++/Java:
|
6
0
把这些想法(从 头一C ):
|
overexchange · 客户端锁定是否违反了同步策略的封装? 7 年前 |
mangochaser · java——具有多态性和封装的几何形状 7 年前 |
LBaelish · 安全/正确使用指针[关闭] 8 年前 |
Petr Marek · Javascript类封装行为 8 年前 |