منصة للتعلّم الإلكتروني
جزء من قسم البرمجة كائنية التوجّه في رحلة GDScript على Coddy. الدرس 62 من 65.
التحدي
صعبأنشئ أصناف منصة للتعلّم الإلكتروني: المقررات والطلاب والمدرّسون. الطلاب والمدرّسون أشخاص، لذا يشتركون في صنف أب.
يجب ألا تشير الكائنات إلى بعضها بعضًا: يخزّن المقرر عناوين البريد الإلكتروني لطلابه واسم مدرّسه، ويخزّن الطلاب والمدرّسون عناوين المقررات. تتلقى أي دالة تحتاج إلى مقرر هذا المقرر كوسيط.
Person في person.gd: يتلقى المُنشئ person_name وemail ويخزّنهما. تُرجع _to_string() القيمة NAME (EMAIL).
Course في course.gd:
- الخصائص:
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 في student.gd يرث من Person ويحتفظ بمنشئه. لديه مصفوفتان من النوع Array[String] للعناوين، هما enrolled وcompleted:
enroll(course: Course) -> bool: تُرجعfalseعندما يكون المقرر موجودًا بالفعل فيenrolledأوcompleted، أو عندما ترفضcourse.add_student()؛ وإلا فتضيف العنوان وتُرجع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 في instructor.gd يرث من 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()
جميع دروس البرمجة كائنية التوجّه
1أساسيات البرمجة كائنية التوجه
الملفات الخارجيةمقدمة إلى البرمجة كائنية التوجهالفئات مقابل الكائناتالكلمة المفتاحية selfالأساليبالخصائصالمُنشئ (_init)مراجعة - آلة حاسبة بسيطة4تعدد الأشكال
إعادة النظر في تجاوز الأساليبكتابة الأنواع بأسلوب البطةالفئات والأساليب المجرّدةتصميم الواجهاتمراجعة - حاسبة الأشكال10أنماط التصميم، الجزء الثاني
نمط الأوامرنمط المحوّلنمط المُزيّننمط الطريقة القالبيةنمط الحالةالنمط المركّب2خصائص الأصناف
متغيرات الكائن مقابل المتغيرات الساكنةالدوال الساكنةمُعيِّنات الخصائصمُسترجِعات الخصائصخاص وفقًا للاتفاقيةمراجعة - مدير الحسابات البنكية5التغليف
الأعضاء العامة والخاصةالتحقق من الصحة باستخدام دوال الضبطإخفاء المعلوماتالخصائص للقراءة فقطمراجعة - نظام سجلات الطلاب8مفاهيم متقدمة في البرمجة كائنية التوجه
التركيب مقابل الوراثةالأصناف الداخليةالعُقد كمكوّناتRefCounted مقابل Nodeالتعدادات في الأصنافتدرّب بنفسك: مترجم GDScript عبر الإنترنت