为什么 spring 源码中类的关系那么复杂?

2022-03-26 20:49:25 +08:00
 BlackZhu
最近在读 spring 源码,发现其中的类关系真让人头大,一层一层的继承实现太繁杂了,比如一个抽象方法往往要往下走好几层才会有具体的实现!
这是 spring 本身的设计理念,还是随着项目的发展迭代出来的结果?
4121 次点击
所在节点    程序员
26 条回复
bthulu
2022-03-26 20:52:11 +08:00
迭代了 N 年的结果啊, 当年比较注重面向对象, 各种设计模式来一遍, 自然是一层套一层越套越多了
thinkershare
2022-03-26 20:57:40 +08:00
因为计算机科学中, 没有什么问题是通过添加一个抽象无法解决的, 如果不行, 就再加一个抽象. 所以后来有了: 如无必要、勿增实体. 而什么是必要就是一个哲学问题了! 每一个添加的抽象都是为了某个切面需求概率的抽象.
forgottencoast
2022-03-26 21:05:36 +08:00
应该要研究他这样做的意义。
BlackZhu
2022-03-26 21:11:06 +08:00
@bthulu 所以说这算是一种缺陷? 如果官方团队有机会重构的话 会放弃这种理念 选择更加精简的方式吗


@forgottencoast 我就是不太懂这样做的意义 在自己的项目中也有必要采用这种设计方式吗? 对项目是好处大还是坏处大?
thinkershare
2022-03-26 21:34:10 +08:00
@BlackZhu 如果你的项目中, 你无法搞清楚抽象的目的, 就不要抽象. 每个人都只能试图看的稍微远一点, 预测非常永久的事情纯粹是赌运气. 抽象是有代价的, 你需要了评估你项目的复杂度, 没有一个放之四海而皆准的办法, 设计就是平衡矛盾的需求, 平衡的好, 就是有效设计.
thinkershare
2022-03-26 21:36:09 +08:00
另外你说的 Spring 的抽象设计在它的体系中是没啥问题的! 官方团队即便重构大差不大还是这个样子, 除非需求发生了重大变化, 软件设计就是尽量让代码贴近需求的自然抽象, 越是自然, 则未来越是容易维护和扩展!
ikas
2022-03-26 23:25:24 +08:00
spring 曾经是相对于 javaee 的轻量级框架..
当时随着应用的广泛,必然会增加各种需求啊..才逐渐形成了如今的样子..
Braisdom
2022-03-27 09:31:36 +08:00
Sping 是一个高度抽象的框架,为了适应各种系统的需求,才会产生各种抽象,本质上是为了适应变化,但这样做也是有成本的,也就是导致框架代码很难理解,各种抽象概念、各种关系起来越复杂。天下大事,分久必合,合久必分,现在一些比较轻量级的框架也在产生。
haha512
2022-03-27 14:37:02 +08:00
过度设计,都其他为项目准备勾画好了未来 20 年的需要
但实际 99%的项目不到 5 年都死了或者重构了(哈哈
murmur
2022-03-27 15:48:44 +08:00
@haha512 初始版本:2002 年 10 月 1 日,也就是说很快 spring 就迎来 20 年生日了
zoharSoul
2022-03-27 15:57:21 +08:00
spring 的风格, 你看 golang 的很多框架就没这么玩
FreeEx
2022-03-27 17:09:12 +08:00
所以我都不读源码,这些框架都不是一次性写好的,而是经过了大量时间缝缝补补,Spring 当年相对 EJB 也算轻量,现在也变成了一个庞然大物,屠龙勇士终成恶龙?
FrankHB
2022-03-27 17:22:03 +08:00
@thinkershare 显然有,比如抽象太多并且泄露出来被用户发现了的这种 OP 问题。
slyang5
2022-03-27 20:03:54 +08:00
@zoharSoul 只能说 go 的框架还不成熟, 面向的用户还不够大众
thinkershare
2022-03-27 21:38:15 +08:00
@FrankHB 他去看源代码, 当然任何实现细节都会被发现!
bigbyto
2022-03-27 21:58:18 +08:00
源码不是这样读的,先看借口抽象文档,再看细节实现。理解了接口,就不会觉得复杂。
shyangs
2022-03-28 00:44:35 +08:00
Java 好像有這種一層套一層的梗圖 /搞笑圖,版友有存的可以貼上來.
nothingistrue
2022-03-28 10:01:50 +08:00
面向对象编程第一个解决的问题:让开发类库的人和使用类库的人可以分开。开发 Spring ,和使用 Spring 开发业务,一个是开发类库,一个是使用类库开发业务,你不能那一个标准去看源码。
frank1256
2022-03-28 16:12:41 +08:00
20 年的代码,能看懂已经不复杂了
git00ll
2022-03-28 17:24:28 +08:00
拿当初 spring1 的代码放到现在 spring5 里面,仍然兼容。
这不正是说明设计的很棒吗

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

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

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

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

© 2021 V2EX