基本情報技術者 2011年 秋期 午後 問05
書籍の卸売業者の受注システムに関する次の記述を読んで、設問1,2に答えよ。
書籍の卸売業者の受注システム開発のために、オブジェクトを抽出し、その関係を示すオブジェクト図を作成し、それを基にクラス図を作成することにした。
〔受注業務の説明〕
(1) 得意先から注文を受けると、受注伝票に受注日、得意先と注文された商品の商品名などを記入する。受注伝票の例を図1に示す。


(2) 商品には、単独商品とセット商品がある。セット商品は、2種類以上の単独商品を組み合せたものであり、セット商品としての商品名をもつ。セット商品の価格は、そのセットを構成する単独商品の価格の合計から1%割り引かれる。一度の注文では、10種類を超える商品は注文できない。
受注業務のシステム化に当たり、システム化対象となる主なオブジェクトとその主な属性を抽出し、複数のオブジェクト図を作成した。その一つを図2に示す。
図2は、P書店から“UML入門”を2冊、“XML(上)”を1冊、“XML(上)”と“XML(下)”のセット商品“XMLセット”を1セット受注したときのオブジェクト図である。

次に、クラス抽出と多重度を検討して、図3に示す分析のためのクラス図を作成した。多重度とは、一方のクラスの一つのオブジェクトに対して接続されている、他方のクラスのオブジェクトの個数を示すものである。
設問1:
問題文を見る 図3のに入れる正しい答えを、解答群の中から選べ。
a〜cに関する解答群
ア:商品
イ:商品番号
ウ:受注者
エ:受注伝票
オ:セット商品
カ:単独商品
dに関する解答群
ア:0
イ:0..*
ウ:1
エ:1..10
オ:1..*
カ:2
キ:2..*
模範解答
a:ア、b:カ、c:オ、d:キ
解説
解答の導き方
図3の空欄は、クラスの種類と、クラス同士の個数の関係を読み取って埋めます。クラスは、同じ種類のものに共通する情報をまとめたものです。多重度は、あるクラスのオブジェクト一つに対して、相手のクラスのオブジェクトがいくつ関係するかを表します。
-
a は、複数の商品に共通するクラスです。問題文には「商品には、単独商品とセット商品がある」とあります。図2にも、単独商品とセット商品が登場しています。どちらにも商品番号、商品名、単価があります。この共通の種類をまとめたクラスが「商品」なので、a は「商品」です。図3では、下にある二つのクラスから上のクラスへ向かって汎化の矢印が伸びています。汎化とは、共通するものを上位のクラスにまとめ、具体的な種類を下位のクラスとして表す関係です。したがって、上位の a が「商品」、下位の b と c が商品の具体的な種類になります。
-
b と c は、商品を二つの種類に分けたクラスです。問題文では商品を「単独商品」と「セット商品」に分けています。図3では、b と c の間に、c を全体、b を部分とする関係が示されています。セット商品は単独商品を組み合わせたものです。つまり、セット商品が全体で、その中に含まれる単独商品が部分です。このことから、b は「単独商品」、c は「セット商品」と判断できます。
-
d は、一つのセット商品を構成する単独商品の数です。問題文には、セット商品は「2種類以上の単独商品を組み合せたもの」とあります。図3の関連線では、d が単独商品側にあり、セット商品側には「0..*」があります。多重度は、反対側のオブジェクト一つに対して、何個のオブジェクトが関係するかを表します。そのため、単独商品側の d は「セット商品一つに含まれる単独商品の数」です。2種類以上なので、d は「2..」です。ここで「」は、上限が決められていないことを表します。セット商品側の「0..*」は、単独商品一つが、どのセット商品にも含まれない場合から、複数のセット商品に含まれる場合まであることを示しています。
-
受注明細と商品の関係も、多重度の見方を確認できます。図3では、受注明細側が「0..*」、商品側が「1」です。これは、受注明細一つには商品が必ず一つ対応し、同じ商品が複数の受注明細で使われることもある、という意味です。数量は受注明細に記録されます。図2では、「UML入門」の受注明細が一つあり、数量が2です。したがって、数量が2だから受注明細や商品との関係が二つになるわけではありません。また、受注と受注明細の多重度は、受注一つに対して受注明細が「1..10」です。これは「一度の注文では、10種類を超える商品は注文できない」という条件に対応しています。数量ではなく、受注明細の数を数える点に注意してください。
誤りやすいポイント
- 汎化の矢印を、上位クラスから下位クラスへ向かうものと誤解しないようにします。図3では、下位の「単独商品」と「セット商品」から、上位の「商品」へ向かっています。
- セット商品と単独商品の関係では、ひし形が付いている側が全体です。図3では「セット商品」が全体で、「単独商品」がその部分です。
- d は、セット商品の販売数量ではなく、セット商品を構成する単独商品の数です。「2種類以上」なので「2..*」になります。
- 受注明細の数と商品の数量は別です。受注明細が一つでも、数量が2冊や3冊の場合があります。
FAQ
Q: 「0..*」は、何個を表しますか?
A: 0個以上を表します。個数の上限は決められていません。
A: 0個以上を表します。個数の上限は決められていません。
Q: 「1..10」は、どのような範囲ですか?
A: 1個以上10個以下です。この問題では、受注一つに含まれる受注明細の数を表します。
A: 1個以上10個以下です。この問題では、受注一つに含まれる受注明細の数を表します。
Q: セット商品側の「0..」は、セット商品一つに含まれる単独商品の数ですか?
A: いいえ。多重度は反対側のクラスに対する個数です。セット商品側の「0..」は、単独商品一つが何個のセット商品に含まれるかを表します。
A: いいえ。多重度は反対側のクラスに対する個数です。セット商品側の「0..」は、単独商品一つが何個のセット商品に含まれるかを表します。
関連キーワード: クラス図、多重度、汎化、集約、オブジェクト図
設問2:
問題文を見る 図3に基づいて、各クラスに必要な属性と操作を検討した。受注には年月日、合計などを保持し、受注明細にはNo、数量などを保持することにした。また、受注の合計は、受注明細ごとの金額を求めてから算出することにした。
全てのクラスの属性と操作を検討した結果から、図4に示す設計のためのクラス図を作成した。図4中のに入れる正しい答えを、解答群の中から選べ。

