软件开发可能是一个非常复杂的过程。随着您编写的代码在规模和复杂性上不断增加,保持代码的可读性和易于理解非常重要。在 开源软件 开发中,许多人协作处理代码,这些代码具有多个相互关联且经常变动的部分。这可能会使潜在的贡献者难以理解代码库。
理解代码库所需的努力可能会直接影响贡献,因为许多人的贡献时间有限,许多人是在业余时间进行贡献。这使得代码库对于经验丰富和新的贡献者来说都易于理解至关重要。
复杂性问题
考虑一个实现烘焙面包算法的函数示例,名为 bakeBread
。烘焙面包涉及多个步骤,因此将代码分解为多个辅助函数很有帮助
string bakeBread()
{
mixIngredients();
kneadDough();
riseDough();
punchDough();
riseDough();
bakeInOven();
}
void mixIngredients() { /* code here */ }
void kneadDough() { /* code here */ }
void riseDough() { /* code here */ }
void punchDough() { /* code here */ }
void bakeInOven() { /* code here */ }
正如您从上面的示例代码中看到的,烘焙面包是一个相当复杂的过程,将其在多个函数中实现可以将问题分解为易于理解的步骤。然而,这种方法的一个缺点是,在 bakeBread
之外有几个函数仅在该函数内部使用。
嵌套来救援
嵌套 有助于减轻代码结构方面的一些复杂性。它使所有上述函数都可以在它们使用的 bakeBread
的范围内声明
string bakeBread()
{
void mixIngredients() { /* code here */ }
void kneadDough() { /* code here */ }
void riseDough() { /* code here */ }
void punchDough() { /* code here */ }
void bakeInOven() { /* code here */ }
mixIngredients();
kneadDough();
riseDough();
punchDough();
riseDough();
bakeInOven();
}
嵌套通过提供一种 封装 形式来帮助清理代码。函数在它们使用的地方定义,而不会使全局范围混乱。这也防止了与其他使用相同名称的函数发生名称冲突,而无需求助于奇怪的函数名称来区分它们。嵌套还有助于协作者轻松识别函数的定义位置、使用方式以及如何快速进行改进。
D 语言中的强大嵌套
D 语言中的嵌套 超越了函数。您可以将 类 嵌套在类中,将 结构体 嵌套在结构体中,结构体嵌套在类中,类嵌套在结构体中,甚至可以在函数或任何其他范围内本地导入 模块。这个概念被称为“层层嵌套”。
如果 bakeBread
示例(或其任何现在嵌套的函数)需要导入外部模块,则可以在其使用的范围内导入它
string bakeBread()
{
import std.stdio: writeln;
void mixIngredients() {
import std.array: split;
// more code here
}
/* the rest of code which may include
* functions, classes or structs goes here
*/
}
这使得跟踪事物的来源变得容易,并防止与来自不同模块但名称相同的符号(函数、类、结构体等)发生名称冲突。像这样实现的函数可以在重构期间移动,而不会破坏代码,因为它不依赖于任何全局导入的模块。这最大限度地减少了对大型代码库进行重大更改所需的工作量——这对于协作开发来说是一件好事。
是时候试试 D 语言了
D 语言是一种非常适合开发的语言。它很容易 安装 D 编译器,编写一些示例代码,并 运行它 以亲自体验 D 语言。您还可以在 在线 D 编辑器 中运行您的代码。《D 语言编程》一书由 Ali Çehreli 撰写,对 D 语言进行了很好的介绍,并提供了免费的在线版本。
1 条评论