Eラーニングプラットフォーム
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 88/91。
チャレンジ
簡単コース、学生、講師を管理するEラーニングプラットフォームを構築しましょう。この包括的なチャレンジでは、継承、インターフェース、カプセル化、およびデザインパターンを1つのまとまりのあるシステムに統合します。
コードは以下の6つのファイルに分けて構成します:
User.php— 学生と講師の両方のベースとなる抽象クラスUserを作成します。id(int) とname(string) にはコンストラクタのプロパティ昇格(constructor promotion)を使用し、両方を public readonly にします。子クラスが実装しなければならない抽象メソッドgetRole(): stringを含めてください。Student.php— User ファイルをインクルードします。Userを継承したStudentクラスを作成します。学生は、登録したコースを private 配列で追跡し、各コースの進捗状況(完了パーセンテージ)も管理します。以下を実装してください:getRole(): string—"Student"を返しますenrollInCourse(Course $course): string— コースに空きがある場合に学生を登録し、成功または失敗のメッセージを返しますgetEnrolledCourses(): array— 登録済みコースの配列を返しますupdateProgress(string $courseTitle, int $percent): void— コースの進捗状況(0-100)を設定しますgetProgress(string $courseTitle): int— 進捗パーセンテージを返します。登録されていない場合は 0 を返します
Instructor.php— User ファイルをインクルードします。Userを継承したInstructorクラスを作成します。講師はコースを作成し管理できます。以下を実装してください:getRole(): string—"Instructor"を返しますcreateCourse(string $title, int $capacity): Course— この講師が割り当てられた新しい Course を作成して返します
Course.php— Instructor ファイルをインクルードします。title(string, public readonly)、instructor(Instructor, public readonly)、およびcapacity(int, private) をコンストラクタのプロパティ昇格で持つCourseクラスを作成します。登録された学生を private 配列で追跡します。以下を実装してください:getCapacity(): int— 最大定員を返しますgetEnrolledCount(): int— 現在の登録者数を返しますhasCapacity(): bool— さらに学生が登録できる場合は true を返しますaddStudent(Student $student): bool— 定員に余裕がある場合に学生を追加し、成功ステータスを返しますgetStudents(): array— 登録されている学生の配列を返します
Platform.php— Course と Student ファイルをインクルードします。システム全体を管理するPlatformクラスを作成します。コースとユーザーを private 配列に保存します。以下を実装してください:addCourse(Course $course): void— プラットフォームにコースを追加しますfindCourse(string $title): ?Course— タイトルでコースを検索しますenrollStudent(Student $student, string $courseTitle): string— 学生をコースに登録します。"Course not found"、"Course is full"、または"[name] enrolled in [title]"を返しますgetCourseStats(string $title): string—"[title]: [enrolled]/[capacity] students"または"Course not found"を返します
main.php— Platform ファイルをインクルードします。講師データ (JSON)、作成するコース (JSON)、および実行する操作 (JSON) の3つの入力を受け取ります。講師の JSON 形式:
{"id": 1, "name": "Dr. Smith"}コースの JSON 形式:
[{"title": "PHP Basics", "capacity": 2}, {"title": "OOP Mastery", "capacity": 3}]操作の JSON 形式:
[{"type": "enroll", "student_id": 1, "student_name": "Alice", "course": "PHP Basics"}, {"type": "progress", "student_id": 1, "course": "PHP Basics", "percent": 50}, {"type": "stats", "course": "PHP Basics"}]プラットフォーム、講師、およびすべてのコースを作成します(講師の
createCourseメソッドを使用)。コースをプラットフォームに追加します。その後、各操作を処理します:"enroll"— 新しい Student を作成して登録し、enrollStudent()からの結果を出力します"progress"— 学生の進捗を更新し、"[name] progress in [course]: [percent]%"を出力します"stats"—getCourseStats()からの結果を出力します
後で進捗を更新できるように、作成した学生を ID で追跡してください。各操作の結果を新しい行に出力します。
このチャレンジは、継承がいかにクリーンなユーザー階層を作成するか、カプセル化がいかに登録データを保護するか、そしてプラットフォームがコース、学生、講師の間の関係を管理するコーディネーターとしていかに機能するかを示しています。
自分で試してみよう
<?php
require_once 'Platform.php';
// 入力を読み込む
$instructorData = (array)json_decode(trim(fgets(STDIN)), true);
$coursesData = (array)json_decode(trim(fgets(STDIN)), true);
$operations = (array)json_decode(trim(fgets(STDIN)), true);
// TODO: プラットフォームを作成する
// TODO: instructorData から講師を作成する
// TODO: 講師の createCourse メソッドを使用してすべてのコースを作成し、
// プラットフォームに追加する
// TODO: 作成された学生を ID で管理する
$students = [];
// TODO: 各操作を処理する
foreach ($operations as $op) {
$operation = (array)$op;
// TODO: "enroll" 操作を処理する
// 新しい学生を作成して登録する
// enrollStudent() の結果を出力する
// TODO: "progress" 操作を処理する
// 学生の進捗を更新する
// "[name] progress in [course]: [percent]%" を出力する
// TODO: "stats" 操作を処理する
// getCourseStats() の結果を出力する
}
?>