منصة التعليم الإلكتروني
جزء من قسم Object Oriented Programming في رحلة C# على Coddy — الدرس 68 من 70.
التحدي
سهللنقم ببناء منصة تعليم إلكتروني تدير الدورات التدريبية، والطلاب، وعمليات التسجيل! يجمع هذا التحدي كل ما تعلمته عن البرمجة كائنية التوجه (OOP) - الفئات (classes)، والوراثة (inheritance)، والواجهات (interfaces)، والتغليف (encapsulation)، والخدمات التي تعمل معاً في بنية نظيفة.
ستقوم بتنظيم الكود الخاص بك عبر خمسة ملفات:
Lesson.cs: أنشئ فئةLessonفي مساحة الأسماءELearning.Models. لكل درسTitle(string) وDurationMinutes(int) كخصائص للقراءة فقط يتم تعيينها من خلال منشئ الفئة (constructor).Course.cs: أنشئ فئةCourseفي مساحة الأسماءELearning.Models. للدورة التدريبية خصائص للقراءة فقط هيId(string)، وTitle(string)، وInstructor(string)، بالإضافة إلى قائمةLessons. قم بتضمين طريقةAddLesson(Lesson lesson)وخاصية للقراءة فقطTotalDurationتحسب مجموع مدد جميع الدروس.Student.cs: أنشئ فئةStudentفي مساحة الأسماءELearning.Modelsمع خصائص للقراءة فقطId(int) وName(string). يتتبع الطلاب تقدمهم من خلال قاموس خاص (private dictionary) يربط معرفات الدورات (course IDs) بعدد الدروس المكتملة. قم بتضمين الطرقCompleteLesson(string courseId)لزيادة التقدم وGetProgress(string courseId)لإرجاع عدد الدروس المكتملة (أو 0 إذا لم يكن مسجلاً).EnrollmentService.cs: أنشئ فئةEnrollmentServiceفي مساحة الأسماءELearning.Services. تدير هذه الخدمة الدورات والتسجيلات باستخدام مجموعات خاصة (private collections). قم بتنفيذ ما يلي:AddCourse(Course course)- يضيف دورة تدريبية إلى المنصةEnroll(Student student, string courseId)- يرجعtrueإذا نجح التسجيل، وfalseإذا كانت الدورة غير موجودة أو كان الطالب مسجلاً بالفعلGetEnrolledCourses(Student student)- يرجع قائمة بمعرفات الدورات التي سجل فيها الطالبGetCourse(string courseId)- يرجع الدورة التدريبية أوnullإذا لم يتم العثور عليها
Program.cs: اجمع كل شيء معاً عن طريق إنشاء دورات تدريبية مع دروس، وتسجيل الطلاب، وتتبع التقدم، وعرض النتائج بناءً على المدخلات.
ستتلقى المدخلات التالية:
- عدد الدورات التدريبية المراد إنشاؤها
- لكل دورة: المعرف (ID)، العنوان، المحاضر، عدد الدروس، ثم لكل درس: العنوان والمدة (بالدقائق)
- معرف الطالب واسمه
- عدد العمليات المراد تنفيذها
- لكل عملية: الإجراء (
enroll، أوcomplete، أوprogress، أوinfo) متبوعاً بمعرف الدورة (course ID)
تنسيقات المخرجات:
enroll: اطبعEnrolled in: {CourseTitle}أوEnrollment failed: {courseId}complete: اطبعCompleted lesson in {CourseTitle}(زيادة التقدم بمقدار 1)progress: اطبع{CourseTitle}: {completed}/{total} lessonsinfo: اطبع{CourseTitle} by {Instructor} - {TotalDuration} minutes
على سبيل المثال، إذا كانت المدخلات هي:
2
CS101
Intro to Programming
Dr. Smith
3
Variables
30
Loops
45
Functions
60
CS102
Data Structures
Dr. Jones
2
Arrays
40
Lists
50
1
Alice
6
enroll
CS101
info
CS101
complete
CS101
complete
CS101
progress
CS101
enroll
CS999يجب أن تكون المخرجات:
Enrolled in: Intro to Programming
Intro to Programming by Dr. Smith - 135 minutes
Completed lesson in Intro to Programming
Completed lesson in Intro to Programming
Intro to Programming: 2/3 lessons
Enrollment failed: CS999لاحظ كيف تدير الخدمة العلاقة بين الطلاب والدورات، بينما تتعامل كل فئة مع مسؤولياتها الخاصة. يتتبع الطالب تقدمه الخاص، وتحسب الدورات مدتها الإجمالية، وتنسق خدمة التسجيل كل شيء - فصل نظيف للمسؤوليات (separation of concerns)!
جرّب بنفسك
using System;
using System.Collections.Generic;
using ELearning.Models;
using ELearning.Services;
class Program
{
public static void Main(string[] args)
{
// قراءة عدد الدورات
int numCourses = Convert.ToInt32(Console.ReadLine());
// TODO: إنشاء مثيل من EnrollmentService
// TODO: قراءة وإنشاء كل دورة مع دروسها
// لكل دورة: قراءة ID، والعنوان، والمدرس، وعدد الدروس
// لكل درس: قراءة العنوان والمدة
// إضافة الدروس إلى الدورة، ثم إضافة الدورة إلى الخدمة
// قراءة معلومات الطالب
int studentId = Convert.ToInt32(Console.ReadLine());
string studentName = Console.ReadLine();
// TODO: إنشاء مثيل من Student
// قراءة عدد العمليات
int numOperations = Convert.ToInt32(Console.ReadLine());
// TODO: معالجة كل عملية
// لكل عملية: قراءة الإجراء و courseId
// التعامل مع: enroll، و complete، و progress، و info
// إخراج الرسالة المناسبة بناءً على الإجراء
}
}
جميع دروس Object Oriented Programming
1أساسيات OOP
الملفات الخارجيةNamespaces والتوجيهاتمقدمة في Classes و Objectsالكلمة المفتاحية 'this'Methods والمعاملاتFields مقابل PropertiesConstructorsObject Initializersمراجعة - آلة حاسبة بسيطة4الوراثة
صيغة الوراثة الأساسية (:)الكلمة المفتاحية 'base'الكلمات المفتاحية Virtual و Overrideالأصناف المختومة (Sealed Classes)الفئة الأساسية 'object'مراجعة - هيكلية الموظفين7ميزات متقدمة
تحميل العوامل (Operator Overloading)المفهرسات (Indexers (this[]))إعادة تعريف ()ToStringدوال التوسعة (Extension Methods)ملخص - Custom List2الخصائص والأعضاء الساكنة (Static Members)
الخصائص المطبقة تلقائيًا (Auto-Implemented Properties)خصائص القراءة فقط والكتابة فقطالحقول والدوال الساكنة (Static)الفئات الساكنة (Static Classes)الأعضاء ذات البنية التعبيرية (Expression-Bodied Members)5تعدد الأشكال والواجهات (Polymorphism & Interfaces)
تعدد الأشكال: وقت التجميع مقابل وقت التشغيلالواجهة مقابل الفئة المجردة (Abstract Class)الواجهات المتعددةالواجهات الصريحةUpcasting و Downcastingملخص - حاسبة الأشكال8مفاهيم البرمجة كائنية التوجه (OOP) المتقدمة
التركيب بدلاً من الوراثةالـ Generics (الأصناف والدوال)الـ Delegates والأحداثالـ Attributes والـ Reflectionواجهة IDisposable وجملة usingأساسيات Dependency Injection