PHPerKaigi2021の登壇資料です。 補足資料はこちら https://dnskimox.hateblo.jp/entry/2020/12/19/184101
ユースケースシナリオのススメ2021/03/26 PHPerKaigi 2021@dnskimox
View Slide
自己紹介男爵Twitter:@dnskimox所属:Alp,Inc. / ScalebasePHP歴:PHP4〜PHP7業務経験:イラストSNS、C2Cショップ作成サービス、ソシャゲバックエンド、サブスクリプション管理SaaS好きな話題:OOP、DDD、開発プロセス
ユースケースシナリオのススメ▸ ドメインモデルに足りないもの▸ ユースケースとはなにか?▸ ユースケースシナリオの書き方▸ シナリオからコードへ▸ 結論
1.ドメインモデルに足りないもの モデルに妥当性を与えるものは何か?
ショッピングカートのドメインモデル
この手のモデルから何がわかるの?これから作るべきソフトウェアについて、何を語っていて、何を語っていないのか……。
ドメインモデルはソフトウェアの静的な構造を表現する概念の名前、依存関係、関連、多重度、集約関係、etc...
静的な構造概念の名前、依存関係、関連、多重度、集約関係、etc...ソフトウェアが持つふたつの側面動的なふるまい情報を表示する、入力を受け付ける、入力値を検証する、計算をする、データを保存する、外部と通信する、etc...
“ユーザーの立場で見ると、ソフトウェアを外部の世界から区別するようなシステムの境界があります。自分のタスクをソフトウェアがどのようにサポートしてくれるのかということを通して、ユーザーはソフトウェアを理解します。このタスク指向の視点は、一連の記述、すなわちユースケースによって説明できます。――『オブジェクトデザイン』(p.59)
2.ユースケースとはなにか? UMLが教えてくれない大事なこと
ユースケースと聞いて多くの人が想像するであろう「図」
“これはあくまで各ユースケースの相互関係を示すものです。しかしユースケースの価値はほぼすべてがその内容のほうにあり、ダイアグラムはわずかな意味を持つだけです。――『UMLモデリングのエッセンス 第3版』(p.100)
UMLの父イヴァー・ヤコブソンスウェーデンのコンピュータ科学者。グラディ・ブーチ、ジェームズ・ランボーらと共にUMLの最初の版を策定した。ユースケース、シーケンス図、ロバストネス分析などを考案。https://twitter.com/ivarjacobson
“[将来のシステムのユーザによって]開始されるイベントと[ユーザと]システムの間のインタラクションの完全な記述――『オブジェクト指向入門 第2版 方法論・実践』(p.100)で引用されているヤコブソンの言葉
“形式的手法、形式言語、形式的体系などに現れる「形式的」は、「数学や論理学に基礎を置いた、よく定義されて曖昧性が少ない」といった意味で使っていると思う。―― 「形式的」とは何だろう
“各ユースケースは、何らかの目的・目標/機能に関する台本(シナリオ)での主体(アクター)と呼ぶ利用者とシステムのやりとりを描いている。(中略)ユースケースでは技術専門用語をなるべく使わず、エンドユーザーやそのビジネスの専門家に分かり易い用語を用いる。ユースケースの作成は、ビジネスアナリストとエンドユーザーが共同で行う。―― ユースケース - Wikipedia
ソフトウェアの動的なふるまいについて合意を形成する可能な操作、入力値検証、計算、データ保存、検索、システムからの応答、エラー処理、etc...
3.ユースケースシナリオの書き方 形式的な文書にするために欠かせない3カ条
1. 目的レベルを揃える
『ユースケース実践ガイド』( p. 80)
2. シナリオテンプレートに従うユースケース名:XXXをXXXする事前条件- XXXであること主成功シナリオ1. アクターは〜する2. システムは〜する3. アクターは〜する4. システムは〜する拡張2a. XXXがXXXの場合:システムは〜するアクターは〜する1に戻る事後条件- XXXであること晴れの日のシナリオ雨の日のシナリオ
2. シナリオテンプレートに従うユースケース名:ショッピングカートに商品を追加する事前条件- 対象の商品が公開中であること主成功シナリオ1. 買い物客は商品と購入数を選択する2. システムは商品の在庫状況を確認する3. システムはショッピングカートにカート品目を追加する4. システムは「ショッピングカート」画面に遷移する5. 買い物客はショッピングカートの中身を確認する拡張2a. 商品の在庫が購入数未満だった場合:システムは「在庫が足りません」というエラーを表示するユースケースを終了する事後条件- カート品目が一件増えていること- 対象の商品の在庫はまだ減っていないこと
ここでいう「システム」ってどこからどこまでのこと?バックエンドAPIだけなのか、フロントエンドも含むのか、DBはどうなのか、連携しているSaaSは……。
3. 設計スコープを定義する主アクター支援アクター
4.シナリオからコードへ 道はひとつではない
ICONIXプロセス『ユースケース駆動設計実践ガイド』今日はこの話はしません
CRCカードワークショップhttps://slideplayer.com/slide/10494736/
CRCカード(表面)『オブジェクトデザイン』( P. 145)
CRCカード(裏面)『オブジェクトデザイン』( P. 146)ResponsibilityClass(Candidate)Collaboration
CRCカードで用意するもの1. 情報カード2. 鉛筆3. 消しゴムAmazon | コレクト 情報カード 5×3 補助 6ミリ罫 C-532 | 文房具・オフィス用品 | 文房具・オフィス用品
CRCカードの手順1. 参加者はクラスの候補をカードに記入するa. 表面にはクラスの概要や不変条件を自由に書く2. 裏面に責務とコラボレーターを書くa. 書ききれない責務は別のクラスを作って移譲する3. コンピュータになったつもりで、カードをオブジェクトに見立ててシナリオを実行してみる(ウォークスルー)a. オブジェクトは自身の責務以外のことはできないb. オブジェクトはコラボレーター以外と対話できない4. 最後のステップに到達したら、事後条件を達成しているかどうかを確認する5. 最後のステップまで到達できなかったり、事後条件を達成できなかった場合、1に戻って考え直す
この手順に従うとクラスの数がどんどん増えるんだけど?たくさんのクラスの間を飛び回らないと読み解け無い難しいコードになりそう……。
“それでも、私のようなオブジェクト偏愛者は分散制御を選びます。良い設計を実現する条件のひとつは、変更による影響を局所化することです。データとそれを評価する振る舞いは、一緒に変更されることが多いものです。―― 『UMLモデリングのエッセンス 第3版』(P. 56)
“実は、この変化こそ、オブジェクト指向のパラダイムシフトの中心部分です。これは、教えるのが非常に難しい部分です。(中略)一度理解できると、脳内の配線が変わり、実際には分散制御のほうが簡単であると考えるようになります。―― 『UMLモデリングのエッセンス 第3版』(P. 56)
最初に記述するクラスの候補はどこからくるの?ユースケースからクラス名を抽出するのか、他の源泉があるのか、あるとしたらそれは何なのか……。
“ユースケースはクラスを見つけるのに最適の道具ではない。(中略)優秀なオブジェクト指向分析者および設計者は、「システムはaを実行し、次にbを実行する」という形式に見られる性質に注目しないように心がけている。代わりに、「抽象Aのインスタンスに許される操作は何か、それらの操作に対する制限は何か」を問う。―― 『オブジェクト指向入門 第2版 方法論・実践』(P. 101)
“ユースケースは分析ツールではなくむしろ確認(validation)ツールである。(中略)提示された分析モデルあるいは試験的な設計に欠けている属性があるかどうかを検査する方法としてユースケースは有効なツールだろう。―― 『オブジェクト指向入門 第2版 方法論・実践』(P. 102)
最初のドメインモデルはシナリオよりも先につくる顧客へのヒアリング、要求文書、対象ドメインの専門用語、チーム内の会話、デザインパターン、etc...
オススメの設計プロセス(ドラフト版)ドメインモデルユースケースシナリオCRCカード
結論ユースケースを有効活用するには 覚えて帰ってほしい3つのこと
ユースケースは図ではない大事なのはシステムのふるまいを示すシナリオクラスの候補をシナリオで検証ウォークスルーを通じてオブジェクト同士の連携を観察ふるまいについて合意形成する文書そのものより、記述中に発生するコミュニケーション
現場でユースケースシナリオを書いてみよう!ご清聴ありがとうございましたYou can find me at @dnskimox & https://dnskimox.hateblo.jp/
参考文献▸ 『オブジェクトデザイン』▸ 『UMLモデリングのエッセンス 第3版』▸ 『ユースケース実践ガイド』▸ 『ユースケース駆動開発実践ガイド』▸ 『オブジェクト指向入門 第2版 方法論・実践』▸ ユースケース - Wikipedia▸ イヴァー・ヤコブソン - Wikipedia▸ CRCカードでチームが協働して設計する▸ 「形式的」とは何だろう