eに関する解答群
ア:商品番号:文字列
イ:商品名:文字列
ウ:セット商品名:文字列
エ:番号:数値
オ:名称:文字列
fに関する解答群
ア:/小計:数値
イ:商品名:文字列
ウ:年月日:文字列
エ:名称:文字列
gに関する解答群
ア:受注日取得():文字列
イ:小計取得():数値
ウ:数量取得():数値
エ:単価取得():数値
オ:名称取得():文字列
模範解答
e:エ、f:ア、g:イ
解説
解答の導き方
この設問では、図4の設計のためのクラス図にある空欄が、どのクラスの属性や操作を表すかを考えます。属性はクラスが持つ情報、操作はクラスが行う処理です。
eは「受注」の属性です。
受注伝票には「受注番号12345」とあります。また、図2の受注オブジェクトにも「番号=12345」とあります。したがって、受注が持つ番号は、受注番号に対応する数値です。選択肢では「番号:数値」に当たるエが適切です。
受注伝票には「受注番号12345」とあります。また、図2の受注オブジェクトにも「番号=12345」とあります。したがって、受注が持つ番号は、受注番号に対応する数値です。選択肢では「番号:数値」に当たるエが適切です。
fは「受注明細」の属性です。
受注明細は、注文された商品ごとの情報を表します。受注伝票には、商品ごとに数量と小計が記載されています。小計は、数量に商品の単価を掛けて求めます。たとえば、数量が2で単価が2,000なら、小計は次のとおりです。
受注明細は、注文された商品ごとの情報を表します。受注伝票には、商品ごとに数量と小計が記載されています。小計は、数量に商品の単価を掛けて求めます。たとえば、数量が2で単価が2,000なら、小計は次のとおりです。
図4では、属性名の前の「/」は、ほかの属性などから計算できる値を表します。小計は受注明細の数量と商品側の単価から計算できるため、fには「/小計:数値」が入ります。選択肢ではアです。
gは「受注明細」の操作です。
本文には、受注の合計を「受注明細ごとの金額を求めてから算出する」とあります。つまり、受注明細ごとの小計を求める処理が必要です。したがって、gには小計を求める「小計取得():数値」が入ります。選択肢ではイです。
本文には、受注の合計を「受注明細ごとの金額を求めてから算出する」とあります。つまり、受注明細ごとの小計を求める処理が必要です。したがって、gには小計を求める「小計取得():数値」が入ります。選択肢ではイです。
なお、受注全体の合計と、受注明細ごとの小計は別の値です。受注の合計は、各受注明細の小計を合計した値です。
誤りやすいポイント
-
「番号」の種類を取り違えないようにします。
eは受注の属性です。商品番号ではなく、受注伝票に記載される受注番号に対応します。 -
小計を、受注明細に直接記録する値と決めつけないようにします。
図4の「/」は、その属性が計算できることを示しています。小計は数量と単価から求められるため、派生する属性です。 -
小計と数量を混同しないようにします。
数量は受注明細が持つ情報です。一方、小計は数量と商品の単価から求める金額です。そのため、gには「数量取得()」ではなく「小計取得()」が入ります。
FAQ
Q: 「/小計:数値」の「/」は何を表していますか?
A: その値を、ほかの情報から計算できることを表します。この場合は、数量と商品の単価から小計を求めます。
A: その値を、ほかの情報から計算できることを表します。この場合は、数量と商品の単価から小計を求めます。
Q: セット商品でも、小計は同じ考え方で求めますか?
A: はい。受注明細が示す商品の単価に数量を掛けます。セット商品の場合は、セット商品の単価を使います。
A: はい。受注明細が示す商品の単価に数量を掛けます。セット商品の場合は、セット商品の単価を使います。
Q: 受注の合計と受注明細の小計はどう違いますか?
A: 小計は商品ごとの注文金額です。受注の合計は、受注明細ごとの小計を合計した金額です。
A: 小計は商品ごとの注文金額です。受注の合計は、受注明細ごとの小計を合計した金額です。
関連キーワード: クラス図、オブジェクト図、属性、操作、派生属性、多重度




