Disciplined Software Engineering Lecture #12

Slides:



Advertisements
Similar presentations
7/10 if 文課題 力作が多くて感心! 演習1:キーボードから2つの整数を入力し、小さい方の数字を 表示せよ。
Advertisements

ループで実行する文が一つならこれでもOK
プログラミング言語としてのR 情報知能学科 白井 英俊.
第11回 整列 ~ シェルソート,クイックソート ~
実証分析の手順 経済データ解析 2011年度.
6/19 前回復習 for文による繰り返し計算 演習1:1から10まで足して画面に結果を表示する 提出者: 1人
Disciplined Software Engineering Lecture #8
データ構造と アルゴリズム 理工学部 情報システム工学科 新田直也.
プログラミング基礎I(再) 山元進.
Extremal Combinatrics Chapter 4
Object Group ANalizer Graduate School of Information Science and Technology, Osaka University OGAN visualizes representative interactions between a pair.
応用情報処理V 第1回 プログラミングとは何か 2004年9月27日.
人工知能特論2011 資料No.6 東京工科大学大学院 担当教員 亀田弘之.
Natural Semantics 実行過程の、最初と最後の状態(state)の関係を考える。
C言語講座 第4回 ポインタ.
Semantics with Applications
プログラムの動作を理解するための技術として
第6章 2重ループ&配列 2重ループと配列をやります.
条件式 (Conditional Expressions)
9.NP完全問題とNP困難問題.
データ構造と アルゴリズム 知能情報学部 新田直也.
変数のスコープの設計判断能力 を育成するプログラミング教育
応用情報処理V 第1回 プログラミングとは何か 2003年9月29日.
8.Intersecting Families
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
ユースケース オブジェクト指向の要求分析のためのモデル。 スウェーデンのイヴァー・ヤコブソンが1990年代前半に開発。
Disciplined Software Engineering Lecture #1
プログラミング基礎a 第8回 プログラムの設計 アルゴリズムとデータ構造
第7回 条件による繰り返し.
C言語講座 第3回 ポインタ、配列.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
第25章 単一始点最短路 3節 Bellman-Fordのアルゴリズム
動的依存グラフの3-gramを用いた 実行トレースの比較手法
第10回関数 Ⅱ (ローカル変数とスコープ).
電気・機械・情報概論 VBAプログラミング 第2回 2018年7月2日
アルゴリズムとプログラミング (Algorithms and Programming)
Structured programming
第7回 条件による繰り返し.
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
プログラミング基礎a 第8回 プログラムの設計 アルゴリズムとデータ構造
情報 第1回:状態遷移 その1.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
ソフトウェア制作論 平成30年10月10日.
復習 一定回数を繰り返す反復処理の考え方 「ループ」と呼ぶ false i < 3 true i をループ変数あるいはカウンタと呼ぶ
アルゴリズムとデータ構造1 2006年7月11日
4. システムの安定性.
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
プログラミングⅡ 第2回.
vc-2. Visual Studio C++ のデバッガー (Visual Studio C++ の実用知識を学ぶシリーズ)
PROGRAMMING IN HASKELL
復習 if ~ 選択制御文(条件分岐) カッコが必要 true 条件 false 真(true)なら この中が aを2倍する 実行される
蓄積されたオブジェクトの動作履歴を用いた 実行履歴削減手法の提案
4.プッシュダウンオートマトンと 文脈自由文法の等価性
データ中心システム設計方法論“DATARUN” 
PROGRAMMING IN HASKELL
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
ソフトウェア工学 知能情報学部 新田直也.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
PROGRAMMING IN HASKELL
参考:大きい要素の処理.
回帰テストにおける実行系列の差分の効率的な検出手法
第7章 そろそろ int 以外も使ってみよう! ~データ型 double , bool~
データ構造と アルゴリズムI 第三回 知能情報学部 新田直也.
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
計算の理論 II 時間量と領域量 月曜4校時 大月美佳 2019/9/13 佐賀大学理工学部知能情報システム学科.
情報処理Ⅱ 小テスト 2005年2月1日(火).
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
アルゴリズム ~すべてのプログラムの基礎~.
Presentation transcript:

Disciplined Software Engineering Lecture #12 コメントは特にありません。 ---------- ページ3, 35, 36, と41に若干手を加えましたが,変更は本質的ではありません。 (久保記,1999.2.28) Software Engineering Institute Carnegie Mellon University Pittsburgh, PA 15213 Sponsored by the U.S. Department of Defense

