応用情報技術者 2017年 春期 午前2 問26
問題文
データモデルを解釈してオブジェクト図を作成した。解釈の誤りを適切に指摘した記述はどれか。ここで、モデルの表記には UML を用い、オブジェクト図の一部の属性の表示は省略した。

選択肢
ア:“123456:注文” が複数の商品にリンクしているのは、誤りである。(正解)
イ:“2ドア冷蔵庫:商品” が複数の注文にリンクしているのは、誤りである。
ウ:“A商店:顧客” が複数の注文にリンクしているのは、誤りである。
エ:“ドラム式洗濯機:商品” がどの注文にもリンクしていないのは、誤りである。
🔒 解説は解答すると表示されます
UMLカーディナリティ【午前2解説】
正解の理由
設問のクラス(データモデル)では、注文—商品間の多重度が「注文側 = *、商品側 = 1」と示されています。UMLの多重度は「あるクラスの1インスタンスに対して、反対側クラスの何個のインスタンスが関係しうるか」を示します。したがって「各注文(注文インスタンス)はちょうど1つの商品に対応する」が意味されます。オブジェクト図で「123456:注文」が2つの異なる商品にリンクしているのは、この制約に違反します。以上より、選択肢アの指摘(123456が複数の商品にリンクしているのは誤りである)は正しい指摘です。
解法ステップ
- クラス図の多重度を確認する。多重度は各端に書かれており、「その端にいるオブジェクトが、相手側の1インスタンスに対していくつ関連できるか」を表す。
- 今回は「注文側 = *、商品側 = 1」を読み取る:
- 注文側の多重度「*」は「1つの商品に対して複数の注文があり得る」ことを意味する(商品に対して多数の注文が紐づけ可能)。
- 商品側の「1」は「1つの注文に対して、ちょうど1つの商品の参照しか許されない」ことを意味する。
- オブジェクト図の各注文インスタンスが「ちょうど1つの」商品インスタンスにしかリンクしていないか確認する。
- 違反(注文が複数の商品にリンクしている)を見つけたらその選択肢を正とする。
選択肢別の誤答解説
- 選択肢ア:正しい。前述の多重度解釈により、注文インスタンスは商品側に対してちょうど1つしかリンクできない。図中の「123456:注文」が2つの異なる商品に接続されているため、モデル違反であり誤りの指摘は妥当である。
- イ:誤り。選択肢は「2ドア冷蔵庫:商品 が複数の注文にリンクしているのは誤りである」と述べるが、クラス図では商品側の多重度が1、注文側が*であるため、1つの商品が複数の注文にリンクすることは許容される(むしろ期待される)ので、この指摘は誤りである。
- ウ:誤り。顧客—注文間の多重度は「顧客側 = 1、注文側 = *」となっており、1人の顧客が複数の注文を持つことは許される。したがって「A商店:顧客 が複数の注文にリンクしているのは誤りである」という主張は間違いである。
- エ:誤り。選択肢は「ドラム式洗濯機:商品 がどの注文にもリンクしていないのは誤りである」としているが、多重度(注文側の*、商品側の1)は「各注文は1つの商品の参照を持つ」ことを定めるのみで、全ての商品が必ず少なくとも1つの注文にリンクされなければならないとは規定しない。オブジェクト図に未使用の(リンクのない)商品オブジェクトが存在すること自体は多重度違反ではないため、この選択肢は誤りである。
よくある誤解
- 多重度の向き(どちらの端の数字か)を逆に読むミス:多重度は各端ごとに「相手側に対する個数」を示す点を忘れない。
- 「1」を「最大1」と誤解するケース:「1」は「ちょうど1」を意味する(範囲表現で 1 または 1..1)。一方で「0..1」や「*」とは意味が異なる。
- オブジェクト図は「すべてのクラス要素がリンクされているべき」と誤認する:インスタンス図において、あるオブジェクトがリンクを持たないことは、クラス図の制約により禁止されない限り問題ではない。
補足コラム
- UML多重度の基本解釈(端Aの多重度 m が示すもの):「Aの1インスタンスに対して、反対側Bのインスタンスがmの範囲だけ関連しうる」。例えば「A側 1、B側 *」なら「Aに対してBが複数」。
- オブジェクト図はクラス図の制約(多重度)を順守する必要がある。チェック項目は「各オブジェクトのリンク数がクラス図の多重度の範囲内にあるか」。
- 注文数(属性)は「同一注文で複数種類の商品を扱う」ことを示さない。異なる商品の複数参照が必要ならクラス設計で「注文—注文行(OrderLine)—商品」のように中間エンティティで表現するのが一般的(1注文に複数明細を許す場合)。
FAQ
Q. 商品がどの注文にもリンクしていないと必ず誤りですか?
A. いいえ。クラス図に「商品側が0..*ではなく必ず1以上」といった制約(例:商品側が1であるが「1」は注文に対する制約なので、商品が未使用でも直接禁止されない場合が多い)やクラス間の他の制約がない限り、リンクがない商品オブジェクト自体は許容されます。
A. いいえ。クラス図に「商品側が0..*ではなく必ず1以上」といった制約(例:商品側が1であるが「1」は注文に対する制約なので、商品が未使用でも直接禁止されない場合が多い)やクラス間の他の制約がない限り、リンクがない商品オブジェクト自体は許容されます。
Q. 注文が複数商品を持てる設計にしたい場合はどうするべきですか?
A. 一般的には「注文」から直接「商品」へ多対多または1対多を表現するのではなく、注文行(OrderLine)などの中間エンティティを設け、注文1件が複数の注文行を持ち、各行が1つの商品を参照する形にする(注文 — 1..* — 注文行 — 1 — 商品)。
A. 一般的には「注文」から直接「商品」へ多対多または1対多を表現するのではなく、注文行(OrderLine)などの中間エンティティを設け、注文1件が複数の注文行を持ち、各行が1つの商品を参照する形にする(注文 — 1..* — 注文行 — 1 — 商品)。
関連キーワード: UML、オブジェクト図、カーディナリティ、アソシエーション、インスタンス図、多重度、データモデリング

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

