Платформа для онлайн-обучения
Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy — урок 68 из 70.
Задание
ЛегкоДавайте создадим платформу электронного обучения, которая управляет курсами, студентами и записями на обучение! Эта задача объединяет все, что вы узнали об ООП — классы, наследование, интерфейсы, инкапсуляцию и сервисы, работающие вместе в чистой архитектуре.
Вы организуете свой код в пяти файлах:
Lesson.cs: Создайте классLessonв пространстве именELearning.Models. Каждый урок имеет свойства только для чтенияTitle(string) иDurationMinutes(int), устанавливаемые через конструктор.Course.cs: Создайте классCourseв пространстве именELearning.Models. Курс имеет свойства только для чтенияId(string),Title(string) иInstructor(string), а также списокLessons. Включите методAddLesson(Lesson lesson)и свойство только для чтенияTotalDuration, которое вычисляет сумму длительностей всех уроков.Student.cs: Создайте классStudentв пространстве именELearning.Modelsсо свойствами только для чтенияId(int) иName(string). Студенты отслеживают свой прогресс через приватный словарь, который сопоставляет ID курсов с количеством пройденных уроков. Включите методыCompleteLesson(string courseId)для увеличения прогресса иGetProgress(string courseId)для возврата количества пройденных уроков (или 0, если студент не записан на курс).EnrollmentService.cs: Создайте классEnrollmentServiceв пространстве именELearning.Services. Этот сервис управляет курсами и записями, используя приватные коллекции. Реализуйте: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} lessonsinfo: Вывести{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Обратите внимание, как сервис управляет отношениями между студентами и курсами, в то время как каждый класс отвечает за свои собственные задачи. Студент отслеживает свой собственный прогресс, курсы вычисляют свою общую длительность, а сервис записи координирует все — чистое разделение ответственности!
Попробуйте сами
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
// Вывести соответствующее сообщение в зависимости от действия
}
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыПространства имен и директивыВведение в классы и объектыКлючевое слово 'this'Методы и параметрыПоля и свойстваКонструкторыИнициализаторы объектовИтоги — Простой калькулятор4Наследование
Основы синтаксиса наследования (:)Ключевое слово 'base'Ключевые слова Virtual и OverrideЗапечатанные классыБазовый класс 'object'Итоги — Иерархия сотрудников7Продвинутые возможности
Перегрузка операторовИндексаторы (this[])Переопределение ToString()Методы расширенияПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПотокобезопасный SingletonПаттерн FactoryПаттерн Observer (События)Паттерн Strategy13Финальные испытания
Платформа для онлайн-обученияКомпонент игрового персонажаСервис аренды транспорта2Свойства и статические члены
Автоматически реализуемые свойстваСвойства только для чтения и записиСтатические поля и методыСтатические классыЧлены в виде выражений5Полиморфизм и интерфейсы
Полиморфизм: компиляция vs выполнениеИнтерфейс vs абстрактный классМножественные интерфейсыЯвные интерфейсыUpcasting и DowncastingИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция вместо наследованияGenerics (классы и методы)Делегаты и событияАтрибуты и рефлексияIDisposable и оператор usingОсновы Dependency Injection11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Архитектура классов
Экземплярные и статические данныеКлючевые слова 'readonly' и 'const'Опорные поляПовторение — Менеджер банковских счетов6Инкапсуляция
Модификаторы доступаСвойства для инкапсуляцииРеализация скрытия данныхПаттерны неизменяемостиИтоги — Записи студентов9Переменное количество аргументов
Ключевое слово 'params'Необязательные параметрыИменованные аргументыПерегрузка методов