⼤事なのでもう⼀回:振舞いのコードもモデルを使って作成しよう
久保秋 真
株式会社チェンジビジョン
12022/9/2© 2022,

SWEST24

このセッションの概要• 設計でモデル図を作成しても、どうして実装で乖離が⽣じてしまうのか• モデルと対応したコードを安定して得るには？
• いつ、なにを決めておけばよいのか• 実例で確かめてみよう• Astah*のプラグインを使うと試せるよ

22022/9/2© 2022,

SWEST243
2022/9/2© 2022,

SWEST24

設計でモデル図を作成してもどうして実装で乖離が⽣じてしまうのか4
2022/9/2© 2022,

SWEST24

開発しているとき
どんなことがやりたいか

どんな動きがいりそうか
どんなふうに書いてその動きを実現しようか• この順序だと、実装するときに「どのようにコードを書けば動くか」を、考えてしまうことになる
2022/9/2© 2022,

5
SWEST24

そうではなくて…
どんなことがやりたいかどんな⽅法や資源を使おうか
その⽅法や資源を使うならどんなふうに作るとよいか• を考えるようにする⽅が、設計と実装の乖離は少なくなる
2022/9/2© 2022,

6SWEST24

実際、できるプログラマは、• どんな組み⽅があるかのストックを持っていて• それを無意識に使っている• つまり、できるプログラマは、前の⼿順でやってるようで、じつは後の⼿順を踏んでいる

72022/9/2© 2022,

SWEST24

それは特別なことか？
• たとえば、電⼦回路の場合• バラバラのどんなことがやりたいか
部品を使うならどんな回路にしたいか
その回路に必要な部品を使って作ろう
82022/9/2© 2022,

SWEST24

それは特別なことか？
• ICを使うならどんなことがやりたいか

どんなICや論理を使おうか
そのICや論理を使うならどんなふうに回路を作るか• ANDとORで組まないで、NANDを使うことで使うICの種類を減らすとか2022/9/2© 2022,

9SWEST24

ソフトウェアの設計においても• いまは実装する⼈が思案していることを設計の段階でやっておくべきではないか• だとすると、設計するときに考えることも変わってくる

102022/9/2© 2022,

SWEST24

振る舞いのモデルと実装ではどうか• 同じステートマシン図なら同じコードになる？
• その設計者が期待した動作ができるか• その設計者が期待したコードの書き⽅ができるか• 他の⼈に任せたとき、⾃分と同じコードを書いてもらえるか• イベントの扱いは決まっている？
• イベントフラグ使う？それともイベントキュー使う？

• コードから元のステートマシン図が書けるか？
• 状態、遷移、アクションなどがコードから読み取れるか
2022/9/2© 2022,

11SWEST24

振る舞いの実装⽅式が決まっていない• 実装者によってコードの書き⽅が変わっている• コードができてこないと、どんな実装になったかかわからない• ステートマシン図と同じように振る舞うが、図と対応していないコードを書いている• 図の要素と対応していない実装だと、障害が⾒つかっても、そのコードを直して対処するので、図に戻ってこれない• 設計と実装が乖離してしまうのは、振る舞いのモデルに対応した実装⽅式を決めていないのが原因© 2022,2022/9/2

12SWEST24

乖離を⽣じないためにはどんな⼯夫をすればよいのか

132022/9/2© 2022,

SWEST24

振る舞いの実装⽅式を決めよう（設計の仕事）• ステートマシン図の要素を登場させる• 状態、イベント、状態遷移、アクション、ガード条件• どのクラスのどのステートマシン図でも同じ書き⽅にする• ステートマシン図の働き⽅を決める• イベントの作り⽅、溜め⽅、マシンの繰り返し処理の実現⽅法• どのステートマシン図も同じ規則でコードを書く• コードを書くときになって書き⼿が決めない• 書く⼈や、作るクラスによって、勝⼿に書き⽅を変えない
2022/9/2© 2022,

14
SWEST24

設計者は規則を意識して振る舞いを設計する• 振る舞いのモデルを書く前に規則を決める• ステートマシン図とコードの対応規則を決めるのは設計の仕事• 振る舞いのモデルは好き勝⼿にかけない• 規則に従ってコードを書いたら、そのコードが期待する動作をするように図を書く必要がある

152022/9/2© 2022,

SWEST24

（備考）構造にも似た⾯はある• インスタンスが1つか複数か• インスタンスが1個なら、変数1つで済む• 複数なら、それらを格納する⽅法（配列orリスト？）が必要• 集約かコンポジットかで実装構造が変わる• リンク（内部要素のデータへのポインタ）を持たせるか• 内部要素の正味をメンバ変数として保持するか• 多重度に0を含むかどうか• 0になったとき、それが正常な場合か、異常な場合かが変わる
162022/9/2© 2022,

SWEST24ここまでのまとめ• 設計と実装の乖離の原因は実装時の⾃由さ• 振る舞いのモデルを実装するときに、実装⽅式をプログラマに任せていたから• 乖離を減らすにはモデルを実装する規則を使う• 構造のモデルと振る舞いのモデルに加えて、振る舞いのモデルとコードを対応づける規則を⽤意する• 規則に従って実装することで、モデル図とコードの要素の対応関係が維持される
172022/9/2© 2022,

SWEST24変換による実装• モデルとコードの対応づけを設計の責務にする• 設計側はこの⽅式を使うことを前提に設計する

クラス図
ステートマシン図

変換による実装

図からコードへの変換規則
2021/6/4© 2021, Shin Kuboaki.

