令和6年春期試験午後問題 問8

問8 情報システム開発

⇱問題PDF
ダッシュボードの設計に関する次の記述を読んで,設問に答えよ。
 Y社は,食品などを販売する店舗を経営する企業である。複数ある店舗では,商品の販売状況や在庫状況に合わせて,割引率を設定したり,店舗間で在庫の移動を行ったりしている。販売に関する情報は販売管理システムで管理しているが,状況をリアルタイムで監視するには不向きであった。そこで,販売状況をリアルタイムで監視できるシステム(以下,ダッシュボードという)を開発することにした。
 Y社では,商品ごとに商品分類を設定し,売上金額や販売数の集計に利用している。Y社が扱う情報のデータモデル(抜粋)を図1に,ダッシュボードのイメージ(一部)を図2に示す。
pm08_1.png
pm08_2.png
 販売状況や在庫状況はデータベースで管理する。データベースに新たな販売実績が追加されたり,在庫数が更新されたりすると,その内容がダッシュボードに随時反映され,最新の情報が表示される。
 Y社は,ダッシュボードの開発をZ社に依頼し,Z社はその設計に取り掛かった。

〔ダッシュボードのクラスの設計〕
 Z社は,ダッシュボードのクラスの設計を行った。設計したクラス図を図3に,表示できるグラフの種類を表1に,主なクラスの説明を表2に示す。Controllerクラスは,システム全体の挙動を制御するクラスである。Viewクラスは,画面にグラフを表示する機能をもつクラスである。グラフには複数の種類があるので,その種類ごとに,Viewクラスをaしたクラスを作成する。Subjectクラスは,データベースが更新されたことをViewクラスのオブジェクトに通知するクラスである。図1のデータモデル中のテーブルのうち,ダッシュボードで監視したい情報に関するテーブルのそれぞれについて,Subjectクラスをaしたクラスを作成する。以下,Viewクラス,Subjectクラスをaしたクラスのオブジェクトを,それぞれViewオブジェクト,Subjectオブジェクトという。
pm08_3.png
pm08_4.png
pm08_5.png
〔グラフの新規表示〕
 例えば,"時間帯ごと商品分類ごとの売上金額"のグラフを新たに画面上に表示する場合を考える。グラフの種類は棒グラフなので,棒グラフViewクラスのオブジェクトを作成する。次に,①関係するSubjectオブジェクトのaddObserverメソッドを呼び出す。その後,画面の初期表示のために,画面表示更新メソッドを呼び出す。

〔グラフの表示内容更新〕
 店舗で商品が販売されると,販売管理システムが,データベースにレコードを追加する。そのとき,ダッシュボードのControllerクラスに実装されているdbUpdatedメソッドが呼び出されるように,システム間の連携が行われている。
 Controllerクラスは,dbUpdatedメソッドが呼び出されると,更新されたテーブルに対応するSubjectオブジェクトのnotifyObserversメソッドを呼び出す。notifyObserversメソッドは,そのオブジェクトが属性としてもつ配列viewsに格納されている全てのViewオブジェクトのnotifyメソッドを呼び出す。notifyメソッドは,画面表示更新メソッドを呼び出す。Viewクラスの画面表示更新メソッドはdメソッドなので,例えば,"時間帯ごと商品分類ごとの売上金額"の場合はeクラスに実装されたメソッドを呼び出す。

〔データのフィルタリング〕
 Y社からの追加の要求で,集計結果をフィルタリングする機能を追加することになった。例えば,"時間帯ごと商品分類ごとの売上金額"のグラフ上で,特定の商品分類の表示箇所をマウスでクリックしたときに,表示されている全てのグラフについて,指定した商品分類で絞り込んだ結果を表示したい。そこで,絞込条件を取り扱うクラスとして絞込条件クラスを導入し,次の改修を加えることで機能を実現することにした。
  • 絞込条件クラスは,属性として"テーブル名","項目名","絞込条件の値"をもつ。例えば,商品分類で絞り込む場合は,テーブル名に"商品マスタ",項目名に"商品分類コード",絞込条件の値に"商品分類コードの値"が入る。
  • Controllerクラスの属性に絞込条件クラスのオブジェクトを追加し,その属性に条件を設定するためのsetFilterメソッドを追加する。
  • Viewオブジェクトが画面の表示を更新する際に,絞込条件のオブジェクトが引き渡されるようにするために,SubjectクラスのnotifyObserversメソッドと,Viewクラスのnotifyメソッドのそれぞれについて,呼出しの②仕様を変更する
  • 集計処理クラスの処理で絞込条件を考慮して集計し,画面を更新する。
 画面の操作が行われたら,Viewオブジェクトが絞込条件オブジェクトを生成し,ControllerオブジェクトのsetFilterメソッドを呼び出す。その後,全てのViewオブジェクトの画面表示更新メソッドを呼び出すことで,機能を実現する。

