Disciplined Software Engineering Lecture #10 Software Engineering Institute Carnegie Mellon University Pittsburgh, PA 15213 Sponsored by the U.S. Department of Defense 情報システムプロジェクト管理(10) 九州産業大学 情報科学部 松本研究室 ソフトウエア設計(概要) 設計 • 制約 • プロセス • 表現 利用者のニーズ 設計の次元 設計テンプレート 設計の制約 要求は設計と対応していなければならない 要求はしばしば実際に動く製品を手にするまで完全に は理解されないことがある。 各設計レベルはより上位レベル設計をデバッグする : •仕様は要求をデバッグする。 •概要設計は仕様をデバッグする。 •詳細設計は概要設計をデバッグする。 •実装は詳細設計をデバッグする。 設計の枠組み 最初の要求 ユーザ要求について データを集める 要求データを分析する 要求に対して設計 を確認する 要求について質問し 答えを得る 概要設計について 考える 設計を洗練し文書化する 完成した設計 開発の枠組み 要 求 設 計 実 装 単 体 テ ス ト 統 合 テ ス ト システムテスト 受 入 れ 使 用 ユーザー 設計サイクル 要求定義 システム 仕様 システム 概要設計 製品1 仕様 - - - - - - - 製品1 概要設計 部品 1-N 仕様 部品 1-1 仕様 製品N 仕様 製品N 概要設計 - - - - - - - 部品1-N 概要設計 部品1-1 概要設計 モジュール 1n1 仕様 モジュール 1n1 詳細設計 - - - - - - - - - - モジュール 1nk 仕様 - - - - - - - - - - - - - - - - - - - - - - モジュール 1nk 詳細設計 設計プロセス - 1 ソフトウエア設計は不完全に定義された問題に対する 精密で効果的な解を作成する創造的プロセスである。 設計プロセスは以下を行うことができない。 •決まりきった手続きに単純化する •自動化する •精密にコントロールしたりあるいは予測する 設計プロセス - 2 設計プロセスは以下のために構造化することができる •創造的活動から決まりきった仕事を分離する •設計作業が適切に実行されることを保証する •潜在的な設計支援ツールと手法を認識する 次の2つの問題を分離することが重要である: •設計する方法 •完成した設計を表現する方法 設計プロセス - 3 多くの設計方法がある: •全てのドメインに最善であると証明された手法はない •最善の方法は個人に依存するかもしれない •個人の好みはまた重要である •あるプロセスが広く利用可能であるためには多くの 異なる設計手法で有効でなければならない。 また表現には多くのタイプがある。 •グラフィックスが構造の視覚化を支援する •形式化は精密さを与える •テキストは直観的な理解を与える •上記3つ全てがしばしば必要になる。 PSP設計プロセス PSPは完成した設計は何を含むべきかに焦点を置く。 このことは以下の理由で必要である。 •与えられた設計フェーズが何時完了するか決定するた めの判断基準を与えるため •その設計をレビューするためのベースを与えるため •単独で最善の設計手法はないので、PSPは複数の 方法を支援することが可能でなければならない。 貧弱な設計表現は欠陥を生じる - 1 設計のレベル •明らかであるべき設計概念が実装段階でそうでない かもしれない。 •実装期間に設計内容を再構築することは時間を消費 しまたエラーが入りやすい。 •時間を節約し欠陥を予防するためには、設計はそれ を思いついた時に精密に記録しなければならない。 貧弱な設計表現は欠陥を生じる - 2 設計の可視性 •複雑な設計は視覚化することが難しい。 •貧弱な表現はこの問題を一層ひどくする。 •うまく表現された設計は曖昧さがない。 設計の冗長性 •冗長な設計はしばしば矛盾している。 •矛盾があることはエラーを産み欠陥の原因となる。 •高品質な設計では重複が最小である。 設計表現 - 要求 設計の表現は以下でなければならない。 •すべての重要な設計の側面を精密に定義する •全ての重要な詳細を含む •設計者の意志を伝える •設計上の問題と見落しを識別することを助ける また •設計は簡潔で使い易くあるべきである。 •設計上のトピックスは、関係する場所に容易に対応づ けできなければならない 。 •冗長は避けねばならない。 設計の利用者 - 1 設計の主な利用者をあげると、 •プログラマ •設計レビュー者 •テスト作業者とテスト開発者 •ドキュメント作成者、保守者、および機能拡張者 設計の利用者 - 2 全ての利用者が以下を必要とする •プログラム論理の明確な説明文 •全ての外部呼出しと参照の記述 •全ての外部変数、パラメータ、および定数 のリスト •全ての関連するオブジェクトとクラスに対する仕様書 •全てのファイルとメッセージの記述 •全てのシステム制約の仕様書 •全ての実装上の制約の仕様書 設計の利用者 - 3 さらに、設計とコードのレビュー者は以下を必要とする •そのプログラムが何処でどのようにシステムにはめ 込まれるかについての図面 •製品の構造的なビュー •プログラムの外部機能の精密な説明文 その他の利用者は以下を必要とする •典型的なユーザシナリオ •特別なエラーチェックまたは条件の仕様書 •その設計を選択した理由 設計の利用者 - 4 設計は潜在的には膨大な資料である。 •その全てが直ちに必要にはならない。 •あるものは他の情報源から得ることができる。 •できる限り設計の仕事量を制限することが 賢明である したがって、設計者が用意しなければならない重大な 設計の部分集合を識別することが重要である。 可能なところでは, その他の項目は後であるいは他の 人あるいは他のグループが用意した方がよい。 設計の利用者 - 5 実装の前に設計者によって用意されなければならない きわめて重要な資料は以下である。 •プログラム論理の明確な説明文 •全ての外部呼び出しと参照の仕様書 •全ての外部変数、パラメータ、および定数のリスト •全ての関連するオブジェクトとクラスに対する仕様書 •そのプログラムが何処でどのようにシステムにはめ 込まれるかについての図面 •製品の構造的なビュー 設計の次元 オブジェクト 仕様 静的 Static 内部的 属性 制約 外部的 継承 クラスの構造 動的 Dynamic 状態機械 サービス メッセージ 設計テンプレート 4つの設計テンプレートが PSPで 使用される: •論理仕様テンプレート - 静的, 内部的 •状態仕様テンプレート - 動的, 内部的 •機能仕様テンプレート - 動的かつ静的、外部的 •操作シナリオテンプレート - 動的, 外部的 扱う側面 静的:時間によって変化しない側面 動的:時間によって変化する側面 内部的:プログラム/モジユールの内面 外部的:プログラム/モジユール間のつながり 外部に見える性質 設計の階層 プログラム要求: ユーザが必要とするもの 機 能 仕 様 操 作 シ ナ リ オ プログラム仕様: プログラムは何をするか 論 理 仕 様 状 態 仕 様 概要設計: プログラムの作業の方法 モジュール/オブジェクト仕様 実装の階層 モジュールの要求: プログラムが必要とするもの 機能仕様 操作シナリオ モジュール仕様: そのモジュールがするものは何か 論理仕様 状態仕様 詳細設計: モジュールはどのように働くか モジュール ソースコード 設計テンプレートの使用 これらのテンプレートは設計を表現するための1つの方法 を構成している: •その目的は精密で、曖昧でなく、冗長でなく、完全で あること、 •出来るだけPSPでこの設計テンプレートを使用しなさい。 もし他の表現が同様に精密であり、曖昧でなく、冗長で なく、完全であれば、それに替えてもよい。 これら以外の表現を追加してもよい。 テンプレートの次元 オブジェクト仕様 内部的 外部的 静的 論理仕様 テンプレート 機能仕様 テンプレート 動的 状態仕様 テンプレート 機能仕様 および 操作シナリオ テンプレート 機能仕様テンプレート - 1 機能仕様テンプレートの目的は、提供される全ての外部的 サービス機能を曖昧なく定義することである。 •オブジェクト、クラス、および 継承 •外部に見える属性 •各オブジェクトがもつ精密な外部機能 機能仕様テンプレート - 2 可能な限り、各機能の呼び出しとリターンは 形式的記法で仕様を書くべきである。 関連しあっているオブジェクトやクラスの機能仕様は、ひと まとめにして、共通のテンプレートで、グループ化すべきであ る。 例題 CDataクラス 2つのオブジェクト ・CData リンクリスト(0以上の自然数値を持つ)関係 の基本機能をもつ。 ・ASet プッシュダウンとなんとかセットの機能をもつ。 ・CDataリストの中の位置を示すポインタとリスト状態: ・属性ListPositionはポインタが示す0からNまでのメ ンバの個数を示す ・属性ListStateはCDataの状態を示す 状態 メンバ数 EmptySet 0 First&Only 1 FirstofSeveral N MiddleofSeveral N LastofSeveral N ListState ListPosition 0 1 2 3 4 0 1 1 1<LP<N N 振る舞いの記述法 - 基本形 条件::アクション ::の左辺に論理的前条件 ::の右辺にアクションまたは論理的後条件 - 複合条件式 ( vは論理和、&は論理積) (条件1::アクション1)v(条件2::アクション2)&(条3) (条件1v条件2)::アクション1&アクション2 機能仕様テンプレート例 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 CData機能仕様 P.368 付表B4 関数Pop は型dataの変数Dを渡す 戻り値は文字列 Empty’ ::return(D.first name) Emptyでない時、戻り値を Dの名前フィールドとし ^(D=first element) Dに最初の要素を代入、 ^(delete first)vreset 最初の要素を削除しリセット V Empty::return “Empty” Emptyなら文字列に“Empty”を 返す Char *Pop(data &D) 付表B4を見よ Int Empty() LS==0::return(true)|| LS=/0::return(false) Int Clear() ::Set CData pointers to null && LS=0&&LP=0&&return(true) Int Last() (Empty’ &&(LS==1||LS==4)) ::return(true) || (Empty||(LS==2||LS==3))::return( false) Int Reset() ASet (CData) メソッド void Push(data D) char *Pop(data &D) int AddSet(data D) 記号&&は論理積 記号|| は論理和 ListState (0 - 4) ListPosition(0 - N) :: insert D at position 1 && Reset Empty’ :: return (D.name) && (delete first) &&(D=first)&& Reset || Empty :: return “Empty” D not in ASet :: Push(D) && Reset && return(true) || D in ASet :: Reset&& return (false) Int SubtractSet(data D) int MemberSet(data D) 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 状態仕様テンプレート 1 オブジェクトは以下を満たす時、状態機械である: •同一のインプットが異なる応答を作り出す時 •状態履歴が記憶されている時 状態仕様テンプレートはオブジェクトの状態と状態間の 遷移を厳密に定義する。 状態(State) 遷移(Transition) 状態仕様テンプレート 2 状態機械の各々に対して、テンプレートは以下を仕様化す る: •1. 各状態の名前 •2. 各状態を特徴づける属性 •3. その状態に対する属性値 •4. その状態の簡潔な説明 •5. その状態から他の状態へ遷移を引き起こす厳密 な条件 •6. 任意の他の状態からその状態へ遷移を引き起こ す厳密な条件 有限状態機械Finite State Machine プログラムが状態機械か否かの判別の仕方: ・同一入力データに対して、プログラムが異なる外的振 る舞いをするなら、状態機械である。 例1:自販機でつり銭の有無により外的振る舞いが異 なる。 例2:プログラムLOCカウントモジュール ・機能:プログラムの文字を読む。もしコメント文の最初 を検出したら、その終わりまで、空読みして飛ばす。 ・状態:COMMENT状態とPROGRAMTEXT状態 正規(完全直交)状態機械 次の条件を満たすこと 1.あらゆる状態から終了状態へ到達可能 2. すべての状態条件が完全(とり得るすべての状態 が識別できている)で直交している(同時に2つ以上の 状態を取り得ない) 3.各状態からの遷移がすべて完全でかつ直交してい る(あらゆる状態から唯一で一意的な次の状態への遷 移が入力値のすべての取りえる組み合わせに対して 定義できている) 完全直交状態機械とは 1.完全で直交した状態を持ち 2.状態間の遷移条件も完全で直交したもの ゆえに状態機械全体では 1.全ての状態属性値の和集合は真である。 2.すべての可能な状態が含まれている。 5通りの状態機械の例(P.216 図10.5) LS:ListSate、 LP:ListPositon ^:and v:inclusive or (LS==0^LP==0)v (LS==1^LP==1)v (LS==2^LP==1)v (LS==3^1<LP<N)v (LS==4^LP==N) 上記の状態の完全条件と直交条件は満足されるか? 状態の完全条件は満足される? 1) LSのすべてのとり得る値が0から4までかチェック 。 2) LSの各値についてLPのとり得る値がすべて与え られているかチェック。→真。 これら属性の組み合わせは状態機械の状態を表し(図 10.5配布6.15)、 状態属性値の和集合は真なので、状態の完全条件は 満たされている。 状態の直交条件は満足される? 表10.8を調べる この機械は同時に2つの状態を取りえない(なぜなら、 属性LSとLPの値が各状態ごとに異なる) →状態の直交条件は満たされている。 あらゆる状態からの全ての遷移条件の和 集合は真か? 表10.8(配布09.06.09)を見て、チェック その前に、関数集合が完全/直交とは 関数集合で説明 ・関数集合が完全とは、すべての要素の和集合が真 ・関数集合が直交とは、要素間のすべてのありうる積 集合が空 あらゆる状態からのすべての遷移条件の 和集合は真か?表10.8(6.9配布)参照 ①EmptySet状態:遷移がすべてのあり得るメソッド呼 び出しを含んでいるので全条件の和集合は真。 ②First&Only状態:AddSetとSubtractSet以外は EmptySetのときと同様すべてのメソッドを含んでいる 。ただしAddSetとSubtractSetは2度ずつ含まれてい るが条件は異なっている。以上すべてのあり得る条件 を表しているので、和集合は真。 ③MiddleOfSeveral状態:要素は複数。ポインタは最 初の位置。あらゆるメソッドの効果が記述されている。 詳細次頁 ③ SubtractSetメソッド 条件 N==2^D is ASet ::First&Only D notASet v N>2 ::FirstOfSeveral このメソッドのすべての可能性を含み、次の状態とユ ニークに結びついている。FirstOfSeveral状態は N>=2であるので、N==0、N==1は考慮不要。 N==2 N>2 D is ASet First&Only FirstOfSeveral D not ASet FirstOfSeveral FirstOfSeveral 同様にチェックすれば 考慮すべきすべてのあり得る状態遷移とそれらが直交 していること、 それゆえ状態遷移の直交条件が満たされていること、 が検証できる。 あとは終了状態にすべての状態から到達可能だけ。 完全性・直交性の判定方法 1. 状態機械が終了すること トラップやループが無いか(無限ループや終了状態到 達不可能が無いこと。) どの状態からも他の状態へ常に遷移できる。 2.状態の完全性の確認 すべてのとりうる状態が識別できているか。i.e., 状態機械の属性のすべての取りうる値が、状態によっ て記述定義されているか。P214-215 3.状態の直交性の確認 条件のあらゆる集合についてとりうる状態が1時にただ1つ だけ存在すること。i.e.状態機械は同時に2つの異なる状態 を取り得ない。 (属性値は同時に2つの異なる値は取り得ない)。P214216 4.各状態からの遷移が完全かつ直交か確認 あらゆる状態から唯一の一意的な次の状態への遷移が、 入力値のすべてのとりうる組み合わせに対して定義される こと 例題:BSetとCData状態機械の検証 教科書p246- 状態機械の例* EmptySet First&Only FirstOfSeveral MiddleOfSeveral LastOfSeveral *注意:ある状態からそれ自身への遷移は示されていない 5つの状態 EmptySet ポインタは0を意味する 要素数は0 First & Only ポインタは先頭を指す 要素数は1 FirstOfSeveral ポインタは先頭を指す 要素数は複数 状態 MiddleOfSeveral ポインタは中ほどを指す 要素数は複数 LastOfSeveral ポインタは最後を指す 要素数は複数 部分的状態仕様 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 状態仕様テンプレートの考察 全てのオブジェクト状態機械を定義しなさい •自明な状態機械は定義するのも自明であるに違いな い •しばしば簡単な状態機械に見えてもそうでない •状態機械が複数のオブジェクトを含む時には、オブジェクト がうまく選ばれなかった徴候であるかもしれない。 完全性と無矛盾性をチェックしなさい •全ての状態に対する属性の条件の集合は完全で直 交していなければならない。 •任意の与えられた状態からの全ての遷移条件の集 合は完全で直交していなければならない。 今日090630の予定 1.演習問題Bsetは正規状態機械か? 設計検査要領を理解 2.演習問題Logonは正規状態機械か? 概観 3.その他の設計テンプレート 来週以降の予定 1. レビューとプロセス改善 2. 総括 演習090609(jlect#12の14コマ→) 簡単な状態機械Bsetの状態と遷移条件を想起し、状態仕様テン プレート(配布資料2/6)を埋めなさい。属性値nの値も示せ。n=メ ンバ数 Bsetは 2つの状態をとる。 メンバなし、メンバ数1以上 各状態から自分自身または他の状態への遷移条件は PopまたはSubtract PushまたはAdd AddまたはPushまたはPop(n>1)またはSubtract(BsetがDを 含まないとき)またはSubtract(n>1) Pop(n=1)またはSubtract (n=1かBsetがDを含むとき) 演習090623 BSetの 完全直交性の検査→ P.246-248 CDataの 完全直交性の検査→P.248-255(12.4の終りまで) 状態仕様テンプレート EmptyState メンバ無し EmptyState Pop(&D)vSbtrct(D) MemberState Push(D)vAdd(D) MemberSate EmptyState MemberState メンバ数1以上 n=0 n>= 1 [Pop(&D)^(n==1)]v [Sbtrct(D)^(n==1)^(DinBSet] Push(D)vAdd(D)v[Pop(&D)^(n>1) ] v[Sbtrct(D)^DNotinBSet]v [Sbtrct(D)^(n>1)] BSet状態機械は完全直交か?(検査とその結果を述べよ) BSetは正規状態機械か?属性値は0または正の整数 項番 検査 検査結果 1 隠れた落とし穴やループは ないか どの状態からも他の状態へ 移れる 2 状態機械は完全か 3 各状態は直交しているか 属性のすべての取り得る値 が状態によって示されてい る<全ての状態識別できている。> 各属性値について1時に取 り得る状態は唯1つである。 <同時に2つ以上の状態は取り得 ない> 4 各状態からの遷移は完全 で直交しているか 追跡した結果を別紙に示す <各状態から一意的で唯一の次の 状態への遷移が、属性値の取り得 る組み合わせに対して定義されて 各状態からの遷移 メソッド EmptyState MemberState Push(D) MemberState MemberState Add(D) MemberState MemberState Pop(&D) EmptyState Sbtrct(D) EmptyState n==1::EmptyState V n>1::Memberstate [n==1^ DinBSet]::EmptyStat ev[n>1v DNotinBSet]::Membe rState (注1) 注1 完全性の検査 ・すべての組み合わせが埋まっているか? ・それがすべての取り得る条件を網羅しているか? 注意要るのは、右側の下2つ欄だけ: *MS-Popは ・n==1ならESに ・n>1ならMSに遷移する。MSであるためにはn>=1で なければならない。→すべての取り得る条件が網羅さ れている。 注1続 MS-Sbtrctの次の状態は、n==1でかつDinBSetなら ESになる。 ・この条件の否定はnNot=1VDNotinBSetである。 ・MSのともとではn>=1であるから、nNot=1はn>1と等 価。→ESへの遷移条件の否定はMSへの遷移条件と 等しい。→よってこれらの遷移は完全かつ直交である 。 LSのとり得る値 N 0 1 2 3 4 5 6 7 8 L 1 P =0 0 1 2 2 2 2 2 2 2 2 3 4 5 6 7 8 4 3 3 3 3 3 3 4 3 3 3 3 3 4 3 3 3 3 4 3 3 3 4 3 3 4 3 4 表12.7パラメタ値による可能な状態 N== LP=0 なし 0 EmptySet LP=1 First LP>1 LP<N Middle LP==N Last 1 First&Onl y 2 FirstofSev eral >=3 FirstofSev MiddleofS LastofSev eral everal eral Last0fSev eral P.251表12.7(b)状態によるパラメタ値 状態 N==0 ES LP==0 LS==0 FO FS MS N==1 N>=2 LP==1 LS==1 LP==1 LS==2 N>==3 論理仕様テンプレート 実装とほぼ同じ。(例 SubtractSet p219) 相違点: 1.論理仕様には論理参照番号がついており、設計レ ビューが容易(分岐点や主要アクションを判明し易い) 2.次の点を実装時に補完し完成すれば良い: ー変数や引数の宣言と初期化 ー残りの命令を詳細化 他の仕様テンプレートと組合せた説明は、P254- 論理仕様テンプレート 1 論理仕様テンプレートはプログラムの内部論理を精密に 定義する。 論理を便利な記法で記述しなさい: •実装言語と互換性のある疑似コードは適当である。 •形式的記法もまた適当である。 •プログラマは使用する記法に通じていなければならない 。 論理仕様テンプレート 2 論理仕様テンプレートは以下を仕様化: •各オブジェクトの各メソッドの論理と、そのメインプロ グラムの論理 •プログラムまたはメソッドの精密な呼び出し •includes •特別なデータタイプとデータ定義 •プロジェクト名、日付、および開発者名 操作シナリオテンプレート - 1 それは何か?操作の流れのmmインタフェース図示。 例:p221 操作シナリオテンプレートはユーザのシステムとの 正常および異常な相互作用が、設計前と設計途中 の双方で、考察されかつ定義されていることを保証す るために使う。 操作シナリオテンプレートの目的: •テストシナリオとテストケースを定義するため •操作上の問題に関する開発上の疑問の解決のため •ユーザとの要求仕様の論議を解決するため 操作シナリオテンプレート - 2 操作シナリオテンプレートはシナリオ様式を使用する。 これは以下を含む: •主要なユーザの行動とシステムの応答 •予期されるエラーおよびリカバリー条件 設計検証 論理、状態などの仕様テンプレート見てプログラムトレー ス ClearSpaceプログラムの例 p.254機能は 文字列前後の空白を除去して非空白文字列を取り出す 検証は 「実行表」を作成の上、検証 p256 「トレース表」 ーシンボリック実行、すべての場合のトレース表、帰 納的証明 演習課題 #10 テキストの第10章を読みなさい。 PSP2.1を使用して一連のN個の実数が正規分布して いる度合いを計算するためのプログラム 9A を書く。 •N は20より大でかつ5の偶数倍と仮定する •数値を昇順にソートするためにプログラム8Aを使用 する. 付録Cにあるプロセスとレポートの仕様および、付録D にあるプログラム仕様を読むこと。 講義10から記憶すべきメッセージ 1. 設計は創造的なプロセスであるが, その決まりきっ た側面は定義することが出来る。 2. 設計成果物の定義と確立された様式はあなたの設 計の品質を改善できる。 3. コース演習中の 4 つのPSP 設計テンプレートにつ いて実験しなさい、そしてもしそれらのテンプレートが有 用と判ったら、それらを他の仕事にも使いなさい。
© Copyright 2024 ExpyDoc