diff --git a/src/Ch07_Managing_Growing_Projects_with_Packages_Crates_and_Modules.md b/src/Ch07_Managing_Growing_Projects_with_Packages_Crates_and_Modules.md index 4ebe326..adeb7af 100644 --- a/src/Ch07_Managing_Growing_Projects_with_Packages_Crates_and_Modules.md +++ b/src/Ch07_Managing_Growing_Projects_with_Packages_Crates_and_Modules.md @@ -1,21 +1,26 @@ -# 使用包、代码箱与模组来对日益增长的项目进行管理 +# 使用包、代码箱与模组管理不断增长的项目 **Managing Growing Projects with Packages, Crates and Modules** -在编写大型程序时,由于在头脑里对整个程序保持追踪已成为不可能,因此代码组织就尤为重要。通过将相关功能分组,并以截然不同的特性而将代码加以分离,就会搞清楚在哪里去找到实现了某个特定特性的代码,以及在哪里去修改某项特性的运作方式。 +当咱们编写大型程序时,组织咱们的代码,将变得日益重要。通过对相关功能进行分组,并将具有不同功能的代码分开,咱们就会弄清楚,在哪里可以找到实现某项特定功能的代码,以及在哪里可以改变某项特性的工作方式。 -到目前为止,这里所编写的程序,都是在一个模组的一个文件中的。而随着项目的增长,就可以通过将项目分解为多个模组及多个文件,来对代码加以组织。一个代码包,可以包含多个二进制的代码箱,并可有选择地包含一个库代码箱。本章会涵盖到所有的这些技巧。对于那些极为大型、有着一套互相关联而共同演化的项目,Cargo 工具提供了工作区(workspaces)概念,关于工作区,将在第 14 章的 [Cargo 工作区](Ch14_More_about_Cargo_and_Crates_io.md#cargo-工作区)中讲到。 +到目前为止,我们编写的程序,都是在一个文件的一个模块中。随着项目的增长,咱们应通过把代码拆分为多个模块,然后拆分为多个文件来组织代码。一个包可以包含多个二进制代码箱,也可以包含一个库代码箱。随着包的增长,咱们可以将各个部分,提取到独立的代码箱中,成为外部依赖。本章将介绍所有这些技巧。对于由一组相互关联,共同发展的包组成的超大型项目,Cargo 提供了 *工作空间,workspaces*,我们将在第 14 章的 [Cargo 工作空间](../crates-io/workspace.md) 小节中介绍。 -除了实现功能上的分组(grouping functionality)外,对功能实现细节的封装,还实现了更高层次上的代码重用:一旦实现了某个操作,其他代码就可以在无需掌握其实现原理的情况下,通过该代码的公共接口,对该实现代码加以调用。编写代码的方式,就定义了哪些部分是公开给其他代码使用的,哪些部分是私有实现细节而对其修改权力有所保留。这是对那些必须保留在头脑中细节实现数量,而有所限制的另一种方式(in addition to grouping functionality, encapsulating implementation details lets you reuse code at a higher level: once you've implemented an operation, other code can call that code via the code's pulic interface without knowing how the implementation works. The way you write code defines which part are public for other code to use and which parts are private implementation details that you reserve the right to change. This is another way to limit the amount of detail you have to keep in your head)。 +我们还将讨论对实现细节进行封装的问题,这可以让咱们在更高层次上重用代码:一旦咱们实现了某个操作,其他代码就可以通过其公共接口,调用你的代码,而不必知道该操作是如何实现的。咱们编写代码的方式,定义了哪些部分是公开供其他代码使用的,哪些部分是私有的,咱们保留更改权利的实现细节。这是减少咱们必须记住的细节数量(从而减轻编程者负担)的方法。 -而与此相关的概念,便是作用域(scope):代码被编写出处的嵌套上下文,有着定义在所谓 “在作用域中(in scope)” 的一套名字。在读、写及编译代码时,程序员与编译器,二者都需要掌握,在某个特定点位处的某个特定名字,是否是指向了某个变量、函数、结构体、枚举、模组、常量或别的项目,以及该名字所指向项目的意义。创建作用域,及将一些名字的在或不在某个作用域加以修改,都是可行的。在同一作用域中,不能有两个名字相同的项目;有一些工具,可用于找出名字冲突。 +一个相关的概念是作用域:代码被写下之处的嵌套上下文,有着一组被定义为 “在作用域中” 的名字。在读取、编写和编译代码时,程序员和编译器都需要知道,某个特定点位上的特定名字,是否引用了某个变量、函数、结构体、枚举、模组、常量,或其他项目,以及该项目的含义。咱们可以创建出作用域,并改变哪些名字,在作用域内,哪些在作用域外。在同一个作用域中,不能有两个同名的项目;有些工具,可以解决名字冲突问题。 -对于包括哪些细节被暴露、哪些细节为私有,以及程序中各个作用域中有哪些名字等的代码组织,Rust 有着数种特性实现对其的管理。Rust 的这些有关代码组织的特性,有时被统称为 *模组系统(module system)*,包括了: +Rust 有数项特性,可以让咱们管理咱们代码的组织,包括哪些细节是公开的,哪些细节是私有的,以及咱们程序中各个作用域中的有哪些名字。这些特性有时统称为 *模组系统*,包括: -- **代码包(packages)**:实现代码箱(crates)的构建、测试与分享的 Cargo 特性; -- **代码箱(crates)**:产生出库或可执行文件的模组树(a tree of modules that produces a library or executable); -- **模组(modules)** 与 **`use`关键字**:实现对代码组织、作用域及路径私有的控制(let you control the organization, scope, and privacy of paths); -- **路径(paths)**:对结构体、函数或模组等进行命名的方式(a way of naming an item, such as a struct, function, or module)。 -在本章中,就要涉及到这些特性,讨论他们之间互动的原理,以及如何运用这些特性,来对作用域加以管理。在本章结束时,就会对 Rust 的模组系统有扎实掌握,并能够像专业 Rust 程序员那样,以作用域来编写程序! +- **包,packages**:让咱们构建、测试和共享代码箱的 Cargo 特性; + +- **代码箱,crates**:产生库或可执行程序的模组树; + +- **模组,modules** 与 **`use` 关键字**:让咱们控制路径的组织、作用域和隐私; + +- **路径,paths**:命名项目(例如结构体、函数或模块)的一种方式。 + + +在本章中,我们将介绍所有这些功能,讨论他们如何交互,并探讨如何使用他们来管理作用域。到本章结束时,咱们应对模组系统有扎实的了解,并能像专业人士一样,使用作用域!