スパイラル2では、スパイラル1で実装した機能に加えて、ユーザ関係の機能を追加しよう。
SP2のユースケースは以下の7つである。
- 管理ユーザは入力欄に必要事項を記入し「登録」ボタンを押す。
- 登録ボタンが押されたことがユーザ制御パネルに通知される。
- ユーザ制御パネルは入力情報を取り出し、ユーザ管理者に渡し登録を依頼する。
- ユーザ管理者はデータベース管理者に新規ユーザ情報を渡し登録を依頼する。
- データベース管理者はデータベースに新規ユーザを登録する。
- ユーザ管理者はユーザリストを更新する。
- 管理ユーザはユーザリストのユーザをクリックする。
- クリックされたことがユーザ制御パネルに通知される。
- ユーザ制御パネルはリスト内の情報を取り出し、入力欄に設定する。
- 選択されたユーザの背景色が変わる。もし以前に選択されていたユーザがあれば、その背景色は元に戻る。
- 管理ユーザは選択されているユーザの情報を変更し「修正」ボタンを押す。
- 修正ボタンが押されたことがユーザ制御パネルに通知される。
- ユーザ制御パネルは入力情報を取り出し、ユーザ管理者に渡し修正を依頼する。
- ユーザ管理者はデータベース管理者に既存のユーザ情報を渡し修正を依頼する。
- データベース管理者はデータベースのユーザ情報を修正する。
- ユーザ管理者はユーザリストを更新する。
- 管理ユーザは「削除」ボタンを押す。
- 削除ボタンが押されたことがユーザ制御パネルに通知される。
- ユーザ制御パネルはユーザ管理者に削除するユーザのIDを渡し削除を依頼する。
- ユーザ管理者はデータベース管理者にユーザIDを渡し削除を依頼する。
- データベース管理者は渡されたユーザIDのユーザを削除する。
- ユーザ管理者はユーザリストを更新する。
- 管理ユーザは管理画面を開く。
- ユーザ管理者はデータベース管理者にユーザリストを要求する。
- データベース管理者はデータベースからユーザリストを取り出しユーザ管理者に渡す。
- ユーザ管理者はユーザリストを更新する。
- ユーザが年と月と会議室を入力して表示ボタンを押す。
- 表示ボタンが押されたことが制御パネルに通知される。
- 制御パネルは、年と月と会議室名を取り出して、その情報をシステム管理者に通知する。
- システム管理者は、年と月と会議室の情報をデータベース管理者に渡して、予約リストの取り出しを依頼する。
- データベース管理者は、指定された年月と会議室の予約リストをデータベースから取り出しシステム管理者に渡す。
- システム管理者は予約リストをカレンダー管理者に渡して、表示の更新を依頼する。
- カレンダー管理者がカレンダーを更新する。
- ユーザが会議室予約システムのページを開く。
- 制御パネルはデータベース管理者に会議室リストを要求する。
- データベース管理者はデータベースに問い合わせて会議室リストを得て、制御パネルに渡す。
- 制御パネルは会議室のドロップダウンメニューを更新する。
- 制御パネルは現在の年と月の値をテキストボックスに設定する。
- 制御パネルは、現在の年と月と“全会議室”を使ってシステム管理者にカレンダーの更新を依頼する。→ここから先は予約の閲覧と同様。
本来の開発ならば、すべてのユースケースについてシナリオを書くべきである。 シナリオはオブジェクト抽出の基本であるから。
しかし、ここではシナリオとユースケース記述がほぼ同じになることから、シナリオの記述は省略する。
以下の6つのオブジェクトを抽出した。
シーケンス図のオブジェクト間のメッセージやり取りの関係からクラスの関係を導くと以下のようになる。
なお、ここではオブジェクトとクラスは一致している。
クラス名を以下のように英語表記に変更した。
詳細シーケンス図は以下のようになる。
最後の仕様変更に伴い、DBManager.setSymCp()は廃止される。
詳細シーケンス図から詳細クラス図を作成すると次のようになる。
<?php
/**
* パラメータ:
* year : 年
* month : 月
* room : 会議室名
*/
$year = $_POST['year'];
$month = $_POST['month'];
$room = $_POST['room'];
$next_year = $year;
$next_month = $month + 1;
if ($next_month == 13) {
$next_year = $year + 1;
$next_month = 1;
}
$q = "select
v.id,r.name as room,v.start_dt,v.end_dt,u.name as user,v.last_modified
from
reservations v inner join users u on v.user_id=u.id
inner join rooms r on v.room_id=r.id
where
start_dt >= :start_dt and end_dt < :end_dt";
if ($room != "全会議室") {
$q = $q . " and r.name = :room;";
} else {
$q = $q . ";";
}
try {
$pdo = new PDO("mysql:host=mysql514.db.sakura.ne.jp; dbname=forcreate_fuchida; charset=utf8", "forcreate", "junior2015");
$s = $pdo->prepare($q);
if ($room != "全会議室") {
$sa = array(':start_dt' => "$year/$month/1",
':end_dt' => "$next_year/$next_month/1",
':room' => "$room");
} else {
$sa = array(':start_dt' => "$year/$month/1",
':end_dt' => "$next_year/$next_month/1");
}
$s->execute($sa);
//$arr = array('q' => $q, 'y' => $year, 'm' => $month, 'r' => $room, 'sa' => $sa);
//print json_encode($arr);
print json_encode($s->fetchAll());
} catch (PDOException $e) {
print json_encode(array("msg" => $e->getMessage()));
}
$pdo = null;
<?php
try {
$pdo = new PDO("mysql:host=mysql514.db.sakura.ne.jp; dbname=forcreate_fuchida; charset=utf8", "forcreate", "junior2015");
$q="select name from rooms";
$s=$pdo->prepare($q);
$s->execute();
print json_encode($s->fetchAll());
} catch (PDOException $e) {
print json_encode(array("msg" => $e->getMessage()));
}
$pdo = null;