针对接口编程,而不是针对实现编程

zengjd 2003-09-12 09:41:59
针对接口编程,而不是针对实现编程

在面向对象设计方法中有很多值得提倡的方法,这些方法可以为我们的设计带来很大的灵活性,可复用性。其中一个原则就是“针对接口编程,而不是针对实现编程”
这个原则带来的好处有以下几点:
Client不必知道其使用对象的具体所属类。
Client无需知道特定类,只需知道他们所期望的接口。
一个对象可以很容易地被(实现了相同接口的)的另一个对象所替换。
对象间的连接不必硬绑定(hardwire)到一个具体类的对象上,因此增加了灵活性。
松散藕合(loosens coupling)。
增加了重用的可能性。提高了(对象)组合的机率,因为被包含对象可以是任何实现了一个指定接口的类。
在实现上:
C++通过继承纯虚类来实现接口继承。
Java对接口继承具有单独的语言构造方式-Java接口。

但从辩证法的角度看,事物总有利有弊。“针对接口编程”有如上诸多好处,确不可避免的带来设计的复杂性。特别对于没有丰富经验的设计人员。
其中令我比较困惑的地方是:
要想针对接口编程,就必然要最大化接口类,使包括所有子类的方法,这样我们才能利用多态性用接口类来一致的操作子类。但这会带来以下几点不足。
违反面各对象的另一个原则,这个原则是:一个类只能定义那些对它的子类有意义的操作。
接口类包括了并不是对每一个子类都有意义的方法,使接口类臃肿,难以理解。
从父类继承的无用方法,如何处理。

举个例子来说。我们要实现这样一个功能模块。一个TreeView上有各种节点。我们对这样的一个Tree 的节点操作。比如复制,剪切,粘贴,重命名,查看属性、设置它的图标,添加到树节点上等等。每种节点的相同操作(比如复制)的实现是不同的。
你会怎么设计它:
在C++中我会这样做。
我会将每种结点实现成一个类。以实现各自的相关操作(比如复制,粘贴),这些类都继承至一个纯虚的父类,在这个父类中以虚方法的方式声名子类实现我的相关方法,这样做的好处是当你从Tree中取出一个节点时,你不必关心这个节点是什么类实现的,你只需要以纯虚的父类指针操作它就可以了,这样就实现了接口继承的所带来的优点。
但是,如果并不是每个节点都支持所有的方法,比如有些节点不允许复制,有些节点不允许重命名等,那么从父类继承的声名如何处理,实现成一个空方法么?还是不将这样的方法放到父类中?如果不放到父类中,就没办法以统一的方法操作所有的子类了!

请大家就这个问题畅所欲言。分不够我还可以加,虽然本人比较穷,但仍可倾囊相赠!
...全文
360 62 打赏 收藏 转发到动态 举报
写回复
用AI写文章
62 条回复
切换为时间正序
请发表友善的回复…
发表回复
ajoo 2003-11-08
  • 打赏
  • 举报
回复
w8u, 你要是管理者,或者是architect,就可以这么做啊。
关键看你自己的职责了。要各尽其责,而不是越俎代庖。

各个模块之间也是要区分职责的。该自己做的,自己做,不该自己做的,让别人搞定。

对manager来说,run()以及文档规定的语义就是我要的功能。

对下面子模块的负责人,他也要确定这个子模块的职责。负责分配职责的architect制订模块之间的接口,然后各个模块各行其是。

如此逐渐细分。模块的职责划分注意单一功能原则。每个模块做且只做一件事。



辉歌 2003-11-03
  • 打赏
  • 举报
回复
up
xiaoyunet 2003-10-31
  • 打赏
  • 举报
回复
Wolf0403(完美废人)
同意,最大化接口完全是饮鸩止渴。
辉歌 2003-10-31
  • 打赏
  • 举报
回复
对接口编程就是对规范编程。

