韩小明@xiammy的专栏

没水的地方挖井,有水的地方修渠

韩小明ID:xiammy
439371次访问,排名106好友13人,关注者67
毕业后一直在广联达工作
xiammy的文章
原创 174 篇
翻译 0 篇
转载 22 篇
评论 1133 篇
韩小明的公告
作者毕业于浙江大学,非常热爱体育运动。现在尤其热爱羽毛球运动。在休息时间非常热爱技术文章写作。
最近垃圾评论泛滥,为了不污染大家的视听,暂时关闭评论,请大家理解。
欢迎转载,但请注意,除非特别声明,本站采用Creative Commons License许可:署名,非商业。

最近评论
yb00k:感觉 这个还是个垃圾东西 适合IE7的变到IE8 就变样了 点都不规范 一点兼容性都不强....强烈支持 firefox
wuhuiran:我嵌入式数据库一直用BerkeleyDB,看到你的博文才知道还有一个SQLite,谢谢。BerkeleyDB不支持SQL
wuhuiran:我嵌入式数据库一直用BerkeleyDB,看到你的博文才知道还有一个SQLite,谢谢。BerkeleyDB不支持SQL
liquankun:瑞星还是不咋地!
白花了几个月的钱
外国的杀软不一定比国产的好!
但是国产的就是比不上国外的!
没办法!技术赶不上人家 还竟搞内讧
不经历大灾难 就不知道什么是团结!



正真的高手是不用杀毒软件的,没什么好不好的,是你自己技术不行而已
wangdei:http://www.bt285.cn BT下载 有300W部BT种子.
http://www.yaonba.com.cn NBA中文网 有200W条NBA直播
http://www.5a520.cn 小说520网 有300W部小说
http://www.bt285.cn/yazhou/ 亚洲BT 有BT亚洲
http://www.bjxlz.cn p……
文章分类
收藏
    相册
    图书
    链接
    宗刚的专栏(RSS)
    快乐学习(RSS)
    陈亮亮的专栏(RSS)
    朋友
    张恂论 OO
    言之有李(RSS)
    赵伟的小家
    存档
    订阅我的博客
    XML聚合  FeedSky

    原创 小谈子对象中接口的设计原则收藏

    新一篇: 访问量到20万,自贺一把 | 旧一篇: 单元测试之组织保障

    今天和同事在讨论接口的设计原则的时候,总结了一个原则点。虽然简单,也拿出来和大家一起分享。

    问题

    对象在实现接口的同时,由于需要提供访问子接口的服务。最正常的设计可能是下面的。

     

    但是,如果是另外一个情况呢?看看下面的组合方式吧:

     

    小析

    事情变得有点有趣了。往往就是这样,只有一个的时候,没有人会怀疑。只有出现多个的时候,争吵才开始了。所谓一个和尚挑水喝,两个和尚抬水喝,三个和尚没水喝。要我看来,一个和尚是多么的孤独?三个和尚虽然没水喝,可是有得吵闹,岂不是正得设计的乐趣?

    初步看起来,这两种设计中,第二种有着明显的不合理。因为这样,层次就变得混乱。而且父对象若是要越过子接口,访问一些实现上的细节,那么就更加麻烦了!

    前一段时间,我花很大时间去寻找方法,来通过接口指针返回对象指针(Delphi),现在想来,这个技术刚好是第二种设计的技术补充啊。反过来,我却忽略了设计上的原则。第二种方式既然存在,那么它是不是也有存在的理由。

    那么,什么时候适合第一种方式,什么时候适合第二种方式呢?

    我们讨论的时候,总结了一个简单的原则:

    如果子对象是父对象聚合的,且这个子对象公布的接口服务中,不存在更新服务。说白了,就是说这个接口的属性是只读的。那么建议使用第一种方式设计。

    反过来,如果这个接口属性,存在“写方法”,那么父对象一定不能引用对象,因为父对象并不知道子接口到底是由哪个类来实现的。跨越接口去访问接口,那是必然有问题的。所以这个时候应该采用第二种方式。当然了,这个时候,往往就需要对接口的设计提出很高的要求。

    说到最后,就是接口本身的设计了,那一定是一个非常艰难的过程了。一定不是简单原则所能解决的了。 

    发表于 @ 2007年05月09日 00:01:00|评论(loading...)|编辑

    新一篇: 访问量到20万,自贺一把 | 旧一篇: 单元测试之组织保障

    评论

    #jackhatedance 发表于2007-05-09 17:04:28  IP: 61.241.79.*
    IMO,既然都搞接口了,就尽量不必引用其对象了。
    #linzhengqun 发表于2007-05-09 17:35:15  IP: 219.131.196.*
    通过接口指针返回对象指针的方法:
    function GetObjFromIntf(AClass: TClass; const Intf: IInterface): TObject;
    var
    PIntfTable: PInterfaceTable;
    IntfEntry: TInterfaceEntry;
    i: Integer;
    begin
    Result := nil;
    //取得接口表结构
    PIntfTable := AClass.GetInterfaceTable;
    if PIntfTable = nil then Exit;
    while AClass <> nil do
    begin
    for i := 0 to PIntfTable^.EntryCount - 1 do
    begin
    IntfEntry := PIntfTable^.Entries[i];
    //判断接口表指向的地址是否和传入接口指向的地址相同
    if PPointer(Intf)^ = IntfEntry.VTable then
    begin

    //偏移到对象首地址
    Result := TObject(Integer(Intf) - IntfEntry.IOffset);
    Exit;
    end;
    end;
    //继续在父类中找
    AClass := AClass.ClassParent;
    end;
    end;

    #linzhengqun 发表于2007-05-09 17:47:18  IP: 219.131.196.*
    只是兄弟,如果你想通过接口得到对象这么变态的方法,那么为什么不直接使用第一种呢。

    事实上,第一种方法已经违反依赖倒置原则了,正如你所起的名字一样,父对象与子对象之间有严重的依赖关系。应该让它们都依赖于抽象了的接口。

    而问题的关键其实在于如何设计接口?
    #xiammy 发表于2007-05-13 18:59:37  IP: 221.219.252.*
    呵呵,兄弟啊。我可完全没有关心接口到对象的方法。关于这个问题,我在另外一个博客中已经清除阐明了,而且有比你这个更好的方法。
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 韩小明