- 论坛徽章:
- 2
|
三月廿七 发表于 2012-02-10 18:10 ![]()
所有的仿问/更改 集中到一个函数里,方便断点、日志.
日后可能会增加仿问/更改限制,比如 address 不能等于0, 加个断言 assert(address != 0)
终于说到关键点了,日后(别想歪啊)的可能性。
使用accessor,可以提供这样的可能性:日后可以增加断言。
但是:
1. 使用accessor并不仅仅是有这么个作用
2. 增加断言也并不一定需要
1. 不需要访问控制
- typedef struct { int x,y; } point2d_cartesian; /* 直角坐标系2维点*/
复制代码 能增加什么断言? 所有 INT_MIN-INT_MAX的值都是有效的。
2. 需要访问控制,且对应一个成员
- typedef struct { double r,a;} point2d_polar; /* 极坐标系2维点 */
复制代码 半径r就需要满足 >=0 。
3. 需要访问控制,但不对应成员
比如链表的length(),可以没有对应的成员,直接数。(btw:C++标准要求std:: list:: size常数时间返回,所以std:: list 是有这个成员的)
vector的size(),capacity()并不一定需要两个成员。只要以某种规律增长,只需要一个成员就够了, 另一个getter就是通过计算得到的。
point2d_polar也可以提供x/y的accessor, 显然不对应任何成员。
总之封装的目的是分离接口与实现,accessor只是其中的一种:
1. C++/Java/C#之类的语言是通过public/private...等机制来支持接口与实现的分离
2. 接口不仅仅是成员函数,一些数据成员也可能是接口的一部分,也就是说这些数据成员不需要是private+accessor
3. 有一些公有函数是accessor
比如vector的capacity,该接口提供一个重要的询问:该vector增长到何种大小前绝对不会重新分配?
4. 这些accessor不一定对应着数据成员
capacity可以是(常数时间)计算得到的。
这才是重点,才是技术性问题。命名、顺序只是口味问题。 |
|