免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: asuka2001
打印 上一主题 下一主题

命名难,难于上青天 [复制链接]

论坛徽章:
0
41 [报告]
发表于 2012-02-10 18:06 |只看该作者
OwnWaterloo 发表于 2012-02-10 18:01
在某一个时刻,你的这个帖子肯定是"C++推荐不写this",我没来得及拍照……

>> 既然可以重名,那当然重 ...

易扩展、易维护、易调试

论坛徽章:
0
42 [报告]
发表于 2012-02-10 18:10 |只看该作者
所有的仿问/更改 集中到一个函数里,方便断点、日志.
日后可能会增加仿问/更改限制,比如 address 不能等于0, 加个断言 assert(address != 0)

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
43 [报告]
发表于 2012-02-10 18:10 |只看该作者
三月廿七 发表于 2012-02-10 18:00

你要学会自己想,想问什么要/不这么做,而不是因为其他人建议/推荐这么做就去模仿。
否则永远都是半调子。
//
我有个缺点: 没有理论基础作后盾,就不敢写代码
你可以理解为 不自信

为什么要set_x/get_x而不直接使用?
想清楚这个问题了,就会明白accessor是为了使用这个类的其他代码而写的,不是为了这个类的那几个member写的。
accessor与member都不一定保证总是有一一对应关系。
//
这个问题在
Java 核心编程 P140:类设计技巧有原话:
"不是所有的域都需要独立的域仿问器和更改器"


理论基础也别在java里找啊

Java核心编程我没仔细看。接触这本书的原因是因为一个学长给我说书里到处都在吐槽C++。
所以我也只专注于吐槽C++的部分,结论是作者也就一井底蛙。


这话的含义应该没有与我的话冲突。否则作者就不仅仅是在吐槽C++方面是个井底蛙了。
>> "不是所有的域都需要独立的域仿问器和更改器"
它的意思不是说剩下的那些就应该被public了。
而是有
>> accessor与member都不一定保证总是有一一对应关系。
这一层意思。

是否应该有accessor是根据类的接口而定的 —— 这个类应该有些什么功能。
而不是根据类的实现来定的 —— 如何实现这些功能。

论坛徽章:
0
44 [报告]
发表于 2012-02-10 18:16 |只看该作者
OwnWaterloo 发表于 2012-02-10 18:10
理论基础也别在java里找啊

Java核心编程我没仔细看。接触这本书的原因是因为一个学长给我说书 ...


这个你理解错了,这是我自己 原创的

我的意思是说 函数声明 尽量和 变量声明顺序保持一致.  而不是函数声明随便摆放
我觉得这样会更美观一点


      int x;
      int y;


getX();
getY();

论坛徽章:
0
45 [报告]
发表于 2012-02-10 18:20 |只看该作者
我的理论基础 既不来源于 c++, 也不来源java,而是来源于c

论坛徽章:
0
46 [报告]
发表于 2012-02-10 18:31 |只看该作者
本帖最后由 三月廿七 于 2012-02-10 18:35 编辑

我还没能理解你说的话...

/*
>> "不是所有的域都需要独立的域仿问器和更改器"
它的意思不是说剩下的那些就应该被public了。
而是有
>> accessor与member都不一定保证总是有一一对应关系。
这一层意思。
*/

//
类设计技巧第一条是:
一定要将数据设计为私有

第四条是:
不是所有的域都需要独立的域仿问器和更改器,在对象中常常包含一些不希望获得或设计的域。

个人增加一条:在对象中常常包含一些不希望或不需要 获得或设置的域


论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
47 [报告]
发表于 2012-02-10 19:00 |只看该作者
三月廿七 发表于 2012-02-10 18:10
所有的仿问/更改 集中到一个函数里,方便断点、日志.
日后可能会增加仿问/更改限制,比如 address 不能等于0, 加个断言 assert(address != 0)


终于说到关键点了,日后(别想歪啊)的可能性。
使用accessor,可以提供这样的可能性:日后可以增加断言。

但是:
1. 使用accessor并不仅仅是有这么个作用
2. 增加断言也并不一定需要

1. 不需要访问控制

  1. typedef struct { int x,y; } point2d_cartesian; /* 直角坐标系2维点*/
复制代码
能增加什么断言? 所有 INT_MIN-INT_MAX的值都是有效的。

2. 需要访问控制,且对应一个成员

  1. 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可以是(常数时间)计算得到的。

这才是重点,才是技术性问题。命名、顺序只是口味问题。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
48 [报告]
发表于 2012-02-10 19:03 |只看该作者
三月廿七 发表于 2012-02-10 18:31
类设计技巧第一条是:
一定要将数据设计为私有

第四条是:
不是所有的域都需要独立的域仿问器和更改器,在对象中常常包含一些不希望获得或设计的域。


原来从第一条开始就可以不看了。

我还真没见过多少一定绝对的事,至少数据设计为私有不算。
通常某人说一定、绝对:
1. 要么他真不知道反例
2. 要么他知道,只是把你当作傻瓜,认为你不需要知道。

论坛徽章:
0
49 [报告]
发表于 2012-02-10 19:36 |只看该作者
本帖最后由 三月廿七 于 2012-02-10 19:57 编辑
OwnWaterloo 发表于 2012-02-10 19:00
终于说到关键点了,日后(别想歪啊)的可能性。
使用accessor,可以提供这样的可能性:日后可以增加断 ...


point{} 实在太简单了, 我也正在 数据类型 和 抽像数据类型的选择中 矛盾着

一:数据如果不设置为私有,显然是和 ADT 相背离的
      如果客户只能通过接口仿问变量,那么怎么又能直接仿问变量
      如果客户能直接仿问变量,那么怎么又能确保客户只通过接口仿问变量
二:仿问器只是一个接口,仿问器需不需要对应于成员似乎是无关紧要,正是因为仿问器的存在,
      你才能在不同种实现方式中切换,你既可以直接返回数据成员,又可以通过计算得到
三:数据成员也是接口的一部分不知道是不是你杜撰的
四:如果我已经开始关注命名、顺序,那么就说明前面的对我来说已经不是问题了


好吧,point 选择用 数据类型表示,
请教, c 中有什么方法 即可以实现 数据类型,又可以实现 抽像数据类型
不是靠用户的自觉性吧??

论坛徽章:
0
50 [报告]
发表于 2012-02-10 19:56 |只看该作者
你们写代码还管日后啊,

我现在只追求当下的最简单。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP