応用情報技術者 2012年 秋期 午後 問08
ディジタルオーディオプレーヤのオブジェクト指向設計に関する次の記述を読んで、設問1~3に答えよ。
M社は、ディジタルオーディオプレーヤを開発している。ディジタルオーディオプレーヤを制御するソフトウェアは、UMLを使用して設計している。現行のディジタルオーディオプレーヤのクラス図を図1に示す。
M社では、このディジタルオーディオプレーヤに、音声フォーマットの追加、曲名の表示方法の追加、及び倍速再生の追加を行うことになった。
〔音声フォーマットの追加〕
現在の仕様では、再生可能な音声フォーマットは2種類あり、それぞれ固有アルゴリズム1、2で対応している。固有アルゴリズムは音声フォーマットごとに開発する必要がある。
今回の修正では、新たな音声フォーマットを1種類追加して、固有アルゴリズム3で対応することになった。また、再生アルゴリズムクラスとフォーマット識別クラスを追加して、今後更に音声フォーマットを追加するときには、フォーマット識別クラスの修正と固有アルゴリズムクラスの追加だけで対応できるようにした。再生アルゴリズムクラスは、各固有アルゴリズムクラスの抽象クラスとなる。フォーマット識別クラスは、再生に使用する固有アルゴリズムを決定する。
〔曲名の表示方法の追加〕
現在の仕様では、選曲のために曲名などを表示する選曲画面がある。最初にアーティスト一覧を表示し、アーティストを選択するとアルバム一覧を表示する。アルバムを選択すると曲名一覧を表示する。
今回の修正では、ユーザの多様な検索に対応するために、様々な曲情報(アーティスト、アルバム、ジャンル、リリース年)を組み合わせて曲を検索できるようにした。
図2に修正後の選曲画面の表示例を示す。

図2の画面を実現するために次のように設計した。各画面をフォルダに相当させた。フォルダの中にはフォルダと曲を格納することができる。そのフォルダの中に更にフォルダと曲を格納することができる。フォルダと曲を同一インタフェースで扱えるように、抽象クラスであるコンポーネントクラスを追加した。また、フォルダクラスとコンポーネントクラスを使用して、フォルダの再帰的なデータ構造を実現した。
〔倍速再生の追加〕
通常再生の他に、2倍速再生と3倍速再生を追加して、三つの再生モードに対応することになった。倍速再生の追加に伴い、再生機能の仕様を次のように整理した。
・曲名を選択して選曲ボタンを押すと選択済みとなる。選曲ボタンは、停止しているときだけ有効で、繰り返して複数の曲名を選択することができる。また、選択済みの曲名を再選択すると選択解除となる。
・停止しているときに再生ボタンを押すと再生を開始する。このとき、選択済みの曲がない場合は停止のまま何もしない。再生とは、通常再生、2倍速再生、3倍速再生の総称である。再生を開始するときは、必ず通常再生から開始する。再生しているときに再生ボタンを押しても何もしない。
・再生しているときにモードボタンを押すたびに、通常再生、2倍速再生、3倍速再生の順番に再生モードが切り替わる。3倍速再生の次は通常再生に戻る。
・再生しているときに一時停止ボタンを押すと、再生を中断して一時停止となる。一時停止しているときに再生ボタンを押すと、中断したところから通常再生で再開する。一時停止又は停止しているときに一時停止ボタンを押しても何もしない。
・選択済みの曲全ての再生を終了すると停止となる。
・停止しているとき以外に停止ボタンを押すと停止となる。停止しているときに停止ボタンを押しても何もしない。
〔クラス図とステートマシン図〕
追加機能に対応して修正したクラス図と再生機能のステートマシン図を、それぞれ図3、図4として作成した。レビューで、ステートマシン図の再生ボタンの状態遷移について、①再生機能の仕様と異なる点を指摘された。
模範解答
a:再生
b:フォーマット識別
c:再生アルゴリズム
解説
解答の論理構成
-
まず、cに相当するクラスを確定します。本文には
「“再生アルゴリズムクラスは、各固有アルゴリズムクラスの抽象クラスとなる。”」
とあります。図3では「固有アルゴリズム1」「固有アルゴリズム2」「固有アルゴリズム3」から汎化矢印が集まる箱が c です。したがって c =「再生アルゴリズム」となります。 -
次に、b を求めます。本文には
「“フォーマット識別クラスは、再生に使用する固有アルゴリズムを決定する。”」
と記載されています。図3で b は a から上方向に関連し、再生系と独立に“判定”役を果たしている位置です。この役割はフォーマット識別クラスそのものなので b =「フォーマット識別」と決まります。 -
最後に、a を決定します。図3で a はシステム全体の起点として b(識別)と c(アルゴリズム)を利用し、下側に「選曲」も保持しています。本文で繰り返し登場する中心機能は
「“ディジタルオーディオプレーヤを制御するソフトウェア”」
の“再生”機能であり、旧図でも“再生”クラスが最上位に描かれていました。よって a =「再生」となります。
以上より
a:再生
b:フォーマット識別
c:再生アルゴリズム
a:再生
b:フォーマット識別
c:再生アルゴリズム
誤りやすいポイント
- 「フォーマット識別」と「再生アルゴリズム」の役割を逆に読み取る
→ 識別は“決定”役、アルゴリズムは“実処理”役である点に注意が必要です。 - 図3で矢印の方向だけを見てaを「選曲」と誤判断する
→ 「選曲」はaの子要素であり、最上位ではありません。 - “抽象クラス”という語に惑わされ、cを「固有アルゴリズム」と書いてしまう
→ “固有”は具象クラス、抽象側が「再生アルゴリズム」です。
FAQ
Q: 「フォーマット識別」は具体的には何を行うクラスですか?
A: 再生要求を受けたとき、その音声データがどのフォーマットかを判定し、対応する「固有アルゴリズム1~3」インスタンスを「再生」クラスに知らせる責務を持ちます。
A: 再生要求を受けたとき、その音声データがどのフォーマットかを判定し、対応する「固有アルゴリズム1~3」インスタンスを「再生」クラスに知らせる責務を持ちます。
Q: 新しくフォーマットを追加する際、修正が必要なのはどのクラスですか?
A: 本文にある通り「フォーマット識別クラスの修正」と「固有アルゴリズムクラスの追加」だけで済みます。既存クラスには手を入れない設計になっています。
A: 本文にある通り「フォーマット識別クラスの修正」と「固有アルゴリズムクラスの追加」だけで済みます。既存クラスには手を入れない設計になっています。
Q: 「再生」クラスが直接アルゴリズムを持たず抽象クラス経由にしたメリットは?
A: 開放/閉鎖原則を満たし、アルゴリズム追加時に「再生」クラスを変更せずに済むため保守性が向上します。
A: 開放/閉鎖原則を満たし、アルゴリズム追加時に「再生」クラスを変更せずに済むため保守性が向上します。
関連キーワード: 抽象クラス、汎化、責務分割、開放閉鎖原則
(2)d〜fに入れる適切な図を解答群の中から選び、記号で答えよ。解答は、重複して選んでもよい(dとeは順不同)。

模範解答
d:オ
e:カ
f:カ
解説
解答の論理構成
-
d=「オ」と判断
- 要件引用:「フォルダの中にはフォルダと曲を格納することができる。そのフォルダの中に更にフォルダと曲を格納することができる。」
- ここではフォルダが“含む側”、フォルダ/曲が“含まれる側”という階層構造を表す必要があります。UMLでは“白抜きの菱形が付いた実線”=集約(aggregation)でこの関係を示します。
- 集約のダイヤモンドは“全体”側に付くので、フォルダ側にダイヤモンドが描かれる「オ」が最適です。
-
e=「カ」、f=「カ」と判断
- 要件引用:「再生アルゴリズムクラスは、各固有アルゴリズムクラスの抽象クラスとなる。」
- 「抽象クラスとなる」は“汎化/継承”を意味します。UMLでは“塗りつぶし三角形矢印”=汎化(generalization)で表現します。
- 三角形は“親クラス”側に付くため、矢印が抽象クラスへ向く「カ」が該当します。固有アルゴリズムは2種類追加されているので、e・fとも同じ「カ」となります(eとfは順不同)。
誤りやすいポイント
- 集約(白抜きダイヤ)とコンポジション(黒ダイヤ)の混同。「削除時に部分も必ず消える」場合のみコンポジションを使いますが、本問はそこまで厳密ではないため集約で十分です。
- ダイヤモンドや三角形の“位置”を逆に描くミス。シンボルは常に「全体」側、「親」側に付くことを忘れないでください。
- 汎化と依存の取り違え。依存は破線+オープン矢印、汎化は実線+塗りつぶし三角形です。
FAQ
Q: フォルダとコンポーネントはコンポジットパターンですか?
A: はい。再帰的に同一インタフェースで扱う設計であり、典型的なコンポジットパターンです。
A: はい。再帰的に同一インタフェースで扱う設計であり、典型的なコンポジットパターンです。
Q: 集約とコンポジションのどちらを選ぶかの決め手は?
A: “全体が消えたとき部分も必ず消える”ならコンポジション(黒ダイヤ)、それ以外は集約(白ダイヤ)を使うのが一般的な指針です。
A: “全体が消えたとき部分も必ず消える”ならコンポジション(黒ダイヤ)、それ以外は集約(白ダイヤ)を使うのが一般的な指針です。
Q: 汎化矢印の向きはどう覚えれば良い?
A: “三角は親を指す”と覚えると迷いません。子クラス側から親クラスへ三角形が向きます。
A: “三角は親を指す”と覚えると迷いません。子クラス側から親クラスへ三角形が向きます。
関連キーワード: コンポジットパターン、集約、汎化、UML、クラス図
設問2:
問題文を見る本文中の下線①について、指摘内容を30字以内で述べよ。
模範解答
再生を開始するときに、通常再生から開始となっていない。
解説
解答の論理構成
-
仕様の確認
【問題文】の倍速再生仕様に、 「再生しているときに再生ボタンを押しても何もしない。」
「再生を開始するときは、必ず通常再生から開始する。」
という記述がある。
特に後者が“開始時は必ず通常再生”であることを明示している。 -
ステートマシン図の挙動
図4では状態「停止」からイベント「再生ボタン」でコンポジット状態「再生」に入るが、 サブ状態「通常再生」への初期遷移(黒丸→通常再生)が描かれていない。
そのため「停止」から「再生ボタン」を押した時にどのサブ状態へ入るかが不定になる。
誤りやすいポイント
- コンポジット状態に入っただけで初期サブ状態が決まると思い込み、黒丸の初期状態を省略してしまう。
- 「モードボタン」の循環遷移ばかりに注目し、“開始時は通常再生”という基本仕様を見落とす。
- “再生ボタンを押しても何もしない”という文を、開始時にも適用されると誤読してしまう。
FAQ
Q: コンポジット状態に初期遷移を描かない場合、どう解釈されますか?
A: UMLではサブ状態が不定となり、今回のように仕様を満たさない図と見なされます。
A: UMLではサブ状態が不定となり、今回のように仕様を満たさない図と見なされます。
Q: 「再生」コンポジット状態の右上に“通常再生”を描いただけでは不十分ですか?
A: 不十分です。開始時にそのサブ状態へ入ることを示す黒丸→“通常再生”の遷移が必要です。
A: 不十分です。開始時にそのサブ状態へ入ることを示す黒丸→“通常再生”の遷移が必要です。
Q: 仕様と図が食い違った場合、どちらを優先して修正すべきですか?
A: 仕様(テキスト)が正である前提なので、図を仕様に合わせて修正するのが基本方針です。
A: 仕様(テキスト)が正である前提なので、図を仕様に合わせて修正するのが基本方針です。
関連キーワード: ステートマシン、初期状態、コンポジット状態、抽象クラス
設問3:
問題文を見る図4について凡例に倣い、選曲ボタン、停止ボタン、全曲再生終了のイベントが発生したときの状態遷移をステートマシン図に追加せよ。ここで、設問2の指摘内容は考慮しなくてよい。
模範解答
(図を参照)


