コンテンツにスキップ

ヒエラルキー: 複雑性を管理する手段

抽象化に続く2番目に重要なアイデアは、ヒエラルキーの考え方です。 ヒエラルキーは複雑性を管理するための手段であり、ほとんどのソフトウェアアプリケーションに見られます。

「ヒエラルキー」とは何を意味するのか?

広義には、「ヒエラルキーの考え方は、ものをグループ化し、抽象の木構造を形成することです。その「抽象の木構造」をヒエラルキーと呼びます」ということです。

非常に抽象的な定義ですので、例を見てみましょう。

あなたが大学生で、以下のようなコースの課題やPPTスライドなどのファイルを持っているとします。

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])

一般から具体のヒエラルキー

もう1つの一般的なヒエラルキーのタイプは、一般から具体へのヒエラルキーです。 このタイプのヒエラルキーでは、親は子を「一般化」し、その抽象化は子の性質の共通部分です。

たとえば、次のヒエラルキーを考えてみましょう。

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」の一種です。 つまり、各子ノードは親の一種であり、それ自体に特有の特徴があります。 親の特性はすべての子に共通です。

なぜヒエラルキーは重要なのですか?

ヒエラルキーは重要です。なぜなら、システムを異なるレベルで異なる方法で抽象化できるようにするためであり、設計、理解、およびメンテナンスが容易になります。

自動車の設計を行いたいとしましょう。 ヒエラルキーのない場合、ステアリングホイールのボルトからエンジンの各ギアまで、すべての部品をまとめて設計する必要があります。 自動車には数万もの部品がある可能性があるため、それらすべてを追跡して動作を確認することは非常に困難です。

車が機能しない場合、故障している部品を見つけて交換するために、すべての部品をチェックする必要があります。 車がどのように機能するかを説明したい場合、各部品の役割を説明する必要があり、すべての部品が互いに連携して機能するという事実は、おそらく魔法のように見えるでしょう。

ヒエラルキーの考え方を念頭に置いておくと、自動車を管理可能なピースに分割することができます。 たとえば、エンジンの開発チームとシャシーの開発チームに分かれて作業することができます。 そして、エンジンをさらに小さなピースに分割して互いに連携することを確認することもできます。 エンジンの開発チームはシャシーの仕組みを知る必要はありませんし(一般的に)、その逆も同様です。

車が機能しない場合、まずは各上位レベルのコンポーネントをチェックして正常に機能しているか確認し、故障しているコンポーネントを特定し、すべてのサブコンポーネントをチェックして最終的に故障している部品にたどり着くでしょう。 これはそれなりに手間がかかりますが、すべてのボルトやギアをチェックするよりはるかに簡単です。 車がどのように機能するかを説明したい場合、まずは各上位レベルのコンポーネントの機能を説明し、次にサブコンポーネントがどのように連携し、機能する高レベルのコンポーネントを構成するのかを説明します。 明らかに、この方法で車を説明する方が、最初にすべてのネジの役割を説明し、「突然、パーツが魔法のように機能する車になる」と説明するよりも簡単です。

ソフトウェア開発では、「故障している部品の交換」はおおよそ問題のあるコードの修正に対応します。 「車がどのように機能するかを説明する」は、ソフトウェアがどのように構成されているかを理解するためであり、それに基づいてコードを書く方法を知るためです。

複雑なシステムを分解してグループ化することで、ヒエラルキーの考え方は複雑性を管理し、複雑なシステムを効果的に設計し、理解できるようにします。

おめでとうございます!ヒエラルキーのアイデアを学びました。 次に、このモジュールの最後の概念である「標準」について話します。