no message

This commit is contained in:
a-kizaki
2026-10-22 08:48:13 +09:00
commit f81638a7b3
13 changed files with 934 additions and 0 deletions

102
Readme.md Normal file
View File

@@ -0,0 +1,102 @@
# 社員メンテナンスシステム 演習課題
## はじめに(演習の⽬的と取り組み⽅)
当演習は、講義で学んだことを⾃⼒で実践できるようになるために実施します。 そのために以下の内容を守って演習に取り組んでください。
### 納品物、納期を守りましょう
この演習は、実際の仕事を想定した内容です。
提出物の内容と提出期限は必ず守ってください。
作業が間に合わない、提出物に問題が出そうな場合は、**必ずルールにしたがって適切な相⼿に相談してください**。
### 適切な⼿順で開発しましょう
プログラムを書き始める前に、**README.md** や**仕様書**(配布されている場合) を必ず読んでください。
「**何を作るのか**」、「**どこまで作ればよいのか**」を理解してから作業を始めてください。
### 知らないことは⾃分で調べましょう
この演習には、**講義で扱っていない内容が⼀部含まれています**。
その場合は、インターネットなどで⾃分で調べながら進めてください。
調べることも、エンジニアにとって⼤切なスキルの⼀つです。
## 演習目的
**継承**
- 共通処理(CSVの読み書き)は、BaseAccess という抽象クラスにまとめています。
**インタフェース**
- DataAccessInterface によって、EmployeeAccess クラスは必ず getAll(), add(), update(), delete() を実装することが保証されます。
**カプセル化**
- バリデーションロジック(`validateEmployeeData()`)やデータ変換ロジック(`convertRowToEmployee()`)をprivateメソッドとして隠蔽し、外部から直接アクセスできないようにしています。
- プロパティ(`$file`)はprotectedで定義し、継承クラスからのみアクセス可能にしています。
- これにより、クラスの内部実装の詳細を隠し、外部からは公開されたメソッドのみを使用する設計になっています。
**例外処理**
- ファイル操作やデータ検証でエラーが発生した場合、適切な例外(`InvalidArgumentException`、`RuntimeException`)をスローします。
- controller.phpでは、これらの例外をキャッチしてユーザーに分かりやすいエラーメッセージを表示します。
これにより、同じ処理を複数のクラスに記述せずに再利用できる設計のメリットと、
将来的に DB 連携版や部署 CRUD への拡張が容易になる点を体感してもらいます。
## フォルダ構成
project/
├─ database/
│ ├─ abstracts/
│ │ └─ BaseAccess.php // CSV共通処理の抽象クラス
│ ├─ interfaces/
│ │ └─ DataAccessInterface.php // CRUD操作のインタフェース
│ |─ employees/
│ | └─ EmployeeAccess.php // 社員のCSV操作を実装したクラス
├─ EmployeeData.csv // 社員情報のCSVファイル
│─ public/
│ ├─ controller.php // 各画面からの指示を処理するファイル
│ ├─ employee_list.php // 社員一覧表示画面
│ ├─ employee_register.php // 社員登録画面
│ ├─ employee_update.php // 社員更新画面
│ └─ index.php // ホーム画面(各機能へのリンクあり)
## 課題内容
**database/employees/EmployeeAccess.php** の TODOコメントに従って、各メソッド(add, update, delete)を完成させてください。
- **getAll() メソッドは実装済み**なので、参考にしてください。
- TODOコメントが実装のヒントになっています。
- 各メソッドの詳細な仕様は後述の「各メソッド説明」を確認してください。
### 利用可能なメソッド
- `$this->readData()`: CSVから全データを読み込む(BaseAccessから継承)
- `$this->writeData($data)`: CSVにデータを書き込む(BaseAccessから継承)
- `$this->generateId($rows)`: 新しいIDを生成(privateメソッド)
- `$this->validateEmployeeData($data)`: データバリデーション(privateメソッド)
- `$this->convertRowToEmployee($row)`: CSV行を連想配列に変換(privateメソッド)
**困ったときは `ヒント.txt` を参照してください。**
## 各メソッド説明
- **getAll()** (実装済み)
全社員情報を取得して連想配列の配列で返す。
- **add($data)**
新規社員を登録する。IDは自動生成。
$data = ['name' => '田中五郎', 'email' => 'tanaka@example.com']
- **update($id, $data)**
指定IDの社員情報を更新する。
IDが存在しない場合は `RuntimeException` をスロー。
- **delete($id)**
指定IDの社員を削除する。
IDが存在しない場合は `RuntimeException` をスロー。
## カプセル化のポイント
- **privateメソッド**: `validateEmployeeData()`, `convertRowToEmployee()`, `generateId()` は内部処理のためprivateで定義されています。
- **protectedプロパティ**: `$file` は継承クラスからのみアクセス可能なprotectedで定義されています。
- **publicメソッド**: 外部から呼び出す必要があるメソッドのみがpublicで定義されています。
## 例外処理のポイント
- **InvalidArgumentException**: 入力データが不正な場合(必須項目が空、メールアドレス形式が不正など)
- **RuntimeException**: ファイル操作やデータ操作に失敗した場合(ファイルが開けない、IDが見つからないなど)
- controller.phpでは、これらの例外をキャッチしてユーザーに分かりやすいエラーメッセージを表示します。