応用情報技術者 2011年 春期 午後 問08
ゴルフ用ナビゲーションシステムのオブジェクト指向設計に関する次の記述を読んで、設問1~3に答えよ。
S社は、ゴルフ用の携帯型 GPSナビゲーションシステム(以下、GPSナビという)を製品化することになり、そのソフトウェアをオブジェクト指向によって設計することにした。
ゴルフ場は番号の付けられた複数のホールから成る。各ホールには、グリーンと呼ばれる区域があり、ボールを入れる穴(カップ)があけられている。プレーヤは、カップにボールを入れた後、次のホールに進む(ホールの移動)。なお、本問では、プレーヤがカップにボールを入れる前に他のホールに立ち入ることは、考えなくてよいものとする。
GPSナビとは、GPSによって現在位置を測定する機能を備え、さらに、ゴルフ場の位置に関する各種のデータ(位置関係データ)をもつ。プレーヤは始めに、GPSナビに登録されているゴルフ場の中から、現在いるゴルフ場を選択する。プレーヤは、ボールを打つときに位置登録ボタンを押して、その時点の現在位置を最新登録位置として登録することができる。位置登録ボタンが押されるたび、最新登録位置はその時点の現在位置に更新される。GPSナビは、次の項目を自動的に認識又は計算し、所持するプレーヤに示す。
(1) 現在いるホールの番号(現在位置と位置関係データによって認識)
(2) 現在位置からそのホールのグリーンの中央(グリーン位置)までの距離(残距離)
(3) 最新登録位置から現在位置までの距離(飛距離)
GPSナビの画面表示例を図1に示す。画面の表示内容は、タイマによって一定時間間隔で最新の状態に更新される。また、位置と距離の関係を図2に示す。

GPSナビのソフトウェアをオブジェクト指向で設計するに当たり、図3に示すクラス図を作成した。“距離計算”は位置のデータから残距離と飛距離を計算する操作である。

また、タイマによる表示更新、及びプレーヤによる位置登録のシーケンス図の一部を、それぞれ図4、及び図5に示す。


〔ホールのレイアウトを画面表示する機能の追加と処理方式の変更〕
現在いるホールのレイアウトとそこでの現在位置を画面表示する機能を、GPSナビに追加することになった。そこで、処理効率を考慮して、次のような処理方式に変更することにした。
レイアウトを表示するためのクラス "表示 2" を追加し、その属性としてレイアウト表示データを設ける。"現在状態" の操作 "現在状態問合せ" は、属性を最新に更新するための "更新" と、属性を返す "状態問合せ" に分割する。また、"タイマ" からの関連の参照先を "現在状態" に変更し、さらに、既存のものと逆方向の関連を二つ追加する。
処理方式の変更に伴い、図3のクラス図は図6のように、図4のタイマによる表示更新のシーケンス図は図7のように、それぞれ変更する。


