免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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)
您所在的用户组没有投票权限

论坛徽章:
1
技术图书徽章
日期:2013-09-10 08:57:55
2 [报告]
发表于 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()接口的地方则不受影响.

论坛徽章:
1
技术图书徽章
日期:2013-09-10 08:57:55
3 [报告]
发表于 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的方式肯定需要变化.

论坛徽章:
1
技术图书徽章
日期:2013-09-10 08:57:55
4 [报告]
发表于 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的转换, 而不需要改变.

论坛徽章:
1
技术图书徽章
日期:2013-09-10 08:57:55
5 [报告]
发表于 2012-08-02 11:43 |显示全部楼层
举例有问题, 改了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP