如何读代码? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
devqin
V2EX    程序员

如何读代码?

  •  
  •   devqin 2014-01-07 09:24:31 +08:00 5317 次点击
    这是一个创建于 4295 天前的主题,其中的信息可能已经有所发展或是发生改变。
    不可否认,阅读大量的优秀的代码对自己coding的风格有很大的影响,可是如何去阅读代码,如何高效的阅读代码,一直没有找到好的方法,求达人指教一二,不胜感谢
    20 条回复    1970-01-01 08:00:00 +08:00
    coetzee
        1
    coetzee  
       2014-01-07 09:30:50 +08:00   2
    我都是删着读,边读边删(确切的说不停地精简,总结出一个最小的核,然后慢慢补充),最后总体捋一下脉络,不过最近有个同事的程序让我快要崩掉了!
    MingZhe
        2
    MingZhe  
       2014-01-07 09:35:23 +08:00   1
    @coetzee

    哇,中国好同事啊。。。还给看代码。。。
    loading
        3
    loading  
       2014-01-07 09:51:36 +08:00 via iPhone   2
    根据你的水平。
    低水平,一个个函数分开读
    中间水平,整体读
    高手,不管函数,看结构
    loading
        4
    loading  
       2014-01-07 09:52:58 +08:00 via iPhone   1
    如果是进阶,要调换一下…
    meta
        5
    meta  
       2014-01-07 10:51:42 +08:00
    请高声朗读。
    tox
        6
    tox  
       2014-01-07 13:11:44 +08:00
    先了解项目的结构,和各个模块的功能。
    然后可按照自己感兴趣的模块阅读。
    greatghoul
    7
    greatghoul  
       2014-01-07 13:27:50 +08:00
    我其实是按 Commit History 读的,这样能够看到项目的演进,最近这样读 Ruby China 的代码,学到了不少好东西,还有就是读的时候要适当的做一下笔记。
    lenville
        8
    lenville  
       2014-01-07 13:42:23 +08:00
    @meta 请有感情地大声朗读 ( 捂嘴笑

    其实我是初段选手
    我像 @loading 说的那样一个函数一个函数分开读
    acros
        9
    acros  
       2014-01-07 14:32:41 +08:00
    做游戏项目的,一般模块很多。
    我习惯先找一个目标(比如修改某个技能),然后定位代码。看实现(一般运行debug跟着执行走)。然后看模块组织,最后浏览下框架。基本上是由点及面,从小到大的顺序。

    记得有本书专门讲代码阅读的
    hgyenzo
        10
    hgyenzo  
       2014-01-07 16:17:38 +08:00
    @loading 怎么调换O O
    Mutoo
        11
    Mutoo  
       2014-01-07 18:46:18 +08:00
    @acros 那本书叫 《代码阅读方法与实践》
    sdysj
        12
    sdysj  
       2014-01-07 19:01:31 +08:00
    代码写多了自然随便看一段就会慢慢跟踪上下文,很自然的感觉。。。。
    Akagi201
        13
    Akagi201  
       2014-01-07 22:18:24 +08:00
    先猜代码实现什么功能(或者看文档或者听同事说), 然后看懂个大概流程, 看跟自己想的一不一样, 如果是很复杂的代码就要一点点分析的看了.
    regmach
        14
    regmach  
       2014-01-07 22:27:32 +08:00
    从过程追溯函数,再延伸到其他类和过程
    这样的方法可以吗?
    zhujinliang
        15
    zhujinliang  
       2014-01-07 22:40:35 +08:00 via iPad   1
    @meta
    @lenville
    想起了那个疯狂年代的疯狂英语
    liuting
        16
    liuting  
       2014-01-08 10:22:45 +08:00
    需要逻辑..
    tkdchen
        17
    tkdchen  
       2014-01-08 11:42:13 +08:00
    使用ctags。
    从代码的循环和分支结构中,从宏观了解某个函数或者方法的逻辑。
    一定要使用版本控制,例如git,bzr,hg。
    及时的做注释并使用TODO,FIXME,NOTE做标识。
    适时地做合理地推断
    stackpop
        18
    stackpop  
       2014-01-08 12:09:59 +08:00
    我的习惯是按模块读,然后自己设法把这个模块抽离出来,再进行改造。比如leveldb,我先读的是他的LRUCache,redis我先读了他的hash的实现
    goto
        19
    goto  
       2014-01-08 18:10:41 +08:00
    阅读代码有时候非常有趣,读到好的代码那真是一种享受
    liuting
        20
    liuting  
       2014-01-09 11:00:30 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2751 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 11:46 PVG 19:46 LAX 04:46 JFK 07:46
    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