ソフトウェアの設計の視点から、構成方法のタイプ、切り口について解説。 加えて、モジュールやクラスなどパッケージングの様々なレベルを説明。
9.1 System Structures
システムをどのようにサブシステムで構成するかという方法の紹介。
- Centralized Repository and Distributed Approaches (9.1.1)
- クライアント・サーバ。黒板システム(key/valueペアでレポジトリにアクセス。プログラムをデータの流れ通りに構成しなくても部分同士が通信できる。例: apache)。またそれを分散システムで実現するためのRPC、CORBA、RMIなども少し紹介。
- Data-Flow Architectures (9.1.2)
- データの変換の連続として処理をモデル化。要するにUNIXのパイプで流す処理。data-flow diagramを描いてみると役に立つ。例: makewhatis。
- Object-Oriented Structures (9.1.3)
- UMLによる図を描くのはシステムの構造を理解するのに有益。コードを読んで図を生成するツールもある(例: ArgoUML)。
- Layered Architecture (9.1.4)
- 例: ファイルシステム(fwriteからデバイスの書き込みまで。Half-Sync/Half-Async)
- Hierarchies (9.1.5)
- 同じ対象でも視点を変えて何通りもの階層構造がある
- Slicing (9.1.6)
- 分析テクニック。コードから、ある点数の特定箇所での値への影響に着目して関係するコードを抜き出すこと。
9.2 Control models
- Event-Driven Systems (9.1.1)
- 例: GUI。多数の発生源からのイベントを統合。
- System Manager (9.2.2)
- 要素の一つがマネージャとして他の要素の実行を制御する。
- State Transition (9.2.3)
- 有限状態機械。
9.3 Element Packaging
今度はコードを読む際に必要となるボトムアップな視点からの分析に役立つ視点。 コードを読む際には、大きなソフトウェアがどのような方法で各単位に分割されるかを知ることが重要。
- Modules (9.3.1)
- 例: nvi(ファイルとモジュールが1:1), BSD window(複数ファイル/モジュール)、NetBSDカーネル(ディレクトリ/モジュール)
- Namespaces (9.3.2)
- C++のnamespaceやJavaのpackage。
- Objects (9.3.3)
- オブジェクト指向の説明。長いが省略できる。C++等の言語機能のみに頼らない(頼れない)実現方法の例も。
- Generic Implementations (9.3.4)
- 任意の型の要素に使えるデータ構造やアルゴリズム。C/C++のマクロによる表現やC++のテンプレート。
- Abstract Data Types (9.3.5)
- 要するに抽象データ型。
- Libraries (9.3.6)
- 効用: Code Reuse, Encapsulation, Structure(モジュールごとにライブラリにする), Optimization of the Build Process, Reduction of Code Size, Dynamic Linking(Windowsではリソースの切り替えにも使われる)。
- Processes and Filters (9.3.7)
- UNIXのプロセス。例: apache、gccのコンパイラドライバ。UNIXのフィルタ。
- Components (9.3.8)
- ActiveX, JavaBeans, CORBA。
- Data Repositories (9.3.9)
9.4 Architecture Reuse
多くのシステムは確立されたアーキテクチャを利用。基本的な事柄すぎてわざわざ文書化されていないことも多い。
- Frameworks (9.4.1)
- 例: MFC、Java AWT、ACE。
- フレームワーク自体を学習することが理解の近道。それにはほとんど何もしない一番簡単なサンプルを調べたり変更したりするのがよい。
- Code Wizards (9.4.2)
- ウィザードを使って作られたものは作り手が基礎となるフレームワークについて部分的な理解しかしてない場合が往々にしてある。
- Design Patterns (9.4.3)
- 例: Singleton パターン。
- Domain-specific architecture (9.4.4)
- 分野によっては構成法が確立されている。例: ファイルの字句解析・構文解析。
練習問題ピックアップ
exercise 9.5: GNU tarのデータフローダイアグラムを描け。(着目点: リモートバックアップ、圧縮、固定長ブロックI/O)
exercise 9.6: UMLのモデリングツールを使ってオブジェクト指向アプリを解析せよ。
exercise 9.24: 各種デザインパターンのACEフレームワークで使われているコードを特定しコードに即してパターンの特長を説明せよ。
exercise 9.25: gccのソースコードの各部を典型的なコンパイラアーキテクチャに対応させよ。