`
lua
  • 浏览: 74569 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

如何閱讀他人的程式碼

UML 
阅读更多

如何閱讀他人的程式碼

怎麼讀? 怎麼看別人的 Source code, 然後再去修改, 通常的回答, 大概是看 天份 .

  • 我的做法通常是 先搞清楚此程式的 輸入、輸出 , 再從 main() 等開始位置開始追, 經過追蹤、測試 來找到要改的地方.

這一系列文章是作者(王建興)將他閱讀程式碼的心得 與 優點寫出來, 建議有空可以看看(文章下面內容, 是我覺得的重點摘錄). :)

  1. 閱讀他人的程式碼(1)─讀懂程式碼,使心法皆為我所用
    • 先了解系統架構與行為模式,再細讀
    • 接觸他人的程式碼,大致上可以分為三種程度:
      1. 了解
      2. 修改、擴充
      3. 抽取、提煉。
    • 了解別人的程式碼是最基礎的工作,倘若不能了解自己要處理的程式碼,就甭論修改或擴充,更不可能去蕪存菁,從中萃取出自己所需,回收再利用別人所撰寫的程式碼。
    • 閱讀程式碼的重點,不在於讀完每一行程式碼,而是在於有效率地透過探索及閱讀,從而了解系統的架構及行為模式。以便在你需要了解任何片段的細節實作時,能夠很快在腦上對映到具體的程式碼位置,直到那一刻,才是細讀的時機。 
  2. 閱讀他人的程式碼(2) 摸清架構,便可輕鬆掌握全貌
    • 先試著捕捉系統架構性的觀念,不要過早鑽進細節,因為那通常對於你了解全貌,沒有多大的幫助。閱讀程式碼不需要從第一行讀起,我們的目的並不是在於讀遍每一段程式碼。
    • 探索架構的第一件事:找出系統如何初始化
    • 不論某個系統所採用的架構是否為大部分人所熟知的,在試著探索一個系統的長相時,我們應該找出來幾個答案,了解在它所用的架構下,下列這件事是如何被完成的:
      1. 系統如何初始化
      2. 與這個系統相接的其他系統(或使用者)有那些,而相接的介面又是什麼
      3. 系統如何反應各種事件
      4. 系統如何處理各種異常及錯誤。
  3. 閱讀他人的程式碼 (3) 優質工具在手,讀懂程式非難事
    • gtags是GNU GLOBAL source code tag system,它不只搜尋文字層次,而且因為具備了各種語言的語法剖析器,所以在搜尋時,可以只針對和語言有關的元素,例如類別名稱、函式名稱等。
    • 而且,它能針對原始碼的內容進行索引,這意謂一旦建好索引之後,每次搜尋的動作,都毋需重新讀取所有原始碼的內容並逐一搜尋。只需要以現成的索引結構為基礎,即可有效率的尋找關鍵段落。
  4. 閱讀他人的程式碼 (4)望文生義,進而推敲組件的作用
    • 我 喜歡將系統的運作情境,比擬成系統會上演的故事情節。在閱讀細節性質的程式碼前,先知道系統究竟會發生那些故事,是必備的基本功課。你可以利用熟悉或者自 己發明的表示工具,描述你所找到的情境。甚至可以只利用簡單的列表,直接將它們列出。只要能夠達到記錄的目的,對程式碼閱讀來說,都能夠提供幫助。或者, 你也可以利用UML中的類別圖、合作圖、循序圖之類的表示方法,做出更詳細的描述。
    • 探索架構的第一步──找到程式的入口
    • 系統多會採用相同的架構處理Plug-In程式
  5. 閱讀他人的程式碼(5)找到程式入口,再由上而下抽絲剝繭
    • 展開的同時,隨手記錄樹狀結構
    • 當我們從一個入口點找到三個分支後,可以順著每個分支再展開一層,所以分別繼續閱讀init、quit、以及PluginMessageProc的內容,並試著再展開一層。閱讀的同時,你可以在文件中試著記錄展開的樹狀結構。
    • 範例:
      • init():初始化動作
      • itunesdb_init_cc():建立存取iTunes database的同步物件
      • 初始化資料結構
      • 初始化GUI元素
      • 載入設定
      • 建立log檔
      • autoDetectIpod():偵測iPod插入的執行緒
      • quit():終止化動作
      • itunesdb_del_cc():終止存取iTunes database的同步物件
      • 關閉log檔
      • 終止化GUI元素
      • PluginMessageProc():以訊息的方式處理程式所必須面臨的各種事件
      • 執行所連接之iPod的MessageProc()
    • 這部分必須要留意幾個重點。首先,應該一邊閱讀,一邊記錄文件。因為人的記憶力通常有限,對於陌生的事物更是容易遺忘,因此邊閱讀邊記錄,是很好的輔助。
  6. 閱讀他人的程式碼(6)閱讀的樂趣:透過程式碼認識作者
    • 轉換立場,理解作者的思考方式
    • 當你在閱讀一段程式碼時,或許可以試著轉換自己的立場,從旁觀者的角度轉換成為寫作者的心態,揣摩原作者的心理及處境。當你試著設身處地站在他的立場,透過他的思考方式來閱讀、追蹤他所寫下的程式碼,將會感覺更加流暢。
分享到:
评论

相关推荐

    如何看懂源代码.pdf

    对大多数的程式人来说,撰写程式码或许是令人开心的一件事情,但我相信,有更多人视阅读他人所写成的程式码为畏途。许多 人宁可自己重新写过一遍程式码,也不愿意接收别人的程式码,进而修正错误,维护它们,甚至...

    ChatGPT 指令大全.docx

    你现在是一个 Clean Code 专家,我有以下的程式码,请用更干净简洁的方式改写,让我的同事们可以更容易维护程式码。另外,也解释为什么你要这样重构,让我能把重构的方式的说明加到 Pull Request 当中。附上程式码

    青岛网吧一卡通 添加查找修改会员程式

    可以修改一卡通数据库中会员部分。用于网吧老板内部添加员工卡等操作。设有密码 防备他人使用。程序复制到一卡通安装目录即可运行。附带源码

    vb制作39條碼生成程式

    學習條碼制作的最好資料,內容簡易,不需請教他人,要自學成才!!!哈哈

    Code Virtualizer v1.3.8 Full

    对于每一个所保护的程式,这些所产生的虚拟指令以及虚拟机器本身都是独特的,以防止他人对 Code Virtualizer 采用广泛的攻击。 Code Virtualizer 可以在任何 x32 或 x64 原生 PE 文档中(例如可执行文档(EXEs),...

    WINLOCk 电脑控制 禁用USB 禁用指定软件 隐藏分区

    WinLock 能够针对不同的使用者进行限制,例如拒绝特定使用者存取特定档案、应用程式或是 Windows 档案总管(控制台、我的电脑等),限制 USB 装置与硬碟的使用,过滤网际网路内容与禁止对于特定网站的存取。...

    vqqq.net下载系统(php+文本)

    使用说明: ... ... ... 程式说明: ...主要程式:vqqq.net 界面修改美化及部分代码优化:emuch .../*本程式完全免费 ,唯一要求是,请保留vqqq.net版权,及vqqq.net的连接,如果你不同意,请不要使用本程序*/

    Reptile V2.01

    你可以先选择程式现有的Texture Type(材质形式)或自己的图档,然後套用它内建的132种Preset (模板),再依自己喜好调整色盘及细部选项,轻轻松松就能制作出独一无二的背景图片(GIF、JPG)。注意事项:安装后程序会要求...

    xp系统的一些你不知道的使用

    1013-硬体驱动程式 1014-检查 Windows XP 是否登记 1015-将〔修复控制台〕安装在硬碟内 1016-辨认真假中文版XP的方法 1017-XP减肥方法 1018-WINDOWS 错误代码 1019-Windows XP 家用版及商业版功能对比   ...

    USB端口保护工具

    用家无法通过关闭程式来关闭MyUSBOnly,移除程式亦要输入密码 五大好处 杜绝经由USB装置盗窃资料 保障企业内部资料安全 禁止病毒进入企业内部 完整报表,记录USB在电脑上的所有行为 简易安装,无需伺服器,安装后...

    dart_course_bizz84

    这个应用程式可让使用者选择我为Andrea Bizzotto的Udemy课程-《初学者及以后的完整Dart语言指南》中设定的课程部分编写的程式码解决方案。 有关更多信息,请参考该课程。设计通常,我将为该课程中的每个代码解决...

    留言动态验证单独版留言动态验证单独版

    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...感谢大家使用本人设计的程式,请尊重我的劳动成果,不要删除我的版权信息! 有什么问题加我QQ279999471提出,谢谢。 本程序无后台属于前台型

    Peing 提問箱 - 自動產生回應區塊-crx插件

    语言:中文 (繁體) 这个插件可以帮助你在问题页面长出...另外很重要的一点,安装这个套件不会窃取你的任何资料,详细的程式码可以在这边参阅:https://github.com/yuh926323/peing如果使用上有任何问题,欢迎与我联系!

    .NET Reflector 8.3.3.115 官方最新破解版 注册机

    .NET Reflector 工具软件虽非Open Source(开放源代码),但早期释出的版本连他自己的exe档都能反转回原始程式,但后期版本则使用混淆器进行保护,并加上免费使用的天数限制 使用此一工具软件者,需注意到反编译出来...

    代码段:代码段共享网站

    程式码片段 Snippet代码共享网站。类似Gist,但加入了多文件在线编译运行,Web代码在线预览的功能。 :sparkles:功能 :smiling_face_with_sunglasses:分享发布代码片段。 :laptop:支持十多种语言在线编译运行。 :...

    Argus:狗贪睡警报应用程序

    下载应用程式 该应用程序从未上传到Play商店。 如果要下载,请在此处下载 要求: Android手机必须至少在Lollipop以上。 您必须授予SMS权限。 这个怎么运作 阿格斯将为您生成一个秘密代码,以及您的电话号码和QR码...

    Linux操作系统基础教程

    Linux 操作系统基础教程 清华大学信息学院计算机系 目 录 前言..........................................................................................................................................

    为你自己学Git

    5.10 状况题 检视特定档案的 Commit 纪录 5.11 状况题 等等,这行程式谁写的? 5.12 状况题 啊!不小心把档案或目录删掉了⋯ 5.13 状况题 刚才的 Commit 后悔了,想要 拆掉重做⋯ 5.14 状况题 不小心使用 hard 模式...

    念青五笔 for Windows NT/2000/XP

    其次,在避免重码的前提下,加入了大量词目,诸如网友、网站、程式、菜鸟、声卡、网卡等,不一而足;对于一些词序的排列也依据常用频率作出了相应调整,如“问题”之于“总是”即是一例,而一些“的确良”之类的历史...

    EXCEL集成工具箱V8.0完整增强版(精简)

    EXCEL集成工具箱V8.0 多国语言版(2003-2010通用)增强版! * 软件大小: 22.90MB ...【锁定屏幕】 快捷一键式登出当前用户并锁定电脑,类似于CTRL+ALT+DEL功能。 【系统待机】 使用此功能可以达到节能及锁定...

Global site tag (gtag.js) - Google Analytics