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 GDScript của Coddy. Bài học 62 trên 65.

challenge icon

Thử thách

Khó

Xây dựng các lớp cho một nền tảng học trực tuyến: khóa học, học viên và giảng viên. Học viên và giảng viên đều là người, vì vậy họ dùng chung một lớp cha.

Các đối tượng không được tham chiếu đến nhau: một khóa học lưu email của học viên và tên của giảng viên, còn học viên và giảng viên lưu tiêu đề khóa học. Phương thức nào cần một khóa học thì nhận khóa học đó làm đối số.

Person trong person.gd: hàm khởi tạo nhận person_name và email, rồi lưu chúng. _to_string() trả về NAME (EMAIL).

Course trong course.gd:

  • Thuộc tính: title, max_capacity, instructor_name (ban đầu là ""), cùng hai mảng Array[String] student_emails và completed_emails.
  • Hàm khởi tạo nhận tiêu đề và sức chứa, mặc định là 30.
  • Tín hiệu course_full(title: String), do add_student() phát ra khi học viên chiếm chỗ trống cuối cùng.
  • add_student(email) -> bool: trả về false khi khóa học đã đủ chỗ hoặc email đã thuộc về một học viên; nếu không thì thêm email và trả về true.
  • remove_student(email) -> bool: xóa một học viên hiện tại, trả về false nếu email không thuộc về học viên nào.
  • mark_completed(email) -> bool: chuyển một học viên hiện tại vào completed_emails, trả về false nếu email không thuộc về học viên hiện tại.
  • assign_instructor(instructor) -> bool: lưu tên giảng viên, hoặc trả về false nếu khóa học đã có giảng viên.
  • _to_string() trả về TITLE: N/CAPACITY students, M completed, instructor: NAME, dùng none nếu không có giảng viên.

Student trong student.gd kế thừa Person và giữ nguyên hàm khởi tạo. Lớp này có hai mảng tiêu đề Array[String], enrolled và completed:

  • enroll(course: Course) -> bool: trả về false nếu khóa học đã có trong enrolled hoặc completed, hoặc nếu course.add_student() từ chối; nếu không thì thêm tiêu đề và trả về true.
  • unenroll(course: Course) -> bool: chỉ áp dụng với khóa học đã đăng ký; xóa học viên khỏi khóa học và xóa tiêu đề khỏi enrolled.
  • complete_course(course: Course) -> bool: chỉ áp dụng với khóa học đã đăng ký; gọi course.mark_completed() và chuyển tiêu đề từ enrolled sang completed.
  • _to_string() trả về Student , văn bản của Person, rồi đến : N enrolled, M completed.

Instructor trong instructor.gd kế thừa Person. Hàm khởi tạo nhận person_name, email và expertise, đồng thời lớp này lưu một mảng Array[String] course_titles:

  • assign_to_course(course: Course) -> bool: gọi course.assign_instructor() với tên của mình; nếu thành công thì thêm tiêu đề và trả về true.
  • _to_string() trả về Instructor , văn bản của Person, , EXPERTISE: và các tiêu đề được nối bằng , , hoặc no courses.

Code được cung cấp đọc các lệnh có các trường phân tách bằng | và kết nối với course_full để in ra Course full: TITLE. Với đầu vào sau:

course Python 101|2
course Data Science
student Ana|ana@mail.com
student Ben|ben@mail.com
instructor Grace Hopper|grace@mail.com|Compilers
enroll ana@mail.com|Python 101
enroll ben@mail.com|Python 101
enroll ben@mail.com|Data Science
assign grace@mail.com|Python 101
report

đầu ra là:

Enroll Ana in Python 101: true
Course full: Python 101
Enroll Ben in Python 101: true
Enroll Ben in Data Science: true
Assign Grace Hopper to Python 101: true
Python 101: 2/2 students, 0 completed, instructor: Grace Hopper
Data Science: 1/30 students, 0 completed, instructor: none
Student Ana (ana@mail.com): 1 enrolled, 0 completed
Student Ben (ben@mail.com): 2 enrolled, 0 completed
Instructor Grace Hopper (grace@mail.com), Compilers: Python 101

Đặt code của bạn trong person.gd, course.gd, student.gd và instructor.gd. main.gd chứa code đầu vào/đầu ra được cung cấp và không thể chỉnh sửa.

Tự làm thử

extends Node

func _ready():
	# Đoạn code đầu vào/đầu ra đã cho: giữ nguyên

	var courses := {}
	var people := {}

	var line := OS.read_string_from_stdin()
	while line != "":
		var parts := line.split(" ", true, 1)
		var f: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
		match parts[0]:
			"course":
				var course: Course
				if f.size() > 1:
					course = Course.new(f[0], int(f[1]))
				else:
					course = Course.new(f[0])
				course.course_full.connect(func(title): print("Course full: ", title))
				courses[f[0]] = course
			"student":
				people[f[1]] = Student.new(f[0], f[1])
			"instructor":
				people[f[1]] = Instructor.new(f[0], f[1], f[2])
			"enroll":
				var ok: bool = people[f[0]].enroll(courses[f[1]])
				print("Enroll ", people[f[0]].person_name, " in ", f[1], ": ", ok)
			"unenroll":
				var ok: bool = people[f[0]].unenroll(courses[f[1]])
				print("Unenroll ", people[f[0]].person_name, " from ", f[1], ": ", ok)
			"complete":
				var ok: bool = people[f[0]].complete_course(courses[f[1]])
				print(people[f[0]].person_name, " completes ", f[1], ": ", ok)
			"assign":
				var ok: bool = people[f[0]].assign_to_course(courses[f[1]])
				print("Assign ", people[f[0]].person_name, " to ", f[1], ": ", ok)
			"report":
				for title in courses:
					print(courses[title])
				for email in people:
					print(people[email])

		line = OS.read_string_from_stdin()

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 GDScript online