4-1 設計の基本概念

Fundamentals of System Design

設計は要件を実装可能な形に変換するプロセスである。 本節では、設計の目的と原則、基本設計と詳細設計の違い、 そして良い設計の特性について解説する。

1. 設計とは

1.1 設計の定義

設計(Design)とは、要件定義で明確化された「何を作るか」を、 「どのように作るか」に変換するプロセスである。 抽象的な要件を、開発者が実装可能な具体的な仕様に落とし込む。

フェーズ 問い 成果物
要件定義 何を作るか(What) 要件仕様書
設計 どのように作るか(How) 設計書
実装 実際に作る ソースコード

1.2 設計の目的

設計の目的は、要件を満たすシステムを効率的に構築するための 青写真を作成することである。

目的 説明
要件の実現 機能要件・非機能要件を満たす構造を定義
品質の確保 保守性、拡張性、性能などの品質特性を確保
開発の効率化 実装の指針を示し、開発者間の認識を統一
リスクの低減 技術的な問題を早期に発見・解決
コミュニケーション ステークホルダー間の共通理解を促進

2. 設計のレベル

2.1 基本設計と詳細設計

設計は一般的に、基本設計(外部設計)と詳細設計(内部設計)の 2段階で行われる。

設計フェーズの流れ

図1: 設計フェーズの流れ

観点 基本設計(外部設計) 詳細設計(内部設計)
視点 ユーザー視点(外から見た振る舞い) 開発者視点(内部構造)
抽象度 高い 低い(具体的)
対象 システム全体の構成 個々のモジュール・コンポーネント
主な内容 画面、帳票、外部IF、データ構造 クラス、メソッド、アルゴリズム
参加者 ユーザー、SE、アーキテクト SE、プログラマー

2.2 基本設計の成果物

基本設計では複数の成果物を作成する。

成果物 内容
システム構成図 ハードウェア、ネットワーク構成
機能一覧 システムが提供する機能の一覧
画面設計書 画面レイアウト、項目定義、遷移図
帳票設計書 出力帳票のレイアウト、項目
外部インターフェース設計書 他システムとの連携仕様
データベース設計書 ER図、テーブル定義
バッチ処理設計書 バッチジョブの構成、スケジュール

2.3 詳細設計の成果物

詳細設計では実装に必要な詳細を定義する。

成果物 内容
クラス図 クラスの構造と関係
シーケンス図 オブジェクト間のメッセージのやり取り
モジュール仕様書 各モジュールの入出力、処理ロジック
物理データベース設計 インデックス、パーティション
単体テスト仕様書 モジュールレベルのテスト設計
アジャイルでの設計
アジャイル開発では、事前に詳細な設計書を作成するのではなく、 イテレーションごとに必要な設計を行う。ただし、アーキテクチャなど 変更コストが高い決定は早期に行うことが重要である。

3. 設計の原則

3.1 基本的な設計原則

良い設計を行うための基本原則がある。

原則 説明 効果
関心の分離 異なる関心事を異なるモジュールに分離 変更の局所化、理解しやすさ
高凝集 関連する機能を1つのモジュールにまとめる モジュールの責務が明確
低結合 モジュール間の依存を最小化 変更の影響範囲を限定
情報隠蔽 内部実装を外部から隠す 実装変更の自由度確保
抽象化 詳細を隠し本質的な特徴を抽出 複雑性の管理
モジュール化 システムを独立した部品に分割 並行開発、再利用

3.2 SOLID原則

SOLID原則はオブジェクト指向設計の5つの基本原則である。

原則 名称 説明
S 単一責任の原則 クラスは1つの責任のみを持つ
O 開放閉鎖の原則 拡張に開き、修正に閉じる
L リスコフの置換原則 サブクラスは親クラスと置換可能
I インターフェース分離の原則 クライアントに不要なメソッドへの依存を強制しない
D 依存性逆転の原則 抽象に依存し、具象に依存しない
原則の過剰適用に注意
設計原則は重要だが、過剰に適用すると複雑になりすぎることがある。 YAGNI(You Ain't Gonna Need It:今必要でないものは作らない)の 精神で、必要十分な設計を心がけるべきである。

4. 良い設計の特性

4.1 品質特性

良い設計は、以下の品質特性を備えている。

特性 説明 実現方法
正確性 要件を正しく満たす 要件トレーサビリティ、レビュー
保守性 変更・修正が容易 モジュール化、文書化
拡張性 機能追加が容易 抽象化、プラグイン構造
再利用性 部品を他で再利用可能 汎用化、共通ライブラリ
テスト容易性 テストしやすい構造 依存性注入、モック可能
理解容易性 設計意図が明確 命名規則、設計パターン

4.2 設計のトレードオフ

設計では、相反する特性間のトレードオフを検討する必要がある。

トレードオフ
性能 vs 保守性 最適化されたコードは読みにくい
柔軟性 vs 複雑性 拡張可能にすると構造が複雑化
セキュリティ vs 利便性 認証を強化すると操作が煩雑
開発速度 vs 品質 急ぐと技術的負債が蓄積

設計判断の記録

重要な設計判断は「アーキテクチャ決定記録(ADR)」として 文書化することが推奨される。判断の背景、検討した選択肢、 選択理由、トレードオフを記録しておくことで、 後から設計意図を理解しやすくなる。

次のステップ
設計の基本概念を理解したら、次は「4-2 アーキテクチャ設計」で システム全体の構造設計について学習しよう。
参考文献
[1] Martin, R. C. (2017). Clean Architecture.
[2] Bass, L. et al. (2012). Software Architecture in Practice.