论坛首页 Java版

讨论interface在java编程中的作用

浏览 28706 次
该帖已经被评为精华帖
作者 正文
最后更新时间:2008-08-21
我理解的老庄的意思,

第一层:接口是用来实现的。

对这个用法,我同意老庄的观点,它不是必要的。本来类就已经是实现了,为什么还多加个接口?脱裤子放屁嘛!

第二层:接口是用来给类来提供一个视图的。
这个方法,在我的总结,主要作用就是封装。你可以进一步把一些实现细节封装在类内部。然后给外部一个最小的视图。
我的静态工厂的目的就是这个。
但是,我仍然同意它不一定是必要的。我的经验是,如果一个类要做成public的,漏到package外面,就考虑让它实现一个接口,隐藏构造函数,然后用静态工厂公开语义入口。这种api式的设计方式可以保证包内部的实现变化最小程度地影响包外面广大的用户。
至于包内部的东西,就不见的有这个必要。毕竟这种设计是有额外代价的。

第三层:接口是用来给类提供多于一个得视图的。
我对这个不以为然。一个类有几个视图并不重要。用户看见的只是一个一个的视图,谁管它们是不是同一个类的视图?当用户看见的是视图,具体类对他们已经毫无意义了。

而我的看法:接口是用来让你忘掉类而直接面对规范和协议的。
   
1 请登录后投票
最后更新时间:2004-09-28
接口显然是有语义的,如果两个不同的类,碰巧有几个语义完全不同的方法有相同的签名,就把它们抽象成一个接口,虽然从语法和静态语义上是合适的,但显然与接口的本意相悖。
  首先,明确一下接口有哪些类型的语义。直接能够想到的是每个具体方法的语义,姑且称之为状态语义,毕竟每个方法实际上改变的是实现类的状态;其次,则是这些方法的调用序列或顺序或某种关系所含的语义,称之为协议语义,或者说接口实际上也规定了一个有意义的调用序列(如果不存在这类序列,我认为这样的接口内聚度存在问题),两阶段提交中XA Resource的接口是其中的典型。
  接口没有属性,那么状态语义怎么表述?这是个难点。一开始我想到DBC,但是DBC似乎缺乏处理无状态对象的能力。这里需要的是一个抽象的状态机,包括了接口最小的一致语义所需要的抽象状态,接口上的方法引发这个状态机的变化。这实际上需要相当形式化的方式来描述。问题的难点在于怎么判断实现类是否遵循这个语义,也就是说描述接口的这个抽象状态机怎样映射到实现类的实际状态机上,能够自动(或者以足够方便的方式)映射是这种语义定义方式的关键。
  协议语义的描述看起来更加困难,序列是否有意义的说法太主观了。接口是被动的,不可能说在某种状态禁止调用某个方法,而只能在调用中判断合法性。而且,实现类对这类语义的遵循更难判断。反倒是可以轻易的核定调用类是否采用了合法的序列。
  但是,我相信接口语义的定义机制将会逐渐成为一个重要的方面。这将能够为大规模软件语义一致性测试提供一个非常有效的方式。
  但愿java1.5的metadata机制能够成为解决这个问题的一个契机。
   
0 请登录后投票
最后更新时间:2004-09-28
仅对java而言,现在对接口的处理方式是不自足的。
   
0 请登录后投票
最后更新时间:2004-09-28
charon 写道
仅对java而言,现在对接口的处理方式是不自足的。

不是很明白这是什么意思。
   
0 请登录后投票
最后更新时间:2004-09-28
charon 写道

  首先,明确一下接口有哪些类型的语义。直接能够想到的是每个具体方法的语义,姑且称之为状态语义,毕竟每个方法实际上改变的是实现类的状态;其次,则是这些方法的调用序列或顺序或某种关系所含的语义,称之为协议语义,或者说接口实际上也规定了一个有意义的调用序列(如果不存在这类序列,我认为这样的接口内聚度存在问题),两阶段提交中XA Resource的接口是其中的典型。

期待进一步的解释,我一直都觉得接口提供的是“状态语义”,“协议语义”是由协作图和序列图负责的。
我用一个简单的开发流程来说明一下我的理解.
1.面对一个业务问题,建模的时候要了解这个业务处理流程中涉及到的数据及对数据所做的处理.比如登录流程,数据是用户名和密码,数据的处理是提交、验证.
2.为了处理简单,引入oo,把用户名和密码封装为一个类,signon,它需要提供验证这个方法。这样和流程结合起来,就产生了它和用户之间的一个协作图和序列图。可以清晰地表示这个登录过程。
3.对于上面抽象的结果,signon,为了达到缓冲的目的,引入接口,告诉实现者,这个signon要实现验证功能。至于具体怎么实现,由类决定,在协作这个层次上,不会过多地考虑signonImpl去哪里取数据,怎么进行字符串的比较,以及是否把密码hash过后再进行比较之类的细节。

看上面的讨论,“反方”的观点基本一致,就是接口的作用更多地体现在设计上。但具体如何使用呢?可能就跟个人经验有关了,似乎莫衷一是
   
0 请登录后投票
最后更新时间:2004-09-28
下篇预告《基于java特性的OO开发过程》,下午或者晚上贴上来。
   
0 请登录后投票
最后更新时间:2004-09-28
最近在看axis,又发现了一段常看到的话。“实际上我们的代码和设计中的结构是不一样的,以后我们有机会改。”
http://ws.apache.org/axis/java/architecture-guide.html 写道

In fact, the Axis source code is not as cleanly separated into subsystems as the above diagram might imply. Some subsystems are spread over several packages and some packages overlap more than one subsystem. Proposals to improve the code structure and make it conform more accurately to the notional Axis subsystems will be considered when we get a chance.

常常在想,到底是先有代码还是先有设计啊?
呵呵,看来驱动力是功能,按照功能做代码,按照代码总结系统(应有的)设计。
   
0 请登录后投票
最后更新时间:2004-09-28
wuhaixing 写道
常常在想,到底是先有代码还是先有设计啊?

这是一个蠢的问题,就像问:"到底是先有鸡还是先有蛋"一个合乎逻辑的回答是:"一种较早的鸡下一种较早的蛋".对于代码和设计也是这样。
   
0 请登录后投票
最后更新时间:2007-04-20
庄表伟 写道
to:wuhaixing

你的例子,不是自底向上,而是需求的变更。当你有了一个class A。你就有了需要的功能,但是当你需要对这个class A有另外的看法时,你可以定义一个interface甚至多个interface,将它“贴”到这个class A上。

如果这样的需求没有出现,那么interface就是没有必要的。


在这里发表我很不成熟的看法如果就庄先生所说这种需求不出现的话可能接口的作用就不会体现出来
可是如果这类需求一而再再而三的出现呢 ?那么先生 什么好的方法去解决 ,特别是原来程序员开发完后走人, 程序由别人接 手的时候  作为管理层你希望的是后人即存程序之外直接添加上功能代码 还是在阅读即存代码后在其基础上修改
我认为前者的独立性更大 而且不会造成 对即存项目的影响
   
0 请登录后投票
最后更新时间:2007-04-26
不是很过瘾,感觉其他人和庄表伟功力不是在一个层次上。

老庄说了:“关键在于,有人认为,面向接口的设计,就是良好的设计了”
   
0 请登录后投票
论坛首页 Java版

跳转论坛:
JavaEye推荐