設問1:
図3中のa、bに入れる適切な属性名、及び図4中のcに入れる適切な字句を、それぞれ本文中にある字句を用いて答えよ(aとbは順不同)。
模範解答
a:グリーン位置
b:最新登録位置
c:ホールの移動
解説
解答の論理構成
-
属性 [a]・[b] の候補抽出
- 【問題文】には “現在位置からそのホールのグリーンの中央(グリーン位置)までの距離(残距離)” と “最新登録位置から現在位置までの距離(飛距離)” とあります。
- 「残距離」を求めるには “グリーン位置”、「飛距離」を求めるには “最新登録位置” が必須です。
- 図3の “現在状態” は “距離計算” を呼び出す側なので、計算に必要な両位置を属性として保持する設計が自然です。
➜ よって [a] と [b] は “グリーン位置” と “最新登録位置” になります。
-
[a]・[b] の順不同
- 問題は “(aとbは順不同)” と指示しています。したがって正答は
a:グリーン位置/b:最新登録位置 でも
a:最新登録位置/b:グリーン位置 でも可ですが、模範解答は前者の並びです。
- 問題は “(aとbは順不同)” と指示しています。したがって正答は
-
[c] に入る字句の決定
- 図4の alt フラグメントは “ホール問合せ” の直後に “グリーン位置問合せ” を行うか否かを分岐しています。
- これはプレーヤが次のホールに進んだときだけ必要となる処理です。
- 【問題文】“プレーヤは、カップにボールを入れた後、次のホールに進む(ホールの移動)。” とあるため、状態遷移を表す語は “ホールの移動” が最適です。
➜ [c] には “ホールの移動” を記述します。
誤りやすいポイント
- “残距離” と “飛距離” という表示項目をそのまま属性名にしてしまう。実際には距離そのものではなく、距離を算出するための位置情報を保持する点に注意が必要です。
- [c] を “次ホールへ移動” などと自由翻訳するミス。設問は “本文中にある字句を用いて” と明示しているため、原文どおり “ホールの移動” を使います。
- 図のメッセージ順序から「グリーン位置はゴルフ場オブジェクトにしか無い」と考え、[a] を空欄にしてしまう。設計上、問い合わせ先と保持先は分けて良いことを理解しておきましょう。
FAQ
Q: 属性に “残距離” や “飛距離” を直接持たせても動きそうですが、なぜ位置を持たせるのですか?
A: 距離は計算結果で時間とともに変化します。一方 “最新登録位置” や “グリーン位置” はイベント時にのみ更新される比較的安定した値です。変化の少ないデータを属性に、変化量を操作で算出するのがオブジェクト指向設計のセオリーです。
A: 距離は計算結果で時間とともに変化します。一方 “最新登録位置” や “グリーン位置” はイベント時にのみ更新される比較的安定した値です。変化の少ないデータを属性に、変化量を操作で算出するのがオブジェクト指向設計のセオリーです。
Q: “ホールの移動” かどうかを誰が判断しているのですか?
A: “現在状態” が “ホール問合せ” の結果を以前のホール番号と比較し、変化していれば “ホールの移動” と判断します。シーケンス図ではその条件分岐だけを alt フラグメントで表現しています。
A: “現在状態” が “ホール問合せ” の結果を以前のホール番号と比較し、変化していれば “ホールの移動” と判断します。シーケンス図ではその条件分岐だけを alt フラグメントで表現しています。
Q: [a]・[b] の順番は採点に影響しますか?
A: 設問に “順不同” とあるため影響しません。ただし答案欄の a・b には指定された位置で記入することが求められます。
A: 設問に “順不同” とあるため影響しません。ただし答案欄の a・b には指定された位置で記入することが求められます。
関連キーワード: オブジェクト指向, クラス図, シーケンス図, 属性設計, 条件分岐
設問2:
図5中のアには二つのメッセージが入る。それらについて、解答欄にメッセージの矢印線とメッセージ名を記入せよ。ただし、矢印“→”と“➡︎”の区別は不要であり、メッセージの戻り線は省略し、メッセージ名は相当する操作名とせよ。
模範解答

