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