代码编织梦想

点击上方 果汁简历 ,选择“置顶公众号”

优质文章,第一时间送达

format,png

转自:架构思维

链接:toutiao.com/i6882356844245975563

今天我们要探讨的问题是:Service层需要接口?

现在结合我参与的项目以及阅读的一些项目源码来看。如果「项目中使用了像Spring这样的依赖注入框架,那可以不用接口」!

先来说说为什么使用了依赖注入框架以后,可以不使用接口!

不需要接口的理由

我整理了支持Service层和Dao层需要加上接口的理由,总结下来就这么三个:

  • 可以在尚未实现具体Service逻辑的情况下编写上层代码,如Controller对Service的调用

  • Spring默认是基于动态代理实现AOP的,动态代理需要接口

  • 可以对Service进行多实现

实际上,这三个理由都站不住脚!

先说说第一个理由:「上层可以在下层逻辑没有实现的情况下进行编码」!很典型的面向接口编程,对层与层之间进行了解耦,看起来好像没有问题。

这种开发方式适合不同模块之间是由不同的人或项目组开发的,因为沟通的成本比较大。同时避免由于项目组之间开发进度的差异而相互影响。

不过让我们回想一下,在一般项目开发里面,有多少项目组是按层来切分开发任务的呢?实际上,大部分的项目都是按照功能划分的。即使是现在前后端分离的情况,单纯的后端开发也是按照功能模块进行任务划分,即一个人负责从Controller层到DAO层的完整逻辑处理。在这种情况下,每一层都先定义一个接口,再去实现逻辑,除了增加了开发人员的工作量(当然,如果代码量计入工作量的话,那开发人员应该也不是太排斥接口的!),实际没有任何用处。

如果开发人员想在下层逻辑没有完成的情况下,先开发上层逻辑,可以先编写下层类的空方法来先完成上层的逻辑。

这里推荐一个个人比较喜欢的开发流程,自上向下的编码流程:

  • 先在Controller层编写逻辑,遇到需要委托Service调用的地方,直接先写出调用代码。优先完成Controller层的流程

  • 然后使用IDE的自动补全,对刚才调用下层的代码生成对应的类和方法,在里面添加TODO

  • 等所有的类和方法都补全了,再基于TODO,按照上面的流程去一个个的完善逻辑。

此方法可以使你对业务流程有比较好的理解。

对于第二个理由,就完全不成立了。Spring默认是基于动态代理的,不过通过配置是可以使用CGLib来实现AOP。CGLib是不需要接口的。

最后一个理由是「可以对Service进行多实现」。这个理由不充分,或者说没有考虑场景。实际上在大多数情况下是不需要多实现,或者说可以使用其它方式替代基于接口的多实现。

另外,对于很多使用了接口的项目,项目结构也是有待商榷的!下面,我们结合项目结构来说明。

项目结构与接口实现

一般项目结构都是按层来划分的,如下所示:

  • Controller

  • Service

  • Dao

对于不需要多实现的情况,也就不需要接口了。上面的项目结构即可满足要求。

对于需要多实现的情况,无论是现在需要,还是后面需要。这种情况下,看起来好像是需要接口。此时的项目结构看起来像这样:

  • Controller

  • Service

    • ----接口在一个包中

    • impl ---实现在另一个包里

  • Dao

对于上面的结构,我们来考虑多实现的情况下,该怎么处理?

第一种方式,是在Service中新增一个包,在里面编写新的逻辑,然后修改配置文件,将新实现作为注入对象。

  • Controller

  • Service

    • ---- 接口在一个包中

    • impl ---实现在另一个包里

    • impl2 ---新实现在另一个包里

  • Dao

第二种方式,是新增一个Service模块,在里面编写新的逻辑(注意这里的包和原来Service的包不能相同,或者包相同,但是类名不同,否则无法创建类。因为在加载时需要同时加载两个Service模块,如果包名和类名都相同,两个模块的类全限定名就是一样的了!),然后修改配置文件,将新逻辑作为注入对象。

  • Controller

  • Service

    • ---- 接口在一个包中

    • impl ---实现在另一个包里

  • Service2

    • impl2 ---新实现在另一个包里

  • Dao

