トップダウン設計とボトムアップ設計
トップダウン設計とボトムアップ設計とは、設計戦略である。トップダウンとボトムアップは、情報や知識の順序付け戦略であり、様々な分野で使われる用語だが、ここでは主にソフトウェア工学での用法について解説する。
目次 |
概要 [編集]
トップダウン設計は、段階的に詳細にしていく設計技法である。最初にシステム全体を定式化し、その時点では個々の詳細には立ち入らない。その後、システムの個々の部分の設計を詳細化していく。最終的には、実装に移せるまで詳細化する。トップダウン設計はブラックボックスと深い関連がある。内部構造に立ち入らずに設計を行っている段階では、各部分をブラックボックスとして扱っていることになる。
ボトムアップ設計では、最初にシステムを構成する個々の部品を細部まで設計する。そして部品群を組み合わせてより大きな部分を作っていき、最終的にシステム全体が構成される。
ソフトウェア工学 [編集]
ソフトウェア開発 [編集]
ソフトウェア開発工程では、トップダウン設計とボトムアップ設計は重要な意味を持つ。
トップダウン設計では計画とシステムについての理解の完全性が重要となる。システムのある程度の部分の設計が十分な詳細さのレベルになるまでコーディングを開始することはできない。このため、設計の大部分が完了するまで主要な機能のテストはできない。ボトムアップ設計では、モジュール単位の設計が完了した時点でコーディングとそのテストが開始できる。しかし、ボトムアップではモジュール間の関連が明確化されていないと後から設計変更が発生してしまう危険性があり、実際問題としてモジュール間の関連を最初から全て完璧に見通すことは困難である。ボトムアップ設計の利点の1つとしてコードの再利用性の高さが挙げられる。
トップダウン設計は1970年代にIBMの研究者ハーラン・ミルズとニクラウス・ヴィルトが提案した。ミルズは構造化プログラミングを実用化し、1969年にニューヨーク・タイムズ紙の資料検索の自動化プロジェクトで実践して成果を上げた。このことから、トップダウン設計がIBMや他のコンピュータ企業で広く採用されるようになった。ヴィルトはPascal言語の開発者であり、Program Development by Stepwise Refinement という論文が業界に影響を与えた。トップダウン設計は1980年代にオブジェクト指向プログラミングが台頭してくるまで最も支持された手法であった。
最近では、トップダウン設計とボトムアップ設計を組み合わせて設計する手法が一般的である。システムを完全に理解することは手法によらず重要であり、理論上はトップダウン設計が必要となる。しかし多くのソフトウェアプロジェクトは、ある程度の既存のコードを流用する。既存のモジュールを流用することでボトムアップ設計の考え方が持ち込まれる。設計手法によっては、部分的に機能するシステムをまず構築し(設計とコーディング)、そのシステムに要求仕様を満たすように機能を追加していくこともある。
プログラミング [編集]
トップダウン・プログラミングは従来的な手続き型言語で主流とされるプログラミング手法である。まず複雑な部品の設計が行われ、それをもっと細かい単純な部品に分割し詳細化していく。最終的に各部品がコーディングできるほど詳細化された時点でプログラムを書き始める。これはC++やJavaのようなオブジェクト指向言語で主流とされるボトムアップ・プログラミングの対極にある。
トップダウン・プログラミングでは、まずメインの手続きを書く。その中には必要とされる関数名が登場する。その後、登場した各関数の実体を書いていく。これを全関数を書き上げるまで繰り返す。各関数(サブルーチン)の機能は可能な限り小さくされるため、そのコーディングも単純でコード自体も小さくなる。ボトムアップ・プログラミングでは、一部機能を選び、それを実装したコードをまず作成する。そのような単機能のコード群を書いた後で、それらを組み合わせて全体を構成していく。
トップダウン・プログラミングの利点:
- チームは常に目標を持って作業する。
- チーム全員が互いの作業内容を知っている。
- プログラミングが開始された時点で、不明な点は何もない。
- コードは目的を持って整然と書かれるので、理解しやすい。
トップダウン・プログラミングの欠点:
- ほぼ全体がコーディングされるまで実行してみることができないため、テストが後回しになる。一方、ボトムアップ・プログラミングでは単体テストが可能である。トップダウン・プログラミングでは、プロジェクトの最終段階で集中してテストを行うことになるため、最後になって問題が多発することが多い。トップダウンであっても、スタブを多用したテストハーネスを作れば、早期の単体テストは可能であるが、コストがかかる。
- コーディングは、それ以前の設計の品質に直接依存する。仕様の詳細さが不十分だとコーディングできない場合がある。
構文解析 [編集]
構文解析は、(ファイルやキーボードからの)一連の入力を処理して、その文法的構造を決定することである。構文解析は自然言語の解析にも使われるし、コンパイラなどでコンピュータ言語の解析にも使われる。
ボトムアップ構文解析は、最も下位の単位から解析していって上位の構造へと進んでいく戦略である。LR法などがある。一方、トップダウン構文解析は構文木の仮説を立てて、実際の構造がその仮説に合っているかを調べていく。再帰下降構文解析などがある。
外部リンク [編集]
- Program Development by Stepwise Refinement- Communications of the ACM, Vol. 14, No. 4, April (1971)