关于DIP原则中接口的放置问题,请大家指点一下。

mis98ZB 2004-04-07 10:32:23
DIP原则里边抽取出来的接口,应该放在哪里呢?
是制订这个接口的类所在的包(需求方),还是实现这个接口的类所在的包(实现方)?

想了半天也找不到一个合适的方法,只好来烦劳高手们指点一下。
...全文
123 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
panpan221 2004-04-16
  • 打赏
  • 举报
回复
关注
社会栋梁 2004-04-13
  • 打赏
  • 举报
回复
学习
mis98ZB 2004-04-13
  • 打赏
  • 举报
回复
感谢jeffyan77(jeffyan77)版主指点。

实际上跟我现在的想法差不多。

接口如何分包,只是一种表象,它表现的是接口的所有权(即决定权与变更权)的分派。
接口单独封包,只是一种简单的折衷。

接口所有权归使用方,能够方便地更换实现;
而接口所有权归实现方,则能方便地重用实现。

更换实现与重用实现,孰轻孰重,便是是否使用DIP的决定条件。
  • 打赏
  • 举报
回复
mis98ZB(Effective Typer)
dearmite(笨笨的我!):
@_@
他(我那同事)的底细我是知道的,他买了根本就没有看过……
可惜,可惜.......
书非借不能读也
  • 打赏
  • 举报
回复
jeffyan77(jeffyan77) ( ) 信誉:103 2004-04-12 01:47:00 得分:0


大家好。

这是一个好问题。这个接口放置的地点有两个:一是和实现这个接口的具体类放在一起,也就是放在提供服务的包里;二是放到消费这个服务的包里。

这样确实可以,
只是,放在一起,
那么,布署类上你不用设引用关系,
不然,在布署图上,要一一指明引用关系
(不过这样倒是可以看清你的接口实现的类都是从那些接口上引用来的)

我嘛,既然两种都行,那我当然放一起了,
还省得import呵呵

mis98ZB(Effective Typer)
话也不能这么说,
C++是灵活,也方便,但是, C++语法各家各有各的样子,
这一点,倒也认人愁得慌:)
C++和JAVA,相比,
有一点像UNIX和LINUX相比
JAVA更纯一些,
当初我比VC搞JAVA时,说什么都不理解JAVA笨笨的行为,
我第一天,就写了一个MDebug类,
里面放在Trace的方法,
想想VC的调试版,发布版,改一下设置,就搞定,
而JAVA的调试,多数还是System.out
不过,学过一段时间了,
现在反而对JAVA有些好感了,
至少没有那些怪怪的语法
设计的思路更多的依赖于你的想法,而不是语言的语法!
公用的.h文件,和DELPHI的公用的UNIT,JAVA的公用的包和类
其实没什么分别!
jeffyan77 2004-04-12
  • 打赏
  • 举报
回复
大家好。

这是一个好问题。这个接口放置的地点有两个:一是和实现这个接口的具体类放在一起,也就是放在提供服务的包里;二是放到消费这个服务的包里。

听上去好像什么都没说,只是重复了一遍楼主的问题,但实际上这就是答案。

首先,如果你的系统既包括服务的提供者,也包括服务的消费者,那么这个接口应当放到消费者那里。消费者下单,消费者买单。任何功能的修改都应当来自于需求的变化,而需求的变化当然来自于消费者。把这个接口放到消费者一端,由开发消费者功能的小组负责,是最好的选择。

看官可能会问,如果消费者有5个怎么办?按照这种消费者为主的思路,接口就需要5个,具体实现类就需要实现5个接口。

但是很多的情况下你的系统只是一个服务的提供者,并不知道消费者。譬如你是一个API提供商,把自己写的JDBC软件提供给其他程序员使用,你就没办法把接口放到消费者那里。这个时候把接口放到自己这里当然就是唯一的选择。

那么有没有可能你自己的系统包括了提供者和消费者,但仍然需要把接口放到提供者这里呢?当然也是有的。譬如提供者包首先被开发,而在开发的时候消费者包还不存在,或者消费者的数目可能还会增加,接口的数目不定,那么不妨由提供者给出接口。这个时候给出的接口可能是一个比较宽的接口,使用端根据自己的需要决定使用接口的某部分。