相对而言,实际第一种方式相对更简单一点,只需要关注包层面。而第二种方式需要关注模块和包两个层面。另外,实际这两种方式都导致了项目中包含了不需要的逻辑代码。因为老逻辑都会被打进包里。

不过,从结构上来看,实际方式二的结构要比方式一的结构更清晰,因为从模块上能区分逻辑。

那有没有办法来结合两者的优点呢?答案是肯定的,而且操作起来也不复杂!

首先将接口和实现独立开,作为一个独立的模块:

  • Controller

  • Service --- 接口模块

  • ServiceImpl

    • impl ---实现在另一个包里

  • ServiceImpl2

    • impl2 ---新实现在另一个包里

  • Dao

其次,调整打包配置,ServiceImpl和ServiceImpl2二选一。既然ServiceImpl和ServiceImpl2是二选一,那ServiceImpl和ServiceImpl2的包结构就可以相同。包结构相同了,那调整了依赖以后,依赖注入相关的配置就不需要调整了。调整后,项目结构看起来像这样:

  • Controller

  • Service --- 接口模块

  • ServiceImpl

    • impl ---实现在另一个包

  • ServiceImpl2

    • impl ---新实现和老实现在相同的包中

  • Dao

现在,ServiceImpl和ServiceImpl2模块中的包结构、类名都是一样的。那我们还需要接口模块吗?

假设,我们把Service接口模块去掉,结构变成了如下所示:

  • Controller

  • Service1 --- 老实现

  • Service2 --- 新实现

  • Dao

单纯的通过调整模块依赖,是否能实现Service的多实现?答案显而易见吧?


不使用接口的缺点

上面给出了不使用接口的理由。不过不使用接口并不是完全没有缺点的,主要问题就是在进行多实现的时候,没有一个强接口规范。即不能通过实现接口,借助IDE快速生成框架代码。对于没有实现的接口,IDE也能给出错误提醒。

一个不太优雅的解决是,将原来的模块里的代码拷贝一份到新模块中,基于老代码来实现新的逻辑。

所以,如果一个项目需要多实现、且多实现数量较多(不过一般项目不会有多个实现的),则推荐使用接口。否则不需要使用接口。

总结

本文针对「Service层是否需要接口」这个问题,指出需要接口的理由的问题。以及个人对这个问题的观点,希望对大家有一些帮助。

往期精彩回顾

让人又爱又恨的 Lombok,到底该不该用

Delombok 是个啥?居然可破 Lombok?

跳槽的必要条件是有一份好的简历

时候为自己的后半生考虑了——致奔三的互联网人

format,png

format,png

点个赞呗

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/weixin_37097680/article/details/111087456

谈谈微服务设计中的API网关模式-爱代码爱编程

关注 程序员成长指北,回复“1” 加入我们一起学习,天天进步 根据 Gartner 对微服务的定义:“微服务是范围狭窄、封装紧密、松散耦合、可独立部署且可独立伸缩的应用程序组件。” 与将模块高度耦合并部署为一个大的应用程序相比,微服务的目标是将应用程序充分分解或者解耦为松散耦合的许多微服务或者模块,这样做对下面几点有很大帮助: 每个

如何丰富测试手段,实现QA自身效率的提升-爱代码爱编程

作者|李京京 项目中QA同学需要针对不同项目特点,采用不同的测试手段,大家常用的测试手段包括:功能测试,接口测试,接口Mock测试等,那如何将这些测试手段应用到自己的项目中,形成特定的测试方案呢。下面会结合具体项目来作详细阐述。 一、接口自动化测试 项目名称:盘古类目体系改造 1、背景介绍 通过新老类目体系的相互映射,保证新老类目体系并行一

低代码风靡开发世界,开发人员应该感到害怕吗?-爱代码爱编程

全文共1938字,预计学习时长5分钟 图源:unsplash   LCAD市场规模庞大,发展迅速。Forrester预测,低代码开发平台市场将从2017年的38亿美元增加到2022年的212亿美元,实现爆炸性增长。Gartner预估,到2024年,65%的应用程序开发将使用某种形式的低代码应用程序开发。 推动低代码成为主流的四大功

谷歌程序员 20 行代码送你一个“老婆”-爱代码爱编程