〔過負荷の回避〕
 設計レビューを実施したところ,次の点が指摘された。
  • 販売管理システムが,データベースに販売実績のレコードを連続で追加すると,ダッシュボードが過負荷になるおそれがある。
  • 一つのViewオブジェクトは,fので,1回の販売実績の登録で,表示の更新が複数回発生してしまう。
 そこで,Viewクラスの属性に"更新フラグ"を追加し,notifyメソッドでは画面表示更新メソッドを呼び出すのではなく,"更新フラグ"を立てるようにした。また,"更新フラグ"を立てる処理とは別に,定期的に画面表示更新メソッドを呼び出す仕組みを用意し,"更新フラグ"が立っている場合だけ画面の更新処理を実行してから"更新フラグ"を降ろすようにした。

設問1

本文中のaに入れる適切な字句を答えよ。

解答例・解答の要点

a:継承

解説

aについて〕
Viewクラスと、棒グラフView/折れ線グラフView/円グラフViewの3つのクラスは「汎化-特化」の関係にあります。Viewクラスが上位クラス(親クラス・スーパークラス)、グラフの種類ごとに用意されるクラスが下位クラス(子クラス・サブクラス)です。Subjectクラスと3つの下位クラスの関係も同様です。「汎化-特化」の関係では、共通する属性と操作は上位クラスで定義し、固有の属性や操作は上位クラスの定義情報を引き継いだ下位クラスで定義するという方法をとります。オブジェクト指向において、下位クラスが上位クラスの属性と操作を引き継ぐことを「継承(インヘリタンス)」と言います。したがって、文脈を考えると空欄aには「継承」が当てはまります。

a=継承

設問2

図3中のbcに入れる適切なクラス間の関係又は多重度を答え,クラス図を完成させよ。なお,表記は図3の凡例に倣うこと。

解答例・解答の要点

b:0..*
c:pm08_6.png

解説

bについて〕
表2の説明より、Subjectクラスはデータの更新をViewオブジェクトに通知するクラスであり、各メソッドは次のような動作をすることがわかります。
  • addObserverメソッドは、通知先を登録する
  • nofityObserverメソッドは、登録された全ての通知先のnofityメソッドを呼び出す
nofityObserverメソッドの「全ての通知先」という説明より、通知先は複数登録できることが読み取れます。例えば、販売実績テーブルにレコードが追加された場合、売上金額が変わるので、図2の3つのグラフ全てを更新することになります。これを実現するためには、販売実績Subjectオブジェクトはデータの更新を3つのViewオブジェクトに通知する必要があるので、通知先として3つのViewオブジェクトを登録します。このように、一つのSubjectクラスに対して複数のViewクラスが関連付けられることがあるため、Subjectクラスに対するViewクラスの多重度は0以上です。したがって、空欄bには「0..*」が当てはまります。

b=0..*

cについて〕
Viewクラスと、棒グラフView/折れ線グラフView/円グラフViewの各クラスの関係性が問われています。設問1で解説したとおり、棒グラフView等はViewクラスを継承して作成されるクラスです。図3の凡例より、継承は上位クラス側に白三角(△)を付けた実線で表すので、空欄cには「pm08_6.png」が入ります。Subjectクラスと、3つのSubjectオブジェクトのクラスとの関係も同様です。

cpm08_6.png
pm08_7.png

設問3

本文中の下線①について,関係するSubjectオブジェクトのクラス名を図3中から選び全て答えよ。

解答例・解答の要点

販売実績Subject,販売明細Subject

解説

addObserverメソッドは、データの更新の通知先となるSubjectオブジェクトを登録するメソッドなので、棒グラフ"時間帯ごと商品分類ごとの売上金額"にデータ更新を通知してほしいSubjectオブジェクトはどれか、という視点で考えます。図3で示されているSubjectオブジェクトは販売実績、在庫、販売明細の3つなので、この3つのどれかということになります。

図2で"時間帯ごと商品分類ごとの売上金額"のグラフを確認すると、横軸に"時間帯"、縦軸に"商品分類ごとの売上金額"が設定されています。つまり、この2つに関するデータ更新が、棒グラフの更新タイミングとなります。図1のデータモデルを参照すると、"時間帯"を判断するための属性"販売日時"が販売実績テーブルにあるため、販売実績Subjectが関係することがわかります。また、"商品分類ごとの売上金額"を計算するには、販売明細テーブルの属性"商品コード"から商品分類を参照することになるため、販売明細Subjectも関係します。在庫Subjectには関係する属性はありません。したがって、棒グラフViewクラスに関係するSubjectオブジェクトは「販売実績Subject、販売明細Subject」の2つです。

