Menu
CoddyTech

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

CoddyのGDScriptジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 62/65。

challenge icon

チャレンジ

難しい

eラーニングプラットフォームのクラスを作成しましょう。コース、学生、講師を扱います。学生と講師はどちらも人なので、親クラスを共有します。

オブジェクト同士が互いを参照してはいけません。コースには学生のメールアドレスと講師の名前を保存し、学生と講師にはコースのタイトルを保存します。コースを必要とするメソッドには、引数としてコースを渡します。

person.gdのPerson:コンストラクターはperson_nameとemailを受け取り、それらを保存します。_to_string()はNAME (EMAIL)を返します。

course.gdのCourse:

  • プロパティ:title、max_capacity、instructor_name(初期値は"")、およびArray[String]型のstudent_emailsとcompleted_emails。
  • コンストラクターはタイトルと定員を受け取ります。定員の既定値は30です。
  • course_full(title: String)シグナル。add_student()が最後の空席を埋めたときに発行されます。
  • add_student(email) -> bool:コースが満員の場合、またはそのメールアドレスの学生がすでに登録されている場合はfalseを返します。それ以外の場合はメールアドレスを追加してtrueを返します。
  • remove_student(email) -> bool:現在登録されている学生を削除します。そのメールアドレスの学生が登録されていない場合はfalseを返します。
  • mark_completed(email) -> bool:現在登録されている学生をcompleted_emailsに移します。そのメールアドレスの学生が現在登録されていない場合はfalseを返します。
  • assign_instructor(instructor) -> bool:講師の名前を保存します。コースにすでに講師がいる場合はfalseを返します。
  • _to_string()はTITLE: N/CAPACITY students, M completed, instructor: NAMEを返します。講師がいない場合はnoneを使います。

student.gdのStudentはPersonを継承し、コンストラクターはそのまま使います。タイトルを格納する2つのArray[String]、enrolledとcompletedを持ちます。

  • enroll(course: Course) -> bool:コースがすでにenrolledまたはcompletedにある場合、あるいはcourse.add_student()が拒否した場合はfalseを返します。それ以外の場合はタイトルを追加してtrueを返します。
  • unenroll(course: Course) -> bool:登録済みのコースに対してのみ実行します。コースから学生を削除し、enrolledからタイトルを削除します。
  • complete_course(course: Course) -> bool:登録済みのコースに対してのみ実行します。course.mark_completed()を呼び出し、タイトルをenrolledからcompletedに移します。
  • _to_string()はStudent 、Personのテキスト、続けて: N enrolled, M completedを返します。

instructor.gdのInstructorはPersonを継承します。コンストラクターはperson_name、email、expertiseを受け取り、Array[String]型のcourse_titlesを保持します。

  • assign_to_course(course: Course) -> bool:自分の名前を指定してcourse.assign_instructor()を呼び出します。成功した場合はタイトルを追加してtrueを返します。
  • _to_string()はInstructor 、Personのテキスト、, EXPERTISE: 、および, で結合したタイトルを返します。タイトルがない場合はno coursesを返します。

用意されたコードは、フィールドが|で区切られたコマンドを読み込み、course_fullに接続してCourse full: TITLEを出力します。次の入力の場合:

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

出力は次のとおりです:

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

コードはperson.gd、course.gd、student.gd、instructor.gdに記述します。main.gdには用意された入出力コードが含まれており、編集できません。

自分で試してみよう

extends Node

func _ready():
	# 提供された入出力コード:そのままにしてください

	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()

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

自分で練習してみよう: GDScriptオンラインコンパイラ