要件定義書2
ソースコードが5,000行程度のPythonプロジェクト(Webアプリや管理ツール)を想定した、標準的なディレクトリ構成とスタブ(枠組み)を作成しました。
この規模になると、1つのファイルにすべてを書くのではなく、 役割ごとにファイルを分割する「モジュール化」 が必須になります。
1. ディレクトリ構成(Django/Flask等のWeb構成例)¶
5,000行規模の場合、メンテナンス性を考慮して以下のような構成にするのが一般的です。
Text Only
inventory_system/
├── app/
│ ├── __init__.py
│ ├── models/ # データベースの定義 (SQLAlchemyなど)
│ │ ├── __init__.py
│ │ ├── item.py
│ │ └── user.py
│ ├── routes/ # API・画面遷移のエンドポイント
│ │ ├── __init__.py
│ │ ├── auth.py
│ │ └── inventory.py
│ ├── services/ # ビジネスロジック(ここがコードの主役)
│ │ ├── __init__.py
│ │ └── loan_logic.py
│ └── utils/ # 共通関数(メール送信、ログなど)
│ └── notifier.py
├── tests/ # テストコード
├── config.py # 設定ファイル
├── main.py # 実行エントリーポイント
└── requirements.txt # 依存ライブラリ一覧
2. 主要な関数のスタブ例¶
ビジネスロジックの中核となる services/loan_logic.py の例です。5,000行規模のシステムでは、こうした「条件分岐や計算」を含む関数が数十個積み重なっていきます。
Python
# services/loan_logic.py
def check_availability(item_id: int, start_date: str, end_date: str) -> bool:
"""
指定された期間に備品が予約可能かどうかを判定する。
Args:
item_id: 備品ID
start_date: 開始日
end_date: 終了日
Returns:
bool: 予約可能ならTrue
"""
# 1. データベースから該当備品の予約一覧を取得
# 2. 期間の重複チェックロジック(ここが複雑になる)
# 3. 在庫ステータスの確認
pass
def process_loan_request(user_id: int, item_id: int, period: dict):
"""
貸出申請の処理を行う。
"""
# 1. check_availabilityを呼び出し
# 2. 承認ワークフローのステータス更新
# 3. ユーザーへ申請完了通知(notifier.pyを使用)
pass
def calculate_late_fees(loan_id: int) -> int:
"""
返却遅延によるペナルティ料金を計算する(ロジックの例)。
"""
# 1. 返却予定日と現在日付の差分を計算
# 2. 備品カテゴリごとの料率を適用
pass
3. なぜこれで5,000行になるのか?¶
「関数の中身が pass なのに、どうやって5,000行も行くの?」と疑問に思うかもしれません。実際の開発では、以下の要素でコード量が増えていきます。
- バリデーション(20%): 入力された値が正しいか(日付が過去じゃないか、文字数は適切かなど)のチェック。
- エラーハンドリング(20%): データベース接続失敗、ネットワークエラー、予期せぬ入力への対策。
- テストコード(30%):
tests/フォルダ内のコード。5,000行のうち1,500行程度はテストコードであるのが理想的です。 - HTML/CSS/JS(30%): Webアプリの場合、フロントエンドのコードも合算するとすぐに数千行に達します。
次のステップへの提案¶
この構成をベースに、**「特定の機能(例えば、CSVインポート機能やメール通知機能)」の具体的な実装コード**を1つ作成してみましょうか?
あるいは、**データベースのテーブル定義(SQL/SQLAlchemy)**の具体例をご覧になりますか?