Eラーニングプラットフォーム
CoddyのGDScriptジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 62/65。
チャレンジ
難しい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オンラインコンパイラ