agiler_charming 2004-04-08
  • 打赏
  • 举报
回复
而且也应该是独立的
agiler_charming 2004-04-08
  • 打赏
  • 举报
回复
接口也可以是独立的
libi 2004-04-08
  • 打赏
  • 举报
回复
好久没见jeff露头了,是不是又准备出书了,那我辈又可一饱耳目了。
qiuqiupeng 2004-04-08
  • 打赏
  • 举报
回复
偶要抱着书睡觉了
mis98ZB 2004-04-08
  • 打赏
  • 举报
回复
Polarislee(北极星):
又看了一下那本书,发现它是建议接口单独建包的。

dearmite(笨笨的我!):
@_@
他(我那同事)的底细我是知道的,他买了根本就没有看过……
  • 打赏
  • 举报
回复
Chuanyan(花儿为什么这样穷)
“多看不如多记,
多记不如多想,
多想不如多做!”
这段话,好象不是我说的,是一个“名”人说的:)
你安一个ROSE,
按它上面的,画一遍,
感觉就爽多了
mis98ZB(Effective Typer) 那你就比较爽了,
不会的正好有人问,
要不要“培训费”呀:)
dub 2004-04-08
  • 打赏
  • 举报
回复
接口是共同遵守的约定,应该是独立的。
需求方直接调用接口,实现方只管实现就行了。
mis98ZB 2004-04-07
  • 打赏
  • 举报
回复
dearmite(笨笨的我!):
是吗,正好我旁边就有一本(同事的)。
嘿嘿,抢过来研究一下:)
Chuanyan 2004-04-07
  • 打赏
  • 举报
回复
dearmite(笨笨的我!) :
多谢你。不过俺已经拥有了,因为太厚,所以没看完。
mis98ZB 2004-04-07
  • 打赏
  • 举报
回复
Polarislee(北极星):
真的!?嗯,晚上回去重新研究一下这本书。

但是正如我上面说的,实现方无法单独重用了。
这样就没有办法自底向上组建系统了。
该怎么解决呢?
  • 打赏
  • 举报
回复
我把接口 ,和接口 的实现的类放到一起,
就是因为,这样在代码上容易理解一些,
没有从需求上去想,
不过,我的需要分析的图,
喜欢从各个包里,去拖,那些类!
所以,包对于我来说,
代码显得更重要一些

PS,
URL http://www.javaresearch.org/members/jeffyan77/javapatterns/chp13.pdf
这上面,有《Java与模式》中的一讲,
工厂模式,
你可以下载了看看,
FREE的哟!
Chuanyan(花儿为什么这样穷):
其实这本书真的不贵,
因为,上千页的书,在90元左右的价,这真的不贵了,
我买的一本ORACLEXML 的书,800多页 88元钱,
现在基本上,就是一页0.1元钱的样子,
不过,既然你认为贵,
网上有这本书的7章呀,你可以下载啦!(悄悄)
其实,也就网上放的那几章精彩一些

  • 打赏
  • 举报
回复
但是《Java与模式》讲的是模式。
我需要的是在代码级别上的对封装的思考。
这是实现的技术,而java的书似乎正是缺少这样的基础的东西……

这本书你真的没看,
你可能还是按《设计模式》那本书去想这本书的内容
不是的,
这本书里面,70%以上,是实际开发中的例子,
这也是那本书为什么那么贵的原因,
其实,这本书的理论深度,好象还不及《设计模式》呢,
但是,就因为,深度不深,实际的东西多,
所以,这本书,反而成为了JAVA的设计第一书!
里面其中一节,竟然连JAVAMAIL都有,
你可以想像得到这本书,与你的实际相距多近,
离教条的教材有多远!
北极猩猩 2004-04-07
  • 打赏
  • 举报
回复
按照《敏捷软件开发》中的建议,接口应该放在使用该接口的包中。
mis98ZB 2004-04-07
  • 打赏
  • 举报
回复
另外插一句:一个包里放多少个类合适啊?
加载更多回复(11)

1,265

社区成员

发帖
与我相关
我的任务
社区描述
软件工程/管理 管理版
社区管理员
  • 研发管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