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

問8 情報システム開発

⇱問題PDF
通信販売用Webサイトの設計に関する次の記述を読んで,設問1~3に答えよ。
 P社では,新たな事業展開として,インターネットを用いた通信販売を開始することにした。通信販売のための販売用Webサイトは,新規に開発する。販売用Webサイト及び販売用Webサイト内で用いるショッピングカートに関する説明を次に示す。

〔販売用Webサイト〕
  • インターネットに公開し一般の顧客が買物に利用する。
  • 顧客は,P社から付与される顧客IDでログインしてから買物をする。
  • 顧客は,商品カタログを画面に表示し,ショッピングカートに商品を追加したり,ショッピングカートから商品を削除したりして,購入する商品を選ぶ。
  • 顧客は,商品を選び終わったら,ショッピングカート内の商品の購入手続を行う。
  • 商品には,通常商品と予約販売商品の2種類がある。
  • 通常商品を購入した場合の配送手続では,即座に商品の配送処理が行われる。
  • 予約販売商品を購入した場合の配送手続では,配送のための情報がデータベースに保存され,実際の配送処理は商品の発売開始日以降に行われる。
  • 商品の配送処理は,既存の配送処理システムと連携することによって行う。販売用Webサイトは,購入された商品の情報を配送処理システムに通知する。配送処理システムは,通知された商品の情報をとりまとめて,配送業者に集配依頼の情報を送る。
〔ショッピングカート〕
  • 顧客がショッピングカートに商品を追加すると,追加された商品の在庫数を,追加された数量分だけ減らす。ただし,商品の在庫数が不足している場合は,ショッピングカートに商品を追加せず,在庫数も減らさない。
  • 顧客がショッピングカートから商品を削除すると,削除された商品の在庫数を,削除された数量分だけ増やす。

 販売用Webサイトの開発を行うに当たり,データベース及びショッピングカートの設計を次のように行った。

〔データベースの設計〕
 販売用Webサイトで使用するデータベースには,商品在庫情報テーブル,ショッピングカート情報テーブル及び販売明細テーブルを用意する。
 商品在庫情報テーブルには,商品名や単価などの商品に関する情報と,その在庫数を格納する。商品は,商品IDで一意に識別する。
 ショッピングカート情報テーブルには,ショッピングカートに入っている商品の商品IDと数量を格納する。ショッピングカートは,顧客IDで一意に識別する。
 販売明細テーブルには,顧客が購入した商品の情報を格納する。販売明細は,注文IDと商品IDの複合キーで一意に識別する。注文IDは,購入手続を行ったときに発行されるIDである。
 なお,販売用Webサイトに用いるデータベースでは,トランザクション内でテーブルに対する更新アクセスが発生するとテーブル単位のロックがかかり,トランザクション終了時に,すべてのロックが解除される仕組みになっている。

〔ショッピングカートの設計〕
 ショッピングカートに関連する部分のクラス図を図1に示す。また,顧客がショッピングカートに商品を追加してから,商品を購入するまでの流れを表したアクティビティ図を図2に示す。
 商品クラスと商品在庫管理クラスは,aクラスとして定義する。それをbするcクラスとして,通常商品用と予約販売商品用のクラスを定義する。
 このような設計にすることによって,ショッピングカートクラスでは,商品の種類を意識することなく,すべての商品の情報をdクラスで取り扱うことができる。
 例えば,予約販売商品をショッピングカートに追加する場合は,予約販売商品の商品IDと数量を指定してショッピングカートクラスの商品追加メソッドを実行する。
 商品追加メソッドでは,追加される商品が予約販売商品であることを判定し,予約販売商品在庫管理クラスのインスタンスを作成して在庫取得メソッドを呼び出す。在庫取得メソッドの中では,在庫数についてデータベースの書換えを行った後,eクラスのインスタンスを作成し,dクラスの型で返す。ショッピングカートは,返されたオブジェクトを属性に追加登録する。
 商品の購入手続を行うとき,通常商品と予約販売商品では,処理の大まかな流れは同一だが,配送手続に関する処理が異なる。
 ショッピングカートクラスの購入手続メソッドでは,最初に注文IDを発行する。次に,発行された注文IDを用いて,ショッピングカート内の商品の購入手続メソッドを個々に呼び出す。商品の購入手続メソッドの内部では,販売明細更新メソッドと,配送手続メソッドが順に呼び出される。このとき,販売明細更新メソッドはdクラスに実装されたメソッドが呼び出される。配送手続メソッドは,dクラスでは純粋f関数(a関数)として定義されているので,b先のクラスで実装されたメソッドが呼び出される。
pm08_1.png
pm08_2.png

設問1

本文中のafに入れる適切な字句を答えよ。ただし,ac及びfについては解答群の中から選び,記号で答えよ。
 deについては,図1中にあるクラス名から選び答えよ。
a,b,c,f に関する解答群
  • 依存
  • インタフェース
  • 仮想
  • 具象
  • 継承
  • 再帰
  • 集約
  • スタイルシート
  • 抽象

解答例・解答の要点

a:
b:
c:
d:商品
e:予約販売商品
f:

解説

abcfについて〕
〔販売用Webサイト〕の説明に、
  • 通常商品を購入した場合の配送手続では,即座に商品の配送処理が行われる。
  • 予約販売商品を購入した場合の配送手続では,配送のための情報がデータベースに保存され,実際の配送処理は商品の発売開始日以降に行われる。
とあるように通常商品と予約販売商品では配送手続が異なります。また、ショッピングカートでは、追加された商品に応じて在庫数量を増減させますが、予約販売では在庫がないはずなので、自ずと在庫操作に関して通常商品とは異なる操作が必要となります。

図1のクラス図を見てみると、商品クラスの配送手続メソッド、商品在庫管理クラスの在庫取得メソッドが斜体で書かれていて、凡例には「斜体で書かれた操作名は,操作の書式の定義だけ行われ,実装は行われないことを意味する」と記載されています。このように、複数のクラスが行うべき共通処理があるものの、処理内容が異なる場合は、上位クラスにて関数の型だけを定義しておく「f:仮想」関数を利用します。純粋仮想関数は、仮想関数のうち派生クラスでの実装を強制するものです。
また、商品クラスのクラス名と、商品在庫クラスのクラス名が斜体で書かれていて、凡例に「斜体で書かれたクラス名は,クラス内に,実装が行われない操作を含むことを意味する」と記載されています。このように1つ以上の仮想関数を含むクラスを「a:抽象」クラスといいます。

抽象クラスで定義された仮想関数は、「b:具象」クラスに「c:継承」され、具体的な処理内容が記述されます。

なお、抽象クラスと似た概念にインタフェースがありますが、インタフェースでは処理実装をしたメソッドを含むことができません。商品クラスでは購入手続メソッド、販売明細更新メソッドが、商品在庫管理クラスでは在庫返却メソッドが、共通処理として実装されているため、インタフェースではないことがわかります。

a=ケ:抽象
 b=オ:継承
 c=エ:具象
 f=ウ:仮想

dについて〕
[d]クラスは、(通常/予約)商品在庫管理クラスの在庫取得メソッドから返され、そのオブジェクトはショッピングカートクラスの属性に追加登録されるとあります。ショッピングカートの属性を見ると、オブジェクトである属性は、商品:商品[](商品クラスのリスト)だけですから、在庫取得メソッドが返すクラスは商品クラスであると判断することもできます。このように、商品クラスを抽象クラスとして定義することで、他のクラスでは通常商品と予約販売商品とにかかわらず、「d:商品」クラスとして扱うことができるようになります。

d=商品

eについて〕
[e]のインスタンスは商品クラスとしてショッピングカートクラスに返されますから、[e]は商品クラスまたは商品クラスの派生クラス(具象クラス)でなければなりません。商品クラスの派生クラスは、通常商品クラスおよび予約販売商品クラスです。

クラス図を見ると、予約販売商品在庫管理クラスから予約販売商品クラスに向けて破線の矢印がかかれており、依存関係があることがわかります。依存関係は、あるクラスが別のクラスを使用する関係なので、予約販売商品在庫管理クラスの在庫取得メソッドが作成するのは「e:予約販売商品」クラスのインスタンスであることがわかります。

e=予約販売商品

設問2

図2中のghに入れる適切な字句を答えよ。

