why javaer 什么都要搞一个 interface?

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

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

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

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

但像以下这种

IUserService

UserSeriveImpl

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

7760 次点击
所在节点    程序员
89 条回复
janus77
2022-05-26 15:23:32 +08:00
面向接口编程是这样的
dcalsky
2022-05-26 15:25:43 +08:00
如果经常写测试你就会发现除了正常的实现,还有一种叫 mock 实现。

结论:写 interface 是方便测试的时候 mock 以及今后多实现拓展;但是现实却是很多人压根不写测试,活生生把 interface 玩成样板模板。
eote
2022-05-26 15:26:01 +08:00
使用 interface 进行 AOP 效率比较高,因为对外暴露的方法已经确定了。还有就是 web 领域外包遗毒,DDD 模式深入骨髓
Oktfolio
2022-05-26 15:30:43 +08:00
Spring 在 AOP 的时候,类实现了接口就使用 JDK 动态代理,没有则使用 CGLib
zzzkkk
2022-05-26 15:31:14 +08:00
那种设计已经成了业界标准
更恶心的是
有人竟然把这套东西搬到 php

这套东西最没技术含量
unco020511
2022-05-26 15:39:39 +08:00
因为这是毒瘤模板
pavelpiero
2022-05-26 15:40:15 +08:00
😂
pavelpiero
2022-05-26 15:41:30 +08:00
你好,其实你举例的 userservice 最贴近这种场景了,因为多样化的登录方式会涉及到不同的实现,比如密码登录,扫码登录,刷系统授权登录。
banmuyutian
2022-05-26 15:45:40 +08:00
因为大部分是毒瘤模板+1
crysislinux
2022-05-26 15:49:02 +08:00
这就叫依赖反转
asanelder
2022-05-26 15:51:18 +08:00
@dcalsky #2 应该是 mock 的 repo 吧, 比如, 测试的时候, 可能不依赖真实的数据库, 而是依赖内存存储之类的, 本来就是要测试业务逻辑的, 不应该 mock UserService 这咱吧...
@Oktfolio #4 第二种不是效率更好么?
@zzzkkk #5 一直没找到这种标准是从哪里来的... 找不到出处啊, 铁子
@pavelpiero #8 俺理解的是, 如果登陆方式要抽象的话, 设计一个 ILogin 接口就好, UserService 依赖这个, 而不必把 UserService 也搞成接口
JaguarJack
2022-05-26 15:52:07 +08:00
明明业务里面只有一种实现,为什么还需要定义 Interface ?我也有这样的疑问
yohole
2022-05-26 15:55:33 +08:00
对于大型项目或者可预见会持续迭代的中大型需求,面对接口编程没有错,成本也是基本客户忽略

但是实际情况下正如你所说的,很多系统或者需求可能在第一次上线之后,基本很少改动或者不会有变化了,这种情况下完全可以直接写实现的,不需要任何接口的实现

如果一定要扯远一点,这有可能是因为 JAVA 从诞生的那一刻的定位和宣传都是企业级,可维护性和可扩展性可能是要放首位的

然后很多后来者不断受着各种设计模式和大量开源项目的影响,于是就慢慢变成现在的"标准"和事实了
Oktfolio
2022-05-26 15:56:42 +08:00
@asanelder JDK 动态代理从 1.8 开始就比 cglib 高了吧。不过大多数人不会考虑这个问题,按照“传统”来就是了
makelove
2022-05-26 15:58:08 +08:00
@zzzkkk php 作者绝对是个脑残 java 粉,连语法都抄 java,甚至以前半官方的 Zend 框架都一股子恶臭 Java 味。
LeegoYih
2022-05-26 16:00:30 +08:00
有没有一种可能,人家用 interface 是为了 RPC 准备的
offswitch
2022-05-26 16:04:19 +08:00
你的理解是对的,很多人不懂,就喜欢这样呗,没办法。
wolfie
2022-05-26 16:06:14 +08:00
面向 kpi 设计带来的习惯,只有一个实现不需要这么做。
系统性搞过架构的毕竟少数。
statumer
2022-05-26 16:06:36 +08:00
这种做法对于项目管理是有好处的,不要觉得用接口就是为了替换实现。
如果搞个 Interface ,开发者就只能暴露方法,不会乱暴露对象成员变量,减少 caller 做 hack 的可能性。
elintwenty
2022-05-26 16:08:41 +08:00
某些情况比如 rpc 需要 interface 、或低版本的一些实现方式,而且 interface 就算只有一个实现类的情况,可以起到 中高级开放人员编写 interface 交给其他人开发 的管理作用,或者更方便的看提供接口,直接看实现类代码量较大(虽然这个可以被插件或 ide 取代)

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

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

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

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

© 2021 V2EX