• 検索結果がありません。

2014年2月28日 成果発表会プレゼン資料(伊藤)

N/A
N/A
Protected

Academic year: 2021

シェア "2014年2月28日 成果発表会プレゼン資料(伊藤)"

Copied!
25
0
0

読み込み中.... (全文を見る)

全文

(1)

演習コースⅡ 形式手法と仕様記述

2014年02月28日

NECソフト株式会社 伊藤 淳

(2)

目次

VDMの活用において

経験した失敗と解決方法

提案手法の説明

結果と考察

まとめと今後の課題

(3)

VDMの活用において経験した失敗と解決方法

誤りに気が付かず,仕様を書き続けてしまった

事後条件の記述が十分でなく,誤検出や見落と

しがあった

仕様を小さい機能単位で記述・検証し,

現状の範囲内で誤りを検出しよう!

事後条件の十分性をテストで確認しよう!

(4)

テスト駆動開発を利用した形式仕様記述

(概念図)

以前の記述方法 要求 仕様書 陽仕様 ①記述 ②記述 事後条件 提案手法 ③実行・検証 陽仕様のテスト

(5)

提案手法

テスト駆動開発を利用した形式仕様記述

(概念図)

テストリスト ①作成 要求 以前の記述方法 要求 仕様書 陽仕様 ①記述 ②記述 事後条件

やるべきことを

書きだす

③実行・検証 陽仕様のテスト

(6)

提案手法

テスト駆動開発を利用した形式仕様記述

(概念図)

陽仕様のテスト ②記述 テストリスト ①作成 要求 やるべきこと を書きだす 以前の記述方法 要求 仕様書 陽仕様 ①記述 ②記述 事後条件

誤検出しないか?

」を

テストするテストケースを

VDMで記述する

③実行・検証 陽仕様のテスト

(7)

提案手法

テスト駆動開発を利用した形式仕様記述

(概念図)

陽仕様のテスト ②記述 テストリスト ①作成 要求 やるべきこと を書きだす 仕様書 陽仕様 ③実行・記述 以前の記述方法 要求 仕様書 陽仕様 ①記述 ②記述 事後条件 ③実行・検証 陽仕様のテスト 「誤検出しないか?」を テストするテストケースを VDMで記述する

(8)

提案手法

テスト駆動開発を利用した形式仕様記述

(概念図)

②記述 テストリスト ①作成 事後条件のテスト ④記述 要求 やるべきこと を書きだす 陽仕様のテスト 仕様書 陽仕様 ③実行・記述 以前の記述方法 要求 仕様書 陽仕様 ①記述 ②記述 事後条件 ③実行・検証 陽仕様のテスト

見落としをしないか?

」を

テストするテストケースを

VDMで記述する

「誤検出しないか?」を テストするテストケースを VDMで記述する

(9)

提案手法 仕様書

テスト駆動開発を利用した形式仕様記述

(概念図)

②記述 ③実行・記述 テストリスト ①作成 ⑤実行・記述 陽仕様 事後条件 要求 やるべきこと を書きだす 事後条件のテスト 陽仕様のテスト ④記述 「見落としをしないか?」を テストするテストケースを VDMで記述する 以前の記述方法 要求 仕様書 陽仕様 ①記述 ②記述 事後条件 ③実行・検証 陽仕様のテスト ⑤再実行・検証 「誤検出しないか?」を テストするテストケースを VDMで記述する

(10)

提案手法 仕様書

テスト駆動開発を利用した形式仕様記述

(概念図)

陽仕様のテスト ②記述 ③実行・記述 テストリスト ①作成 ⑤実行・記述 陽仕様 事後条件 要求 やるべきこと を書きだす ④記述 事後条件のテスト 以前の記述方法 要求 仕様書 陽仕様 ①記述 ②記述 事後条件 ⑥再実行・検証

小さい機能単位で

検証しながら仕様を

繰り返し記述する

