在 Java 业务系统的开发中, service 层有必要写个接口吗?

2021-03-12 10:15:29 +08:00
 awesomeMen
感觉没啥卵用啊?有大佬出来解答一下吗?
5946 次点击
所在节点    Java
44 条回复
RedBeanIce
2021-03-12 10:18:32 +08:00
大部分系统没用。。。
hello2060
2021-03-12 10:21:32 +08:00
接口那肯定是因为要复用啊,把公用的部分抽取出来,没这个需求就不用呗。
justNoBody
2021-03-12 10:22:35 +08:00
如果你这个类的工作简单,且业务上目前没有什么需要扩展的,没有什么变化点,我觉得是可以不写接口的。
但是,如果这个 service 会存在多种实现的时候,比如你的 service 是需要调用运营商的短信接口,然后你们对接了多个运营商,这个时候接口就非常有必要了。
有了这个接口以后,其他同学只需要根据你定义的接口,传入必要的参数,选择一个合理的实现(或者你用策略模式封装一下),就可以非常简单的发出短信。
个人见解,欢迎讨论
awesomeMen
2021-03-12 10:22:59 +08:00
@hello2060 为什么复用就要加个接口?直接在 service 层写方法不行吗?
yeqizhang
2021-03-12 10:24:21 +08:00
面向接口编程... 主要是接口代理、接口继承、极小的可能直接改成 rpc...
wakzz
2021-03-12 10:24:59 +08:00
绝大多数系统用不上接口抽象,后来就很少用接口了,除非一开始就确定这快逻辑有多个实现类所以要抽象个接口出来。
hafuhafu
2021-03-12 10:27:48 +08:00
你要是保证项目所有 service 从现在到将来都只有一个实现,那肯定没用啊。
这个就是个规范而已,约定优于配置。你喜欢的话不要 service 都行。而且业务系统这种基本类和接口都是自动生成的,在意这个干吗...不就接口加一个方法,实现类实现一下的事。
KarmaWu
2021-03-12 10:28:01 +08:00
看情况,假设要区分多个版本的接口,须有不同的实现类
securityCoding
2021-03-12 10:29:01 +08:00
1. 如果都是内部自己调用,那没有必要,一个 class 撸到底就行
2. 如果有外部 rpc 调用的话,还是定义一个接口方便打包到 client-sdk 给别人
yeqizhang
2021-03-12 10:34:40 +08:00
@yeqizhang 才发现说错了,接口哪有继承....修正:接口多个实现
chendy
2021-03-12 10:35:07 +08:00
大部分业务场景用不上,能想到的需要用到的场合:
1. 上古系统没有 cglib 之类的只能用 Proxy 所以必须接口 ​
2. 需要多个实现
3. 要分发 service 层代码
kingwrcy
2021-03-12 10:37:26 +08:00
没有用.

除非你时刻准备拿另外一个类来替换当前类.

那是有必要的,否则没有用.

建议不要接口.
soupu626
2021-03-12 10:38:03 +08:00
基本原理就是,大家先约定好,要什么参数,什么返回,然后就可以不关心底层细节和上层逻辑,各干各的就行了,还有就是结对的时候,便于测试,定好接口,一个写实现,一个写测试,本质上是为了解耦
但是现在大家都是一个人一把梭,就是个象征意义,可以不加
Macolor21
2021-03-12 10:43:21 +08:00
提问之前善用搜索引擎,了解下提问的艺术,这个问题在 StackOverFlow 已经有人提问,并且多个答案很好的解释了。/questions/55087578/do-i-really-need-to-create-interfaces-in-spring

总结来说,这样的写法是用于扩展用(利用 DI ),你常规理解的用法,这个 service 有不同实现,然后就是 DI 的好处了。

但如果你的 service 不需要另外的实现,你可以不用写,Spring IOC 也能将你的 service 注入到其他类中。现在微服务盛行,没啥机会让你为一个 service 写多个实现了。

但是基于接口,你可以在测试时,不使用生产的业务,通过写一个 Mock 实现,配置不同的配置文件,来测试你的这个 service 接口。
zjsxwc
2021-03-12 10:45:47 +08:00
用 interface,是为了能够方便地在屎山上拉屎啊,

不用 interface,你需要挖开老屎,看老屎里面有啥,用来 interface,你只管在老屎上面拉新屎。
xlui
2021-03-12 10:53:19 +08:00
先说结论,有必要。

就算只有一个实现类,也应该保留接口。这种情况下,通过查看接口,我能很快的找到对外暴露的方法,后续维护重构都很省心。

如果不保留接口,那我在查看类的功能时候就得遍历所有的 public 方法,时间一长,转手的人一多,这个类就会无限膨胀下去,最终变成屎山。
zjsxwc
2021-03-12 10:58:00 +08:00
interface 无非就是给屎打上标记而以,这是黑色的屎、这是黄色的屎,这是硬的屎,这是稀的屎,
这个坑只能拉 又黄有稀的屎,我就拉 又黄有稀的屎,我 tm 才不管你这个坑里面有什么屎,以前有谁在这个坑里面拉屎。



如果屎没有各种标记分类,就相当于,这是张三拉的屎,这是赵四拉的屎,tm 的这个坑居然只能张三来拉屎,我要拉屎,只能让张三来代替我拉屎了,张三又不在,怎么办啊,只能把我变成张三,很累的好不。
zjsxwc
2021-03-12 11:01:38 +08:00
当然,我可以继承张三啊,我就又可以拉屎了,可是很多时候,我虽然继承了张三,但我看不惯张三,张三吃素,我吃肉的,根本就是格格不入
sleeepyy
2021-03-12 11:01:48 +08:00
@zjsxwc 直接看呕吐了。。。
zjsxwc
2021-03-12 11:13:18 +08:00
当然,你可以一个屎填坑,这个坑永远只能拉这个屎,有需求,就改造这个屎本身,也就是楼主主题里说的。

我明明能一个屎完事,这个 final 屎就是牛逼!没有毛病。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/760924

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX