tag:crieit.net,2005:https://crieit.net/tags/%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E5%9B%B3/feed 「ユースケース図」の記事 - Crieit Crieitでタグ「ユースケース図」に投稿された最近の記事 2021-11-29T13:41:31+09:00 https://crieit.net/tags/%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E5%9B%B3/feed tag:crieit.net,2005:PublicArticle/16108 2020-10-04T23:28:17+09:00 2021-11-29T13:41:31+09:00 https://crieit.net/posts/UML-5f79dc014a829 実践UML記述法:ユースケース図におけるユースケース間の関係の書き方を疑似コードから逆変換して考える <p>本記事は、 Qrunch からの移転記事です。</p> <p>移転元: <a target="_blank" rel="nofollow noopener" href="https://morichan.qrunch.io/entries/XRfxn2KmER0Skcvp">実践UML記述法:ユースケース図におけるユースケース間の関係の書き方を疑似コードから逆変換して考える - 雑木林</a></p> <h1 id="TL; DR"><a href="#TL%3B+DR">TL; DR</a></h1> <p>ユースケース図の <code>include</code> および <code>extends</code> は、それぞれメソッドおよび <code>if</code> 文が真の場合のメソッドに変換できます。<br /> また、拡張点は <code>if</code> 文の真偽値判定に変換できます。</p> <h1 id="本題:ユースケース図におけるユースケース間の関係の書き方を疑似コードから逆変換して考える"><a href="#%E6%9C%AC%E9%A1%8C%EF%BC%9A%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E5%9B%B3%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E9%96%93%E3%81%AE%E9%96%A2%E4%BF%82%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9%E3%82%92%E7%96%91%E4%BC%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8B%E3%82%89%E9%80%86%E5%A4%89%E6%8F%9B%E3%81%97%E3%81%A6%E8%80%83%E3%81%88%E3%82%8B">本題:ユースケース図におけるユースケース間の関係の書き方を疑似コードから逆変換して考える</a></h1> <p>UMLのダイアグラムの1つに、ユースケース図というものがあります。<br /> ユースケース図とは、ステークホルダーとシステムの関係を、簡易的に図として表現するものです。</p> <p>以下のような図を、人生で1度は見たことがあるはずです。</p> <p><img src="http://www.plantuml.com/plantuml/png/ZPBVIiCm5CRlynIXLtgnFe2CiZSPfOqrq3KboLGGmIHEb0r47KFnGl3FS0n46IB-UPjZSNiBapbRsPKtXt3ExtmVvoCD8KCkswqKIIfJWek3bsd_kNWR5uUZh_xzTAy3wW7C4Cm7w5VGJp-FudA2K4hM9POCSvfiI1nJJY99MOPG64d6iLTAU3WKk2q8HyWnOPRyTS8x2Bjf50g21P5DAadBRNYpcwlYJ84-BJfte7kWkvQirMgsacr9Cc7TSCve9eLjBMWr1ZC2Oy3qmKn0FuBgVRwVWze7DNHLTprBhrJYnmFRMtMEoSBTpS4SWRwsyzcW2-ha5s4voPenOzmnoqvMx7O0wc9ESj9YcwIvnSCyfrc2S7MSxmUL45x3zJhDehGTao2mMF8_h5Ih-_wosHoUPnHRTXSXbxwDBYYtgavvTCFIzYTy0m00" alt="冷蔵庫利用者のユースケース図" /></p> <pre><code class="plantuml">@startuml title 冷蔵庫利用者のユースケース図 left to right direction actor "利用者" as user rectangle 冷蔵庫 { usecase set_item as "食品を入れる --- extension points 食品にラッピングが付いている" (食品を取る) as get_item (ドアを開ける) as open_door (ラッピングを外す) as remove_wrapping set_item ..> open_door : <<include>> get_item ..> open_door : <<include>> set_item <.. remove_wrapping : <<extend>> } user --> set_item user --> get_item @enduml </code></pre> <h1 id="問題点"><a href="#%E5%95%8F%E9%A1%8C%E7%82%B9">問題点</a></h1> <p>ここで、よく混乱するのが <code>include</code> および <code>extend</code> の意味、および、矢印の向きです。</p> <p><code>include</code> は、あるユースケースは別のユースケースを包含している、という意味を表します。</p> <blockquote> <p>ユースケースBの中には、ユースケースAが含まれていることを示します。<br /> 「has a」関係、つまり、「ユースケースB has a ユースケースA」の関係が成り立ちます。</p> </blockquote> <p><code>extend</code> は、あるユースケースが別のユールケースを拡張する、という意味を表します。</p> <blockquote> <p>ユースケースAに対して、機能を追加するようなユースケースBの関係を示します。</p> </blockquote> <p><a target="_blank" rel="nofollow noopener" href="http://www.itsenka.com/contents/development/uml/usecase.html">ユースケース図(Use Case Diagram) - UML入門 - IT専科</a></p> <p>この包含と拡張、という単語の違いは、個人的には非常に理解が難しかったです。<br /> それにより、以下の疑問が顕在化します。</p> <ul> <li>どのように <code>include</code> と <code>extend</code> を使い分けるのか</li> <li>なぜ <code>extend</code> の矢印の向きは <code>include</code> と逆なのか</li> </ul> <p>しかし、下記ページにより、長年の疑問が解けたので、解説しようと思います。</p> <p><a target="_blank" rel="nofollow noopener" href="http://architect360.apricot-jp.com/400/includeextend.html">ユースケース図のincludeとextend:アーキテクト360</a></p> <h1 id="解決策"><a href="#%E8%A7%A3%E6%B1%BA%E7%AD%96">解決策</a></h1> <p>エンジニアは、図で理解するより、ソースコードで理解する方が簡単ですよね。<br /> ということで、上記ユースケース図の例を、疑似コードに置換えてみます。</p> <p>冷蔵庫利用者のユースケース疑似コード</p> <pre><code class="py"># TODO: 例として挙げたユースケース図からは、ユースケースの実行順序までは読取れない def ドアを開ける: # ドアを開ける際の処理記述 def ラッピングを外す: # ラッピングを外す際の処理記述 def 食品を入れる: if 食品にラッピングが付いている: ラッピングを外す() ドアを開ける() # 食品を入れる際の処理記述 def 食品を取る: ドアを開ける() # 食品を取る際の処理記述 </code></pre> <p>各ユースケースは、各メソッドと対応します。</p> <p><code>include</code> の関係先ユースケース(例における「ドアを開ける」ユースケース)は、関係元ユースケース(例における「食品を入れる」ユースケースおよび「食品を取る」ユースケース)の共通部品として、関数内で呼出すメソッドとして対応します。</p> <p><code>extend</code> の関係元ユースケース(例における「ラッピングを外す」ユースケース)は、関係先ユースケース(例における「食品を入れる」ユースケース)を一部拡張するため、拡張点「食品にラッピングが付いている」場合にのみ呼出すメソッドとして対応します。</p> <p>ここで注意ですが、例として挙げたユースケース図からは、ユースケースの実行順序までは読取れないことに気をつけてください。<br /> 例えば、「食品を入れる」ユースケースで実行する、「ドアを開ける」ユースケース/「ラッピングを外す」ユースケース/「食品を入れる」ユースケースの3つ(3番目は、ユースケース自身のユースケースを指す)は、本来は前後関係がありますが、ユースケース図からは読取れません。<br /> 「ドアを開ける」前に「食品を入れる」ことはできませんし、「ラッピングを外す」前に「食品を入れる」ことは、本来はできないので、疑似コードでは順序を指定してます(ドアを開けた後にラッピングを外すことはできますが、電気代が掛かるので、先にラッピングを外しています)。</p> <p>表でまとめると、下記の通りです。</p> <div class="table-responsive"><table> <thead> <tr> <th>ユースケース図</th> <th>疑似ソースコード</th> </tr> </thead> <tbody> <tr> <td>ユースケース</td> <td>メソッド</td> </tr> <tr> <td><code>include</code></td> <td>関係元ユースケースの内部で実行するユースケース</td> </tr> <tr> <td><code>extend</code></td> <td>関係先ユースケースの内部で、拡張点が真の場合に実行するユースケース</td> </tr> <tr> <td>拡張点</td> <td><code>extend</code> の関係元ユースケースを実行する場合は真を表す真偽値</td> </tr> </tbody> </table></div> <p>こう見ると、最初の疑問点がはっきりすると思います。</p> <h2>どのように <code>include</code> と <code>extend</code> を使い分けるのか</h2> <p><code>include</code> の関係先ユースケースは、複数のユースケースから呼出されることを想定し、共通部品化すると良いです。</p> <p><code>extend</code> の関係元ユースケースは、まず関係先ユースケースを共通部品化し、ある分岐点(拡張点)でのみ実行するユースケースとして外出しすると良いです。</p> <h2>なぜ <code>extend</code> の矢印の向きは <code>include</code> と逆なのか</h2> <p>ここは、私の個人的な見解を述べます。</p> <p><code>extend</code> が <code>include</code> と逆向きなのは、 <code>extend</code> の関係元ユースケースが拡張点を求めていることが理由と考えます。<br /> すなわち、 <code>extend</code> の関係元ユースケースは、関係先ユースケースにおける拡張点に「依存」していると言えるのではないか、と考えます。</p> <p>疑似コードを見ればわかりますが、 <code>extend</code> の関係先ユースケースに拡張点が存在しないユースケース図は、どのような場合に関係元ユースケースが実行されるのか、判断できかねます。<br /> つまり、 <code>extend</code> の関係元ユースケースと、関係先ユースケースの拡張点は、セットであると考えるのが自然です。<br /> さらに言えば、 <code>extend</code> の関係元ユースケースは、関係先ユースケースの拡張点なしには関係を結ぶことは難しく、拡張点に依存して存在を維持している関係である、と言うこともできます。</p> <h1 id="結論"><a href="#%E7%B5%90%E8%AB%96">結論</a></h1> <p>ユースケース図の関係は、疑似コードから逆変換して考えてみると、理解しやすい気がします。<br /> UMLは高度に抽象的であるため、具象的な疑似コードに置換えることで、把握しやすいのかもしれません。</p> <p>これを元に、ユースケース図がもっと流行ることを期待します。</p> Morichan