③実行・検証 陽仕様のテスト 「誤検出しないか?」を テストするテストケースを VDMで記述する 「見落としをしないか?」を テストするテストケースを VDMで記述する

(11)

例題を用いた提案手法の説明

マイヤーズの三角形問題

3つの値が与えられたとき,それが正三角形,

二等辺三角形,不等辺三角形のうちどれであ

るかを判断する

出典:http://www.kindaikagaku.co.jp/information/kd0329.htm

a=値1

b=値2

c=値3

or

or

a b c a b c a b c

(12)

public

三辺の長さが等しいとき正三角形である : () ==> ()

三辺の長さが等しいとき正三角形である() == (

assertTrue(i三角形.種類を判定する(1,1,1) = <正三角形>

);

);

『“三辺の長さが等しいとき正三角形である”こと

を判定する仕様』をどう書くか?

凡例 テストケース 陰仕様・陽仕様 TDD Red Green

3つの辺が全て「1」のとき,正三角形

と判定されることを期待する

(13)

public

三辺の長さが等しいとき正三角形である : () ==> ()

三辺の長さが等しいとき正三角形である() == (

assertTrue(i三角形.種類を判定する(1,1,1) = <正三角形>

);

);

『“三辺の長さが等しいとき正三角形である”こと

を判定する仕様』をどう書くか?

凡例 テストケース 陰仕様・陽仕様 TDD Red Green

「種類を判定する」操作が存在しない

ためエラー・・・つまり

(14)

public

種類を判定する :

int

*

int

*

int

==> 種類

種類を判定する(a辺1,a辺2,a辺3) == (

is not yet specified

);

public

三辺の長さが等しいとき正三角形である : () ==> ()

三辺の長さが等しいとき正三角形である() == (

assertTrue(i三角形.種類を判定する(1,1,1) = <正三角形>

);

);

『“三辺の長さが等しいとき正三角形である”こと

を判定する仕様』をどう書くか?

凡例 テストケース 陰仕様・陽仕様 TDD Red Green

操作の中身(陽仕様)はまだ考えず,

定義のみを記述する

存在しない操作を記述すればよい

(15)

public 種類を判定する : int * int * int ==> 種類

種類を判定する(a辺1,a辺2,a辺3) == ( is not yet specified

);

public

三辺の長さが等しいとき正三角形である : () ==> ()

三辺の長さが等しいとき正三角形である() == (

assertTrue(i三角形.種類を判定する(1,1,1) = <正三角形>

);

);

『“三辺の長さが等しいとき正三角形である”こと

を判定する仕様』をどう書くか?

public

種類を判定する :

int

*

int

*

int

==> 種類

種類を判定する(a辺1,a辺2,a辺3)== (

if

(a辺1 = 1

and

a辺2 = 1

and

a辺3 = 1)

then

(

return

<正三角形>

;

)

return

<三角形でない>;

);

凡例 テストケース 陰仕様・陽仕様 TDD Red Green TDD Red Green

最低限動作するように「具体例」で

陽仕様を記述する

(16)

public 種類を判定する : int * int * int ==> 種類

種類を判定する(a辺1,a辺2,a辺3) == ( is not yet specified

); public 三辺の長さが等しいとき正三角形である : () ==> () 三辺の長さが等しいとき正三角形である() == ( assertTrue(i三角形.種類を判定する(1,1,1) = <正三角形>); );

『“三辺の長さが等しいとき正三角形である”こと

を判定する仕様』をどう書くか?

public

種類を判定する :

int

*

int

*

int

==> 種類

種類を判定する(a辺1,a辺2,a辺3)== (

if

(a辺1 = 1

and

a辺2 = 1

and

a辺3 = 1)

then

(

return

<正三角形>

;

)

return

<三角形でない>;

);

public

三辺の長さが等しいとき正三角形である : () ==> ()

三辺の長さが等しいとき正三角形である() == (

assertTrue(i三角形.種類を判定する(1,1,1) = <正三角形>

);

assertTrue(i三角形.種類を判定する(2,2,2) = <正三角形>

);

);

