2024年 春期 応用情報技術者試験 問8

ダッシュボードの設計

Y社は、食品などを販売する店舗を経営する企業である。複数ある店舗では、商品の販売状況や在庫状況に合わせて、割引率を設定したり、店舗間で在庫の移動を行ったりしている。販売に関する情報は販売管理システムで管理しているが、状況をリアルタイムで監視するには不向きであった。そこで、販売状況をリアルタイムで監視できるシステム(以下、ダッシュボードという)を開発することにした。

Y社では、商品ごとに商品分類を設定し、売上金額や販売数の集計に利用している。Y社が扱う情報のデータモデル(抜粋)を図1に、ダッシュボードのイメージ(一部)を図2に示す。

開発者からの注記: int, string等はmermaidの仕様上ついていますが、本来の図にはありませんので無視してください
図2 ダッシュボードのイメージ(一部)

販売状況や在庫状況はデータベースで管理する。データベースに新たな販売実績が追加されたり、在庫数が更新されたりすると、その内容がダッシュボードに即時反映され、最新の情報が表示される。

Y社は、ダッシュボードの開発をZ社に依頼し、Z社はその設計に取り掛かった。

【ダッシュボードのクラスの設計】

Z社は、ダッシュボードのクラスの設計を行った。設計したクラス図を図3に、表示できるグラフの種類を表1に、主なクラスの説明を表2に示す。Controllerクラスは、システム全体の挙動を制御するクラスである。Viewクラスは、画面にグラフを表示する機能をもつクラスである。グラフには複数の種類があるので、その種類ごとに、Viewクラスをaしたクラスを作成する。Subjectクラスは、データベースが更新されたことをViewクラスのオブジェクトに通知するクラスである。図1のデータモデル中のテーブルのうち、ダッシュボードで監視したい情報に関するテーブルのそれぞれについて、Subjectクラスをaしたクラスを作成する。以下、Viewクラス、Subjectクラスをaしたクラスのオブジェクトを、それぞれViewオブジェクト、Subjectオブジェクトという。

図3 クラス図
表1 表示できるグラフの種類
種類グラフの構成要素説明
棒グラフ横軸の項目、集計対象の項目、分類横軸の項目について、任意の値の範囲で区切り、集計対象の項目の値を縦軸で表現する。縦軸の値は、分類ごとに色分けし、それらを積み上げて表示する。
円グラフ集計対象の項目、分類集計対象の項目について、分類ごとに集計して、その割合を扇形の面積で表現する。扇形は分類ごとに色分けして表示する。
折れ線グラフ横軸の項目、集計対象の項目、分類横軸の項目について、任意の値の範囲で区切り、集計対象の項目の値の推移を折れ線で表現する。折れ線は分類ごとに分けて表示する。
表2 主なクラスの説明
クラス説明
Controllerプログラムの流れを制御するクラス。データベースが更新されたときに、更新されたテーブル名の配列を引数にして、dbUpdatedメソッドを呼び出す。
DAOデータベースにアクセスするためのクラス。
Subjectデータの更新をViewオブジェクトに通知するクラス。通知先は、addObserverメソッドで登録されている全てのViewオブジェクトのnotifyメソッドを呼び出す。notifyObserversメソッドは、登録されている全てのViewオブジェクトのnotifyメソッドを呼び出す。Viewクラスの画面表示更新メソッドは、対象に関する集計を行い、画面の表示を更新する。
Viewダッシュボードに一つのグラフを表示するクラス。グラフの軸や集計対象の項目の情報を、集計項目オブジェクトの配列として保持している。notifyメソッドは、画面表示更新メソッドを呼び出す。画面表示更新メソッドは、対象に関する集計を行い、画面を更新する。
集計処理グラフを表示する際に必要となる、各種集計の処理を実装したクラス。

【グラフの新規表示】

例えば、"時間帯ごと商品分類ごとの売上金額"のグラフを新たに画面上に表示する場合を考える。グラフの種類は棒グラフなので、棒グラフ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メソッドでは画面表示更新メソッドを呼び出すのではなく、"更新フラグ"を立てるようにした。また、"更新フラグ"を立てる処理とは別に、定期的に画面表示更新メソッドを呼び出す仕組みを用意し、"更新フラグ"が立っている場合だけ画面の更新処理を実行してから"更新フラグ"を降ろすようにした。

出典:令和6年度 春期 応用情報技術者試験 午後 問8