看一些开源代码,经常被弄得晕头转向,原因是因为某些类调用一些方法, 我要往上倒很多父类才知道原理,
a 类的方法 跳到找到父类 A 然后又找到 父类 A1
b 的方法 找到 B
...
以此类推,跳来跳去就晕了,
平时写前端代码,用的都是组件库,写的都是表单 crud,继承用得很少很少,
求问各种大佬,怎么才能不.....当局者迷呢
太晕了
1 fakerw OP ? |
![]() | 2 chendy 2021-02-23 00:26:33 +08:00 如果真的要知道实现方式,可能只能这样了…… 更多的时候看一眼调用关系知道个大概就行了 |
![]() | 3 fucUup 2021-02-23 00:54:46 +08:00 via Android 晕啥,Linux 21 万个类,查字典即可 |
![]() | 4 fucUup 2021-02-23 00:55:53 +08:00 via Android ![]() 不要妄想 1 个月练成葵花宝典,至少 20 年 |
5 Justin13 2021-02-23 01:57:27 +08:00 via Android ![]() 先理解设计,再理解流程,再看文件结构,最后看代码。 |
![]() | 6 nuk 2021-02-23 02:00:16 +08:00 运行时 debug |
/td> | 7 pastgift 2021-02-23 02:36:15 +08:00 via iPhone ![]() 有时候其实就是过度设计,一堆没意义的继承导致代码难读,不是你的问题 根据我的经验,好的代码思路清晰,继承多少关系其实不大,你 get 到作者的的点很快就能推测出整体结构。而不好的代码谁来都皱眉头。 |
8 laminux29 2021-02-23 06:30:15 +08:00 用 UML 工具,把这些代码转换为图,一目了然。 |
![]() | 10 hello2060 2021-02-23 07:04:12 +08:00 点击函数名,跳到定义不就行了。父类的非 private 函数子类也可以用,这个很好理解啊。 所以你迷在哪里? |
![]() | 12 anthow 2021-02-23 08:54:58 +08:00 多 debug |
13 oatw 2021-02-23 09:17:21 +08:00 ![]() 组合优于继承。 开源项目的流行度和代码质量不一定成正比,过多继承的建议先绕过。 |
14 cczeng 2021-02-23 09:37:01 +08:00 合成聚合复用原则- 多使用组合,而不是多使用继承 |
15 cczeng 2021-02-23 09:38:26 +08:00 如果是已有项目,那就只能这样。 #5 楼说的没错。 |
17 jadeborner 2021-02-23 09:44:18 +08:00 你说的是 ES6 的继承? |
18 looppppp 2021-02-23 09:44:20 +08:00 所以我喜欢函数式编程 |
19 Lemeng 2021-02-23 09:44:35 +08:00 不是大问题,debug |
![]() | 20 way2explore2 2021-02-23 09:57:38 +08:00 @fucUup xian zi gong a |
![]() | 21 lewis89 2021-02-23 10:02:16 +08:00 ![]() 一般超过三层 就没人摸得着头脑了,Spring 里面的设计 至少超过 7 层.. 类图绕得人头大,不过你可以先看下 架构 overview |
22 chesterzzy 2021-02-23 10:16:14 +08:00 Sourcetrail 等类似的代码查看工具,应该会有一定的帮助 |
![]() | 23 yazoox 2021-02-23 10:34:34 +08:00 别总想着“继承“。如果可能,应该可以尽可能少的使用继承。等你代码写多了,就能体会到,很多时候,”不继承“比”继承“要好。 design principle 里面有一条就是,composition over inheritance |
24 soulmt 2021-02-23 11:00:39 +08:00 用 xmind 梳理调用流程和 class 之间的继承关系,再标注一下各个类自带的函数以及做什么的就好了,光看的话,确实很难办 |
26 acmore 2021-02-23 11:04:30 +08:00 难道是在看 Spring 源码么,那一大堆 BeanFactory & ApplicationContext 的继承确实挺恶心人的。 而且这一堆继承与其说是基于设计,倒不如说是基于历史的,确实让人头大。 |
27 taogen 2021-02-23 12:08:31 +08:00 via Android 做过一个玩具项目,可以根据 Java doc 文档转换为 plantuml 类图。有兴趣的可以看看。 https://github.com/tagnja/plantuml-generator |
28 tmackan 2021-02-23 12:17:24 +08:00 idea 可以查看源码的 uml 图的,右键点击 Diagrams |
29 taogen 2021-02-23 12:29:45 +08:00 via Android @tmackan #28 之前没发现这功能,这个功能挺不错的。但是好像只能看一个类的上级继承类,不能看下级子类,也就是不能看涉及一个类的完整继承链。 |
![]() | 30 happinessnch 2021-02-23 12:41:29 +08:00 继承不仅仅是代码复用,也是 OOP 设计的一个方法,继承类与父类要存在 is a 的关系,所以先理解基类,由顶向下的理解,再去研究某个类的某个方法具体实现,先了解一下 OO 的设计原则和基础。 |
![]() | 31 index 2021-02-23 12:49:15 +08:00 via Android 用好 ide 快捷键,在看类关系,子类,接口实现等,都有快捷键,能很大程度减少视线迷路的概率 |
![]() | 32 abersheeran 2021-02-23 13:05:15 +08:00 继承太多,往往是代码太烂。 |
![]() | 33 johnsona 2021-02-23 13:21:07 +08:00 via iPhone 理解核心的代码即可 搞懂全部完完全全没必要 |
![]() | 34 Rocketer 2021-02-23 13:46:11 +08:00 via iPhone ![]() 继承是为了复用,所以父类、爷类、祖宗类都应该当黑盒使,你就只关注你用到的那一层就行。只要不是那种方法名看不懂要做什么的垃圾代码,就没必要翻到上层去看它。 |
36 tmackan 2021-02-23 14:15:30 +08:00 @taogen 右键选择 implement 或者查看 parent 就可以查看 上下游了,说实话 java 源码看起来很费劲 |
![]() |   37 whoim 2021-02-23 14:26:31 +08:00 个人觉得,没必要每一个类每一个函数都要知道是干什么的,只要知道整体逻辑就可以!否则只会陷入各种细节中! |
![]() | 38 fiveelementgid 2021-02-23 14:28:48 +08:00 via Android 不知道,C#不支持多重继承 Inherite: only one class and multiple interfaces |
39 auh 2021-02-23 14:30:23 +08:00 小菜鸡,闲谈两句,篇幅不大。楼主看看。小菜鸡害羞,其他人忽略。https://player.fanlushuai.win/coder/%E7%9C%8B%E6%87%82%E8%AE%BE%E8%AE%A1/ |
44 aguesuka 2021-02-23 16:35:38 +08:00 via Android ctrl+h ctrl+alt+shift+u |
45 jones2000 2021-02-23 20:43:23 +08:00 拿张纸和笔, 把类和继承关系简单画下。 对于某一个函数功能,用单点调试的方法,一步一步跟进去。 光看代码没用的, 看半天就晕了。 |
46 hitmanx 2021-02-23 22:23:31 +08:00 如果还有懂这个代码的老人在的话,让他给你讲一讲中间的设计想法和慢慢的变迁比你自己看效率要高很多。 代码都是从简单慢慢变得复杂的,可能因为新需求或者是一些边缘情况。而一个新人在不了解这个背景和历史的情况下,看得似懂非懂的再正常不过了。如果加上是一堆烂代码的话,看得头大也很正常。 如果在没有老人或者只能自助的情况下可以看代码的 commit history (如果有的话),并且有对应的 bug 或者文字描述或者邮件讨论的话就更佳了。如果都没有,那只能自己去硬啃了^_^ |
47 THESDZ 2021-02-24 10:50:29 +08:00 继承或者接口这类代码,如果自下往上看,是真的很难懂,你要先看架构图(设计图之类的),自上往下推才能比较好懂... |
![]() | 48 trumpasjokerA 2021-02-24 17:26:09 +08:00 via Android 用 idea 把类结构图打出来,先单个研究明白,自顶向下看好理解一些 |