假设你在写一个模块A, 里面需要调用某一个功能,不要手忙脚乱地去找实现这个功能的类。你只要自己清晰地定义出:我需要什么功能。把这些东西组成接口。就成了。
然后,在需要这些功能的地方,从外面接受一个这个接口的对象。

至于别人怎么实现这个接口,是别人的事,你只管定义好接口,写好自己的代码,就可以喝咖啡去了。
======================================================
有这么简单吗?
那我定义一个接口,就一个功能:工作,Run。
然后什么都不管了,全部让别人搞定。



辉歌 2003-10-31
  • 打赏
  • 举报
回复
还没有结论啊。继续学习。
pyd 2003-10-28
  • 打赏
  • 举报
回复
如果我们在编程中需要表达十种书,我们当然需要一个书的基类,而我们实际要用的并不是书而是每本具体的书,如果想在基类书中表达最大化接口,那它就不是书了,也就是书只能表达各种书的共性,也就是最小化接口,最小化接口的实现才应该和CLIENT无关,我认为应该是这样的逻辑。
请继续讨论,给予指正。
Wolf0403 2003-10-28
  • 打赏
  • 举报
回复
呵呵,正是。可惜这个话题好像已经被放弃了。
opqit 2003-10-22
  • 打赏
  • 举报
回复
fifo333 2003-10-21
  • 打赏
  • 举报
回复
高深,哪些书专门讲这种问题的?请高手指点。
CsdnPlayer 2003-10-21
  • 打赏
  • 举报
回复
拿到所求工资,算是一种目标:)
Wolf0403 2003-10-21
  • 打赏
  • 举报
回复
---------------------------------------------------------------
重要通知
经 完美国际软件标准组织 规定,面向对象的编程,既不是面向实现
的编程,也不是面向接口的编程,而是 面向工资 的编程。
诠释:不论面向什么,最终讲求的是拿到所求工资。
完美废人
面向工资编程元年
---------------------------------------------------------------
CsdnPlayer 2003-10-21
  • 打赏
  • 举报
回复
Just a joke :)
CsdnPlayer 2003-10-21
  • 打赏
  • 举报
回复
---------------------------------------------------------------
重要通知
经 公孙国际软件标准组织 规定,面向对象的编程,既不是面向实现的编程,
也不是面向接口的编程,而是 面向目标 的编程。
诠释:不论面向什么,最终讲求的是达到所求目标。
公孙智多星
面向目标编程元年
---------------------------------------------------------------
CsdnPlayer 2003-10-21
  • 打赏
  • 举报
回复
重要通知
经 公孙国际软件标准组织 规定,面向对象的编程,既不是面向实现的编程,
也不是面向接口的编程,而是 面向目标 的编程。
诠释:不论面向什么,最终讲求的是达到所求目标。
公孙智多星
面向目标编程元年
liushmh 2003-10-21
  • 打赏
  • 举报
回复
看看agile software programming,看看7个principle
Wolf0403 2003-10-17
  • 打赏
  • 举报
回复
最大化接口 总感觉对于解决问题没有任何好处。。。呵呵。因为子类是可以“扩展”而不是“缩小”范围的,所以最大化接口应该是基本不可能的
meijing 2003-10-17
  • 打赏
  • 举报
回复
有句老话: 世上没有绝对的自由。
我认为楼主就有点想要绝对自由的意思。
同一父类的不同子类之间虽然有共同点,但它们毕竟是不同的类,各自有各自的特性。
所以我认为指望在任何时候都可以互换是不正确的;虽然可以通过最大化接口来实现这样的目的。
step_by_step 2003-10-15
  • 打赏
  • 举报
回复
continue...
Wolf0403 2003-10-15
  • 打赏
  • 举报
回复
bahanzo1(绯雨流烟) :
就是 COM 模式了,呵呵。其实 COM 的设计确实是很好的,不过偶懒得学而已
laomai 2003-10-15
  • 打赏
  • 举报
回复
学习!
加载更多回复(42)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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