code小生 一个专注大前端领域的技术平台 公众号回复Android加入安卓技术群 编辑丨张倩 文章来源丨机器之心 用 GAN 生成的 2D 二次元「老婆」已经过时了。 ‍ 还记得前不久的「‍东升发型生成器」吗?在那个视频中,B 站 up 主 Mars 隆重推出了自制的秃头生成器。不管你现在有多年轻,头发有多么浓密,那个生成器都能让你

再见QQ,再见QQ游戏!-爱代码爱编程

整套源码包括:SQLServer数据库安装文件、数据库建库建表sql、服务器端整套源码(含完整核心引擎源码)、105种客户端游戏类型。 这套源码含有的游戏类型如下: 代码编译和部署方式 整套源码我已经全部整理好了,服务端各个服务和游戏大厅程序,使用VS2013打开系统模块/Platform.sln,即可编译整个解决方案,如下图所示:

让你变厉害的7个底层思维-爱代码爱编程

职场&认知洞察 丨 作者 / findyi 这是findyi公众号分享的第89篇原创文章 如果把你的思维比做操作系统,那思维模型就是一个个App。 这些App会给你提供新的视角,快速帮你决策,提升你的工作效率。顶级的思维模型能提高你成功的可能性,并帮你避免失败。 华尔街大VFarnam Street曾这样描述思维模型:“思维模型是

Gdevops北京站2020收官活动归来-爱代码爱编程

这是学习笔记的第 2299 篇文章   昨天参加了社区组织的Gdevops全球敏捷运维峰会,还是收获满满,对我来说,参加了这么多大会,一般会有四类渠道的交流: 1)和社区的小伙伴交流,对于社区运营发展会一起聊聊不错的想法和点子 2)听技术主题的分享,在适当的时候还会和讲师做简短的沟通 3)和新老朋友在会场交流,时间有限,聊点近况,借大会的机会

谈谈微服务设计中的API网关模式-爱代码爱编程

关注 程序员成长指北,回复“1” 加入我们一起学习,天天进步 根据 Gartner 对微服务的定义:“微服务是范围狭窄、封装紧密、松散耦合、可独立部署且可独立伸缩的应用程序组件。” 与将模块高度耦合并部署为一个大的应用程序相比,微服务的目标是将应用程序充分分解或者解耦为松散耦合的许多微服务或者模块,这样做对下面几点有很大帮助: 每个

字节跳动CEO 张一鸣卧底公司群2天,怒斥员工摸鱼-爱代码爱编程

来源:码个蛋,整理自互联网 张一鸣卧底公司群内,活捉摸鱼员工 12月9日,一张字节跳动CEO--张一鸣怒批,公司员工上班时间专注聊游戏浑水摸鱼的行为。在各大社交平台流转。作为有千亿估值的字节跳动CEO,亲自下场怒批摸鱼行为,迅速点燃了上班摸鱼这个话题。 据截图信息来看。张一鸣是之前因为“试玩原神,在飞书搜到并加入了这个群。最近我发现这个

【报告分享】2020中国消费市场发展报告.pdf(附下载链接)-爱代码爱编程

大家好,我是文文(微信号:sscbg2020),今天给大家分享商务部研究院于2020年12月发布的报告《2020中国消费市场发展报告:新消费成为引领国内大循环的重要动力.pdf》,关注新消费领域的伙伴们可以看下呀。 本报告工37页,包含如下四大部分: 1、2020年消费发展环境; 2、2020年消费发展特点; 3、2020年消费政策导向;

谷歌程序员 20 行代码送你一个“老婆”-爱代码爱编程

code小生 一个专注大前端领域的技术平台 公众号回复Android加入安卓技术群 编辑丨张倩 文章来源丨机器之心 用 GAN 生成的 2D 二次元「老婆」已经过时了。 ‍ 还记得前不久的「‍东升发型生成器」吗?在那个视频中,B 站 up 主 Mars 隆重推出了自制的秃头生成器。不管你现在有多年轻,头发有多么浓密,那个生成器都能让你

​文末赠书 | DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?...-爱代码爱编程

点击上方“民工哥技术之路”,选择“设为星标” 回复“1024”获取独家整理的学习资料! 岁末将至,2021年已进入倒计时。DB-Engines最近发布了2020年12月份的数据库排名。该网站根据数据库管理系统的受欢迎程度对其进行排名,实时统计了363种数据库的排名指数。前10名的排行情况详见下图:   2020年12月前10名排名情况