Eラーニングプラットフォーム
CoddyのC#ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 68/70。
チャレンジ
簡単コース、学生、受講登録を管理する e ラーニングプラットフォームを構築しましょう!このチャレンジでは、クラス、継承、インターフェース、カプセル化、そしてクリーンなアーキテクチャの中で連携するサービスなど、これまでに学んだ OOP のすべてを統合します。
コードは以下の 5 つのファイルに整理して作成します:
Lesson.cs:ELearning.Models名前空間にLessonクラスを作成します。各レッスンは、コンストラクタを通じて設定される読み取り専用プロパティとしてTitle(string) とDurationMinutes(int) を持ちます。Course.cs:ELearning.Models名前空間にCourseクラスを作成します。コースは読み取り専用のId(string)、Title(string)、Instructor(string) プロパティに加え、Lessonsリストを持ちます。AddLesson(Lesson lesson)メソッドと、すべてのレッスンの所要時間の合計を計算する読み取り専用のTotalDurationプロパティを含めてください。Student.cs:ELearning.Models名前空間に、読み取り専用のId(int) とName(string) プロパティを持つStudentクラスを作成します。学生は、コース ID と完了したレッスン数をマッピングするプライベートな辞書(dictionary)を使用して進捗を追跡します。進捗をインクリメントするCompleteLesson(string courseId)メソッドと、完了したレッスン数を返す(受講していない場合は 0 を返す)GetProgress(string courseId)メソッドを含めてください。EnrollmentService.cs:ELearning.Services名前空間にEnrollmentServiceクラスを作成します。このサービスは、プライベートなコレクションを使用してコースと受講登録を管理します。以下を実装してください:AddCourse(Course course)- プラットフォームにコースを追加しますEnroll(Student student, string courseId)- 登録に成功した場合はtrue、コースが存在しないか学生が既に登録済みの場合はfalseを返しますGetEnrolledCourses(Student student)- 学生が登録しているコース ID のリストを返しますGetCourse(string courseId)- コースを返すか、見つからない場合はnullを返します
Program.cs: レッスンを含むコースの作成、学生の登録、進捗の追跡、入力に基づいた結果の表示を行い、すべてを統合します。
以下の入力が与えられます:
- 作成するコースの数
- 各コースについて:ID、タイトル、講師、レッスン数。その後、各レッスンについて:タイトルと所要時間(分)
- 学生 ID と名前
- 実行する操作の数
- 各操作について:アクション(
enroll、complete、progress、またはinfo)に続いてコース ID
出力形式:
enroll:Enrolled in: {CourseTitle}またはEnrollment failed: {courseId}と出力しますcomplete:Completed lesson in {CourseTitle}と出力します(進捗を 1 増やします)progress:{CourseTitle}: {completed}/{total} lessonsと出力しますinfo:{CourseTitle} by {Instructor} - {TotalDuration} minutesと出力します
例えば、入力が以下の場合:
2
CS101
Intro to Programming
Dr. Smith
3
Variables
30
Loops
45
Functions
60
CS102
Data Structures
Dr. Jones
2
Arrays
40
Lists
50
1
Alice
6
enroll
CS101
info
CS101
complete
CS101
complete
CS101
progress
CS101
enroll
CS999出力は以下のようになります:
Enrolled in: Intro to Programming
Intro to Programming by Dr. Smith - 135 minutes
Completed lesson in Intro to Programming
Completed lesson in Intro to Programming
Intro to Programming: 2/3 lessons
Enrollment failed: CS999サービスが学生とコースの関係を管理し、各クラスがそれぞれの責任をどのように果たしているかに注目してください。学生は自身の進捗を追跡し、コースは自身の合計時間を計算し、受講登録サービスがすべてを調整します。これは「関心の分離(Separation of Concerns)」が実現されたクリーンな設計です!
自分で試してみよう
using System;
using System.Collections.Generic;
using ELearning.Models;
using ELearning.Services;
class Program
{
public static void Main(string[] args)
{
// コースの数を読み込む
int numCourses = Convert.ToInt32(Console.ReadLine());
// TODO: EnrollmentService インスタンスを作成する
// TODO: 各コースとそのレッスンを読み込んで作成する
// 各コースについて:ID、タイトル、講師、レッスン数を読み込む
// 各レッスンについて:タイトルと時間を読み込む
// レッスンをコースに追加し、その後コースをサービスに追加する
// 受講生情報を読み込む
int studentId = Convert.ToInt32(Console.ReadLine());
string studentName = Console.ReadLine();
// TODO: Student インスタンスを作成する
// 操作の数を読み込む
int numOperations = Convert.ToInt32(Console.ReadLine());
// TODO: 各操作を処理する
// 各操作について:アクションと courseId を読み込む
// 処理:enroll、complete、progress、info
// アクションに基づいて適切なメッセージを出力する
}
}