Transcript jlect10

Disciplined Software
Engineering
Lecture #10
Software Engineering Institute
Carnegie Mellon University
Pittsburgh, PA 15213
Sponsored by the U.S. Department of Defense
Copyright © 1994 Carnegie Mellon University1
ソフトウエア設計ー概要
設計
• 制約
• プロセス
• 表現
利用者のニーズ
設計の次元
設計テンプレート
Copyright © 1994 Carnegie Mellon University2
設計の制約
要求は設計と対応していなければならない 要求はしばしば実際に動く製品を手にするまで完全に
は理解されないことがある。
各設計レベルはより上位レベル設計をデバッグする :
•仕様は要求をデバッグする。
•概要設計は仕様をデバッグする。
•詳細設計は概要設計をデバッグする。
•実装は詳細設計をデバッグする。
Copyright © 1994 Carnegie Mellon University3
設計の枠組み
最初の要求
ユーザ要求について
データを集める
要求データを分析する
要求に対して設計
を確認する
要求について質問し
答えを得る
概要設計について
考える
設計を洗練し文書化する
完成した設計
Copyright © 1994 Carnegie Mellon University4
開発の枠組み
要
求
設
計
実
装
単 体 テ ス ト
ユーザー
統 合 テ ス ト
システムテスト
受 入 れ
使
用
Copyright © 1994 Carnegie Mellon University5
設計サイクル
要求定義
システム
仕様
システム
概要設計
製品1
仕様
製品N
仕様
- - - - - - -
製品1
概要設計
製品N
概要設計
部品 1-N
仕様
部品 1-1
仕様
- - - - - - - 部品1-N
概要設計
部品1-1
概要設計
モジュール 1n1
仕様
モジュール 1n1
詳細設計
- - - - - - - - - -
モジュール 1nk
仕様
- - - - - - - - - - - - - - - - - - - - - -
モジュール 1nk
詳細設計
Copyright © 1994 Carnegie Mellon University6
設計プロセス - 1
ソフトウエア設計は不完全に定義された問題に対する
精密で効果的な解を作成する創造的プロセスである。
設計プロセスは以下を行うことができない。
•決まりきった手続きに単純化する
•自動化する
•精密にコントロールしたりあるいは予測する
Copyright © 1994 Carnegie Mellon University7
設計プロセス - 2
設計プロセスは以下のために構造化することができる
•創造的活動から決まりきった仕事を分離する
•設計作業が適切に実行されることを保証する
•潜在的な設計支援ツールと手法を認識する
次の2つの問題を分離することが重要である:
•設計する方法
•完成した設計を表現する方法
Copyright © 1994 Carnegie Mellon University8
設計プロセス - 3
多くの設計方法がある:
•全てのドメインに最善であると証明された手法はない
•最善の方法は個人に依存するかもしれない
•個人の好みはまた重要である
•あるプロセスが広く利用可能であるためには多くの
異なる設計手法で有効でなければならない。
また表現には多くのタイプがある。
•グラフィックスが構造の視覚化を支援する
•形式化は精密さを与える
•テキストは直観的な理解を与える
•上記3つ全てがしばしば必要になる。
Copyright © 1994 Carnegie Mellon University9
PSP設計プロセス
PSPは完成した設計は何を含むべきかに焦点を置く。
このことは以下の理由で必要である。
•与えられた設計フェーズが何時完了するか決定するた
めの判断基準を与えるため
•その設計をレビューするためのベースを与えるため
•単独で最善の設計手法はないので、PSPは複数の
方法を支援することが可能でなければならない。
Copyright © 1994 Carnegie Mellon University10
貧弱な設計表現は欠陥を生じる - 1
設計のレベル
•明らかであるべき設計概念が実装段階でそうでない
かもしれない。
•実装期間に設計内容を再構築することは時間を消費
しまたエラーが入りやすい。
•時間を節約し欠陥を予防するためには、設計はそれ
を思いついた時に精密に記録しなければならない。
Copyright © 1994 Carnegie Mellon University11
貧弱な設計表現は欠陥を生じる - 2
設計の可視性
•複雑な設計は視覚化することが難しい。
•貧弱な表現はこの問題を一層ひどくする。
•うまく表現された設計は曖昧さがない。
設計の冗長性
•冗長な設計はしばしば矛盾している。
•矛盾があることはエラーを産み欠陥の原因となる。
•高品質な設計では重複が最小である。
Copyright © 1994 Carnegie Mellon University12
設計表現 - 要求
設計の表現は以下でなければならない。
•すべての重要な設計の側面を精密に定義する
•全ての重要な詳細を含む
•設計者の意志を伝える
•設計上の問題と見落しを識別することを助ける
また
•設計は簡潔で使い易くあるべきである。
•設計上のトピックスは、関係する場所に容易に対応づ
けできなければならない 。
•冗長は避けねばならない。
Copyright © 1994 Carnegie Mellon University13
設計の利用者 - 1
設計の主な利用者をあげると、
•プログラマ
•設計レビュー者
•テスト作業者とテスト開発者
•ドキュメント作成者、保守者、および機能拡張者
Copyright © 1994 Carnegie Mellon University14
設計の利用者 - 2
全ての利用者が以下を必要とする
•プログラム論理の明確な説明文
•全ての外部呼出しと参照の記述
•全ての外部変数、パラメータ、および定数 のリスト
•全ての関連するオブジェクトとクラスに対する仕様書
•全てのファイルとメッセージの記述
•全てのシステム制約の仕様書
•全ての実装上の制約の仕様書
Copyright © 1994 Carnegie Mellon University15
設計の利用者 - 3
さらに、設計とコードのレビュー者は以下を必要とする
•そのプログラムが何処でどのようにシステムにはめ
込まれるかについての図面
•製品の構造的なビュー
•プログラムの外部機能の精密な説明文
その他の利用者は以下を必要とする
•典型的なユーザシナリオ
•特別なエラーチェックまたは条件の仕様書
•その設計を選択した理由
Copyright © 1994 Carnegie Mellon University16
設計の利用者 - 4
設計は潜在的には膨大な資料である。
•その全てが直ちに必要にはならない。
•あるものは他の情報源から得ることができる。
•できる限り設計の仕事量を制限することが
賢明である
したがって、設計者が用意しなければならない重大な
設計の部分集合を識別することが重要である。
可能なところでは, その他の項目は後であるいは他の
人あるいは他のグループが用意した方がよい。
Copyright © 1994 Carnegie Mellon University17
設計の利用者 - 5
実装の前に設計者によって用意されなければならない
きわめて重要な資料は以下である。
•プログラム論理の明確な説明文
•全ての外部呼び出しと参照の仕様書
•全ての外部変数、パラメータ、および定数のリスト
•全ての関連するオブジェクトとクラスに対する仕様書
•そのプログラムが何処でどのようにシステムにはめ
込まれるかについての図面
•製品の構造的なビュー
Copyright © 1994 Carnegie Mellon University18
設計の次元
オブジェクト
仕様
静的
内部的
属性
制約
外部的
継承
クラスの構造
動的
状態機械
サービス
メッセージ
Copyright © 1994 Carnegie Mellon University19
設計テンプレート
4つの設計テンプレートが PSPで 使用される:
•論理仕様テンプレート - 静的, 内部的
•状態仕様テンプレート - 動的, 内部的
•機能仕様テンプレート - 動的かつ静的、外部的
•操作シナリオテンプレート - 動的, 外部的
Copyright © 1994 Carnegie Mellon University20
設計の階層
プログラム要求:
ユーザが必要とするもの
機 能 仕 様
操 作 シ ナ リ オ
プログラム仕様:
プログラムは何をするか
論 理 仕 様
状 態 仕 様
概要設計:
プログラムの作業の方法
モジュール/オブジェクト仕様
Copyright © 1994 Carnegie Mellon University21
実装の階層
モジュールの要求:
プログラムが必要とするもの
機能仕様
操作シナリオ
モジュール仕様:
そのモジュールがするものは何か
論理仕様
状態仕様
詳細設計:
モジュールはどのように働くか
モジュール
ソースコード
Copyright © 1994 Carnegie Mellon University22
設計テンプレートの使用
これらのテンプレートは設計を表現するための1つの方法
を構成している:
•その目的は精密で、曖昧でなく、冗長でなく、完全で
あること、
•あなたが出来るところではPSPでこの設計テンプレート
を使用しなさい。
もし他の表現が同様に精密で、曖昧でなく、冗長でなく
、完全であれば、それに替えてもよい。
これら以外の表現を追加してもよい。
Copyright © 1994 Carnegie Mellon University23
テンプレートの次元
オブジェクト仕様
内部的
外部的
静的
論理仕様
テンプレート
機能仕様
テンプレート
動的
状態仕様
テンプレート
機能仕様
および
操作シナリオ
テンプレート
Copyright © 1994 Carnegie Mellon University24
機能仕様テンプレート - 1
機能用仕様テンプレートの目的はこの製品によって
提供される全ての外部的なサービス機能を曖昧でなく
定義することである。
•オブジェクト、クラス、および 継承
•外部に見える属性
•各オブジェクトが与える精密な外部機能
Copyright © 1994 Carnegie Mellon University25
機能仕様テンプレート - 2
可能なところでは、各機能の呼び出し及びリターンは
形式的記法で仕様化すべきである。
関係するオブジェクトやクラスの機能仕様は共通の
テンプレートの中で一緒にグループ化すべきである。
Copyright © 1994 Carnegie Mellon University26
機能仕様テンプレート例
ASet (CData)
void Push(data D)
char *Pop(data &D)
int AddSet(data D)
int SubtractSet(data D)
int MemberSet(data D)
ListState (0 - 4)
ListPosition(0 - N)
:: insert D at position 1 && Reset
Empty’ :: return D.name && delete first
&& reset ||
Empty :: return “Empty”
D not in ASet :: Push(D) && Reset && return
true || D in ASet :: Reset&& return false
D in ASet :: delete(D) && Reset &&
return true || D not in ASet :: Reset &&
return false
D in ASet :: return ListPosition ||
D not in ASet && N==1 :: ListPostition = 1 &&
ListState = 1 && return false ||
D not in ASet && N>1 :: ListPosition = N &&
ListState = 4 && return false
Copyright © 1994 Carnegie Mellon University27
状態仕様テンプレート 1
オブジェクトは以下を満たす時状態機械である:
•同一のインプットが異なる応答を作り出す時
•履歴が状態によって記憶されている時
状態仕様テンプレートはオブジェクトの状態と状態間の
遷移を精密に定義する。
Copyright © 1994 Carnegie Mellon University28
状態仕様テンプレート 2
オブジェクト状態機械の各々に対して、
テンプレートは以下を仕様化する:
•各状態の名前
•各状態を特徴づける属性
•その状態に対する属性値
•その状態の簡潔な説明
•その状態から自分自身への遷移を引き起こす精密
な条件
•任意の他の状態からこの状態への遷移を引き起こ
す精密な条件
Copyright © 1994 Carnegie Mellon University29
状態機械の例*
EmptySet
First&Only
FirstOfSeveral
MiddleOfSeveral
LastOfSeveral
*注意:ある状態からそれ自身への遷移は示されていない
Copyright © 1994 Carnegie Mellon University30
部分的状態仕様
First&Only
the set has one member
N =1
ListState = 1
ListPosition = 1
EmptySet
Clear || Pop || (SubtractSet(D) && D in ASet)
First&Only
Reset || StepForward || StepBackward ||
(AddSet(D) && D in ASet) || (SubtractSet(D) && D not in
ASet) || MemberSet || Empty || Last || Status || Position
FirstOfSeveral
Push || (AddSet(D) && D not in ASet)
MiddleOfSeveral
Impossible
LastOfSeveral
Impossible
Copyright © 1994 Carnegie Mellon University31
状態仕様テンプレートの考察
全てのオブジェクト状態機械を定義しなさい
•自明な状態機械は定義するのも自明であるに違いな
い
•しばしば簡単な状態機械に見えてもそうでない
•状態機械が複数のオブジェクトを含む時には、オブジェクト
がうまく選ばれなかった徴候であるかもしれない。
完全性と無矛盾性をチェックしなさい
•全ての状態に対する属性の条件の集合は完全で直
交していなければならない。
•任意の与えられた状態からの全ての遷移条件の集
合は完全で直交していなければならない。
Copyright © 1994 Carnegie Mellon University32
論理仕様テンプレート 1
論理仕様テンプレートはプログラムの内部論理を精密に
定義する。
論理を便利な記法で記述しなさい:
•実装言語と互換性のある疑似コードはしばしば
適当である。
•形式的記法もまた適当である。
•プログラマは使用する記法に達者でなければならない。
Copyright © 1994 Carnegie Mellon University33
論理仕様テンプレート 2
論理仕様テンプレートは以下を仕様化すべきである:
•各オブジェクトの各メソッドの論理と、そのメインプロ
グラムの論理
•プログラムまたはメソッドに対する精密な呼び出し
•includes
•特別なデータタイプとデータ定義
•プロジェクト名、日付、および開発者
Copyright © 1994 Carnegie Mellon University34
操作シナリオテンプレート - 1
操作シナリオテンプレートはユーザのシステムとの
正常および非正常な相互作用が、設計前と設計途中
の双方で、考察されかつ定義されていることを保証す
るために使用される。
操作シナリオテンプレートは以下のことに使用できる:
•テストシナリオとテストケースを定義するために
•操作上の問題に関する開発上の疑問の解決のため
•ユーザとの要求仕様の論議を解決するために
Copyright © 1994 Carnegie Mellon University35
操作シナリオテンプレート - 2
操作シナリオテンプレートはシナリオ様式を使用する。
これは以下を含む:
•主要なユーザの行動とシステムの応答
•予期されるエラーおよびリカバリー条件
Copyright © 1994 Carnegie Mellon University36
演習課題 #10
テキストの第10章を読みなさい。
PSP2.1を使用して一連のN個の実数が正規分布して
いる度合いを計算するためのプログラム 9A を書く。
•N は20より大でかつ5の偶数倍と仮定する
•数値を上昇順にソートするためにプログラム8Aを使
用する.
付録Cにあるプロセスとレポートの仕様および、付録D
にあるプログラム仕様を読むこと。
Copyright © 1994 Carnegie Mellon University37
講義10から記憶すべきメッセージ
1. 設計は創造的なプロセスであるが, その決まりきっ
た側面は定義することが出来る。
2. 設計成果物の定義と確立された様式はあなたの設
計の品質を改善できる。
3. コース演習中の 4 つのPSP 設計テンプレートにつ
いて実験しなさい、そしてもしそれらのテンプレート が
有用と判ったら、それらを他の仕事にも使いなさい。
Copyright © 1994 Carnegie Mellon University38