代碼折疊是一些文本編輯器,源代碼編輯器和IDE的一個功能,它允許用戶有選擇地隱藏和顯示 - “折疊” - 當前編輯文件的各個部分作為例行編輯操作的一部分。這允許用戶管理大量文本,同時僅查看在任何給定時間特別相關的文本子部分。折疊的識別可以是自動的,通常基于所討論的計算機語言,縮進或手動的語法,基于帶內標記(保存為源代碼的一部分)或指定帶外,只在編輯器中。許多編輯器在側邊欄中提供代碼折疊的公開小部件,在行號旁邊,例如由指向側面(如果折疊)或向下(如果展開)的三角形指示,或者通過[ - ]框指示 可折疊(展開)文本和可擴展(折疊)文本的[+]框。一些計算機程序員通常使用此功能來管理源代碼文件,并且還經常用于數據比較,以僅查看已更改的文本。
歷史
可能第一個折疊編輯器是用于IBM 370大型機的1974結構化編程工具(SPF)編輯器,它可以根據縮進隱藏線條。它顯示在字符映射的3270終端上它對像COBOL這樣的冗長語言非常有用。它演變為交互式系統生產力設施(ISPF)。
應用
代碼折疊具有各種使用模式,主要是組織代碼或隱藏較少有用的信息,因此可以專注于更重要的信息。常見的模式如下。
列提綱
最基本的是,應用程序使用代碼折疊來概述源代碼,將每個塊折疊為單行。這可以只是函數和類之類的頂級塊,嵌套函數和方法之類的嵌套塊,或者所有塊,特別是控制流塊。這使得人們可以獲得代碼概覽,輕松導航和重新排列代碼,并根據需要深入了解更多細節,而不會被其他代碼分散注意力。從視角來看,這允許人們快速查看所有函數的列表(沒有他們的身體),而導航方式則取代了長期函數的廣泛分頁 - 或者搜索目標 - 直接轉到下一個函數。
隱藏樣板代碼
某些語言或庫需要大量的樣板代碼。這導致代碼非常長,這可能會掩蓋主要觀點。此外,實用代碼可能會在樣板中丟失。
例如,在Java中,具有getter和setter的單個私有字段至少需要3行,如果每個字段位于單獨的行上:
private String name = null;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
這擴展到10行,傳統的功能斷行和功能之間的間距(包括尾隨換行):
private String name = null;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
使用javadoc的文檔將其擴展為20行:
/**
* Property name readable/writable.
*/
private String name = null;
/**
* Getter for property name
*/
public String getName() {
return name;
}
/**
* Setter for property name.
* @param name
*/
public void setName(String name) {
this.name = name;
}
如果有很多這樣的字段,結果很容易就是數百行代碼而且“有趣”內容很少 - 代碼折疊可以將每個字段減少到一行,甚至可以減少所有字段的單行。此外,如果所有例程字段都被折疊,但非常規字段(其中getter或setter不僅僅是返回或分配私有字段)沒有折疊,則更容易看到實質性代碼。
折疊元數據
元數據可能很長,并且通常不如它描述的數據重要。折疊元數據允許主要關注數據,而不是元數據。
在結構化編程中顯示結構或三明治代碼
結構化編程由嵌套的代碼塊組成,長代碼塊(如長切換語句)可能會掩蓋整體結構。代碼折疊允許人們看到整體結構并擴展到特定級別。此外,在某些用途中,特別是嚴格的結構化編程(單功能退出),在查看擴展代碼時很難看到代碼模式。例如,在結構化編程中的資源管理中,通常獲取資源,然后使用資源獲取代碼塊,最后獲取釋放資源。如果中間存在長代碼塊,則很難看到獲取/釋放配對,但很容易看出插入的塊是否被折疊。類似地,在條件代碼中,如if ... then ... else,輔助塊可能遠離條件語句。
分組代碼
折疊組可用于對代碼進行分組,可以通過顯式分組 - 類似于將模塊分成多個部分的注釋塊,或者將類成員分成關聯的組 - 或隱式地,例如通過按訪問級別自動對類成員進行分組。
隱藏遺留代碼
遺留代碼或者開發人員不希望在給定時間點查看或更改的任何代碼 -可以折疊起來,以便程序員可以專注于所考慮的代碼。
折疊代碼的四種方式
參考資料 >