∴販売実績Subject,販売明細Subject

設問4

本文中のdeに入れる適切な字句を答えよ。

解答例・解答の要点

d:抽象
e:棒グラフView

解説

dについて〕
空欄の前後の文章は「Viewクラスの画面表示更新メソッドはdメソッドなので,…」となっています。図3のクラス図を確認すると、Viewクラスの画面表示更新メソッドは斜字体で表記されていて、凡例には「斜字体は抽象を意味する」とあります。これより、画面表示更新メソッドは抽象メソッドであることがわかります。したがって空欄dには「抽象」が当てはまります。

抽象メソッドとは、具体的な処理内容を記述せず、複数のクラスに共通する操作の名前や引数だけを定義したものです。例えば、動物に共通する動作として「鳴く」があるとします。動物全体に共通する「鳴く」という動作はありませんが、他のクラスから同じように呼び出せるようにしたいので、動物クラスには「鳴く」というメソッドを定義したいです。この場合、メソッドの名前や引数だけを決めて実装は下位クラスに委ねる形をとります。これが「抽象メソッド」です。下位の犬クラスでは「鳴く」動作を「ワン」と実装し、猫クラスでは「鳴く」動作を「ニャー」と実装します。実装を持つメソッドは「具象メソッド」と呼ばれます。

本システムでは画面表示更新の処理はグラフごとに異なっているので、Viewクラスの画面表示更新メソッドは抽象メソッドとして定義され、下位のクラスで具体的な実装を行う形となっています。

d=抽象

eについて〕
抽象メソッドは実装を持たないので呼び出すことができません。実際に呼び出すのは下位クラスに実装された具象メソッドとなります。

表示するグラフの種類によって、どのViewクラスを利用するかが決まります。図2のダッシュボードのイメージより、"時間帯ごと商品分類ごとの売上金額"は棒グラフの表示であることがわかります。棒グラフを更新するためには、棒グラフViewクラスに実装された画面表示更新メソッドを呼び出すことになります。したがって、空欄eには「棒グラフView」が当てはまります。

e=棒グラフView

設問5

本文中の下線②について 仕様変更の内容を30字以内で答えよ。

解答例・解答の要点

引数に絞込条件クラスのオブジェクトを追加する (22文字)

解説

データのフィルタリング機能を追加することで、既存のSubjectクラスやViewクラスにどのような仕様変更が発生するかを考える問題です。

下線②を含む一文は、「Viewオブジェクトが画面の表示を更新する際に,絞込条件のオブジェクトが引き渡されるようにするために,SubjectクラスのnotifyObserversメソッドと,Viewクラスのnotifyメソッドのそれぞれについて,呼出しの仕様を変更する」と記述されています。メソッドにオブジェクトを引き渡す方法を答えれば良いので、答えは「引数に絞込条件クラスのオブジェクトを追加する」になります。

∴引数に絞込条件クラスのオブジェクトを追加する

設問6

本文中のfに入れる適切な字句を,30字以内で答えよ。

解答例・解答の要点

f:複数のSubjectオブジェクトに登録される (22文字)

解説

fについて〕
空欄の前後の文脈より、空欄には「1回の販売実績の登録で,表示の更新が複数回発生してしまう」理由が当てはまることがわかります。

〔グラフの表示内容更新〕を確認すると、表示の更新が行われるプロセスは次のようになっています。
  1. データベースにレコードが追加されると、Controllerクラスに実装されているdbUpdatedメソッドが呼び出される
  2. dbUpdatedメソッドは、更新されたテーブルに対応するSubjectオブジェクトのnotifyObserversメソッドを呼び出す
  3. notifyObserversメソッドは、通知先のViewオブジェクトのnotifyメソッドを呼び出す
  4. notifyメソッドは、画面表示更新メソッドを呼び出す。
設問3で説明した棒グラフViewクラスのように、1つのViewオブジェクトが複数のSubjectオブジェクトの通知先となることがありますから、ほぼ同時に複数のテーブルにレコードが追加された場合、上記1~4の更新プロセスが複数回発生することになります。販売実績の登録で考えれば、1回の販売で販売実績、在庫、販売明細、それぞれのデータが更新されます。このとき販売実績Subjectと販売明細Subjectからそれぞれから、棒グラフViewオブジェクトに通知される(notifyObserversメソッドが呼び出される)ので、画面表示更新メソッドが複数回実行されることになります。これが1回の登録で表示の更新が複数回発生するメカニズムです。

文脈から考えると、空欄fには「複数のSubjectオブジェクトに登録される」や「複数のSubjectオブジェクトの通知先となる」などが当てはまることになります。

f=複数のSubjectオブジェクトに登録される
模範解答

Pagetop