void auto_transporter_transport(void) {switch(p_state) {// 略case TRANSPORTING:
line_tracer_run();if (walldetector_is_detected()) {p_state = WAIT_FOR_UNLOADING;}
break;
case WAIT_FOR_UNLOADING:
line_tracer_stop();break;
}
}

実装コード

18
SWEST24

具体的なモデルとコードで変換による実装の実際をみてみよう

19
2022/9/2© 2022,

SWEST24

対象のシステム• ⾃動搬送システム• 状況に応じて「配達」「転送」「回送」の各業務を処理する• 配達業務• 待機場所で荷物を受けるのを待つ• ⾛⾏開始指⽰を受け取ったら、配達先へ荷物を運搬する• 配達先に到着したら停⽌する• 荷物が下ろされるのを待つ• 荷物が下ろされたら、⾞庫へ回送して停⽌する
2021/6/4© 2021, Shin Kuboaki.

20
SWEST24

業務の流れ4. 荷台から荷物が降ろされて⾛⾏開始指⽰を受けたら、回送を開始する
⾞庫

配達先

5. 運搬済みで回送後、側壁を認識したら⾞庫に⼊ったとみなし業務を終了する

3. 側壁を認識したときは、停⽌して荷物が降ろされるのを待つ

転送先

1. 荷物を受け取るのを待つ
2. ⾛⾏開始指⽰で運搬開始する
待機場所
2021/6/4© 2021, Shin Kuboaki.

21

SWEST24

使⽤する機器• 荷物を運搬する⾃動搬送ロボット• 駆動制御部による⾛⾏• 荷台、ライン監視部、側壁監視部、バンパーを装備側壁監視部
ライン監視部
荷台
バンパー
駆動制御部
222021/6/4© 2021, Shin Kuboaki.

別の演習：https://youtu.be/A24WsSucrKw
SWEST24

システムのクラス図

232022/9/2© 2022,

SWEST24

運搬業務のステートマシン図242022/9/2© 2022,

SWEST24

⼿書きのコード25
2022/9/2© 2022,

SWEST24

⼿書きコードのデモ

26
2022/9/2© 2022,

SWEST24

どんなふうにしてモデルとコードを対応づけるのか27
2022/9/2© 2022,

SWEST24コードの書き⽅なんて⼀般化できるの？
• どんな場合にも対応するような⼀般化は難しい• きっと周りくどく、扱いにくいものになってしまうだろう• しかし、⾃分達のコードは似ていないか？
• 同じ機器の別のアプリ• 派⽣品のコード• 似ているもの同⼠なら、⼀定の規則で済ませられそうだ
28
2022/9/2© 2022,

SWEST24

既存のコードから始める• 機能しているコードをテンプレート化する• 可変する部分に、外部のデータを埋め込めるようにしておく• モデルでは埋め込みに必要なデータを決める• モデルはそのテンプレートに必要な情報を書く• 埋め込むと欲しいコードになることを確認する• モデルからデータを取り出してテンプレートに埋め込んだら、それが機能しているコードになればよい
29
2022/9/2© 2022,

SWEST24

Astah m2tプラグイン• テンプレートにモデルのデータを埋め込んで、ソースコードを⽣成するプラグイン• 細合さんがちょっと昔に作った代物• LED-Campでも使っていた• テンプレートによって変換規則を実現したものとみなせる
30
2022/9/2© 2022,

SWEST24

⼿書きコードとモデル図を対応づける

31
2022/9/2© 2022,

SWEST24対応づけをテンプレートにする
switchcase

do activity

event check
exit action

32
2022/9/2© 2022,

SWEST24テンプレートをm2tの設定へ反映

33
2022/9/2© 2022,

SWEST24

⽣成したコード34
2022/9/2© 2022,

SWEST24

⽣成したコードのデモ

35
2022/9/2© 2022,

SWEST24

作成したテンプレートやコード• GitHubに登録• https://github.com/kuboaki/m2t_workspace• READMEにも説明がある

36
2022/9/2© 2022,

SWEST24変換による実装• 作成したテンプレート：変換規則• モデルから⼀定の決まったコードに変換する規則とみなせる• 属⼈化していないコード作成の知識や⼿法ともいえる• 変換するように実装できる• モデルのデータをテンプレートに埋め込めばよい• ⼊⼒されるモデルは変わっても、変換する作業は同じ

37
2022/9/2© 2022,

SWEST24変換による実装• チームが保有する資源になる• コードの書き⽅は、個⼈のセンスや技能ではなくなる• できる⼈の技量や知⾒は、変換規則に反映する• 埋め込むデータをすべてモデル図に盛り込めば、そこが設計の終わり

38
2022/9/2© 2022,

SWEST24

「障害の発⽣⼯程」の判定もクリアに• 変換規則通り実装して障害があるなら• 設計の間違いとみなせる• 変換規則通り実装していないなら• 設計に従っていないので、テストが通っていてもダメ• ⼀番最初のテストは、変換規則どおり実装しているかの確認• 変換規則に間違いや不備がある場合• 規則を作る側＝設計側の責任
39
2022/9/2© 2022,

SWEST24

まとめ• 振る舞いの実装が、設計と乖離する原因だった• 先にモデルとコードとの対応づけを決めておく• クラス図だけでなくステートマシン図とコードも対応づける• 設計では対応づけを前提にモデルを作成する• つまり、対応づけを決めるのは設計のしごと• 対応づけがあれば、実装は機械的• だったら⾃動化できるよね？だからプラグインがあるよ40
2022/9/2© 2022,

SWEST24

⼤事なのでもう⼀回:
振舞いのコードもモデルを使って作成しよう―

おしまい―久保秋 真

株式会社チェンジビジョン
41
2022/9/2© 2022,

SWEST24