設計検証 設計検証は2つの講義でカバーされる。この講義では以下を述べる。 設計検証する理由 状態機械の正しさ 実行表 帰納法による証明 次の講義は以下をカバーする トレース表 数学的プログラムの検証 プログラムの証明

設計検証の必要性- 1 あなたのPSPを改善するために作業するのにしたがって、あなたは設計の欠陥数を顕著に減少させることは難しいと思うようになるだろう。 チェックリストを使い、注意力を増やすことによってあなたのコードレビューによる欠陥摘出率を改善できる。 設計レビューによる欠陥摘出率を改善するために、あなたは検証手法規範を使うことが必要になる。 「規律ある検証手法」を「検証手法規範」に変更しました。(久保,1999.1.28)

設計検証の必要性- 2 設計検証に対するきちんとしたアプローチが本質的である。なぜならば 多くのよくある設計欠陥は条件が見落とされることによって引き起こされる ありそうもない状況のように見えることが強力な計算システムにおいて起こりやすくなっている 最初のプログラムバージョンでは起こり得なかった条件が後の修正によって引き起こされるかもしれない。

設計検証の必要性- 3 構造化された設計検証の手続きに従うことによって、以下の可能性が増える 見落とされた条件に気がつく まれにしか露出しないリスクを確認する 将来起こりうる危険を認識する 設計レビューに関するデータを記録することによって, 後の設計インスペクションをやり易くする。

設計検証を使う - 1 設計検証手法は次の期間に使うべきである 設計中 設計レビュー中 設計インスペクション中 あなたの設計検証手法はテスト中にあなたに最もトラブルを引き起こした欠陥タイプに焦点を当てるべきである。

設計検証を使う- 2 この講義と次の講義では私を最も悩ませた設計欠陥カテゴリーに言及するつぎの話題を選択した。 状態機械の構造 ループの構成体 もし利用可能であれば私は次のような欠陥タイプに対して追加の検証手法を使うつもりである ポインタ インタフェース

設計検証のトピックス 次の2講義でカバーされた設計検証のトピックスは 状態機械の正しさを検証すること 実行表 帰納法による証明 トレース表 数学的プログラムの検証

状態機械の正しさ 計算システムの状態を変更する任意のプログラムは状態機械である。 もしプログラムが同一の入力で異なる動作が出来れば、このプログラムは状態機械である。 単純に見える状態機械が複雑な動作をすることがあり得る。したがって状態機械を注意深く検証することが重要である。

状態機械の検証 状態機械の検証におけるステップは次である 状態機械が隠れた落とし穴またはループをもたないことを保証するためのチェック 全ての状態の集合が完全で直交していることのチェック あらゆる状態からの全ての遷移の集合は完全で直交していることのチェック 状態機械の正しさを検証した後、そのプログラムが意図していたアプリケーション機能を実行することを保証しなさい。

隠れた落とし穴やループ - 1 隠れた落とし穴やループをチェックするために 状態テンプレートを構築する 状態機械ダイアグラムを構築する 任意の出口状態が任意の他の状態から到達不可能かを決定する もし任意の出口状態が任意の他の状態から到達不可能ならばこれは正規の(完全直交)状態機械ではない。

隠れた落とし穴やループ - 2 例:次のようなオブジェクトBSetを考えよう 2 状態: EmptyState, MemberState 4 メソッド: Push, Pop, Add, Subtract Pushは1つのメンバーをBSetに加える PopはBSetから1つのメンバーを取り除く AddはもしBSetがすでに同じメンバーを含んでいなければメンバーをBSetに加える。 SubtractはもしBSetが同一のメンバーを含んでいればBSetからメンバーを取り除く。

隠れた落とし穴やループ- 3 BSetに対する状態テンプレートは次のようになる: n >= 1 EmptyState n = 0 Pop or Subtract MemberState Push or Add MemberState n >= 1 EmptyState Pop(n=1) or Subtract(n=1)(D in BSet) MemberState Add or Push or Pop(n>1) or Subtract(D not in BSet) or Subtract(n>1)

隠れた落とし穴やループ- 4 Pop or Subtract EmptyState n = 0 Push or Add Pop(n=1) or Subtract(n=1)(D in BSet) MemberState n > 0 Add or Push or Pop(n>1) or Subtract(D not in BSet) or Subtract(n>1)

隠れた落とし穴やループ- 5 したがってこの状態機械が隠れた落とし穴あるいはループを持たないことは明らかである。

