`
lua
  • 浏览: 76356 次
  • 性别: 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)閱讀的樂趣:透過程式碼認識作者
    • 轉換立場,理解作者的思考方式
    • 當你在閱讀一段程式碼時,或許可以試著轉換自己的立場,從旁觀者的角度轉換成為寫作者的心態,揣摩原作者的心理及處境。當你試著設身處地站在他的立場,透過他的思考方式來閱讀、追蹤他所寫下的程式碼,將會感覺更加流暢。
分享到:
评论

相关推荐

    PIN码第8位小程式(修正)

    总结来说,"PIN码第8位小程式(修正)"是一个用于处理PIN码特定部分的工具,可能是为了计算或验证PIN码的第8位。这个程序可能来源于网络,使用时需注意安全问题,确保其来源可靠,并且仅在理解其功能和风险的情况下...

    Sitetalk网站及Sitetalk应用软件程式使用说明知识.pdf

    Sitetalk网站及Sitetalk应用软件程式使用说明知识 Sitetalk网站及Sitetalk应用软件程式...Sitetalk网站及Sitetalk应用软件程式提供了一个功能强大且实用的社交媒体平台,用户可以通过该平台与他人进行信息交流和互动。

    MSN安裝程式

    "MSN安装程式"指的是用于在计算机上安装MSN客户端的执行文件,确保用户能够顺利地在他们的设备上设置和使用MSN服务。 在安装过程中,可能会遇到各种问题,例如下载错误、安装失败、版本不兼容等。"保证完整安全"的...

    ChatGPT 指令大全.docx

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

    Oodler-Android-App:我正在取笑的Oodler Android应用程式程式码

    标题"Oodler-Android-App:我正在取笑的Oodler Android应用程式程式码"表明这是一个关于Android应用程式的开源项目,名为“Oodler”,可能是一个开发者在进行某种形式的调侃或者分享。描述中的内容重复了标题,暗示这...

    S7-200 POU块解密_plc程式模块口令解密工具_POU口令_plc解密_plc解密_PLCDecryption_

    描述中的“plc s7-200 程式 模块 口令解密工具 结对好用”,意味着存在一种工具,能够有效地处理S7-200的程序模块,尤其是那些带有密码保护的模块。这样的工具对于那些需要快速理解和修改已加密程序的工程师来说非常...

    useful:一些自己在使用的程式码片段

    标题 "useful:一些自己在使用的程式码片段" 暗示这可能是一个包含实用Python代码的集合,供个人或他人参考使用。描述中的信息简短,但与标题相呼应,再次确认这是一个代码片段的集合,可能包含了作者在日常编程工作...

    .net开发:为程式码加上行号的方法详解

    在.NET开发中,有时我们需要将源代码添加行号以便于阅读、分析或教学。这篇教程将详细介绍如何在C++环境中,使用Visual Studio 2008为程序代码加上行号。这种方法同样适用于其他.NET语言,如C#或VB.NET,因为它们都...

    EXCEL宏保护密码破解

    1. 首先,需要新建一个 EXCEL 文件,并在工作表标签处右键点击“检视程式码”,然后复制代码并粘贴到 VBA 编辑器中。 2. 其次,需要将 EXCEL 文件中的 VBA 代码编译成二进制文件,然后使用 VBA 代码读取该文件中的宏...

    AndroidApp:Android应用程式原始码-Android app source code

    当我们谈论“Android应用程式原始码”时,我们指的是开发者用来构建这些应用程序的编程代码。Android App的源代码通常由Java或Kotlin语言编写,遵循特定的设计模式和框架。Android Studio是官方的集成开发环境(IDE...

    破解EXCELVBA工程密码.pdf

    我们可以使用Visual Basic Editor(ALT+F11)打开VBA编辑器,然后在工作表标签中右键>>检视程式码>>复制以下代码>>按F8执行: Private Sub CommandButton1_Click() Worksheets("这里为你要显示的工作表名称")....

    如何看懂源代码.doc

    6. **阅读的乐趣,透过程式码认识作者** 代码是程序员思维的体现,通过阅读代码,你可以揣摩作者的设计思路和编程风格。这不仅是技术上的学习,也是对软件工程艺术的欣赏。 在现实工作中,不可避免地会遇到接手...

    Code Virtualizer v1.3.8 Full

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

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

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

    如何分析源码.pdf

    #### (6)阅读的乐趣,透过程式码认识作者 最终目标不仅仅是理解代码本身,更是通过代码了解背后的设计思路和技术选择: - **设计模式**:观察是否有使用常见的设计模式。 - **重构机会**:寻找可以改进的地方。 ...

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

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

    Reptile V2.01

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

    shopeefeedid

    8. **合规性**:卖家在创建feed时,需遵守Shopee的政策和规定,包括价格、图片、描述等方面,确保信息真实、合法且不侵犯他人权益。 9. **多语言支持**:对于跨国卖家,可能需要为不同市场的店铺创建不同语言版本的...

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

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

    Examples.rar

    描述中提到"有善之臂提供的功能程式碼,用c寫的,歡迎下載使用",这告诉我们这些代码是由"有善之臂"提供的,这可能是一个个人、团队或者组织的名字。他们分享的是用C语言编写的代码,C语言是一种基础且强大的编程...

Global site tag (gtag.js) - Google Analytics