自己太菜了,求问,如何看懂有非常多继承的代码? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
fakerw
V2EX    程序员

自己太菜了,求问,如何看懂有非常多继承的代码?

  •  2
     
  •   fakerw 2021-02-22 23:33:35 +08:00 7560 次点击
    这是一个创建于 1692 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看一些开源代码,经常被弄得晕头转向,原因是因为某些类调用一些方法, 我要往上倒很多父类才知道原理,

    a 类的方法 跳到找到父类 A 然后又找到 父类 A1

    b 的方法 找到 B

    ...

    以此类推,跳来跳去就晕了,

    平时写前端代码,用的都是组件库,写的都是表单 crud,继承用得很少很少,

    求问各种大佬,怎么才能不.....当局者迷呢

    太晕了

    48 条回复    2021-02-24 17:26:09 +08:00
    fakerw
        1
    fakerw  
    OP
       2021-02-23 00:21:06 +08:00
    chendy
        2
    chendy  
       2021-02-23 00:26:33 +08:00
    如果真的要知道实现方式,可能只能这样了……
    更多的时候看一眼调用关系知道个大概就行了
    fucUup
        3
    fucUup  
       2021-02-23 00:54:46 +08:00 via Android
    晕啥,Linux 21 万个类,查字典即可
    fucUup
        4
    fucUup  
       2021-02-23 00:55:53 +08:00 via Android   1
    不要妄想 1 个月练成葵花宝典,至少 20 年
    Justin13
        5
    Justin13  
       2021-02-23 01:57:27 +08:00 via Android   6
    先理解设计,再理解流程,再看文件结构,最后看代码。
    nuk
        6
    nuk  
       2021-02-23 02:00:16 +08:00
    运行时 debug
    pastgift /td>
        7
    pastgift  
       2021-02-23 02:36:15 +08:00 via iPhone   1
    有时候其实就是过度设计,一堆没意义的继承导致代码难读,不是你的问题
    根据我的经验,好的代码思路清晰,继承多少关系其实不大,你 get 到作者的的点很快就能推测出整体结构。而不好的代码谁来都皱眉头。
    laminux29
        8
    laminux29  
       2021-02-23 06:30:15 +08:00
    用 UML 工具,把这些代码转换为图,一目了然。
    sam014
        9
    sam014  
       2021-02-23 07:03:55 +08:00
    @fucUup 20 年为什么要来练葵花宝典,你在欺负前端,哈哈哈
    hello2060
        10
    hello2060  
       2021-02-23 07:04:12 +08:00
    点击函数名,跳到定义不就行了。父类的非 private 函数子类也可以用,这个很好理解啊。

    所以你迷在哪里?
    Skmgo
        11
    Skmgo  
       2021-02-23 07:40:41 +08:00
    @laminux29 UML 工具推荐几个?
    anthow
        12
    anthow  
       2021-02-23 08:54:58 +08:00
    多 debug
    oatw
        13
    oatw  
       2021-02-23 09:17:21 +08:00   1
    组合优于继承。

    开源项目的流行度和代码质量不一定成正比,过多继承的建议先绕过。
    cczeng
        14
    cczeng  
       2021-02-23 09:37:01 +08:00
    合成聚合复用原则- 多使用组合,而不是多使用继承
    cczeng
        15
    cczeng  
       2021-02-23 09:38:26 +08:00
    如果是已有项目,那就只能这样。 #5 楼说的没错。
    James369
        16
    James369  
       2021-02-23 09:43:22 +08:00
    @fucUup #4 不好意思,程序员的职业生涯没有 20 年,啊哈哈
    jadeborner
        17
    jadeborner  
       2021-02-23 09:44:18 +08:00
    你说的是 ES6 的继承?
    looppppp
        18
    looppppp  
       2021-02-23 09:44:20 +08:00
    所以我喜欢函数式编程
    Lemeng
        19
    Lemeng  
       2021-02-23 09:44:35 +08:00
    不是大问题,debug
    way2explore2
        20
    way2explore2  
       2021-02-23 09:57:38 +08:00
    @fucUup xian zi gong a
    lewis89
        21
    lewis89  
       2021-02-23 10:02:16 +08:00   1
    一般超过三层 就没人摸得着头脑了,Spring 里面的设计 至少超过 7 层.. 类图绕得人头大,不过你可以先看下 架构 overview
    chesterzzy
        22
    chesterzzy  
       2021-02-23 10:16:14 +08:00
    Sourcetrail 等类似的代码查看工具,应该会有一定的帮助
    yazoox
        23
    yazoox  
       2021-02-23 10:34:34 +08:00
    别总想着“继承“。如果可能,应该可以尽可能少的使用继承。等你代码写多了,就能体会到,很多时候,”不继承“比”继承“要好。

    design principle 里面有一条就是,composition over inheritance
    soulmt
        24
    soulmt  
       2021-02-23 11:00:39 +08:00
    用 xmind 梳理调用流程和 class 之间的继承关系,再标注一下各个类自带的函数以及做什么的就好了,光看的话,确实很难办
    soulmt
        25
    soulmt  
       2021-02-23 11:01:26 +08:00
    @yazoox 写业务能不继承就不要继承,写框架还是比较推荐的。
    acmore
        26
    acmore  
       2021-02-23 11:04:30 +08:00
    难道是在看 Spring 源码么,那一大堆 BeanFactory & ApplicationContext 的继承确实挺恶心人的。
    而且这一堆继承与其说是基于设计,倒不如说是基于历史的,确实让人头大。
    taogen
        27
    taogen  
       2021-02-23 12:08:31 +08:00 via Android
    做过一个玩具项目,可以根据 Java doc 文档转换为 plantuml 类图。有兴趣的可以看看。
    https://github.com/tagnja/plantuml-generator
    tmackan
        28
    tmackan  
       2021-02-23 12:17:24 +08:00
    idea 可以查看源码的 uml 图的,右键点击 Diagrams
    taogen
        29
    taogen  
       2021-02-23 12:29:45 +08:00 via Android
    @tmackan #28
    之前没发现这功能,这个功能挺不错的。但是好像只能看一个类的上级继承类,不能看下级子类,也就是不能看涉及一个类的完整继承链。
    happinessnch
        30
    happinessnch  
       2021-02-23 12:41:29 +08:00
    继承不仅仅是代码复用,也是 OOP 设计的一个方法,继承类与父类要存在 is a 的关系,所以先理解基类,由顶向下的理解,再去研究某个类的某个方法具体实现,先了解一下 OO 的设计原则和基础。
    index
        31
    index  
       2021-02-23 12:49:15 +08:00 via Android
    用好 ide 快捷键,在看类关系,子类,接口实现等,都有快捷键,能很大程度减少视线迷路的概率
    abersheeran
        32
    abersheeran  
       2021-02-23 13:05:15 +08:00
    继承太多,往往是代码太烂。
    johnsona
        33
    johnsona  
       2021-02-23 13:21:07 +08:00 via iPhone
    理解核心的代码即可 搞懂全部完完全全没必要
    Rocketer
        34
    Rocketer  
       2021-02-23 13:46:11 +08:00 via iPhone   2
    继承是为了复用,所以父类、爷类、祖宗类都应该当黑盒使,你就只关注你用到的那一层就行。只要不是那种方法名看不懂要做什么的垃圾代码,就没必要翻到上层去看它。
    tmackan
        35
    tmackan  
       2021-02-23 14:14:54 +08:00
    @taogen 可以的 你捣鼓下~
    tmackan
        36
    tmackan  
       2021-02-23 14:15:30 +08:00
    @taogen 右键选择 implement 或者查看 parent 就可以查看 上下游了,说实话 java 源码看起来很费劲
    whoim
        37
    whoim  
       2021-02-23 14:26:31 +08:00
    个人觉得,没必要每一个类每一个函数都要知道是干什么的,只要知道整体逻辑就可以!否则只会陷入各种细节中!
    fiveelementgid
        38
    fiveelementgid  
       2021-02-23 14:28:48 +08:00 via Android
    不知道,C#不支持多重继承
    Inherite: only one class and multiple interfaces
    auh
        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/
    bruce0
        40
    bruce0  
       2021-02-23 14:39:07 +08:00
    @pastgift 我也同意,好的代码不是说用了多少种设计模式。设计的多么优雅,而是能简单易懂,让人一看就明白
    toomlo
        41
    toomlo  
       2021-02-23 14:47:41 +08:00
    @pastgift #7 golang 吗,嘻嘻
    laminux29
        42
    laminux29  
       2021-02-23 15:57:15 +08:00
    @Skmgo EA 。全称 Enterprise Architect 。
    LessonOne
        43
    LessonOne  
       2021-02-23 16:27:11 +08:00
    @Justin13 大多数人都是先写代码搞业务流程 才慢慢 总结设计然后有自己的一套设计模式 新手 只能先理解 逻辑
    aguesuka
        44
    aguesuka  
       2021-02-23 16:35:38 +08:00 via Android
    ctrl+h ctrl+alt+shift+u
    jones2000
        45
    jones2000  
       2021-02-23 20:43:23 +08:00
    拿张纸和笔, 把类和继承关系简单画下。 对于某一个函数功能,用单点调试的方法,一步一步跟进去。 光看代码没用的, 看半天就晕了。
    hitmanx
        46
    hitmanx  
       2021-02-23 22:23:31 +08:00
    如果还有懂这个代码的老人在的话,让他给你讲一讲中间的设计想法和慢慢的变迁比你自己看效率要高很多。

    代码都是从简单慢慢变得复杂的,可能因为新需求或者是一些边缘情况。而一个新人在不了解这个背景和历史的情况下,看得似懂非懂的再正常不过了。如果加上是一堆烂代码的话,看得头大也很正常。

    如果在没有老人或者只能自助的情况下可以看代码的 commit history (如果有的话),并且有对应的 bug 或者文字描述或者邮件讨论的话就更佳了。如果都没有,那只能自己去硬啃了^_^
    THESDZ
        47
    THESDZ  
       2021-02-24 10:50:29 +08:00
    继承或者接口这类代码,如果自下往上看,是真的很难懂,你要先看架构图(设计图之类的),自上往下推才能比较好懂...
    trumpasjokerA
        48
    trumpasjokerA  
       2021-02-24 17:26:09 +08:00 via Android
    用 idea 把类结构图打出来,先单个研究明白,自顶向下看好理解一些
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     841 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 20:44 PVG 04:44 LAX 13:44 JFK 16:44
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86