全ての可能な状態- 1 よく起こる問題はある状態機械の状態を見落とすことである。 初期状態、空状態、エラー状態等などがその例である。 状態パラメータの全ての可能な条件を確かめて、それらの条件が含まれているかあるいは真に不可能かのいずれかであることを保証しなさい。

全ての可能な状態- 2 BSetをチェックする例: EmptyState は n = 0 をもつ MemberState は n > 0 をもつ n < 0 ではないので, これで全ケースをカバーする。 n>0状態のどれも異なるべきでないことを保証するため, それらの状態のどれかが他の状態とは違った作動を示すかどうかをチェックしなさい。 状態テンプレートまたは状態ダイアグラムをチェックすると全ての n>0 状態が同一の作動をすることが分かる。したがってさらに状態を追加することは不要である。

状態の直交性 状態が直交しているべきためには、状態機械は一度に2つの状態が可能であってはならない。 例の状態機械においては, n = 0 または n > 0 の何れかである. 状態は直交している、なぜならばその機械が EmptyState (n = 0) あるいは MemberState (n > 0)の何れかでなければならないから; すなわち一度に両方成り立つたつことはありえない。

状態遷移 - 1 正規の(完全直交)状態機械では, 状態遷移はすべて完全で直交していなければならない。 これが成り立つためには あらゆる状態はあらゆる可能なインプットに対して、 次の状態が定義されていなければならない。 あらゆる状態はあらゆる可能なインプットに対して、唯一の次の状態をもたなければならない。

状態遷移 - 2 第1に、BSet例のEmptyStateの完全性をチェックせよ: 条件は Push, Pop, Add, および Subtractである。 状態は各条件に対して定義されている、それゆえ EmptyStateの遷移は完全である。 次の表は各条件が完全なことを示している: Push MemberState Pop EmptyState Add MemberState Subtract EmptyState

状態遷移 - 3 次に、EmptyState の遷移が直交していることをチェックしなさい。 EmptyStateへの遷移条件は Pop と Subtractである. MemberStateへの遷移条件は Push と Add である。 これらの次の状態遷移条件がオーバーラップしないので、その遷移条件は直交している。

状態遷移 - 4 MemberStateの完全性に対して,可能なケースは表のようになる これらはすべて可能なケースであるので, D in BSet D not in BSet n = 1 n > 1 Push Pop Add Subtract MemberState EmptyState これらはすべて可能なケースであるので, MemberStateの遷移は完全である。

状態遷移 - 5 MemberStateの直交性に対して, 遷移の間にオーバーラップがあってはならない。 MemberStateから EmptyStateへの遷移は Pop(n=1) あるいは Subtract(n=1) かつ (D in BSet)の時に起こる。 MemberStateから MemberStateへの遷移は Add + Push + Pop(n>1) + Subtract(D not in BSet) + Subtract(n>1)の時に起こる。 前の図から明らかなように、これらの二つのケースは 共通に持つ条件はないので直交している。

クラスの演習- 1 SignOnのオブジェクトは次のメソッドをもつものとする。 Open ーsign-on手続きを開始する。 LogOn ー名前を要求する もしその名前が正しければ、PassWordがパスワードを要求する もしPassWordが正しければ, SignOnは値“真”を以って終了する。 もし何かエラーがあれば, そのプログラムは もう一度LogOnから始める。 エラーが2回起これば SignOnは値“偽”を以って終了する。

クラスの演習- 2 SignOn状態テンプレートと状態ダイアグラムを構築しなさい。 隠された落とし穴とループをチェックしなさい。 状態の完全性と直交性をチェックしなさい。 遷移の完全性と直交性をチェックしなさい。

クラスの演習 - 状態ダイアグラム StandBy LogOn(No) Open (false) LogOn(No) Start Error LogOn(Yes) LogOn(Yes) NameOk PassWord(No) Trial PassWord(Yes) (true) PassWord(Yes) (true) PassWord(No) (false)

演習-状態テンプレート StandBy n = 0 Start Open Start n = 1 NameOk LogOn(Yes) Error LogOn(No) NameOk n = 2 Error PassWord(No) StandBy (true) Password(Yes) Error n = 3 Trial LogOn(Yes) StandBy (false) LogOn(No) Trial n = 4 StandBy (true) PassWord(Yes) StandBy(false) PassWord(No)

