teacher asking a question to the class
Photo by Max Fischer on Pexels.com

【授業レポート】システム開発(2年) 第37週目

〜ユースケース結合:DAO・サービス・UIを実際に「つなぐ」〜

第37週目は、前回までに設計・実装した DAO層 → Service層 → UI層 を一本のユースケースとして結合し、
アプリが実際に動く姿”を作る実践的な回でした。

本格的なアプリの形が見え始め、各班から歓声やため息(バグ…!)が入り混じる、熱量の高い授業となりました。


■ 先生の導入:「設計が正しいかどうかは“つないで動かして”初めて分かる」

田中先生:「個々の部品(DAO・サービス)が正しくても、つないだら動かないことはよくあります。今日は“インテグレーション(結合)”の練習です。」

ポイントは3つ:

  • 境界が正しく情報を受け渡すか
  • 責務分離が破綻していないか
  • 例外やエラーがどこで止まり、どこで処理されるか

■ 実習①:ユースケースを再確認(フロー図→コード)

各班はまず、宿題で作成した「主要ユースケース」のフロー図を提示。

例:図書館システム「本の貸出」ユースケース

  1. UI → “借りたい本ID”を入力
  2. Service → “貸出可能か”チェック
  3. DAO → loans に新規レコードをINSERT
  4. DAO → books の is_available を false に更新
  5. Service → 結果をUI向けメッセージに変換
  6. 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. 班の**主要ユースケース1つの結合テストレポート(成功例/失敗例)**を提出
  2. UI → Service → DAO の**呼び出し順序(簡易シーケンス図)**を作成
  3. 今日出たバグのうち “根本原因” と “再発防止案” を各2つずつ書く

■ 来週の予告:例外処理・エラーハンドリング強化回

次週は結合で露呈した問題点を踏まえ、
エラーハンドリング/入力バリデーション/例外設計 を体系的に学ぶ回になります。


第37週目は、アプリが“動く”姿に初めて近づいた節目の授業でした。
生徒たちは設計と実装のつながりを深く理解し、次の改善ステップへ向けて確かな成長を見せました。

投稿者 greeden

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)