【授業レポート】システム開発(2年) 第37週目
〜ユースケース結合:DAO・サービス・UIを実際に「つなぐ」〜
第37週目は、前回までに設計・実装した DAO層 → Service層 → UI層 を一本のユースケースとして結合し、
“アプリが実際に動く姿”を作る実践的な回でした。
本格的なアプリの形が見え始め、各班から歓声やため息(バグ…!)が入り混じる、熱量の高い授業となりました。
■ 先生の導入:「設計が正しいかどうかは“つないで動かして”初めて分かる」
田中先生:「個々の部品(DAO・サービス)が正しくても、つないだら動かないことはよくあります。今日は“インテグレーション(結合)”の練習です。」
ポイントは3つ:
- 境界が正しく情報を受け渡すか
- 責務分離が破綻していないか
- 例外やエラーがどこで止まり、どこで処理されるか
■ 実習①:ユースケースを再確認(フロー図→コード)
各班はまず、宿題で作成した「主要ユースケース」のフロー図を提示。
例:図書館システム「本の貸出」ユースケース
- UI → “借りたい本ID”を入力
- Service → “貸出可能か”チェック
- DAO → loans に新規レコードをINSERT
- DAO → books の is_available を false に更新
- Service → 結果をUI向けメッセージに変換
- UI → ユーザーへ結果を表示
田中先生は
「フロー図を片手に実装するのがプロ」
と強調し、全員が図を机の上に広げてコーディングを開始しました。
■ 実習②:UI層(CLI/Web)との接続
どの UI にするかは班ごとに選択
- CLI(メニュー型)
- Web(簡易Flask/学習用HTTPフレームワーク)
- チャット型UI(テキスト対話で操作)
実装例(CLIの抜粋:学習用)
print("=== 本の貸出 ===")
book_id = input("Book ID: ")
try:
message = book_service.borrow(book_id)
print("[SUCCESS]", message)
except Exception as e:
print("[ERROR]", e)
生徒A:「UIまでつなぐと、一気に“アプリ作ってる感”が出て楽しい!」
■ 実習③:サービス層のロジックを実装
ユースケースごとにロジックを作り込み。
例:BooksService.borrow()(擬似コード)
def borrow(self, book_id):
book = self.books_dao.get(book_id)
if not book:
raise ValueError("本が存在しません")
if not book.is_available:
raise ValueError("貸出不可:すでに貸出中です")
self.loans_dao.create(member_id=self.current_user, book_id=book_id)
self.books_dao.update_status(book_id, available=False)
return f"{book.title} を貸し出しました"
生徒の気づき:
- DAO と Service の責務がきれいに分かれていると読みやすい
- UI向けの文言はサービス層で統一すると整う
- 例外が出る場所を意識するとバグが減る
■ 実習④:結合テスト(Integration Test)大会
今日一番盛り上がったのがこの時間。
班同士でアプリを交換し、以下のテストを実行:
- 正常系
- 本を借りる
- 本を返す
- 検索して結果が表示される
- 異常系
- 存在しない本ID
- 貸出中の本を再度借りようとする
- フォームに文字列 instead of 数字
- DB整合性のエラー(あえて発生させる)
生徒B:「借りる → 返す → 借りるの連続テストで在庫がズレた…原因はDAOのコミット忘れだった!」
生徒C:「UIではエラーを優しく伝えてるのに、サービス層からの例外がそのまま出てきてしまった…」
こうした気づきこそ、結合の価値。
■ 実習⑤:ログの整備とデバッグ体験
インテグレーションで必ず問題が出るため、先生は次の方針を提示:
- 例外は必ずログへ書く(UIには見せない)
- 成功ログにも“何を、誰が、いつ”を残す
- サービス層では “ログ→例外→UI向けメッセージ” の順で整える
ログを活かしたバグ発見も多数発生。
生徒D:「ログを読んだら、DAOの引数順序ミスだと一瞬で分かった!」
生徒E:「例外を握りつぶすと本当にバグが見つからないと実感した…」
■ 先生のひとこと
「部品の完成と、アプリが“動く”ことは別問題です。
今日のように“つないで動かす”ことで、本当の設計力・調整力が身につきます。
エラーは成長の宝です。怖がらずに、拾って、直しましょう。」
■ 宿題(次回の実装フェーズに向けて)
- 班の**主要ユースケース1つの結合テストレポート(成功例/失敗例)**を提出
- UI → Service → DAO の**呼び出し順序(簡易シーケンス図)**を作成
- 今日出たバグのうち “根本原因” と “再発防止案” を各2つずつ書く
■ 来週の予告:例外処理・エラーハンドリング強化回
次週は結合で露呈した問題点を踏まえ、
エラーハンドリング/入力バリデーション/例外設計 を体系的に学ぶ回になります。
第37週目は、アプリが“動く”姿に初めて近づいた節目の授業でした。
生徒たちは設計と実装のつながりを深く理解し、次の改善ステップへ向けて確かな成長を見せました。
