平成22年春期試験午後問題 問8

問8 情報システム開発

⇱問題PDF
ソフトウェアのオブジェクト指向設計に関する次の記述を読んで,設問1~3に答えよ。
 今まで,Q鉄道会社の自動券売機は,乗車券の発売しかできなかった。このたび,急行券も発売できる新型の自動券売機を開発することになった。急行券は,座席の指定は行わないが,乗車する急行列車を指定して発売する。
 新型の自動券売機の主なシナリオは,次のとおりである。

〔前提〕
  • 乗車券は,普通列車,急行列車にかかわらず,列車に乗るときに必要であり,乗車駅と降車駅を指定することによって,金額(運賃)が決まる。
  • 急行券は,急行列車に乗るときに必要であり,列車とその乗車駅,降車駅を指定することによって,金額(料金)が決まる。
〔発売時〕
  • 乗客は,まず購入する切符の種類(乗車券又は急行券)を選択し,乗車日,乗車駅,降車駅,人数及び急行券の場合は列車を自動券売機に入力する。
  • 自動券売機は,入力されたデータに基づいて,金額(運賃又は料金)を算出し,表示する。
  • 乗客は,表示内容でよければ,自動券売機に現金を投入し,発売ボタンを押す。表示内容でよくなければ,取消しボタンを押し,初期状態に戻す。
  • 発売ボタンが押されると,自動券売機は投入されている現金を確認して収納し,発券するとともに,釣りがあれば釣銭を返却する。
 ソフトウェアの設計には,UMLのクラス図などを利用している。乗車券だけを発売する現在の自動券売機のクラス図を,図1に示す。

 新型の自動券売機では,クラス"乗車券"と"急行券"についてはスーパークラスを設けることにし,図2に示すクラス図を作成した。
pm08_1.gif
 図2のクラス図におけるスーパークラス"切符"とそのサブクラス"乗車券"及び"急行券"では,共通の属性をスーパークラスに,サブクラス個別の属性を各サブクラスにもたせている。ただし,属性"運賃"と"料金"については,個別に残しながら,共通の属性"金額"を追加した。また,乗車券面編集と急行券面編集は,切符に印刷するイメージを作るための,それぞれのサブクラス個別の操作である。
 図2のクラス"操作機構"の属性"切符"は,実装ではオブジェクト"乗車券"又は"急行券"を指していて,"操作機構"からそれらのオブジェクトの操作を呼び出すことを可能にする。

 新型の自動券売機で急行券を発売する場合の正常処理について,図3に示すシーケンス図を作成した。範囲cにはメッセージが入る。
pm08_2.gif

設問1

継承を使用した図2のクラス図について,(1),(2)に答えよ。
  • abに入れる適切な属性名又は操作名を答えよ。
  • 多様性(ポリモルフィズム)をもつメッセージに該当する操作名を一つ答えよ。ただし,"発売","取消じ'と"削除"は除く。

解答例・解答の要点

  • a:列車
    b:金額問合せ
  • 発券

解説

  • aについて〕
    問題文の〔前提〕及び〔発売時〕には以下の記述があります。
    • 急行券は,急行列車に乗るときに必要であり,列車とその乗車駅,降車駅を指定することによって,金額(料金)が決まる。
    • 乗客は,まず購入する切符の種類(乗車券又は急行券)を選択し,乗車日,乗車駅,降車駅,人数及び急行券の場合は列車を自動券売機に入力する。
    これらの説明より、急行列車に乗車する際は"列車"の指定が必要なことがわかります。"列車"の情報は急行列車に固有の属性なので、急行券クラスに属性"列車"が必要となります。

    a=列車

    bについて〕
    図1の乗車券クラスと、図2の切符クラスの操作の差異を確認しましょう。
    乗車券クラスと比べ切符クラスには操作"乗車券面編集"、操作"運賃問合せ"が存在しません。これらはともに削除された機能ではないため、サブクラスにて実装が必要です。
    操作"乗車券面編集"については、問題文に「乗車券面編集と急行券面編集は,切符に印刷するイメージを作るための,それぞれのサブクラス個別の操作である」と記載があるように、それぞれのサブクラス(乗車券クラス、急行券クラス)にて定義しています。一方、操作"運賃問い合わせ"についてはサブクラスでは定義されていません。よって、[b]には"運賃問合せ"に関する操作が当てはまることがわかります。

    ここで改めて〔前提〕の説明を確認しましょう。
    • 乗車券は、普通列車,急行列車にかかわらず、列車に乗るときに必要であり、乗車駅と降車駅を指定することによって、金額(運賃)が決まる。
    • 急行券は、急行列車に乗るときに必要であり、列車とその乗車駅、降車駅を指定することによって、金額(料金)が決まる。
    乗車券は"運賃"、急行券は"料金"という言葉で金額を表現しています。"運賃問合せ"のままでは急行券の問い合わせには対応できないため、乗車券、急行券どちらでも対応できるよう"金額問い合わせ"と文言を統一する必要があります。これは、図3のシーケンス図において、操作機構から急行券に対して"金額問合せ"というメッセージが送られていることから確認できます。

    b=金額問合せ

  • ポリモルフィズムは、日本語では「多様性」「多態性」「多相性」と表現され、同じメッセージを送っても受信側のオブジェクトによって行われる操作が異なる様子を言います。

    例えば"動物"クラスを作って"鳴く"という操作を定義したとしましょう。それを派生させた"犬"クラスと"猫"クラスを作ったとき、"犬"クラスに対して"鳴く"というメッセージを送ると出力は"ワン"、"猫"クラスに対して"鳴く"というメッセージを送ると出力は"ニャー"となり、同じメッセージでも受け手のオブジェクトによって操作の内容が異なります。この感じがポリモルフィズムです。

    ポリモルフィズムの特性から言って、同じ名前の操作が複数のクラスで実装されている部分に着目します。切符クラスを継承する乗車券クラスと急行券クラスには"作成"・"削除"・"発券"という同名の操作があります。この3つは切符クラスの抽象メソッドをサブクラスにて実装したものです。
    まず"削除"は設問の条件より除外できます。"作成"は図3のシーケンス図において破線で示されておりメッセージではないので除外できます。したがって残った"発券"がポリモルフィズムをもつメッセージということになります。

    ∴発券

設問2

図3のシーケンス図について,(1),(2)に答えよ。メッセージ名については,図2のクラス図中にある操作から選べ。
  • cに入れるメッセージについて,送信側と受信側のクラス名,及び適切なメッセージ名を答えよ。
  • deに入れる適切なメッセージ名を答えよ。

解答例・解答の要点

  • 送信側クラス名:乗客
    受信側クラス名:現金機構
    メッセージ名:入金
  • d:現在額問合せ
    e:急行券面編集

解説

  • まず、図3のシーケンス図について[c]の直後の動作を確認すると、乗客から操作機構に"発売"メッセージが送られています。発売に関して〔発売時〕の説明を見てみると「乗客は,表示内容でよければ,自動券売機に現金を投入し,発売ボタンを押す」と記載があります。よって、[c]にはこれより前の動作が入ることになります。

    次に直前の操作を確認すると、〔発売時〕の説明に「自動券売機は,入力されたデータに基づいて,金額(運賃又は料金)を算出し,表示する」と記載があります。これは図3の以下の部分に該当します。
    pm08_3.gif
    ここで改めて「乗客は,表示内容でよければ,自動券売機に現金を投入し,発売ボタンを押す」を見てみると、「乗客は,表示内容でよければ,自動券売機に現金を投入し」の箇所がシーケンス図に記載されていないことがわかります。現金を投入するのは乗客、受け取り先は"現金機構"です。現金機構クラスには操作"入金"があるので、[c]には乗客から現金機構に入金メッセージを送る矢印が入ります。

    ∴送信側クラス名=乗客
     受信側クラス名=現金機構
     メッセージ名=入金
    pm08_4.gif
  • dについて〕
    操作機構クラスから現金機構クラスに送られるメッセージです。現金機構クラスの操作は"入金"・"現在額問合せ"・"収納返却"の3つしかありませんから、このうちいずれかが空欄に入ります。

    発売ボタンが押された際の動作を確認すると、「発売ボタンが押されると,自動券売機は投入されている現金を確認して収納し,発券するとともに,釣りがあれば釣銭を返却する」と説明されています。
    発売メッセージを受け取った操作機構クラスは、急行券クラスへの金額問合せと現金機構への現金額問合せを行い、現在額が急行券の金額以上であれば発券処理を行います。この中でシーケンス図に記載されていないのは「投入されている現金を確認」することです。現在入金されている額の確認は現金機構クラスの操作"現在額問合せ"にて行います。したがって、[d]には「現在額問合せ」が当てはまります。

    d=現在額問合せ

    eについて〕
    急行券クラスが自分自身に送っていルるメッセージです。急行券クラスの操作は"作成"・"削除"・"急行券面編集"・"発券"の4つしかありませんから、このうちいずれかが空欄に入ります。"作成"・"削除"はオブジェクトの生成と破棄に関するメッセージであり、図3中に記載済なので、"急行券面編集"または"発券"の2択と言えます。

    シーケンス図を確認してみると、[e]は印刷機構の発券処理を行う前の処理です。言い換えると、急行券を発券する前に行うべき処理が入ることになります。
    改めて問題文を見てみると「乗車券面編集と急行券面編集は,切符に印刷するイメージを作るための,それぞれのサブクラス個別の操作である」記載があり、印刷前に切符に印刷するイメージを作成する必要があることがわかります。
    急行券の場合は操作"急行券面編集"にて行います。したがって、[e]には「急行券面編集」が当てはまります。

    e=急行券面編集

設問3

乗客が乗車券と急行券など,複数の切符を同時に購入する場合を考慮し,まとめて発売する機能を追加したい。乗客が,切符要求の入力後,更に次の切符要求の入力を行い,最後に発売ボタンを押すことによって,それまでに入力した切符をまとめて発売できるようにする。
 これを実現するために,クラス図としては図2のクラスの配置は変えず,いずれかのクラスの属性一つと,そのクラスにかかわる関係の多重度を変えて対応する。
 変更する必要がある属性の所属するクラス名と属性名を答えよ。また,その属性の変更内容が分かる適切な変更後の属性名を,10字以内で答えよ。

解答例・解答の要点

クラス名:操作機構
属性名:切符
変更後の属性名:切符の集合

解説

乗客が切符を購入する場合、入力された情報を保持しているのは操作機構クラスの属性"切符"です。現仕様ではクラス図において操作機構から見た切符クラスの多重度が0..1となっているように、属性"切符"には一つの切符の情報しか保持することができません。

属性を"乗車券"及び"急行券"の2つとすれば、1つの乗車券と1つの急行券の組合せを一度に保持することはできますが、2つの乗車券を一度に買うような場面には対応できず、また設問の条件にも反するので適切ではありません。
既存属性と多重度を変えて対応するとなると、操作機構クラスが保持する属性"切符"を単一の切符クラスから、切符クラスのリストを保持する属性に変更し、操作機構から見た切符の多重度を0..*に変更することが考えられます。こうすることで複数の切符情報を保持しておき、まとめて発売処理をすることができるようになります。

∴クラス名=操作機構
 属性名=切符
 変更後のクラス名=切符の集合(切符のリスト)
pm08_5.gif
模範解答

Pagetop