解説
解答の論理構成
-
“図5”は「プレーヤによる位置登録」の流れを示しています。位置登録時の主役は【問題文】にある
「プレーヤは、ボールを打つときに位置登録ボタンを押して、その時点の現在位置を最新登録位置として登録することができる。」
という仕様どおり “位置登録ボタン” です。
したがって ア の最初のメッセージは “位置登録ボタン” から “現在状態” へ送られる操作 “現在位置登録” になります。
(操作名は “現在状態” クラスの操作欄にある “現在位置登録” をそのまま使用) -
“現在位置登録” を実行するには GPS から最新の現在位置を取得しなければなりません。これは “図4” で示された通常の更新シナリオと同じで、
「現在状態 → GPS 『現在位置問合せ』」
というメッセージで実現されています。
位置登録時にも同じ問い合わせが必要なので、ア の二つ目は “現在状態” から “GPS” への “現在位置問合せ” となります。 -
以上から ア には
・位置登録ボタン → 現在状態 : 現在位置登録
・現在状態 → GPS : 現在位置問合せ
の二本を記述するのが妥当です。
誤りやすいポイント
- “現在状態 → ゴルフ場” の “ホール問合せ” を描いてしまう
→ ホール判定は位置登録と無関係。GPS 位置を得てから内部で行うのでメッセージとしては不要です。 - “表示” オブジェクトを経由させる
→ 位置登録フローでは “表示” は関与しません。メッセージは “位置登録ボタン” から直接 “現在状態” へ送られます。 - 操作名の誤記
→ クラス図に記された “現在位置登録” “現在位置問合せ” の語句を一字違わず転記する必要があります。
FAQ
Q: “現在位置登録” のあとに “距離計算” は呼ばれないのですか?
A: 図5では省略されていますが、内部処理で呼び出すか後続タイミングでタイマが起動して再計算します。設問はメッセージを二つに限定しているので対象外です。
A: 図5では省略されていますが、内部処理で呼び出すか後続タイミングでタイマが起動して再計算します。設問はメッセージを二つに限定しているので対象外です。
Q: “位置登録ボタン → 表示” としない理由は?
A: “表示” クラスは画面描画を担当するだけで、データ更新は “現在状態” が一元管理します。したがってボタンイベントは “現在状態” に直接伝達します。
A: “表示” クラスは画面描画を担当するだけで、データ更新は “現在状態” が一元管理します。したがってボタンイベントは “現在状態” に直接伝達します。
Q: “現在位置問合せ” は同期メッセージですか?
A: 図4と同様、即時応答を期待する同期メッセージとして扱うのが一般的です。問題では戻り線を省略可と指示されています。
A: 図4と同様、即時応答を期待する同期メッセージとして扱うのが一般的です。問題では戻り線を省略可と指示されています。
関連キーワード: オブジェクト指向, クラス図, シーケンス図, メッセージ, インタラクション
設問3:機能追加を行って処理方式を変更する場合について、〔1〕、〔2〕に答えよ。
(1)図7中のイには、クラス内呼出しとクラス“表示2”に関するメッセージを除くと、二つのメッセージが入る。それらについて、設問2と同様に、解答欄に記入せよ。
模範解答

