免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3906 | 回复: 12
打印 上一主题 下一主题

[其他] 面条还是千层饼? [复制链接]

论坛徽章:
1
技术图书徽章
日期:2013-09-10 08:57:55
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-01 12:44 |只看该作者 |倒序浏览
本帖最后由 pprpg 于 2012-08-01 14:13 编辑

迪米特法则(Law of Demeter)又叫作最少知识原则,就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。
如果对象a包含成员b, b包含函数f1的话.
不应该有a.b.f1()这样的调用出现, 应该包装成a.b_f1();

一个对象不会有访问两级成员的代码
应该是:
不会有访问一个对象两级成员的代码

单选投票, 共有 5 人参与投票
60.00% (3)
40.00% (2)
您所在的用户组没有投票权限

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
2 [报告]
发表于 2012-08-01 13:04 |只看该作者
what i can said is :keep your blance...


if it is a must to choose one. my alternation is 2.

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
3 [报告]
发表于 2012-08-01 13:20 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
4 [报告]
发表于 2012-08-01 17:38 |只看该作者
回复 1# pprpg

>> 不应该有a.b.f1()这样的调用出现, 应该包装成a.b_f1();
这难道不是一回事?

论坛徽章:
1
技术图书徽章
日期:2013-09-10 08:57:55
5 [报告]
发表于 2012-08-01 20:08 |只看该作者
OwnWaterloo 发表于 2012-08-01 17:38
回复 1# pprpg

>> 不应该有a.b.f1()这样的调用出现, 应该包装成a.b_f1();
这难道不是一回事?


如果b.f1()发生改变, 后一种方式就只影响a.b_f1()的实现, 而调用a.b_f1()接口的地方则不受影响.

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
6 [报告]
发表于 2012-08-01 20:39 |只看该作者
pprpg 发表于 2012-08-01 20:08
如果b.f1()发生改变, 后一种方式就只影响a.b_f1()的实现, 而调用a.b_f1()接口的地方则不受影响.


怎么个改变法? 除非a不包含b了, 那 a.b_f1() 这命名就不合适。。。
还是说b_f1这不是真实的名字, 只是一个像foo/bar那样的Placeholder name?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
7 [报告]
发表于 2012-08-01 20:41 |只看该作者
回复 5# pprpg

我的意思是,就a.b.f1()与a.b_f1()来看,两者包含的信息没区别。
除非b_f1不是真实名字。

论坛徽章:
1
技术图书徽章
日期:2013-09-10 08:57:55
8 [报告]
发表于 2012-08-01 21:44 |只看该作者
OwnWaterloo 发表于 2012-08-01 20:39


怎么个改变法? 除非a不包含b了, 那 a.b_f1() 这命名就不合适。。。
还是说b_f1这不是真实的名字, 只是一个像foo/bar那样的Placeholder name?


对于调用者z来说, 有两种调用方式:
1.
a.b.GetByID(id);

2.
a.b_GetByID(id);

如果b的接口GetByID(id)变成GetByName(name), a.b_GetByID(id)可以扮演代理的角色, 在内部做这个转换, 对外接口b_GetByID保持不变.
对于a的用户z来说,
采用第二种方式比较稳定.
采用第一种方式, 则z既是a的用户同时也是b的用户, b的接口改变, z调用b的方式肯定需要变化.

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

原来是这种程度的改动。。。

那b对用户公开与否与b是否被a包含没什么关系。。。
决定权在b是否公开。如果是公开的,就a.b.f1()【或者直接b.f1()、 x.y.b.f1()】,否则就是a.b_f1()【x.b_f1(),x.y.b_f1()】。

论坛徽章:
1
技术图书徽章
日期:2013-09-10 08:57:55
10 [报告]
发表于 2012-08-01 22:12 |只看该作者
本帖最后由 pprpg 于 2012-08-02 11:38 编辑

////是我举例有问题:

OwnWaterloo 发表于 2012-08-01 21:51
回复 8# pprpg

那b对用户公开与否与b是否被a包含没什么关系。。。
决定权在b是否公开。如果是公开的,就a.b.f1()【或者直接b.f1()、 x.y.b.f1()】,否则就是a.b_f1()【x.b_f1(),x.y.b_f1()】。


我没理解你的意思.
但我举的例子中, 只涉及了a和b的公开接口.
通过a作为间接层来访问b, 会更稳定一些.




class B{
public:
  string GetInfoByID(id);
}

class A1{
public:
  B &b;
}

class A2{
public:
  string Get_BInfoByID(id);
}

z:
void func_b() {
  A1 a;
  a.b.GetInfoByID(id);
}

void func_nob() {
  A2 a;
  a.Get_BInfoByID(id);
}

如果class B的GetInfoByID(id) 改为GetInfoByName(name);
func_b()肯定需要修改
func_nob()就可能因为class A2的Get_BInfoByID(id)的实现里完成了id到name的转换, 而不需要改变.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP