why javaer 什么都要搞一个 interface?

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

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

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

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

但像以下这种

IUserService

UserSeriveImpl

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

7804 次点击
所在节点    程序员
89 条回复
luzemin
2022-05-26 20:18:41 +08:00
1. 为了实现 OOP SOLID 中 D ,依赖抽象而不依赖具体,为了 N 年后的随时换掉具体实现而规划
2. 方便测试
3. 约束方法名称:具体实现类必须继承并且实现同名方法

以上都是理论,实际往往偏差比较大,基本是因为“模版就是这样”“业内都这样”而跟着做的。
vincent7245
2022-05-26 20:39:04 +08:00
规范,规范,还是 TMD 规范,这就是为什么 java 可以做超级大型的项目。当你一个人做项目的时候可以随意写,当四五个人做项目的时候,一般的口头沟通就可以了。当几百个人同时做一个项目的时候,没有规范你啥都做不了。当你做过大型项目你就明白了。这里的大型项目是指代码至少 10W+起步
ration
2022-05-26 20:39:49 +08:00
面向对象基本都是这样,除了多个实现,依赖注入外,还有其他好处。比如你可以只看接口就知道实现了什么功能,而看具体的类就有一大堆代码了。接口这种东西一开始是来源于硬件而不是软件。
qq1009479218
2022-05-26 21:44:10 +08:00
不做单测吧
qbmiller
2022-05-26 22:08:31 +08:00
大多数项目用不上.
大型项目确实要, 防止写飞
实战为准. 确实没必要
别的语言从没这么多破事
Rocketer
2022-05-26 22:36:34 +08:00
各种设计模式都是为了方便项目规模成长的,所以绝大多数“没必要”都是因为团队 /项目还不够大。

等规模大到设计模式显示出优势时,大概率就很难改了,最后变成💩山。

当然,一直写那种代码的程序员也不会意识到设计模式的优势,他们宁可把代码复制粘贴到一百个地方,也不愿把代码写得一劳永逸。只要不跳出舒适区,我就是舒适的😄
vone
2022-05-26 22:40:47 +08:00
方便单元测试和多实现。

但是现实是没卵用,因为这些复制粘贴的垃圾代码既没有单元测试也没有多实现。
HiShan
2022-05-26 22:42:37 +08:00
可以了解一下 DDD
git00ll
2022-05-26 23:14:25 +08:00
确实,我同事也有人喜欢整这些接口,每个 server 都整一个接口,我感觉没必要。
上面提单测的,单测与接口有什么关系,大部分情况下没接口使用 mockito 或 spock 都能搞定,遇到一点点搞不定的再整接口也行啊
RedBeanIce
2022-05-26 23:26:28 +08:00
还是网上流传的那句话,网友本科生 5%? v2exer 写业务的 5%?
ychost
2022-05-26 23:31:09 +08:00
当你写 framework 的时候,接口就很重要了,还有 IOC 、SPI 都非常方便
RiceNoodle
2022-05-27 00:57:29 +08:00
事实是,面向接口编程对写单元测试非常友好。
优秀的项目愿意这么设计是因为用得着,不代表每个项目都这么优秀。
asanelder
2022-05-27 01:51:46 +08:00
@ychost #71 framework 大量用接口俺感觉正常, 毕竟要考虑通用性, 但 web 项目嘛...
@git00ll #69 嗯,好像俺写测试时不用接口感觉也没啥
xuanbg
2022-05-27 02:42:06 +08:00
别问,问就是规范和习惯。

虽然没啥用,而且 Java 也早就支持接口的默认实现,但大家还是这么写而不是写成默认实现。
Kontinue
2022-05-27 08:42:50 +08:00
有好处也有包袱
cherryas
2022-05-27 09:01:35 +08:00
因为写个 interface 没几分钟,写完还能自动生成 impl 。
micean
2022-05-27 09:46:43 +08:00
写 framework 、library 是一定要的,业务上很多就多余。别提 mock……
Narcissu5
2022-05-27 09:58:21 +08:00
- 有些地方需要接口,比如 java 动态代理
- 如果你的接口几乎都只有一种实现,那么你的抽象可能不够。实际上你没有用到 OO 最重要的能力也就是多态
- 如果你对多态不感兴趣,建议转 Go 。实际上 Go 更符合大多国内程序员的思维模式
wangxin13g
2022-05-27 10:06:44 +08:00
吐槽接口的写代码不写单元测试吗
写项目的时候就不考虑后期有人重构的吗
写项目就一个人吗?
Akagi201
2022-05-27 10:13:59 +08:00
其实面向 interface 没有问题, 主要是要程序员要理解什么是 interface, 为什么会有 interface, 有的低级开发复制粘贴惯了, 直接把实现都复制过来这样根本没有意义. interface 本来就是让你自己梳理你的模块的接口的, 让功能自洽, 合理的设计接口, 而现实有的低级开发只是把一堆乱七八糟的东西堆到 interface.

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

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

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

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

© 2021 V2EX