why javaer 什么都要搞一个 interface?

2022-05-26 15:21:56 +08:00
 asanelder

最近看了几个 web 项目, 不明白的是, 为什么到处都是 interface? 而且很多 interface 只有一种实现?

俺理解的是, 只有在抽象的情况下, 以及可能有多种实现的情况下, 才需要 interface, 比如一个

IUserRepo 表示用户数据的存储, 而存储方式可能是有多种情况, 为了不在业务层耦合到具体的存储方式, 所以使用接口没问题.

但像以下这种

IUserService

UserSeriveImpl

对于这种业务层为什么还要抽象一种接口? 俺好像没见过 IUserService 这种接口有多种实现的情况?

7804 次点击
所在节点    程序员
89 条回复
BBCCBB
2022-05-26 16:08:52 +08:00
为什么我在只有一个实现的时候就不搞?
mgcnrx11
2022-05-26 16:09:13 +08:00
经历过麻木写 Interface ,然后变成觉得都是一种了就不写 Interface ,到最后维护的项目需求确实增长超出预期又退回去老老实实写 Interface 的阶段

这种设计模式嘛,你不知道后面会不会有用得上的时候,当真的用得上多种实现,就会庆幸当年没有偷懒写一个 Interface 了
MicroGalaxy
2022-05-26 16:13:14 +08:00
模板吧,我见过项目绝大部分都是只有一个实现。况且我写自己项目的时候都不写 Interface ,真的用不上
Bingchunmoli
2022-05-26 16:15:41 +08:00
代码生成的,也方便后续自己写其他实现..
Bingchunmoli
2022-05-26 16:20:15 +08:00
1. Spring 在 AOP 的时候,类实现了接口就使用 JDK 动态代理,没有则使用 CGLib
2. service 不写接口 有可能被 leader review 的时候打回来
3. 代码生成无成本
dcalsky
2022-05-26 16:25:04 +08:00
@asanelder Service 也可能 mock 呀,只要被依赖了,就应该被 mock 。
zzzkkk
2022-05-26 16:29:21 +08:00
@asanelder
一直没找到这种标准是从哪里来的... 找不到出处啊, 铁子
===================
出处肯定可以追朔到 j2ee 早期 从 interface 这东西诞生以后
lengyuqu
2022-05-26 16:31:05 +08:00
因为这样的模板开发过程中不容易出错,而且可以大量使用码农投入开发。

任何大规模普及的开发模式一定不是出于技术角度,而是商业运行的角度。显然这个更符合商业运作
lanlanye
2022-05-26 16:34:46 +08:00
现实确实是大部分接口只有一种实现,但对外使用接口能让你在更改实现的时候更好做一些,另外就是上面提到的需要 mock 的场景,这个可能更常见。

在 Golang 里还有避免写 * 这个理由……
SMGdcAt4kPPQ
2022-05-26 16:35:33 +08:00
有人用 interface 做 mixin 吗?
nicevar
2022-05-26 16:35:56 +08:00
再怎么吐槽,这都是 Java 一个非常好的地方,就是再烂历史包袱再重的项目随便换个人来接手,还能干得下去,换成其他语言实现的,都不想瞧一眼。
cubecube
2022-05-26 16:37:01 +08:00
框架用 interface 无可厚非,业务代码实现 interface 不香么
Huelse
2022-05-26 16:41:05 +08:00
留下足够丰富的信息确保项目可以持续迭代,哪怕是 shi
chendy
2022-05-26 16:43:05 +08:00
repo 用接口,方便多实现 / mock
往上的其实直接 class 就行了
spring 很早就自带 cglib ,没接口不能出代理的时代已经过去了……
cheneydog
2022-05-26 16:47:03 +08:00
我觉得 java 的 Interface 挺好的,语法上也没强制要写呀,只是习惯上要写,我也写,默认实现怎么快怎么来,期待着未来能改进。

我也希望 nodejs 中能写 interface ,但是不想用 ts 。
darksword21
2022-05-26 16:52:32 +08:00
如果突然某一层要换的话确实很方便,比如数据库,上层基本不用变,当然在公司里一般写完也不会变了

我是说我在 go 中这么写,java 没经历过
guxingke
2022-05-26 16:53:58 +08:00
如无必要 勿增实体

---
不妨从自己做起,没必要声明的时候就不声明呗。
毕竟真有必要的时候,再抽出一个接口并不困难。
Kaiv2
2022-05-26 16:56:42 +08:00
说下这种模式的优点
IUserService

UserSeriveImpl

我开发一个依赖 UserService 的模块, 你负责 UserService 模块的开发,但是还没实现。你可以先提供接口给我。

类似的 ( dubbo 服务也是这样)
slimhigh
2022-05-26 17:04:20 +08:00
你的理解是对的。大部分情况下是没什么用的,大家生搬硬套罢了。
retrocode
2022-05-26 17:06:12 +08:00
规范嘛, 恶心是真滴恶心, 不过好处是有这么一套通用甚至垄断的规范在, 不至于太恶心,不然高情商点百花齐放,低情商则神魔乱舞,一个人一套规范,天天吵最佳实现谁也不服谁那才是真的恶心了

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

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

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

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

© 2021 V2EX