锁定老帖子 主题:对于接口越来越迷茫
精华帖 (0) :: 良好帖 (6) :: 新手帖 (4) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-02-24
最后修改:2012-02-24
flashing 写道 downpour 写道 在J2EE的应用程序中编写接口,与实际的业务场景有很大的关系。我这里有一个比较现实的例子可以描述一下。
我们在做一个美国项目的时候,有一段业务逻辑需要连接到美国的另外一个应用程序获得一个状态信息,这个远程调用非常慢,通常返回一个结果需要10分钟。比较恶心的一点是,这个状态信息是业务逻辑的关键信息,我们不得不根据不同返回情况来编写后续业务。 这时候接口的作用就体现出来了。因为这个Service Call一旦是一个接口,我们就可以使用其他的实现类来代替原本非常恶心的Remote Call的实现,从而使得我们能够从非常慢的一个远程调用中解脱出来。 所以,在典型的应用程序中,使用接口进行编程的核心作用是可以在适当的时机切换不同的实现方式从而是整个过程变得更为可控。 当然,另外一点,楼主也可以参考一下。楼主可以去浏览一下所有的设计模式,看看这些设计模式的应用是不是绝大多数都建立在接口的基础之上?所以接口的使用在很大程度上是最佳实践的一种集合体现。 之前的一些说法,有的相对比较靠谱,有的则毫无逻辑。希望楼主在参考时加以甄别。 这个说法很滑稽,用了接口就能解决一个remoting 10分钟?如果你仅仅是需要cache一下,那和接口也没有关系。典型的remoting架构里面,一个proxy模式是很正常的,所有底层的工作都应该在这个层面进行,过去的确什么模式都有,corba的代码生成,ejb的接口,至于各种ws*和rest的服务,说实话没有接口有个文档一样可以访问或者通过自描述来导入服务,强制的接口越来越没有必要。 换句话说接口是纯虚的,纯虚啊,这个虚字是重点啊,每次查实现的。。。 最后:所以,在典型的应用程序中,使用接口进行编程的核心作用是可以在适当的时机切换不同的实现方式从而是整个过程变得更为可控。 这句话就是在骗自己,99%的时候,这是不可能的。尤其是写个xxxdao然后写个xxxdaoimpl这种的,用了jdbc的指望以后换jpa、mybatis或者hibernate,写了xxxservice再写个xxxserviceimpl然后指望通过配置就直接暴露服务的,都是在玩自己。。。 另外代码量的增多其实让整个过程更不可控,java的程序员都太过渡设计了,考虑了太多没用的东西,举个例子,apache的httpclient3.1->4.x,最近再一比较python的urllib,全是眼泪啊。。。 首先,关于downpour说的“远程调用慢”,这个情景确实跟用不用接口没什么关系,如果一定要有点关系,那就是写一个远程调用的接口,开发阶段使用本地虚拟环境作为接口实现类,这样访问快,开发快;正式部署阶段,换上调用实际远程地址的接口实现类。 然后关于你说的接口无用论,我想说的是,接口用于不用,可以用两句话笼统地概括出来: 对于软件架构师:接口是大用特用,理论上软件架构师暴露给架构应用者的代码,应该全部是接口; 对于普通流水线码农:接口能不用就不用,因为你不够资格,也不需要,接口定义是架构师的工作,码农没有能力定义接口、约束实现。 ================================================================================= 接口这任务,从流水线码农身上摘掉以后,码农自己也轻松了很多。 在我们团队,普通组员一个接口都不用写,他们写了我也会让他们删除,因为接口是架构师的任务,他们没有能力定义一个具有约束力的接口。 我们的团队成员,使用通用dao,完成一个页面的开发,只需要建三个文件: 1、视图文件; 2、控制器类; 3、Service类 仅此而已,组员省心省力,不用去写任何配置文件,因为一切都基于命名约定:约定优于配置。 ================================================================================== simple is better,简单就是美 谁的孩子谁抱走,流水线码农不能揽架构师的活,架构师也不该把自己的任务仍给流水线码农。 在我们公司,架构师跟流水线码农界限分得非常清楚,架构师闲的时候可以做点流水线码农的活,但是流水线码农绝对不可以干架构师的任务。 ================================================================================== 战斗机设计师只应该设计图纸,不应该去拧螺丝钉; 战斗机组装工人更不可能去设计战斗机图纸,他只可以拧螺丝钉。 我这么说并不是看不起流水线码农,只是实事求是而已,我相信每个流水线码农,在经验丰富,创新能力、独立解决问题的能力提高以后,都有潜力成为架构师。 |
|
返回顶楼 | |
发表时间:2012-02-24
软件架构设计的六大原则
1.“开-闭”原则(OCP) Software entities should be open for extension, but closed for modification. 对扩展开放,对修改封闭。 2.里氏代换原则(LSP) 凡是基类适用的地方,子类一定适用。 3.依赖倒转原则(DIP) 要依赖抽象,不要依赖具体。 4.迪米特法则(LoD) 一个对象应该对其他对象有尽可能少的了解。 5.接口隔离原则(ISP) 使用多个专门的接口比适用单一的接口要好。 6.合成/聚合复用原则(CARP) 要尽量使用合成/聚合,尽量不要使用继承。 http://softbeta.iteye.com/blog/1185581 |
|
返回顶楼 | |
发表时间:2012-02-24
flashing 写道 这个说法很滑稽,用了接口就能解决一个remoting 10分钟?如果你仅仅是需要cache一下,那和接口也没有关系。典型的remoting架构里面,一个proxy模式是很正常的,所有底层的工作都应该在这个层面进行,过去的确什么模式都有,corba的代码生成,ejb的接口,至于各种ws*和rest的服务,说实话没有接口有个文档一样可以访问或者通过自描述来导入服务,强制的接口越来越没有必要。 怎么说呢,我的情况比较复杂。其实我想表达的意思是切换实现在实际应用中为我们带来的好处。这和是否强制使用接口并没有关系。我对于这个问题的态度一向比较开放,解决问题可以使用多种方式,接口是其中的一种比较廉价而简单额方式而已。 flashing 写道 最后:所以,在典型的应用程序中,使用接口进行编程的核心作用是[b]可以在适当的时机切换不同的实现方式从而是整个过程变得更为可控。 这句话就是在骗自己,其实99%的时候,这是不可能的。尤其是写个xxxdao然后写个xxxdaoimpl这种的,用了jdbc的指望以后换jpa、mybatis或者hibernate,写了xxxservice再写个xxxserviceimpl然后指望通过配置就直接暴露服务的,都是在玩自己。。。 这个倒真不是在玩自己。我们目前自己做项目的时候有专门的Mock目录来切换生产环境上的某些实现。这主要是由于有的时候某些依赖并不由我们team负责,在一切都未知的情况下,使用接口而不是具体的实现类来进行模拟,可以保证未来我们无需做任何配置上的切换和代码切换。这些切换的工作都会在deploy的时候自动完成。 |
|
返回顶楼 | |
发表时间:2012-02-24
只能说,在需要的时候用上接口才是正道。单纯说为了使用接口而使用接口,毫无意义可言,只会增加工作量。
|
|
返回顶楼 | |
发表时间:2012-02-24
最后修改:2012-02-24
airball 写道 只能说,在需要的时候用上接口才是正道。单纯说为了使用接口而使用接口,毫无意义可言,只会增加工作量。
你这么说,其实等于是没说。 因为:问题的关键是:什么时候是“需要接口?什么时候是“不需要接口?” 我认为这个问题不应该由普通的流水线码农来回答,何时需要接口、何时不需要接口是软件架构师的任务,对于流水线码农来说,他只有两件事可做: 1、直接使用普通类; 2、创建架构师定义接口的实现类; 普通码农,对于代码只有这两种事情可做。 而具体到我,我留给流水线程序员的余地更小,我的团队成员对于代码,只有一件事可做,那就是: 继承架构师定义的父类 |
|
返回顶楼 | |
发表时间:2012-02-24
最后修改:2012-02-24
前面的回复没看,直接回答楼主的疑惑
接口不是用来给你修改代码的用的 接口是用来给你扩展功能用的 你只是修改代码,当然用不用接口无所谓 尤其是修改api的时候,接口还会给你带来困难 java所谓的灵活 是包括两部分的 1 是修改的灵活 2 是扩展的灵活 kentbeck在书中说过 灵活的价值是程序可以改动的更容易。而不是换一个 而接口服务的 是扩展的灵活 但是接口对于减少修改的代价,也是有很大价值的 如何改动的更容易,有个核心 就是:将 影响范围缩到最小,变化只在指定的局部区域作用 在项目中大量使用接口的附加好处,就是能将变化锁定在局部区域. 不论你是要修改,还是要扩展,都会变得简单和直接,易于定位 所以 如何使用抽象才是 一个相对需要经验的能力 他要求我们: 1 不要创建没有价值的抽象 2 不要在没有需求的时候过度考虑 变化和扩展性 |
|
返回顶楼 | |
发表时间:2012-02-24
youarestupid 写道 airball 写道 只能说,在需要的时候用上接口才是正道。单纯说为了使用接口而使用接口,毫无意义可言,只会增加工作量。
你这么说,其实等于是没说。 因为:问题的关键是:什么时候是“需要接口?什么时候是“不需要接口?” 我认为这个问题不应该由普通的流水线码农来回答,何时需要接口、何时不需要接口是软件架构师的任务,对于流水线码农来说,他只有两件事可做: 1、直接使用普通类; 2、创建架构师定义接口的实现类; 普通码农,对于代码只有这两种事情可做。 而具体到我,我留给流水线程序员的余地更小,我的团队成员对于代码,只有一件事可做,那就是: 继承架构师定义的父类 这位大侠一口一个“普通码农” 印证了您的照片,指点江山啊 |
|
返回顶楼 | |
发表时间:2012-02-24
最后修改:2012-02-24
zouruixin 写道 youarestupid 写道 airball 写道 只能说,在需要的时候用上接口才是正道。单纯说为了使用接口而使用接口,毫无意义可言,只会增加工作量。
你这么说,其实等于是没说。 因为:问题的关键是:什么时候是“需要接口?什么时候是“不需要接口?” 我认为这个问题不应该由普通的流水线码农来回答,何时需要接口、何时不需要接口是软件架构师的任务,对于流水线码农来说,他只有两件事可做: 1、直接使用普通类; 2、创建架构师定义接口的实现类; 普通码农,对于代码只有这两种事情可做。 而具体到我,我留给流水线程序员的余地更小,我的团队成员对于代码,只有一件事可做,那就是: 继承架构师定义的父类 这位大侠一口一个“普通码农” 印证了您的照片,指点江山啊 软件开发一定要分清各自的任务,架构师和普通流水线码农有本质的区别,任务不可混淆,这是我工作中得出的最重要一条教训:“绝对不能够由流水线程序员定义全局约束性接口”。 另外: 我这么说并不是看不起流水线码农,只是实事求是而已,我相信每个流水线码农,在经验丰富,创新能力、独立解决问题的能力提高以后,都有潜力成为架构师。 |
|
返回顶楼 | |
发表时间:2012-02-24
youarestupid 写道 什么乱七八糟的鸟儿逻辑,不懂不要装懂! 你不要不懂装懂,虚心点 |
|
返回顶楼 | |
发表时间:2012-02-24
youarestupid 写道 airball 写道 只能说,在需要的时候用上接口才是正道。单纯说为了使用接口而使用接口,毫无意义可言,只会增加工作量。
你这么说,其实等于是没说。 因为:问题的关键是:什么时候是“需要接口?什么时候是“不需要接口?” 我认为这个问题不应该由普通的流水线码农来回答,何时需要接口、何时不需要接口是软件架构师的任务,对于流水线码农来说,他只有两件事可做: 1、直接使用普通类; 2、创建架构师定义接口的实现类; 普通码农,对于代码只有这两种事情可做。 而具体到我,我留给流水线程序员的余地更小,我的团队成员对于代码,只有一件事可做,那就是: 继承架构师定义的父类 流水线程序员? 形容的挺贴切,但是不用考虑团队成员的主动性吗? 只做这个,怎么提升团队整体水平 |
|
返回顶楼 | |