免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
51 [报告]
发表于 2012-02-10 20:13 |只看该作者
三月廿七 发表于 2012-02-10 19:36
point{} 实在太简单了, 我也正在 数据类型 和 抽像数据类型的选择中 矛盾着

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


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


记得上面有关绝对、一定的话么?没有多少规则是适合所有问题的。
你的这些观点,都是想将任何问题一刀切,用同一种方法去对待。

1. 有些直接访问,另一些通过函数访问
你提出的反问是建立在所有都要通过相同方式访问。

上面的直角坐标点,就是直接访问。 vector的size/capacity就是通过函数访问。
point不一定要学vector那样隐藏, vector不需要学point那样公开; 不需要将它们扯到一样齐,懂了吗?

2. 是需要在不同实现方式中切换才需要提供访问器, 但不是所有class都需要切换实现的后路/可能性
改变了point2d_cartesian的实现,它就不叫point2d_cartesian了。
或者换个例子,改变了std:: pair的实现,它就不叫pair了, 没有改变其实现的机会。

3. 用"杜撰"这个字眼,说明你还是希望他人帮你,而非通过自己的大脑,得出一个结论。
the ONLY "best practice" is using your brain.

4. 当真不是问题?
我倒觉得那些成天喜欢思考命名规范的人才蛋疼,还不如多想想怎么缩短名字的作用域。
顺序什么的更是强迫症的表现。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
52 [报告]
发表于 2012-02-10 20:14 |只看该作者
AD8018 发表于 2012-02-10 19:56
你们写代码还管日后啊,

我现在只追求当下的最简单。


好习惯!

通常日完以后我是不管的 = =

论坛徽章:
0
53 [报告]
发表于 2012-02-10 20:17 |只看该作者
本帖最后由 三月廿七 于 2012-02-10 20:25 编辑
OwnWaterloo 发表于 2012-02-10 20:13
记得上面有关绝对、一定的话么?没有多少规则是适合所有问题的。
你的这些观点,都是想将任何问题一刀 ...


vector的size/capacity就是通过函数访问,如果vector有一个length可以直接仿问,那你怎么办??
公开 和 不公开 在 c 中只能二选其一,懂了吗?

如果 vector是一个第三方插件,肯定是不公开任何数据成员的

你怎么知道我在关心变量顺序的时候,就不在关心变量的作用域?
类设计技巧的 第五条:
"按照标准的格式进行类的定义" 就是在关注变量的作用域

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
54 [报告]
发表于 2012-02-10 20:21 |只看该作者
回复 50# AD8018
回复 52# starwing83

面向对象的许多技术都是建立在"软件不变是相对的,变动是绝对的"这一假设上。
又因为其贫乏的抽象能力与拙劣的实现方式,所以需要各种研究各种技巧以尽可能小的代价让一大坨代码演化。

将这个假设抽掉了,你让他们玩什么

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
55 [报告]
发表于 2012-02-10 20:34 |只看该作者
三月廿七 发表于 2012-02-10 20:17
vector的size/capacity就是通过函数访问,如果vector有一个length可以直接仿问,那你怎么办??
公开 和 不公开 在 c 中只能二选其一,懂了吗?


你认为必须像C++/Java/C#那样的private才是隐藏?
其实它们也藏不住,C++有#define,有地址运算; Java/C#有反射。

或者你认为C里必须是一个没有定义的结构体指针,甚至是void*或者intptr_t才是隐藏?
同C++,有地址运算,你什么都藏不住。

而且在实践中,在结构体中公开定义,但依然通过函数在该结构体上操作的C代码并不少见。

>> 公开 和 不公开 在 c 中只能二选其一,懂了吗?
所以,这只是你的误解。
你的强迫症与一刀切的另一种表现。


三月廿七 发表于 2012-02-10 20:17
你怎么知道我在关心变量顺序的时候,就不在关心变量的作用域?
类设计技巧的 第五条:
按照标准的格式进行类的定义


