Web Analytics Made Easy - StatCounter

工業大学生ももやまのうさぎ塾

うさぎでもわかるをモットーに大学レベルの数学・情報科目をわかりやすく解説! 数式が読み込まれない場合は1回再読み込みしてみてください。

【基本情報対策】うさぎでもわかるソフトウェア工学 Part07 UML前編(クラス図とオブジェクト図)

こんにちは、ももやまです。

今回から前編と後編の2回に分けてオブジェクト指向の設計で使われるUMLの書き方について説明します。

 

この記事では前編部分、具体的には設計の構造を表すクラス図、オブジェクト図の2つの読み方、書き方についての説明をしていきます。

(なお、後編では設計の振る舞い(動き方)を表すアクティビティ図、ユースケース図、シーケンス図について説明する予定です。)

 

 

UMLではオブジェクト指向に関する用語(クラス、オブジェクト、汎化など)がたくさん出てきます。

オブジェクト指向についてあまり自信がない人は、下の記事で復習することを強くおすすめします。

www.momoyama-usagi.com

 

0.UMLとは

(1) UMLとは何か

オブジェクト指向によるプログラミングは、事前にどのようなプログラムを書くか設計を行う必要があります。

 

しかし、自己流で設計方法を書いてしまうと、他の人が解読するのに時間がかかってしまったり、間違った解釈が行われてしまうかもしれません。

そこで、設計で用いられる標準的な記法としてUML (Unified Modeling Language)と呼ばれる統一の言語*1が用いられるようになりました。

 

UMLでは、(オブジェクト指向での)システムの設計を表すために専用の図(言語)を使います。

 

当然言語と呼ばれるくらいなので、日本語や英語の単語・文法に相当する書き方(ルール)があります。

(2) UMLのダイアグラムと特に重要な5種類の図

UMLには全部で13種類の図があります。

13種類の図は大きく分けると、構造を表す図6種類と、振る舞いを表す図7種類に分けることができます。

f:id:momoyama1192:20200725160611j:plain

 

今回の記事(前編)ではUMLの中でも構造を表す図について説明します。

以下に、構造を示す6種類の図の概要を示します。

f:id:momoyama1192:20200725160615j:plain

次の章からは、構造を表す図でも特に試験や実務で出てくるクラス図、オブジェクト図の読み方、書き方について説明します。

(構造を表す図に関しては、基本的にクラス図とオブジェクト図が読めれば基本情報では困りません。)

 

1.クラスとオブジェクトの違い(復習)

クラス図とオブジェクト図の説明の前に、まずはクラスとオブジェクトを具体例を1つ出すことで確認しましょう。

(1) オブジェクトとは

オブジェクトとは、現実世界にある「具体的なもの」を抽象化したものを表します。

オブジェクトの例としては、

  • ANAの飛行機
  • 東京行きの飛行機
  • 500人乗りの飛行機
  • ボーイング787(機種の名前です)の飛行機

があります。

(2) クラスとは

クラスは、オブジェクト(もの)が持つ性質をひとまとめにしたものに名前を付けて、ひな形にしたものを表します。

 

例えば、先程出てきた

  • ANAの飛行機
  • 東京行きの飛行機
  • 500人乗りの飛行機
  • ボーイング787(機種の名前です)の飛行機

の4つのオブジェクトをひとまとめにして「飛行機」と名前を付けることでクラスが出来上がります。

f:id:momoyama1192:20200725160458g:plain

2.クラス図・オブジェクト図の書き方

(1) クラス図の書き方

クラス図では、クラスのシンボルを書くことでクラスを定義する必要があります。

クラス図では、

  • クラスの名前 [必須]
  • クラスが持つ属性 [省略可]
  • クラスが行える操作 [省略可]

の3つを下のように書くことで定義を行います。

f:id:momoyama1192:20200725160454g:plain

なお、属性と操作は省略することができます

(2) オブジェクト図の書き方

オブジェクト図の書き方はクラス図とほとんど同じです。