解答例・解答の要点

g:ショッピングカート内の商品の購入手続を行う
h:ショッピングカートから商品を削除する

解説

gについて〕
ガード条件[g]を満たした場合に、実行されるアクションは次の2つです。
  1. ショッピングカート情報テーブルから商品の情報を削除する
  2. 販売明細テーブルにレコードを追加する
〔データベースの説明〕に「販売明細テーブルには,顧客が購入した商品の情報を格納する」とあるように、②は商品が購入されたときに発生する処理です。
実行されるアクションと、〔販売用Webサイト〕の「顧客は,商品を選び終わったら,ショッピングカート内の商品の購入手続を行う」という説明の組合せから、[g]には「ショッピングカート内の商品の購入手続を行う」が当てはまることがわかります。

g=ショッピングカート内の商品の購入手続を行う

hについて〕
ガード条件[h]を満たした場合に、実行されるアクションは次の2つです。
  1. ショッピングカート情報テーブルから商品の情報を削除する
  2. 商品在庫情報のテーブルの在庫数を増やす
〔ショッピングカート〕に「顧客がショッピングカートから商品を削除すると,削除された商品の在庫数を,削除された数量分だけ増やす」とあるように、②は商品が削除されたときに発生する処理です。
したがって、[h]には「ショッピングカートから商品を削除する」が当てはまります。

h=ショッピングカートから商品を削除する

設問3

設計レビューを実施したところ,図2のアクティビティ図のとおりにプログラムを書くと,複数人が同時にアクセスしたときに,処理のタイミングによっては問題が発生する可能性があるという指摘が出た。どのような場合に,どのような問題が発生する可能性があるか。45字以内で答えよ。

解答例・解答の要点

商品の追加と削除が同時に行われると,デッドロックが発生することがある (34文字)

解説

〔データベースの設計〕を見ると、「トランザクション内でテーブルに対する更新アクセスが発生するとテーブル単位のロックがかかり,トランザクション終了時に,すべてのロックが解除される仕組みになっている」とあり、更新の際にテーブル単位でのロック行われることがわかります。

上記の説明と、複数のトランザクションの関係を図1に示します。
pm08_3.png
並列で実行される2つのトランザクションT1、T2があり、ロック要求がT1→T2の順で行われるとします。この場合、T1のロック解除、言い換えるとT1のトランザクション終了まで、T2はデータ更新を行うことができません。

これらを踏まえて図2を見ていきましょう。
pm08_4.png
図2は、2つのテーブルA・Bに対して、T1はA→B、T2はB→Aの順でロックを要求する様子を示しています。この場合、T1、T2が同時に行われると、お互いが後続処理のためのロックを獲得することができず、両方のトランザクションが相手のロック解除を待つ状態に陥ってしまいます。これにより、永遠にトランザクションが終了しなくなる状態が「デッドロック」です。

これを意識してアクティビティ図を見てみると、「ショッピングカートに商品を追加する」「ショッピングカートから商品を削除する」アクションについて、
  • 商品追加では、商品在庫情報テーブルの更新 → ショッピングカート情報テーブルの更新
  • 商品削除では、ショッピングカート情報テーブルの更新 → 商品在庫情報テーブルの更新
共通の2つのテーブルに異なる順序で更新処理を行うことがわかります。共有資源に対するロックを掛ける順序が異なるトランザクションが同時に実行されるとデッドロックが発生する可能性があります。例えば、以下のような場合に不具合が生じることになります。
  1. 商品追加トランザクションが、商品在庫情報テーブルをロック
  2. 商品削除トランザクションが、ショッピングカート情報テーブルをロック
  3. 商品追加トランザクションが、ショッピングカート情報テーブルをロックしようとするが、商品削除トランザクションにより使用中のため待ち状態となる
  4. 商品削除トランザクションが、商品在庫情報テーブルをロックしようとするが、商品追加トランザクションにより使用中のため待ち状態となる
  5. デッドロックの発生
どのような場合に、どのような問題が発生するかを問われているため、「商品の追加と削除が同時に行われると,デッドロックが発生することがある」旨の解答が適切となります。

∴商品の追加と削除が同時に行われると,デッドロックが発生することがある
模範解答

Pagetop