解説
解答の導き方
まず、追加すべきイベントは「選曲ボタン」「停止ボタン」「全曲再生終了」の三つです。図4は開始→停止→再生(複合状態:通常再生/2倍速再生/3倍速再生)→一時停止という構成になっているので、各イベントがどの状態で発生し、どの状態へ移るかを仕様から読み取って図に反映します。
-
選曲ボタンの扱いを決める
仕様に「選曲ボタンは、停止しているときだけ有効で、繰り返して複数の曲名を選択することができる。また、選択済みの曲名を再選択すると選択解除となる。」とあるので、選曲ボタンの有効状態は停止に限定され、押すと曲の選択状態(副作用)が変わるが状態(停止/再生/一時停止)は遷移しません。したがってステートマシン図には停止状態上の内部振る舞いとして、停止に対する自己ループ(または内部遷移)を追加し、ラベルに「選曲ボタン」を書きます。これは「イベント発生に対して何もしないものはステートマシン図に記載しない」という凡例の趣旨とも矛盾せず、実際に状態変化を伴う処理(選択トグル)があるため図示すべきです。 -
停止ボタンの扱いを決める
仕様に「停止しているとき以外に停止ボタンを押すと停止となる。停止しているときに停止ボタンを押しても何もしない。」とあるため、停止ボタンは再生中(複合状態)および一時停止のときに有効で、それらから停止へ遷移させる必要があります。図示上は次のようにします。- 再生(複合状態)の外周から停止へ向かう遷移を1本引き、ラベルに「停止ボタン」と記載する(複合状態の外周に矢印を引くことで内部のいずれのサブステートからでも有効であることを表せます)。
- 一時停止から停止へ向かう遷移を引き、ラベルに「停止ボタン」と記載する。
停止状態で押しても何もしないので、停止側に停止ボタンの自己ループは描きません。
-
全曲再生終了の扱いを決める(重要)
仕様に「選択済みの曲全ての再生を終了すると停止となる。」とあるため、この事象は再生中(再生の内部で)発生する事象です。従ってこれを停止の自己ループに書くのは不適切で、必ず再生(複合状態)から停止へ遷移を引きます。図示では再生の外周から停止へ向かう遷移を引き、ラベルに「全曲再生終了」と記載します。内部の各サブステート(通常再生/2倍速再生/3倍速再生)から個別に遷移を書くことも可能ですが、複合状態外周へ一本で表すことで「発生元が再生である」ことを明確に示せます。
最終的に図に追加する矢印(要点)
- 停止:自己ループ(内部遷移)ラベル「選曲ボタン」
- 再生(複合状態)→停止:ラベル「停止ボタン」
- 一時停止→停止:ラベル「停止ボタン」
- 再生(複合状態)→停止:ラベル「全曲再生終了」(再生内部で全曲終了したときに発生)
凡例の「二つ以上の状態を一つの状態にまとめて記載することができる」を使えば、再生複合状態の外周に一本の遷移を引くことで、3つのサブステート全体に対する遷移を簡潔に表現できます。
誤りやすいポイント
-
全曲再生終了を停止状態の自己ループに書く誤り
全曲再生終了は再生中に発生する事象なので、再生→停止で表現すべきです。停止側に書くと発生源(再生)を失い振る舞いが不明瞭になります。 -
停止ボタンの遷移元を一時停止に含め忘れる誤り
「停止しているとき以外に停止ボタンを押すと停止となる」ため、少なくとも再生(複合状態)と一時停止の双方から停止への遷移を用意する必要があります。 -
選曲ボタンを図に書かない(何もしないと誤認)する誤り
停止時に選曲ボタンで選択状態が変わるため、副作用のあるイベントとして停止上の内部遷移(自己ループ)で表現する必要があります。単に「状態は変わらないから不要」とすると選択動作が図に現れません。 -
複合状態の扱いを誤る(サブステートごとに重複して遷移を書くか、どれにも書かない)
複合状態外周への遷移を使えば簡潔に表せますが、誤って一部のサブステートのみから遷移を引くと、他のサブステートでイベントが無効と解釈されてしまう可能性があります。
FAQ
Q: 選曲ボタンは停止の自己ループで表して良いですか?
A: はい。仕様の「選曲ボタンは、停止しているときだけ有効で…」から、停止のときに内部的な選択状態を切り替える副作用があるだけで状態遷移は生じません。UMLでは停止状態上の自己ループ(内部遷移)で表現します。
A: はい。仕様の「選曲ボタンは、停止しているときだけ有効で…」から、停止のときに内部的な選択状態を切り替える副作用があるだけで状態遷移は生じません。UMLでは停止状態上の自己ループ(内部遷移)で表現します。
Q: 全曲再生終了は複合状態の外周に遷移を書いてよいですか?
A: よいです。全曲再生終了は再生内部で起きる完了事象なので、再生(複合状態)→停止の遷移として一本で表すのが分かりやすく正確です。各サブステートから個別に遷移を書いても同等ですが、外周に書く方が簡潔です。
A: よいです。全曲再生終了は再生内部で起きる完了事象なので、再生(複合状態)→停止の遷移として一本で表すのが分かりやすく正確です。各サブステートから個別に遷移を書いても同等ですが、外周に書く方が簡潔です。
Q: 停止ボタンは停止状態にも矢印を引くべきですか?
A: いいえ。仕様に「停止しているときに停止ボタンを押しても何もしない」とあるので、停止状態で停止ボタンを押しても図に表す必要はありません(凡例の趣旨:「イベント発生に対して何もしないものはステートマシン図に記載しない」)。
A: いいえ。仕様に「停止しているときに停止ボタンを押しても何もしない」とあるので、停止状態で停止ボタンを押しても図に表す必要はありません(凡例の趣旨:「イベント発生に対して何もしないものはステートマシン図に記載しない」)。
関連キーワード: 状態遷移図、複合状態、内部遷移、完了遷移、イベント






