代码折叠

科技工作者之家 2020-11-17

代码折叠是一些文本编辑器,源代码编辑器和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,辅助块可能远离条件语句。

分组代码折叠组可用于对代码进行分组,可以通过显式分组 - 类似于将模块分成多个部分的注释块,或者将类成员分成关联的组 - 或隐式地,例如通过按访问级别自动对类成员进行分组。

隐藏遗留代码遗留代码或者开发人员不希望在给定时间点查看或更改的任何代码 -可以折叠起来,以便程序员可以专注于所考虑的代码。

折叠代码的四种方式

|| ||

本词条内容贡献者为:

李航 - 副教授 - 西南大学

科技工作者之家

科技工作者之家APP是专注科技人才,知识分享与人才交流的服务平台。