层次结构:管理复杂性的一种方法
在抽象之后,次重要的概念是层次结构的概念。层次结构是一种管理复杂性的方法,几乎在每个软件应用中都存在。
"层次结构"是什么意思?
广义来说,层次结构的概念是将事物分组并形成抽象的树形结构;这个“抽象的树形结构”被称为“层次结构”。
这是一个非常抽象的定义,让我们来看一个例子。
假设你是一名大学生,你有以下课程作业、幻灯片等文件:
introduction-to-ai.pdf
calculus-assignment-1.pdf
programming-assignment-2.py
literature-textbook.epub
introduction-to-ai-lecture-2.pdf
calculus-assignment-2.pdf
programming-assignment-3.py
literature-review-article.epub
introduction-to-ai-project-outline.docx
calculus-final-exam-review.pdf
programming-code-snippets.txt
literature-essay-draft.docx
introduction-to-ai-research-paper.pdf
calculus-quiz-answers.docx
programming-tutorial-slides.pptx
literature-poetry-analysis.pdf
哇,这么多文件。看起来乱七八糟的,不是吗?
一个自然的想法是将它们分组到文件夹中,例如:
course-files/
AI/
introduction-to-ai.pdf
introduction-to-ai-lecture-2.pdf
introduction-to-ai-project-outline.docx
introduction-to-ai-research-paper.pdf
Calculus/
calculus-assignment-1.pdf
calculus-assignment-2.pdf
calculus-final-exam-review.pdf
calculus-quiz-answers.docx
Programming/
programming-assignment-2.py
programming-assignment-3.py
programming-code-snippets.txt
programming-tutorial-slides.pptx
Literature/
literature-textbook.epub
literature-review-article.epub
literature-essay-draft.docx
literature-poetry-analysis.pdf
看起来好多了,对吧? 文件按科目分组在一起, 这样你就可以更容易找到你需要的东西。
这就是层次结构的概念。 回顾一下层次结构的定义: 层次结构的概念是将事物分组并形成抽象的树形结构。 在这里,我们根据它们所属的科目将文件分组在一起。 你可能会问:“那里的‘抽象的树形结构’在哪里?” 那么,上面的目录结构也可以用以下图表示:
mindmap
root((course-files))
AI
introduction-to-ai.pdf
introduction-to-ai-lecture-2.pdf
introduction-to-ai-project-outline.docx
introduction-to-ai-research-paper.pdf
Calculus
calculus-assignment-1.pdf
calculus-assignment-2.pdf
calculus-final-exam-review.pdf
calculus-quiz-answers.docx
Programming
programming-assignment-2.py
programming-assignment-3.py
programming-code-snippets.txt
programming-tutorial-slides.pptx
Literature
literature-textbook.epub
literature-review-article.epub
literature-essay-draft.docx
literature-poetry-analysis.pdf
这看起来就像一棵树的分支。 树中的每个节点代表一个抽象, 子节点的抽象与其父节点相关。 例如,“course-files”文件夹的抽象可能是“所有大学课程的文件”; 它的子节点是“AI”、“Calculus”、“Programming”和“Literature”, 而每个文件夹都抽象出了“某门课程的所有文件”, 这是“所有课程的文件”的一部分。
现在你已经大致了解了层次结构, 让我们来看一些常见的层次结构类型,以更好地理解这个概念。
常见的层次结构类型
合成
合成可能是最常见的层次结构类型。 合成层次结构是指在抽象的树形结构中,父节点包含子节点。
前面的课程文件示例是一个合成层次结构。 在这个示例中,“course-files”文件夹是“AI”、“Calculus”、“Programming”和“Literature”文件夹的父节点; 每个课程文件夹都是该课程的文件的父节点。 “course-files”包含课程文件夹; 每个课程文件夹都包含其文件。 也就是说,父节点包含子节点。
另一个例子是一辆汽车。 在最高级别上,汽车由车身、发动机、底盘和车轮组成。 然后,车身包含门和窗户, 发动机包含变速器和汽缸等等。
graph TD
A([Car]) --> B([Car-Body])
A --> E([chassis])
A --> F([Wheels])
A --> C([Engine])
B --> G([Doors])
B --> H([Windows])
C --> I([Gears])
C --> J([Cylinders])
由一般到特殊的层次结构
另一种常见的层次结构类型是由一般到特殊的层次结构。 在这种层次结构中,父节点泛化了其子节点, 它的抽象是子节点的性质的交集。
例如,考虑以下层次结构:
graph TD
A([Creatures]) --> B([Plants])
B --> G([Trees])
B --> H([Grass])
A --> C([Animals])
C --> D([Insects])
C --> E([Mammals])
E --> F([Humans])
在这个层次结构中,“Animals”是“Creatures”的一种类型; “Mammals”是“Animals”的一种类型; “Humans”是“Mammals”的一种类型,等等。 也就是说,每个子节点都是父节点的一种类型, 除了具体子节点特有的特性以外; 父节点的特性适用于所有子节点。
为什么层次结构很重要?
层次结构很重要,因为它允许系统在不同层级上以不同方式进行抽象, 这使得设计、理解和维护变得更加容易。
假设我们想设计一辆汽车。 如果没有层次结构,我们需要一起设计每个零件, 从方向盘上的每颗螺钉到发动机中的每个齿轮。 由于汽车可能有成千上万个零件, 要追踪它们中的每一个并确保它们可以共同运作将非常困难。
当汽车发生故障时,我们需要检查每个零件, 找到有问题的零件并替换它; 如果我们想解释汽车的工作原理, 我们需要解释每个零件的功能, 而所有零件协同工作构成一个功能完整的汽车 可能看起来像魔法。
有了层次结构的概念,我们可以将汽车拆分成更容易处理的部分。 例如,我们可以让一个工程团队负责发动机的工作, 另一个团队负责底盘等等。 而负责发动机的团队可能会进一步将发动机拆分成更小的部分,以确保它们可以共同工作。 负责发动机的团队不需要知道底盘如何工作(通常);反之亦然。
当汽车发生故障时,我们首先检查每个高级组件, 看它们是否正常工作,识别有问题的组件, 检查它的所有子组件,直到最后找到有问题的部分; 虽然这也是很多工作, 但比检查每个螺栓和齿轮要容易得多。 如果我们想解释汽车的工作原理, 我们首先解释每个顶级组件的功能, 然后解释子组件如何共同工作并构成一个功能完整的顶级组件。 显然,用这种方式解释汽车要容易得多 比先描述每个螺丝钉的功能,再“突然,零件就神奇地成为一个工作的汽车”。
在软件开发中,“替换有问题的零件”大致对应于修复有问题的代码块; “解释汽车的工作原理”大致对应于理解软件是如何组成的,以便知道如何编写代码。
正如你所看到的,通过分解复杂系统并将事物分组在一起, 层次结构的概念允许人们管理复杂性,并有效地设计和理解复杂系统。
恭喜!你已经学会了层次结构的概念。 接下来,我们将讨论本模块的最后一个概念:标准。