Menu
CoddyTech

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 Java của Coddy. Bài học 84 trên 87.

Chào mừng bạn đến với chương thử thách cuối cùng! Các thử thách này giúp kiểm tra mức độ thành thạo của bạn về tất cả các khái niệm lập trình hướng đối tượng (OOP) đã học trong khóa học này.

Trong thử thách này, bạn sẽ xây dựng một hệ thống Nền tảng học trực tuyến, kết hợp tính kế thừa, giao diện, tính đa hình, tính đóng gói và các mẫu thiết kế thành một ứng dụng thống nhất.

Nền tảng của bạn nên mô hình hóa mối quan hệ giữa các khóa học, học viên và giảng viên. Hãy nghĩ về cách lớp cơ sở User có thể được mở rộng thành các lớp Student và Instructor, cách các khóa học chứa bài học và cách theo dõi việc đăng ký giữa học viên với khóa học.

Hãy xem xét những nguyên lý OOP nào phù hợp: dùng tính đóng gói để bảo vệ dữ liệu người dùng, tính kế thừa để chia sẻ hành vi chung, giao diện để định nghĩa các hợp đồng như Enrollable hoặc Completable, và tính đa hình để xử lý thống nhất các kiểu người dùng khác nhau.

Chúc bạn vận dụng tốt mọi điều đã học!

challenge icon

Thử thách

Dễ

Hãy cùng xây dựng một nền tảng học trực tuyến, kết hợp tất cả các khái niệm OOP bạn đã nắm vững trong khóa học này! Bạn sẽ tạo một hệ thống mô hình hóa mối quan hệ giữa khóa học, học viên và giảng viên bằng cách sử dụng kế thừa (inheritance), giao diện, đa hình và tính đóng gói.

Bạn sẽ sắp xếp code trong sáu tệp:

  • Enrollable.java: Tạo một giao diện xác định hợp đồng cho các thao tác đăng ký. Giao diện này cần khai báo phương thức enroll(Student student) trả về giá trị boolean và phương thức getEnrolledCount() trả về giá trị int.
  • User.java: Tạo một lớp cơ sở trừu tượng đại diện cho mọi người dùng trên nền tảng. Thêm các trường riêng tư cho id (String) và name (String), một hàm khởi tạo khởi tạo cả hai trường, các hàm getter phù hợp và một phương thức trừu tượng getRole() trả về chuỗi mô tả vai trò của người dùng.
  • Student.java: Tạo một lớp kế thừa User. Thêm một ArrayList riêng tư để theo dõi ID các khóa học đã đăng ký. Tạo hàm khởi tạo gọi hàm khởi tạo của lớp cha, triển khai getRole() để trả về "Student", rồi thêm các phương thức addCourse(String courseId) và getEnrolledCourseCount(). Ghi đè toString() để trả về "Student: [name] ([enrolledCount] courses)".
  • Instructor.java: Tạo một lớp kế thừa User. Thêm một trường riêng tư cho specialty (String). Tạo hàm khởi tạo nhận id, name và specialty, triển khai getRole() để trả về "Instructor", thêm hàm getter cho specialty và ghi đè toString() để trả về "Instructor: [name] - [specialty]".
  • Course.java: Tạo một lớp triển khai Enrollable. Thêm các trường riêng tư cho courseId (String), title (String), instructor (Instructor) và một ArrayList chứa các học viên đã đăng ký. Hàm khởi tạo nhận courseId, title và instructor. Triển khai enroll(Student student) để thêm học viên vào danh sách, gọi phương thức addCourse() của học viên với ID của khóa học này, rồi trả về true. Triển khai getEnrolledCount(). Thêm phương thức getDetails() trả về ID khóa học nằm trong dấu ngoặc vuông, tiếp theo là tiêu đề và tên giảng viên, theo cấu trúc "[" + courseId + "] " + title + " by " + instructorName.
  • Main.java: Xây dựng nền tảng của bạn! Bạn sẽ nhận một chuỗi lệnh phân tách bằng dấu phẩy:
    • ADD_INSTRUCTOR:id:name:specialty
    • ADD_STUDENT:id:name
    • ADD_COURSE:courseId:title:instructorId
    • ENROLL:studentId:courseId
    • INFO:userId

    Quản lý các tập hợp giảng viên, học viên và khóa học. Xử lý từng lệnh rồi in ra:

    • ADD_INSTRUCTOR: Instructor added: [name]
    • ADD_STUDENT: Student added: [name]
    • ADD_COURSE: Course added: [title]
    • ENROLL: [studentName] enrolled in [courseTitle]
    • INFO: In đầu ra toString() của người dùng

    Sau khi xử lý tất cả lệnh, in --- Platform Summary ---, tiếp theo là thông tin chi tiết và số lượt đăng ký của từng khóa học theo định dạng [courseDetails] - [count] student(s).

Bạn sẽ nhận một đầu vào: chuỗi lệnh được phân tách bằng dấu phẩy.

Ví dụ, với đầu vào ADD_INSTRUCTOR:I001:Dr. Smith:Java,ADD_STUDENT:S001:Alice,ADD_STUDENT:S002:Bob,ADD_COURSE:C001:OOP Fundamentals:I001,ENROLL:S001:C001,ENROLL:S002:C001,INFO:S001,INFO:I001, đầu ra sẽ là:

Instructor added: Dr. Smith
Student added: Alice
Student added: Bob
Course added: OOP Fundamentals
Alice enrolled in OOP Fundamentals
Bob enrolled in OOP Fundamentals
Student: Alice (1 courses)
Instructor: Dr. Smith - Java
--- Platform Summary ---
[C001] OOP Fundamentals by Dr. Smith - 2 student(s)

Thử thách này kết hợp kế thừa (hệ thống phân cấp User), giao diện (Enrollable), tính đa hình (các kiểu người dùng khác nhau với cách triển khai toString riêng) và tính đóng gói (các trường riêng tư với quyền truy cập được kiểm soát) thành một hệ thống thống nhất!

Tự làm thử

import java.util.Scanner;
import java.util.HashMap;
import java.util.ArrayList;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        
        // TODO: Tạo các tập hợp để lưu giảng viên, học viên và khóa học (course)
        // Gợi ý: Dùng HashMap với id làm khóa (key) để dễ tra cứu
        
        // TODO: Tách đầu vào (input) bằng dấu phẩy để lấy từng lệnh (command)
        
        // TODO: Xử lý từng lệnh:
        // - ADD_INSTRUCTOR:id:name:specialty -> Tạo giảng viên, thêm vào tập hợp, in ra (print) "Instructor added: [name]"
        // - ADD_STUDENT:id:name -> Tạo học viên, thêm vào tập hợp, in ra "Student added: [name]"
        // - ADD_COURSE:courseId:title:instructorId -> Tạo khóa học có giảng viên, thêm vào tập hợp, in ra "Course added: [title]"
        // - ENROLL:studentId:courseId -> Ghi danh học viên vào khóa học, in ra "[studentName] enrolled in [courseTitle]"
        // - INFO:userId -> Tìm người dùng (học viên hoặc giảng viên) và in ra kết quả từ toString()
        
        // TODO: Sau khi xử lý tất cả lệnh, in ra "--- Platform Summary ---"
        
        // TODO: Với mỗi khóa học, in ra "[courseDetails] - [count] student(s)"
    }
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Java online