解説
解答の論理構成
- 操作の分割
問題文に「"現在状態" の操作 "現在状態問合せ" は、属性を最新に更新するための "更新" と、属性を返す "状態問合せ" に分割する。」とあります。したがって
・属性を計算・保持する処理 → "更新"
・保持した属性を返す処理 → "状態問合せ"
に二分化されます。 - 参照方向の追加
同じ段落に「既存のものと逆方向の関連を二つ追加する。」とあり、図6でも
現在状態 → 表示
現在状態 → 表示2
の実線矢印(太線)が描かれています。これは現在状態が表示クラス側へメッセージを送れるようになったことを示します。 - タイマによる処理順序の再構成
タイマは図7で :タイマ → :現在状態「更新」を送信し、現在状態は内部データを更新します。更新後、最新データを使って画面を描き替える必要があるため、現在状態が表示(および表示2)に対して「更新」を依頼します。 - 表示側のデータ取得
表示は「更新」依頼を受けても、実際の数値(残距離・飛距離など)は現在状態が保持しています。そこで表示→現在状態へ「状態問合せ」を送り、返された値を描画します。 - [イ] に入るメッセージ
上記 3・4 をシーケンス図に落とすと、
・現在状態 → 表示 「更新」
・表示 → 現在状態 「状態問合せ」
の二本が [イ] 部分に入ります。方向とラベルは図7の配置(表示ライフライン上の小枠)の指示と一致します。
誤りやすいポイント
- 「タイマが表示に直接“更新”を送る」と勘違いし、矢印の送信元を間違える。処理方式変更後は「タイマ → 現在状態」が正しい流れです。
- 「状態問合せ」と「現在位置問合せ」を取り違える。前者は表示が現在状態に要求するデータ取得、後者は現在状態が GPS に要求する現在位置取得です。
- 表示2に関するメッセージを[イ]に書いてしまう。問題文には「“表示2”に関するメッセージは省略している。」と明記されています。
FAQ
Q: 「更新」と「状態問合せ」はどちらが先に呼ばれますか。
A: まず :現在状態 が :表示 に「更新」を送り描画要求を出し、その後 :表示 が「状態問合せ」でデータを受け取る順序です。
A: まず :現在状態 が :表示 に「更新」を送り描画要求を出し、その後 :表示 が「状態問合せ」でデータを受け取る順序です。
Q: タイマは表示を全く呼ばなくなるのですか。
A: はい。処理方式変更で「タイマからの関連の参照先を '現在状態' に変更」したため、タイマは表示クラスを直接呼び出しません。
A: はい。処理方式変更で「タイマからの関連の参照先を '現在状態' に変更」したため、タイマは表示クラスを直接呼び出しません。
Q: 表示2 も「状態問合せ」を呼ぶ必要がありますか。
A: レイアウト描画用の表示2 も最新データが要るため同様に「状態問合せ」を呼びます。ただし問題文では省略されています。
A: レイアウト描画用の表示2 も最新データが要るため同様に「状態問合せ」を呼びます。ただし問題文では省略されています。
関連キーワード: シーケンス図, オブジェクト指向設計, メッセージ方向, クラス図, 更新処理
設問3:機能追加を行って処理方式を変更する場合について、〔1〕、〔2〕に答えよ。
(2)表示のために“GPS”や“ゴルフ場”を参照する頻度は、機能追加前に比べて、何倍になるか。解答群の中から選び記号で答えよ。
解答群
ア:1/4倍
イ:1/2倍
ウ:1倍
エ:2倍
オ:4倍
模範解答
ウ
解説
解答の論理構成
-
機能追加“前”の参照回数
【問題文】の図4には
「3. :現在状態 → :GPS『現在位置問合せ』」
「4. :現在状態 → :ゴルフ場『ホール問合せ』」
と明記されています。
さらに囲み枠Aの中でゴルフ場に対し「グリーン位置問合せ」が行われるが、同じ図4の注記で「alt は選択を表す。」とあるため、更新1回につき
・“GPS”への参照 … 1 回
・“ゴルフ場”への参照 … 1 回(+条件分岐で1回)
が上限になります。 -
機能追加“後”の参照回数
図7には「:現在状態 → :GPS『現在位置問合せ』」と、
「図4のAと同じ」と明記された囲み枠がそのまま再利用されています。したがって
・“GPS”への参照 … 1 回
・“ゴルフ場”への参照 … 1 回(+条件分岐で1回)
と、機能追加前と全く同じ回数です。
また処理方式変更で“タイマ”の呼出し先が「表示」から「現在状態」に移り、二つの表示クラスは「状態問合せ」で既に更新済みの属性を読むだけですから、追加の参照は発生しません。 -
比率計算
前後で回数が等しい ⇒ 参照頻度は 倍。
解答群より「ウ:1倍」が正答となります。
誤りやすいポイント
- 「表示2」が増えたことで参照回数も倍増すると短絡的に考える。実際には“表示2”は「状態問合せ」で済み、外部参照しない。
- 図7の先頭メッセージを「:表示2 → :表示『更新』」と読み、二重更新だから2倍と勘違いする。ここは表示間の連携であり“GPS”“ゴルフ場”とは無関係。
- 図4の alt 部分を毎回2回呼ぶと誤認し、ゴルフ場参照を2倍計上してしまう。
FAQ
Q: 図7で“タイマ”が表示クラスを呼ばなくなった意味は?
A: 更新処理を「現在状態」に集約し、1回の外部参照で2種類の表示クラスへ最新データを配信できるようにしたためです。
A: 更新処理を「現在状態」に集約し、1回の外部参照で2種類の表示クラスへ最新データを配信できるようにしたためです。
Q: 「状態問合せ」と「更新」を分割するメリットは?
A: 外部データ取得(重い処理)を“更新”に集約し、表示側は軽い“状態問合せ”でキャッシュ済みデータを読むだけになるため、処理効率が向上します。
A: 外部データ取得(重い処理)を“更新”に集約し、表示側は軽い“状態問合せ”でキャッシュ済みデータを読むだけになるため、処理効率が向上します。
関連キーワード: シーケンス図, クラス図, 参照頻度, オブジェクト指向, 要求分析


