設計とは??
ソフトウェアの構造、構成要素、構成要素間の関係、およびそれまでは特性を決める作業です。
ソフトウェア構成する単位
コンポーネント
サブシステム
実行プロセス
モジュール
クラス
パッケージ
ライブラリ
プロシージャ
設計の進め方
複製(クローン)
設計/コードをほとんどそのまま使う
参照モデル
アプリケーション分野ごとにシステムの分解方法を示した汎用的なアーキテクチャーを当てはめる
アーキテクチャー・スタイル
アーキテクチャーの選択肢を提案するガイドライン
デザインパターン
・汎用性の高い解決策を示す
・低レベルの設計に対する具体的解決策
デザインコンベンション
・一定の価値基準に基づいた、設計の指針やアドバイス
・従うべき基準と設計の方法を示す
デザインプリンシプル
・良い設計の基準を示し、どのように設計するかまでは決めない
・既存の解決策ではなく新しい設計を生み出すのに適する
取り組む課題か大きい時の対処法
(段階システム設計)
システムを段階的に分解しながら設計する。
分解すると課題が理解しやすくなりますが、分解しても捉えきれない場合はビューをしようし検討漏れがないを検証しやすくします。
分解手法の種類
機能分解
・機能または要求の単位(モジュール)で分ける
・高レベル設計
要求仕様書に記載された機能をモジュール化する
・低レベル設計
各モジュールをより小さなモジュールに細分化する
モジュール間の呼び出し関係を表す
データ思考分解
・データの単位でモジュール化する
・高レベル設計
概念的なデータ構造を表す
・低レベル設計
モジュール間のデータ分布
各データと概念的データ構造との関係を記述
プロセス思考分解
・システムで実行されるプロセスをモジュール化する
・高レベル設計
システムの主要なタスクを明らかにする
タスクを実行プロセスに割り当てる
各タスク間の連携を記述する
・低レベル設計
プロセスをより詳細に記述する
イベント思考分解
・システムで発生するイベントをモジュール化する
・高レベル設計
想定される入力イベントを列挙する
・低レベル設計
システムの状態を列挙し、イベントがどのように状態遷移を引き起こすか表現する
オブジェクト思考分解
・オブジェクトをモジュールに割り当てる
・高レベル設計
システムのオブジェクトの種類とオブジェクト間の関係を記述する
・低レベル設計
各オブジェクトの属性(フィールド)と操作(メソッド)を詳細化する
・システムの性質に応じて選択する
設計(分解)の評価基準
モジュール化されている
システムの各機能がそれぞれただ一つのソフトウェアユニットで実行され、それらユニットの入力と出力が明確に定義されている事
明確さ
ソフトウェアユニットのインターフェースが正確にそのユニットの外見上の振る舞いを定義している事
ビュー
分解すると課題が理解しやすくなりますが、分解しても捉えきれない場合はビューをしようし検討漏れがないを検証しやすくします。
論理ビュー
・ソフトウェアの機能を検討するための視点です。
・システムをプログラム可能な単位で記述する
・一般的に階層的な表現になる
・複数のモデルを使って表すことができる
・ソフトウェアユニット間の依存関係を記述する
・プロジェクトの計画に役立つ
・ソフトウェアユニットに設計変更を加えた場合の影響範囲を評価するのに役立つ
・ソフトウェアユニットの一般化・特化関係(継承関係)を記述する
・抽象または拡張可能なソフトウェアユニットを設計する際に役立つ
・検証しやすい、再利用しやすい
実行ビュー
・ソフトウェアが動作する局面を捉える視点です。
• システム内の実行順序を、コンポーネントとそれらを結ぶコネクターで記述する
• 各コンポーネントは一つの実行の単位を表す
• コネクターは、コンポーネント間の通信手段(通信路、データ、…)を表す
開発ビュー
・ソフトウェアを開発する局面を捉える視点です。
• ソフトウェアユニットとそれを実装したソースコードの対応を記述する
• ソースコードの検索を助ける
配置ビュー
・ソフトウェアをサーバーやぼーどなどに配置する曲面を捉える視点です。
• 実行時の単位となるソフトウェアユニットを物理的リソース(プロセッサ、記憶装置、…)に対応づける
• 品質に関わる属性(パフォーマンス、信頼性、セキュリティー、…)について分析するのに役立つ
役割分担
• システムの設計を、開発チームメンバーに割り当てる作業として分解して記述する
• プロジェクト管理において、リソースの確保と進捗の確認に役立つ