真理大讨论:Service层的接口是不是多此一举?原创
-
分歧出现的背景
-
这是谁的问题?代码架构的问题?
-
有什么问题?
-
解决问题的思路是什么?
-
总结
背景
但CRUD写的久了,确实会有一个疑惑,这层接口到底有没必要?(我们只讨论普通的、常见的场景)从工作的这么多年来看,这一层好像没太大作用,大多数接口一般只有一个实现类,大多数Service层中实现Interface的method中完成了所有的业务逻辑。
在网上搜了下,各说各的道理,各有各的大佬站台。这个点在团队内部也会出现分歧,并且引发内耗,所以也研究了一下。
1、这是谁的问题?
这是一个代码架构的问题。因为是否抽接口,其实是在讲代码的结构。
关于架构,我们再展开聊几句。
什么是架构?一个顶层结构。是为了解决复杂度带来的问题。
什么是代码架构? 软件系统中的组织结构和设计原则, 旨在实现系统的 可靠性 、 可扩展性 、可维护性和易于理解等特性。 代码架构涉及到对系统的整体结构进行规划和设计,包括模块划分、组件之间的关系、数据流向以及代码的组织方式等方面。 ChatGPT3.5
什么是好的架构?
坏的架构都是相似的,但好的架构通常具备以下几个重要的特点:
好的架构让你可以延迟做出一些重要的决定,可以在面对不确定性和变化时保持灵活性、可扩展性和可维护性。
2、有什么问题?
业务逻辑层中的每个类都抽一个接口,在大多数时候好像没有用,投入产出比不高。
为什么会“没什么用”?
大多数程序员的日常是这样的:领了需求,写一个Controller、一个Service、一个DAO就完事了。
期间,不用写单元测试,顶多写个功能测试。
总结一下:
我们CRUD“程序猿”不需要。
事实上大多数系统业务都比较简单,生命周期也短,一些创业项目3个月看不到收益就下掉了,因此不需要扩展,因为够简单;
不需要易于理解,因为够简单,代码够少。使用设计模式还可能被置疑有过度设计之嫌。
不需要可测试性,因为够简单,一眼逻辑就看到底了,调下接口看下就Ok了,最多写个功能测试。
因此,就很容易得到这个结论:
如果一个项目需要多实现、且多实现数量较多(不过一般项目不会有多个实现的),则推荐使用接口。否则不需要使用接口。
先抛个问题:在系统没有game over前,那个大佬敢站出来讲:
“这个项目很简单,不需要多实现、实现类也不会有多个?”
3、解决的思路是什么?
“好的架构让你可以延迟做出一些重要的决定,可以在面对不确定性和变化时保持灵活性、可扩展性和可维护性。”
面向抽象编程,让代码的可扩展性更好,让代码可以更容易适应需求的变化。
可以在尚未实现具体 Service 逻辑的情况下编写上层代码,如 Controller 对 Service 的调用;
Spring 默认是基于动态代理实现 AOP 的;
动态代理需要接口可以对 Service 进行多实现
架构思维,公众号:51CTO技术栈CTO问:Service层真的需要接口吗?
在java中,会使用public、protected和private这些访问修饰符,可以控制类的封装性、实现信息隐藏,并确保良好的代码组织和可维护性。
当然,统一不抽接口,也有这个效果。
增加一个新的实现类写新需求,要比在已经上线的方法中增加if else更加可靠、优雅。
总结
上层依赖下层的接口更稳定、更易于理解,在扩展性、维护性、可测试性也更好。
建立合适的代码规范也可以降低团队开发之间因代码风格不同引发的内耗,提升研发效率。
代码规范示例:
参考
https://www.oschina.net/question/2652412_2323397
#小程序://知乎/cTkkAK4oaPRdjlf