Disciplined Software Engineering Lecture #10

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 設計テンプレートにつ
いて実験しなさい、そしてもしそれらのテンプレートが有
用と判ったら、それらを他の仕事にも使いなさい。