実行表- 1 実行表はプログラムの実行を追跡するきちんとした方法である。 プログラムフローの手によるチェックである。 初期条件でスタートする。 変数の値の集合が選択される。 各実行ステップが調べられる。 変数値の全ての変更が記入される。 プログラムの動作は仕様に対してチェックされる。

実行表- 2 実行表の長所は以下である。 単純である。 証明の結果が信頼できる 実行表の短所は以下である。 一度に1ケースしかチェックできない。 時間がかかる 人間エラーの影響を受ける

実行表の手順 実行表を使用するために キープログラム変数を認識し、トレース表のトップにそれらを記入する。 主要なプログラムステップを記入する。 初期条件を決定し記入する。 変数の値を各プログラムステップを通じて追跡する。 ループの反復に対しては、追加のループサイクルの各々に対して、追加の実行表ステップを加える。 長いループに対しては, もしそれらの結果が明らかであるならば、中間ステップをグループにせよ。

実行表の例- 1 Cycle 1 ClearSpaces(var Input: string; State: int) # 命令 条件 Length State 1 Length = length(Input) ‘ AB ‘ 5 2 if Length > 0 true 3 repeat(until State=3 or Length=0) 4 if Input[Length-1] = ‘ ‘ true 5 Length = Length - 1 4 6 if State < 2 State=State+1 true 1 7 else State = 3 until State=3 or Length=0 false

実行表の例- 2 until条件が満足される前に3つのサイクルが要求される テストケースとちょうど同様に、実行表はこの特定の変数の組み合わせに対するケースのみを証明する。 初期条件を、それらがプログラムによってセットされることを保証するため、注意深くチェックしなさい。 エラーともれに対して実行表を2重にチェックしなさい。

帰納法による証明 この方法は整数パラメータをもつブール関数に適用する。 このことは以下を述べている。 もし n = kに対してf(n)が“真”で かつ もし n = z ただし z > k かつ f(z) が 真のとき f(z+1) が真であることを示すことができる ならこのとき、kより大きい全てのnに対して f(n) が真である 少し手をいれました。 英文には違和感があります。n=z で n を持ち込むなら f(z), f(z+1)ではなく f(n), f(n+1)を使うのがいい。それか n を持ち込まないで z だけですますか。(久保,1999.1.28)

帰納法による証明の例 例: for i=1 to Limit do xyz もし このことがLimit = 1に対して真であることを示す ことができ、かつ ある任意のより大きな値zに対して真であり、かつ そのときz+1に対しても真であることを示すことが出来るなら、 そのときLimitのすべての正の値に対して真である 日本語をすこし変えて厳密にしました。(久保記,1999.1.28)

帰納法による証明の技法 もし あなたが変数 x を使用する設計要素をもっている その要素が x= k に対して働くことを検証する 次に プログラムの作動が z+1 で不適当になる z の値を見つけるよう試みる もしあなたが出来なければ、証明は完了する。

階乗の例 - 1 次のプログラムがN!を計算することを証明しなさい。 Factorial(N) F = 1 for i = 1 to N F = F*i return = F

階乗の例 - 2 k = 1 とする、そして N=1のとき, F = N!であることを証明する。 1の階乗は 1 であるので、これは正しい。 次に, N = z のとき, F = z!が成り立つと仮定する。 最後に, F(z) = z! でかつ F(z+1) <> (z+1)!である z の 任意の値を見つけよう。 この様なケースは次の時のみ起こるであろう 数を計算するシステムが限界値を超えてしまった時 計算能力を超えてしまった時

演習問題 #12 テキストの第12章を読みなさい。 プログラム 10A の開発を続ける. もし時間があれば, 最終報告R5の作業を始めなさい。 R5の仕様書は付録Dで見つけることが出来る。

講義12で覚えておくべきメッセージ 1. もしあなたが設計レビュー手法規範を使えば、 あなたの設計レビューによる欠陥摘出率は顕著に 1. もしあなたが設計レビュー手法規範を使えば、 あなたの設計レビューによる欠陥摘出率は顕著に   改善するだろう。 2. 設計の検証に消費する時間はテスト時間の節約によ って十二分におつりがでるであろう。 3. 検証技法をいくつか練習しそして、あなたがテストの 際にもっ ともよく発見する欠陥を発見するのに もっとも効果的なものを、その中から選択する。 「訓練された設計レビュー手法」は「設計レビュー手法規範」に変更しました。3.に「いくつか」と「その中から」を挿入しました。(久保記,1999.1.28)