转自:http://www.javaeye.com/topic/7776
1、接口的定义是由谁来定义的,但是这样的思路其实存在以下几个问题:
1)按照先定义接口,在进行实现的思路,那么肯定是先有interface,才有class的,对吧。那么咱们讨论一个真实的系统时:这就必然导致一个至顶向下的开发过程,那么我就需要问你了,当你用这样一种思路进行开发时,对于一个Web项目,你是不是会先从jsp或者servlet写起呢?
2)还是按照先定义接口,再进行的实现的思路,那么一个class实现多个interface的情况如何才会出现呢?
3)当接口是我定义的,而实现是别人做的这样情况出现的时候,你的下面这句话就很难理解了“接口是你自己定义的。反映你自己的需求。什么叫没有完成? ”如果按照你的说法,那么需求怎么会变的呢?当需求变的时候,从哪里开始变起呢?
2、关于单元测试的问题,我始终认为单元测试并不能等于100%测试。假设A要B一起工作的,你通过单元测试,可以确定的,是A和B可以各自独立工作。那么我们应该通过什么方法,来确认A和B可以协同工作呢?
按照我的思路,假设A需要使用到B的功能,那么我会先测试B,在保证B通过了所有测试之后,我在测试A,假设出了问题,我就知道问题只会存在于A。就像一层一层打基础一样,当我的底层基础得到确认之后,我才能够再向上搭一层。
ajoo,你现在应该可以看出来了,我们俩的思路是相反的,一个是至顶向下,一个是至底向上。但是按照TDD这样的思路,我相信本质上他就是支持至底向上的。当然,TDD蕴含至底向上大家可以讨论一下,看看我是不是理解正确。
3、关于工作量的问题,我本来希望你通过代码来说明“什么情况下,才会出现,只需要改类,不需要改接口的情况呢?”
而你的回答甚是标准“again,接口IB围绕你的需求定义,并不依赖于B。抽象不依赖具体。B改了, 只要你的需求没改,接口就不用改。”
那还是我来举例子吧。
第一种,使用接口的情况
- //接口
- publicinterfaceIA{
- publicvoiddoSomething();;
- }
- //实现
- publicclassAimplementationIA{
- publicvoiddoSomething();{
- System.out.println("doSomething");;
- }
- }
- //调用
- IAa=newA();;
- a.doSomething();;
第二种,不使用接口的情况
- //直接实现
- publicclassA{
- publicvoiddoSomething();{
- System.out.println("doSomething");;
- }
- }
- //调用
- Aa=newA();;
- a.doSomething();;
无论以上的哪一种情况,只要doSomething这个函数的接受参数等等属性没有改变,那么接口和具体的对象都是不用改的。而如果doSomething的接收参数发生改变,第一种使用接口的例子,就需要改两个文件,而第二种则只需要改一个文件。当然,在调用者那里,都是需要改的。这就是工作量,ajoo说:“对你使用接口耦合的bonus啊。反正是免费的。”我可不认为是免费的,在需求尚未固化之前,我每次如果能少改一个文件,那也是很划算的。