java services demo_java web 中dao 层和service层都使用接口,是否是为使用接口而使用接口?...

谢邀

使用接口是为了调用与实现解耦,带来的好处是可以各干各的了,带来的坏处是从一个概念变成了两个概念,增加了系统的复杂度。衡量一下在具体场景中是弊大于利还是利大于弊,就可以做选择了。当然,在大部分场景下,还要考虑一个因素,就是你会不会写接口。没有良好接口设计能力的人,写出来的接口抽象不合理,等于没写,什么好处都得不到,只有坏处,这种情况下干脆别写。那怎么衡量你会不会写接口呢,我的经验是,至少见过一次写了接口后得到明确好处的例子。

什么情况下需要各干各的?

最简单的场景,写接口的是你,写实现的是你小弟。当然大多数类似情况没必要真的建一个interface然后再让人家去implements,把函数的第一行写好,注释写好,代码提交上,里面的内容让小弟去填就行了。

另一种情况,调用代码先于实现代码编写。比如你开发的是struts这种东西,那你指定得搞个Action接口。

再一种情况,多种业务的模式类似。此时这个接口类实际上相当于某一层的抽象。定义出一个层后,有多种实现,然后通过向调用端注入不同的实现类,实现不同的逻辑。如果这种注入不能在编译期完成的话,也就需要用接口抽象一下。

上面这几种情况写得有点绕,没办法,太难表述了并且好多事我自己也没想明白……

说到题目中的场景。

先说dao,这玩意儿是做数据库读写的。对应一下上面那几种情况:你作为项目架构师想写两行代码就让苦逼小弟加班干活然则自己去泡妹子的话,可能需要写个interface里面几个抽象的insert、delete之类的函数;项目在快速原型阶段如果客户满意就掏钱买oracle如果客户不满意就得免费MySQL的话,你可能需要定义个dao接口然后先用内存数据库写点能让原型跑起来的实现,等一切有定论了再说;每个类都有一个dao,每个dao都有crud基本方法的话你可能需要定义一个通用Dao接口然后搞点代码技巧不用一个个的去写体力代码从此登上人生巅峰。所以dao接口还是有用的。

再说service,这玩意儿更得具体问题具体分析。不去抠理论的话,什么是service,我的理解就是一段段实现了某个逻辑的代码的组合。所以service是个比dao更抽象的概念,严格来讲dao就是一种service。只不过在java web开发中,dao是个人人都得写的东西,所以都拿出来单说了。因此,后面说的service跟dao没有本质分别。

还是上面说的那几种情况:

先从工序上说,你在写上一层的时候,会用到下一层提供的逻辑,具体表现形式就是各种各样的service类和里面的方法。上一层开搞的时候,一定会知道的一个事是下一层会干什么事,比如“将传入编号对应的人员信息设置为离职”,但下一层的代码不一定已经一行一行写出来了。所以这会儿需要有个接口,让写上层代码的人先能把代码写下去。有各种理由可以支持这种工序的合理性,比如一般来说,上一层的一行代码会对应下一层的好多行代码,那先让写上层代码的人写一遍,解决高端层面的bug,会提高很多效率。

再从抽象角度说,不同业务模块之间的共用,不一定是共用某段代码,也可能是共用某段逻辑框架,这时候就需要抽象一个接口层出来,再通过不同的注入逻辑实现。比如模块1是登记学生信息,模块2是新闻发布,看上去风马牛不相及。但分析下来如果两个模块都有共同点,顺序都是1、验证是否有权限 2、验证输入参数是否合法 3、将输入参数转化为业务数据 4、数据库存取 5、写log,那就可以写一个service接口,里面有上述5个函数,再分别写两个service实现。具体执行的时候,通过各种注入方法,直接new也好,用spring注入也好,实现不同的效果。

当然上面说的这种情况很少有人这么干,因为已经普遍到这个程度,再精化精化就是struts了,java web的各种mvc框架都提供机制给你干这个事。但是每个项目或产品,都应该可以用类似的思路抽象出一些东西,如果抽象合理,会很大程度的提高项目架构的合理性。

这些要是能搞定,那什么写个接口然后实现个mock用于测试这种事,信手拈来。

想说的差不多都说了,发现写乱了……凑合看吧,我没什么理论基础,都是做各种小项目的野路子。

====强行装逼分割线===

1、项目架构师要不断找出各种层面的重复,然后消灭之。

2、《梦断代码》中写道,很多人把软件工程的各个要素视为开关,于是总想着是开还是关,但其实这些要素都是旋钮,你需要仔细的调整每个旋钮的位置,才能写出合格的软件作品。

3、软件工程的精髓就在两个字:折衷。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值