凡例 テストケース 陰仕様・陽仕様 TDD Red Green TDD Red Green TDD Red Green

“3つの辺が全て「2」”という同じ意味の

テストを追加し,テストケースが失敗す

ることを確認する

(17)

public 種類を判定する : int * int * int ==> 種類

種類を判定する(a辺1,a辺2,a辺3) == ( is not yet specified

); public 三辺の長さが等しいとき正三角形である : () ==> () 三辺の長さが等しいとき正三角形である() == ( assertTrue(i三角形.種類を判定する(1,1,1) = <正三角形>); );

『“三辺の長さが等しいとき正三角形である”こと

を判定する仕様』をどう書くか?

public 種類を判定する : int * int * int ==> 種類

種類を判定する(a辺1,a辺2,a辺3)== (

if (a辺1 = 1 and a辺2 = 1 and a辺3 = 1) then (

return <正三角形>; ) return <三角形でない>; );

public

三辺の長さが等しいとき正三角形である : () ==> ()

三辺の長さが等しいとき正三角形である() == (

assertTrue(i三角形.種類を判定する(1,1,1) = <正三角形>

);

assertTrue(i三角形.種類を判定する(2,2,2) = <正三角形>

);

);

public

種類を判定する :

int

*

int

*

int

==> 種類

種類を判定する(a辺1,a辺2,a辺3)== (

if

(a辺1 = a辺2

and

a辺2 = a辺3)

then

(

return

<正三角形>

;

)

return

<三角形でない>;

);

凡例 テストケース 陰仕様・陽仕様 TDD Red Green TDD Red Green TDD Red Green TDD Red Green Clean

どちらのテストも動作するように「具体例」

を変数に置き換えて一般化する

(18)

public 種類を判定する : int * int * int ==> 種類

種類を判定する(a辺1,a辺2,a辺3) == ( is not yet specified

); public 三辺の長さが等しいとき正三角形である : () ==> () 三辺の長さが等しいとき正三角形である() == ( assertTrue(i三角形.種類を判定する(1,1,1) = <正三角形>); );

『“三辺の長さが等しいとき正三角形である”こと

を判定する仕様』をどう書くか?

public 種類を判定する : int * int * int ==> 種類

種類を判定する(a辺1,a辺2,a辺3)== (

if (a辺1 = 1 and a辺2 = 1 and a辺3 = 1) then (

return <正三角形>; ) return <三角形でない>; ); public 三辺の長さが等しいとき正三角形である : () ==> () 三辺の長さが等しいとき正三角形である() == ( assertTrue(i三角形.種類を判定する(1,1,1) = <正三角形>); assertTrue(i三角形.種類を判定する(2,2,2) = <正三角形>); ); public 三辺の長さが等しいとき正三角形である : () ==> () 三辺の長さが等しいとき正三角形である() == ( assertTrue(i三角形.種類を判定する(1,1,1) = <正三角形>); );

public 種類を判定する : int * int * int ==> 種類

種類を判定する(a辺1,a辺2,a辺3)== (

if (a辺1 = a辺2 and a辺2 = a辺3) then (

return <正三角形>;

)

return <三角形でない>; );

public 種類を判定する : int * int * int ==> 種類

種類を判定する(a辺1,a辺2,a辺3)== (

dcl w種類 : 種類 := <三角形でない>;

if (a辺1 = a辺2 and a辺2 = a辺3) then ( w種類 := <正三角形>; ) return w種類; ); 凡例 テストケース 陰仕様・陽仕様 TDD Red Green TDD Red Green TDD Red Green TDD Red Green Clean TDD Red Green Clean

一時的に追加したテストや汎用的でない

部分を整理してクリーンにする

(19)

最終的に完成した形式仕様記述(の一部)