具体的には、

  • オブジェクト名 [必須]
    (下線はオブジェクトであることをアピールするものなので、必ず下線を引くこと
  • オブジェクトが持つ具体的な属性 [省略可]
    (クラスが持つ属性に具体値を入れたもの)

の2つを記載します。

f:id:momoyama1192:20200725160502g:plain

なお、「オブジェクト名: クラス名」と書く部分は「オブジェクト名」と書くこともできます。(つまり「: クラス名」の部分は省略可)

 

3.関連とリンク

クラス図では、他のクラス同士を線で結ぶことで互いの関係(関連)を表します。

また、オブジェクト図では、他のオブジェクト同士を線で結ぶことで互いの関連(オブジェクト)を表します。

 

f:id:momoyama1192:20200725160510g:plain

なお、クラス図では関連がどのようなものかを示すために、関連名やロールを付けることができます。

例えば、上の図の例の場合「履修する➤」を付けることで「学生は授業を履修する」関係であることが明らかにできます。

また、「履修者」と「履修可能授業」を関連の両端につけることで、具体的に「履修者」と「履修可能授業」の関係を表していることが明らかにできます。

 

4.多重度

(1) 多重度とは

あるクラスに対するオブジェクトが、別のクラスに対するオブジェクトに何本リンクを引くことができるか(引かなければならないか)を表したものを多重度と呼びます。

f:id:momoyama1192:20200725160506g:plain

例えば上の図の場合、授業の左下に「1..2」と書かれていますね。

この「1..2」は、学生から見たとき、授業のオブジェクトに「1本以上2本以下」のリンクを引けること、つまり学生が授業を「1個以上2個以下」履修できることを表します。

また、「0..3」は、授業から見たとき、学生のオブジェクトに「0本以上3本以下」のリンクを引けること、つまり授業を「0人以上3人以下」の学生まで履修できることを表します。

(2) 多重度の書き方

多重度の書き方には、以下の6種類があります。

上4種類が重要なので、基本的には上の4つを覚えておけばOKです。

f:id:momoyama1192:20200725160524g:plain

なお、多重度に関しては

  • *(多数)なのか具体値なのか
  • 0が入るのか入らないか

を基本情報などの試験で聞かれることが多いです。

 

オブジェクト図の説明はここで終わりです。

これ以降は、クラス図で使うものだけを紹介します。

5.ロールの応用(階層的な関係の表記)

ここで、ロールの応用的な使い方について少し説明します。

例えば、

  • 先輩は数人の後輩を受け持つ [指導する]
    (3年生は2年生の何人かを指導し、2年生は1年生の何人かを指導する)
  • 後輩は、ある1人の先輩に見てもらう [指導される]
    (1年生は2年生の誰か1人に指導され、2年生は3年生の誰か1人に指導される)

をロールを使って表すと、下のように書くことができます。

f:id:momoyama1192:20200725160515g:plain

このようにロールを使うことで、階層的な関係(先輩と公開、上司と部下)を簡単に表すことができます

 

さらに、上のロールを下のように再帰的に表す方法もあります。

f:id:momoyama1192:20200725160520g:plain

 

6.汎化

(1) 汎化とは

サブクラスが持つ共通な性質を抽出し、1つにまとめたスーパークラスとして定義することを汎化と呼び、以下のような矢印で表現します。

f:id:momoyama1192:20200725160535g:plain

※ is-a はわかりやすくするために書いたものなので、実際には書かれません

(2) 汎化を用いたクラス図の例

汎化を使うことで、下のようなクラス図を作ることができます。

f:id:momoyama1192:20200725160529g:plain

 

7.集約と合成集約

(1) 集約

(a) 集約とは

あるクラス(部品)をいくつか集めて大きなクラスを定義することを集約と呼び、以下のようなひし形で表現します。

f:id:momoyama1192:20200725160543g:plain

(b) 集約を用いたクラス図の例

集約を使うことで、下のようなクラス図を作ることができます。

f:id:momoyama1192:20200725160539g:plain

(c) 集約と汎化の併用

集約と汎化を併用し、下のようなクラス図を書くこともできます。

f:id:momoyama1192:20200725160548g:plain

(2) 合成集約(コンポジション)

集約を書く際に、集約先(大きなクラス)が削除されると同時に部品も削除されることを強調したい場合は、ひし形(♢)の部分を黒く(♦)塗りつぶします。

f:id:momoyama1192:20200725160552g:plain

集約と合成集約(コンポジション)を使い分ける際にはサブクラスが本当に消えるかをよく確認してから使いましょう。

f:id:momoyama1192:20200725160556g:plain

例えば、親(父さん、母さん)と子の関係にコンポジション(♦)を使ってしまうと、親が病気などで亡くなると、自動的に子も亡くなるという悲しいクラス図が完成してしまいます。

 

ここからは、クラス図の応用に入るので時間がある人はぜひご覧ください。

基本情報ではあまり出てこないので試験対策したいだけであれば最悪スキップしてもOKです。

8.実現

インターフェース(必要な共通操作のみ定義し、具体的な操作は定義しない特別なクラス)とサブクラスの関係を実現と呼び、下のように矢印と破線で表します。

f:id:momoyama1192:20200725160601g:plain

汎化の一種*2だと思っていただけたらOKです。

(実際、図も汎化に似ていますよね。)

 

9.依存

一方のクラスのオブジェクトが、もう一方のクラスの操作に利用されたり、影響する際に用います。

例えば、下の図の場合「人」クラスの操作により「スマホ」クラスが影響を受けることを表しています。

f:id:momoyama1192:20200725160606g:plain

依存は、2つのオブジェクト間にそこまで強い関係はないものの、一方のクラスを変更した際にもう一方のクラスが変更されることを明示する際に使います。

 

10.クラス図の表記法のまとめ

今まで出てきたクラス図の表記を復習しましょう。

f:id:momoyama1192:20200726032232g:plain

 

11.練習問題

では、クラス図、オブジェクト図に関する練習問題を午前問題で3問、午後問題で1問確認していきましょう。

午前問題

練習1

UMLのクラス図において、集約の関係にあるクラスはどれか。

f:id:momoyama1192:20200726031850g:plain

[基本情報技術者平成18年春期 午前問39]

ア:クラスAとクラスB
イ:クラスAとクラスC
ウ:クラスBとクラスD
エ:クラスCとクラスD

練習2

UMLのクラス図のうち、汎化の関係を示したものはどれか。

[基本情報技術者平成25年秋期 午前問46]

f:id:momoyama1192:20200726031845g:plain

 

練習3

UMLを用いて表した図のデータモデルのa, bに入れる多重度はどれか。

[基本情報技術者平成30年秋期 午前問26]

 

〔条件〕

  1. 部門には1人以上の社員が所属する。
  2. 社員はいずれか一つの部門に所属する。
  3. 社員が部門に所属した履歴を所属履歴として記録する。f:id:momoyama1192:20200726031854g:plain

 

午後問題

書籍の卸売業者の受注システムに関する次の記述を読んで、設問1, 2に答えよ。

 

書籍の卸売業者の受注システム開発のために、オブジェクトを抽出し、その関係を示すオブジェクト図を作成し、それを基にクラス図を作成することにした。

〔受注業務の説明〕

  1. 得意先から注文を受けると、受注伝票に受注日、得意先と注文された商品の商品名などを記入する。受注伝票の例を図1に示す。

    f:id:momoyama1192:20200726031858g:plain

  2. 商品には、単独商品とセット商品がある。セット商品は、2種類以上の単独商品を組み合わせたものであり、セット商品としての商品名をもつ。セット商品の価格は、そのセットを構成する単独商品の価格の合計から1% 割り引かれる。一度の注文では、10種類を超える商品は注文できない。

    受注業務のシステム化に当たり、システム化対象となる主なオブジェクトとその主な属性を抽出し、複数のオブジェクト図を作成した。その一つを図2に示す。

    f:id:momoyama1192:20200726031902g:plain


    図2は、P書店から"UML入門"を2冊、"XML(上)" を1札、"XML(上)" と "XML(下)" のセット商品"XMLセット"を1セット受注したときのオブジェクト図である。

  3. 次に、クラス抽出と多重度を検討して、図3に示す分析のためのクラス図を作成した。多重度とは、一方のクラスの一つのオブジェクトに対して接続されている、他方のクラスのオブジェクトの個数を示すものである。

    f:id:momoyama1192:20200726031906g:plain

設問1. 

図3の  [              ] に入れる正しい答えを、解答群の中から選べ。

 

☆a~cに関する解答群☆

ア:商品   イ:商品番号  ウ:受注者
エ:受付伝票 オ:セット商品 カ:単独商品

☆dに関する解答群☆

ア:0  イ:0..*  ウ:1
エ:1..10 オ:1..*  カ:2
キ:2..*

設問2.

図3に基づいて、各クラスに必要な属性と操作を検討した。受注には年月日、合計などを保持し、受注明細にはNo、数量などを保持することにした。また、受注の合計は、受注明細ごとの金額を求めてから算出することにした。

全てのクラスの属性と操作を検討した結果から、図4に示す設計のためのクラス図を作成した。図4中の [              ] に入れる正しい答えを、解答群の中から選べ。

f:id:momoyama1192:20200726031911g:plain

☆eに関する解答群☆

ア:商品番号 : 文字列
イ:商品名 : 文字列
ウ:セット商品名 : 文字列
エ:番号 : 数値

☆fに関する解答群☆

ア:/小計 : 数値
イ:商品名 : 文字列
ウ:年月日 : 文字列
エ:文字列 : 数値

☆gに関する解答群☆

ア:受注日取得() : 文字列 
イ:小計取得() : 数値
ウ:数量取得() : 数値
エ:単価取得() : 数値
オ:名称取得() : 文字列

 

12.練習問題の答え

午前問題

解答1

解答:イ

f:id:momoyama1192:20200726031850g:plain

それぞれの選択肢が何の関係を表しているか復習しましょう。

ア:クラスAとクラスB(関連)
イ:クラスAとクラスC(集約)
ウ:クラスBとクラスD(依存)
エ:クラスCとクラスD(汎化)

解答2

解答:イ

f:id:momoyama1192:20200726031845g:plain

それぞれの選択肢が何の関係を表しているか復習しましょう。

ア:関連
イ:汎化
ウ:コンポジション(合成集約)
エ:依存

解答3

解答:エ

3つの条件を見ていきましょう。

  1. 部門には1人以上の社員が所属する。
    (→ この条件で、aの選択肢に0が入ることがなくなる。よって、答えはウかエのどちらか。)
  2. 社員はいずれか一つの部門に所属する。
  3. 社員が部門に所属した履歴を所属履歴として記録する。
    (2,3の条件でbに0が入ることがなくなる。よって答えはエ。)f:id:momoyama1192:20200726031854g:plain

午後問題

解答1

[解答]

a:ア(商品)
b:カ(単独商品)
c:オ(セット商品)
d:キ(2..*)

オブジェクト図に注目すると、受注明細にリンクしているのは「受注」と「単独商品とセット商品」の2つであることがわかる。

f:id:momoyama1192:20200726031902g:plain

 

クラス図の関連を見てみると、穴埋めされていない方は「受注」となっているため、(a)~(c)に入る選択肢は「商品」に関するものだとわかる。

f:id:momoyama1192:20200726031906g:plain

ここで、クラス(a)は(b),(c)を汎化したものなので、クラス(a)には商品すべてを表す「商品」が入ることがわかる。(よって(a)の答えはア)

 

(b), (c) は商品のサブクラスに相当する「セット商品」と「単独商品」のどちらかが入る。

ここで文章を読むと「セット商品は2種類以上の単独商品を組み合わせたもの」と書かれている。

(c)は(b)の部品からできていることがクラス図から読み取れるため、(c)はセット商品、(b)は単独商品が入る。

((b)の答えはカ、(c)の答えはオ)

 

次に多重度を埋める(d)だが、この(d)は「セット商品」は何個の「単独商品」からなるかを表す。

先程読んだ文章には「セット商品は2種類以上の単独商品を組み合わせたもの」とあるため、(d)には2以上を表す「2..*」を埋めればよい。((d)の答えはキ。)

解答2

[解答]

e:エ(番号: 数値)
f:ア(/小計:数値)
g:イ(小計修得():数値)

図2のオブジェクト図と図4を見比べて解答をしてくのが基本。

f:id:momoyama1192:20200726031911g:plain

(e)

図2のオブジェクト図に注目すると受注に記載されているデータは、番号と年月日の2つであることがわかる。

だが、図4の受注クラスを見ると年月日はあるが番号はない。

よって、(e)には番号に相当するものが入る。(答えはエ)

 

(f), (g)

問題文より、受注明細にはNoと数量を保存していることがわかる。しかし、図4の受注明細クラス図にはすでにNo、数量が記載されている。

ここで、もう少し問題文を読むと「受注の合計は受注明細ごとの金額を求めてから算出することにした。」とある。

よって、受注明細ごとの金額を求める属性と、金額を取得する操作が必要なことがわかる。

よって、(f)には金額の小計を求める属性、(g)は小計を取得するような操作が入る。

((f)の答えはア、(g)の答えはエ)

 

13.さいごに

今回は、UMLの中でもクラス図とオブジェクト図の読み方、書き方について説明しました。

英単語や英文法を知っていても文章を書くためには練習が必要なのと同じように、UMLを使いこなすためには図の書き方を頭に入れるだけでなく、実際に読んだり書いたりする必要があります。

 

なので、使い方を覚えるだけでなく、実際に基本情報の問題を解くなどして読み書きをする練習をしましょう。

(少なくとも読めるようにしましょう。)

*1:言語と言われると「あれれ? 言語じゃなくて図だろ」と思う人もいるかもしれません。ですが、日本語や英語の代わりに共通の図を用いて(設計方法の)コミュニケーションをとり、他の人と共有する点は言語と同じですよね。なのでUMLは統一の言語だといえるのです。

*2:スーパークラスがインターフェースになっただけ。