Nền tảng học trực tuyến
Thuộc phần Lập trình hướng đối tượng trong hành trình C# của Coddy. Bài học 68 trên 70.
Thử thách
DễHãy cùng xây dựng một nền tảng học trực tuyến quản lý các khóa học, học viên và việc đăng ký! Thử thách này kết hợp mọi điều bạn đã học về lập trình hướng đối tượng (OOP): lớp, kế thừa, giao diện, tính đóng gói và các dịch vụ phối hợp với nhau trong một kiến trúc rõ ràng.
Bạn sẽ sắp xếp code trong năm tệp:
Lesson.cs: Tạo lớpLessontrong không gian tênELearning.Models. Mỗi bài học có thuộc tính chỉ đọcTitle(string) vàDurationMinutes(int), được thiết lập thông qua hàm khởi tạo.Course.cs: Tạo lớpCoursetrong không gian tênELearning.Models. Một khóa học có các thuộc tính chỉ đọcId(string),Title(string) vàInstructor(string), cùng với danh sáchLessons. Thêm phương thứcAddLesson(Lesson lesson)và thuộc tính chỉ đọcTotalDurationđể tính tổng thời lượng của tất cả bài học.Student.cs: Tạo lớpStudenttrong không gian tênELearning.Models, với các thuộc tính chỉ đọcId(int) vàName(string). Học viên theo dõi tiến độ của mình bằng một từ điển riêng tư, ánh xạ ID khóa học sang số bài học đã hoàn thành. Thêm các phương thứcCompleteLesson(string courseId)để tăng tiến độ vàGetProgress(string courseId)để trả về số bài học đã hoàn thành (hoặc 0 nếu chưa đăng ký).EnrollmentService.cs: Tạo lớpEnrollmentServicetrong không gian tênELearning.Services. Dịch vụ này quản lý khóa học và việc đăng ký bằng các tập hợp riêng tư. Triển khai:AddCourse(Course course): thêm khóa học vào nền tảngEnroll(Student student, string courseId): trả vềtruenếu đăng ký thành công,falsenếu khóa học không tồn tại hoặc học viên đã đăng kýGetEnrolledCourses(Student student): trả về danh sách ID của các khóa học mà học viên đã đăng kýGetCourse(string courseId): trả về khóa học hoặcnullnếu không tìm thấy
Program.cs: Kết hợp mọi thứ bằng cách tạo khóa học kèm bài học, đăng ký học viên, theo dõi tiến độ và hiển thị kết quả dựa trên đầu vào.
Bạn sẽ nhận các đầu vào sau:
- Số khóa học cần tạo
- Với mỗi khóa học: ID, tiêu đề, giảng viên, số bài học, sau đó với mỗi bài học: tiêu đề và thời lượng (phút)
- ID và tên học viên
- Số thao tác cần thực hiện
- Với mỗi thao tác: hành động (
enroll,complete,progresshoặcinfo), theo sau là ID khóa học
Định dạng đầu ra:
enroll: In raEnrolled in: {CourseTitle}hoặcEnrollment failed: {courseId}complete: In raCompleted lesson in {CourseTitle}(tăng tiến độ thêm 1)progress: In ra{CourseTitle}: {completed}/{total} lessonsinfo: In ra{CourseTitle} by {Instructor} - {TotalDuration} minutes
Ví dụ, nếu đầu vào là:
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Đầu ra sẽ là:
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: CS999Lưu ý cách dịch vụ quản lý mối quan hệ giữa học viên và khóa học, trong khi mỗi lớp đảm nhận trách nhiệm riêng. Học viên tự theo dõi tiến độ, khóa học tính tổng thời lượng, còn dịch vụ đăng ký điều phối mọi thứ: đó là sự phân tách trách nhiệm rõ ràng!
Tự làm thử
using System;
using System.Collections.Generic;
using ELearning.Models;
using ELearning.Services;
class Program
{
public static void Main(string[] args)
{
// Đọc số lượng khóa học
int numCourses = Convert.ToInt32(Console.ReadLine());
// TODO: Tạo một instance của EnrollmentService
// TODO: Đọc dữ liệu và tạo từng khóa học cùng các bài học
// Với mỗi khóa học: đọc ID, tiêu đề, giảng viên và số lượng bài học
// Với mỗi bài học: đọc tiêu đề và thời lượng
// Thêm các bài học vào khóa học, rồi thêm khóa học vào dịch vụ
// Đọc thông tin học viên
int studentId = Convert.ToInt32(Console.ReadLine());
string studentName = Console.ReadLine();
// TODO: Tạo một instance của Student
// Đọc số lượng thao tác
int numOperations = Convert.ToInt32(Console.ReadLine());
// TODO: Xử lý từng thao tác
// Với mỗi thao tác: đọc hành động và courseId
// Xử lý: enroll, complete, progress, info
// In ra thông báo phù hợp với thao tác
}
}
Tất cả bài học trong Lập trình hướng đối tượng
1Các khái niệm cơ bản về lập trình hướng đối tượng
Tệp bên ngoàiKhông gian tên và chỉ thịGiới thiệu về lớp và đối tượngTừ khóa thisPhương thức và tham sốTrường và thuộc tínhHàm khởi tạoKhởi tạo đối tượngÔn tập: Máy tính đơn giản4Kế thừa
Cú pháp kế thừa cơ bản (:)Từ khóa 'base'Từ khóa virtual và overrideLớp sealedLớp cơ sở 'object'Ôn tập: hệ phân cấp nhân viên7Tính năng nâng cao
Nạp chồng toán tửBộ lập chỉ mục (this[])Ghi đè ToString()Phương thức mở rộngÔn tập: Danh sách tùy chỉnh10Các mẫu thiết kế phần 1
Giới thiệu về mẫu thiết kếSingleton an toàn với luồngMẫu FactoryMẫu Observer (sự kiện)Mẫu Strategy13Thử thách cuối
Nền tảng học trực tuyếnThành phần nhân vật trong trò chơiDịch vụ cho thuê phương tiện2Thuộc tính và thành viên tĩnh
Thuộc tính tự độngThuộc tính chỉ đọc hoặc chỉ ghiTrường và phương thức tĩnhLớp tĩnhThành viên có thân biểu thức5Đa hình và interface
Đa hình lúc biên dịch và lúc chạyInterface và lớp trừu tượngNhiều interfaceInterface tường minhUpcasting và downcastingÔn tập: bộ tính toán hình học8Các khái niệm OOP nâng cao
Ưu tiên composition hơn kế thừaGenerics (lớp và phương thức)Delegate và sự kiệnAttribute và reflectionGiao diện IDisposable và câu lệnh usingKiến thức cơ bản về dependency injection11Các mẫu thiết kế phần 2
Mẫu lệnhMẫu bộ chuyển đổiMẫu trang tríMẫu phương thức khuôn mẫuMẫu trạng tháiMẫu tổ hợpTự luyện tập: Trình biên dịch C# online