public 種類を判定する : int * int * int ==> 種類 種類を判定する(a辺1,a辺2,a辺3)== (

dcl 結果 : 種類 := <三角形でない>;

if (a辺1 + a辺2 <= a辺3 or a辺1 + a辺3 <= a辺2 or a辺2 + a辺3 <= a辺1) then ( 結果 := <三角形でない>;

) else if (a辺1 = a辺2 and a辺2 = a辺3) then ( 結果 := <正三角形>;

) else if (a辺1 = a辺2 or a辺2 = a辺3 or a辺1 = a辺3) then ( 結果 := <二等辺三角形>; ) else ( 結果 := <不等辺三角形>; ); return 結果; ) pre 三辺の長さはすべて0より大きいこと(a辺1,a辺2,a辺3)

post ある二辺の長さの和が他の一辺の長さ以下のとき三角形でないと判定される(a辺1,a辺2,a辺3,RESULT) and

三辺の長さが等しいときのみ正三角形と判定される(a辺1,a辺2,a辺3,RESULT) and

二辺の長さが等しいときのみ二等辺三角形と判定される(a辺1,a辺2,a辺3,RESULT) and

三辺の長さが異なるときのみ不等辺三角形と判定される(a辺1,a辺2,a辺3,RESULT);

陽仕様

事前条件

事後条件

テストケースをヒントに仕様を記述することができ,

誤りを即座に修正することができた

(20)

目次

形式仕様記述における課題

提案手法の説明

結果と考察

(21)

結果と考察(1/2)

テスト駆動開発の利用に対する効果

テストファーストで記述することで,

作成すべき仕

様のヒントを得ながら記述

できた

仕様を小さい機能単位で記述し,修正するたびに

回帰テストをすることで,

素早く仕様の誤りを発見

できた

事後条件に対しても

,テストファーストで記述する

ことで,

一般式への書き換えが容易にできた

品質を確保しながら,かつ,ヒントを得ながら

仕様を記述できるようになった

(22)

結果と考察(2/2)

事後条件に対するテストを追加したことによる効果

事後条件に対して,陽仕様のテストとは「逆の視

点」でテストをすることによって,

これまで見逃して

いた事後条件の誤りを発見できるようになった

レビューだけでは自信が持てなかった

事後条件の

正しさを,テストによって確認できるようになった

事後条件の正しさを確認する手段を,

手順として確立できた

(23)

目次

形式仕様記述における課題

提案手法の説明

結果と考察

(24)

まとめと今後の課題

• テスト駆動開発を利用することで,

具体例をヒントに

て記述ができ,さらに事後条件をテストすることで

見逃

しがちだった誤りを検出しながら仕様を記述できる

手法

を提案した

• なお,本手法の徐々に仕様を記述する特長は,形式仕

様記述(VDM++)初学者に対して,理解を促す効果が

期待でき,

学習教材として利用できると考えている

まとめ

• QCD(学習コスト,実装コスト,品質)に関して,本手法

の有効性を検証すること

• 学習教材としての利用価値の検証をすること

今後の課題

(25)

参照

関連したドキュメント

の発足時から,同事業完了までとする.街路空間整備に 対する地元組織の意識の形成過程については,会発足の

 「訂正発明の上記課題及び解決手段とその効果に照らすと、訂正発明の本

これはつまり十進法ではなく、一進法を用いて自然数を表記するということである。とは いえ数が大きくなると見にくくなるので、.. 0, 1,

次に我々の結果を述べるために Kronheimer の ALE gravitational instanton の構成 [Kronheimer] を復習する。なお,これ以降の section では dual space に induce され

共通点が多い 2 。そのようなことを考えあわせ ると、リードの因果論は結局、・ヒュームの因果

2) ‘disorder’が「ordinary ではない / 不調 」を意味するのに対して、‘disability’には「able ではない」すなわち

˜™Dには、'方の MOSFET で接温fが 昇すると、 PTC が‘で R DS がきくなり MOSFET を 流れる流が減šします。この結果、 MOSFET

□ ゼミに関することですが、ゼ ミシンポの説明ではプレゼ ンの練習を主にするとのこ とで、教授もプレゼンの練習