Menu
Coddy logo textTech

Eラーニングプラットフォーム

CoddyのC#ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 68/70。

challenge icon

チャレンジ

簡単

コース、学生、受講登録を管理する 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 と名前
  • 実行する操作の数
  • 各操作について:アクション(enrollcompleteprogress、または 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
        // アクションに基づいて適切なメッセージを出力する
    }
}

オブジェクト指向プログラミングのすべてのレッスン