因为这些人希望靠规则而非思考将事情办对。希望他人告之应该怎么做。
但其实制定并遵守死板的规则并不是人类的强项,思考才是。

论坛徽章:
0
56 [报告]
发表于 2012-02-10 20:40 |只看该作者
择其善者而从之,其不善者而改之
如果某些人真的那么会思考,还需要学习吗??

属于 数据结构 范畴的一切内容都是我关心(包括但不限于变量名称、顺序...)

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
57 [报告]
发表于 2012-02-10 20:46 |只看该作者
三月廿七 发表于 2012-02-10 20:40
择其善者而从之,其不善者而改之
如果某些人真的那么会思考,还需要学习吗??

属于 数据结构 范畴的一切内容都是我关心(包括但不限于变量名称、顺序...)


我不知道你是不是在说我。
反正我现在视面向对象与设计模式等东西如粪土。
根本不需要认真去学习那些条条款款,一样可以把将这些条款视为信仰的弄得团团转。

另外,关于你上面说的C语言vector,我不知道glib是否符合你的标准,反正它是公开了的:

  1. /* glib.h */
  2. ...
  3. typedef struct _GArray                GArray;
  4. ...
  5. struct _GArray
  6. {
  7.   gchar *data;
  8.   guint len;
  9. };
复制代码
也许这不符合你心中的ADT的定义? 一定要将_GArray移出glib.h才行?
你这让linux的list与rbtree情何以堪

论坛徽章:
0
58 [报告]
发表于 2012-02-10 20:55 |只看该作者
本帖最后由 三月廿七 于 2012-02-10 21:03 编辑

显然不符合我心中的 ADT的定义, 明显就不是ADT

#ifndef LIBXL_HANDLE_H
#define LIBXL_HANDLE_H

typedef struct tagBookHandle * BookHandle;
typedef struct tagSheetHandle * SheetHandle;
typedef struct tagFormatHandle * FormatHandle;
typedef struct tagFontHandle * FontHandle;

#endif

这种格式才符我心中的 ADT的定义

天下代码,无奇不有。并不是存在即合理
linux、windows、gnome都不一定是权威

从gnome 看 windows, windows就是一坨屎

论坛徽章:
0
59 [报告]
发表于 2012-02-10 20:57 |只看该作者
《代码大全》 里面就详细介绍了命名的规则~~

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
60 [报告]
发表于 2012-02-10 21:16 |只看该作者
三月廿七 发表于 2012-02-10 20:55
显然不符合我心中的 ADT的定义, 明显就不是ADT

#ifndef LIBXL_HANDLE_H
#define LIBXL_HANDLE_H

typedef struct tagBookHandle * BookHandle;
typedef struct tagSheetHandle * SheetHandle;
typedef struct tagFormatHandle * FormatHandle;
typedef struct tagFontHandle * FontHandle;

#endif

这种格式才符我心中的 ADT的定义

天下代码,无奇不有。并不是存在即合理
linux、windows、gnome都不一定是权威

从gnome 看 windows, windows就是一坨屎


那就不管ADT的定义纠结如何,以及这些东西是不是ADT,以及这些代码是否权威,Windows是不是屎。
只关注最终问题:glib或者linux这样的公开结构定义的设计是否合理?

我觉得合理。因为我知道什么叫ADT(按我的定义)。
所以即使我知道_GArray结构的具体信息,通常我也当作不知道,而是用garray_xxx函数去操作。
除非我看到文档里说了该结构里面某个域的意图就是公开使用的;或者到了很特殊的情况,我能承担让自己的一部分代码与glib共同演化的代价。

而linux的list与rbtree,如果结构体定义不可见,这数据结构就废了。


这又是上面说的思考 vs 规则的一个体现,ADT是:
1. 知道为什么要分离接口与实现,即使没有强制性规则也会这么做,以及触犯后的代价。
2. 还是那套强制性——private、隐藏定义、void*、intptr_t——规则

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP