פלטפורמת למידה מקוונת
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 84 מתוך 87.
ברוכים הבאים לפרק האתגרים הסופיים! האתגרים האלה נועדו לבחון את השליטה שלכם בכל מושגי ה-OOP שלמדתם לאורך הקורס הזה.
באתגר הזה תבנה מערכת פלטפורמת למידה מקוונת שמשלבת הורשה, ממשקים, פולימורפיזם, כימוס ותבניות עיצוב לכדי יישום אחיד.
הפלטפורמה שלך צריכה למדל את הקשרים בין קורסים, תלמידים ומדריכים. חשוב על האופן שבו מחלקת הבסיס User יכולה להיות מורחבת באמצעות המחלקות Student ו-Instructor, איך קורסים מכילים שיעורים ואיך מעקב אחר הרשמה פועל בין תלמידים לקורסים.
שקלו אילו עקרונות OOP מתאימים: השתמשו בכימוס כדי להגן על נתוני המשתמשים, בהורשה כדי לשתף התנהגות משותפת, בממשקים כדי להגדיר חוזים כמו Enrollable או Completable, ובפולימורפיזם כדי לטפל בסוגי משתמשים שונים באופן אחיד.
בהצלחה ביישום כל מה שלמדת!
אתגר
קלבואו נבנה פלטפורמת למידה מקוונת שמאגדת את כל מושגי ה-OOP שלמדת במהלך הקורס הזה! תיצור מערכת שמדגמת את הקשרים בין קורסים, תלמידים ומדריכים באמצעות ירושה, ממשקים, פולימורפיזם ואנקפסולציה.
תארגן את הקוד שלך בשישה קבצים:
Enrollable.java: צור ממשק שמגדיר את החוזה לפעולות הרשמה. יש להצהיר בו על המתודותenroll(Student student)שמחזירה ערך בוליאני, ועלgetEnrolledCount()שמחזירה int.User.java: צור מחלקת בסיס מופשטת שמייצגת כל משתמש בפלטפורמה. כלול שדות פרטיים עבורid(String) ו-name(String), בנאי שמאתחל את שניהם, getters מתאימים, ומתודה מופשטתgetRole()שמחזירה String המתאר את תפקיד המשתמש.Student.java: צור מחלקה שיורשת מ-User. הוסף ArrayList פרטי למעקב אחר מזהי הקורסים שאליהם התלמיד רשום. כלול בנאי שקורא לבנאי של מחלקת האב, ממש אתgetRole()כך שתחזיר"Student", והוסף את המתודותaddCourse(String courseId)ו-getEnrolledCourseCount(). דרוס אתtoString()כך שתחזיר"Student: [name] ([enrolledCount] courses)".Instructor.java: צור מחלקה שיורשת מ-User. הוסף שדה פרטי עבורspecialty(String). כלול בנאי שמקבל id, name ו-specialty, ממש אתgetRole()כך שתחזיר"Instructor", הוסף getter עבור specialty, ודרוס אתtoString()כך שתחזיר"Instructor: [name] - [specialty]".Course.java: צור מחלקה שמממשת אתEnrollable. כלול שדות פרטיים עבורcourseId(String),title(String),instructor(Instructor), ו-ArrayList של תלמידים רשומים. הבנאי מקבל courseId, title ו-instructor. ממש אתenroll(Student student)כך שתוסיף את התלמיד לרשימה, תקרא למתודהaddCourse()של התלמיד עם המזהה של הקורס הזה, ותחזיר true. ממש אתgetEnrolledCount(). הוסף מתודהgetDetails()שמחזירה את מזהה הקורס בתוך סוגריים מרובעים מילוליים, ואחריו את הכותרת ושם המדריך, במבנה"[" + courseId + "] " + title + " by " + instructorName.Main.java: בנה את הפלטפורמה שלך! תקבל מחרוזת פקודות מופרדת בפסיקים:ADD_INSTRUCTOR:id:name:specialtyADD_STUDENT:id:nameADD_COURSE:courseId:title:instructorIdENROLL:studentId:courseIdINFO:userId
נהל אוספים של מדריכים, תלמידים וקורסים. עבד כל פקודה והדפס:
- ADD_INSTRUCTOR:
Instructor added: [name] - ADD_STUDENT:
Student added: [name] - ADD_COURSE:
Course added: [title] - ENROLL:
[studentName] enrolled in [courseTitle] - INFO: הדפס את הפלט של
toString()של המשתמש
לאחר עיבוד כל הפקודות, הדפס
--- Platform Summary ---ואחריו את הפרטים של כל קורס ואת מספר הנרשמים, במבנה[courseDetails] - [count] student(s).
תקבל קלט אחד: מחרוזת הפקודות המופרדת בפסיקים.
לדוגמה, עבור הקלט ADD_INSTRUCTOR:I001:Dr. Smith:Java,ADD_STUDENT:S001:Alice,ADD_STUDENT:S002:Bob,ADD_COURSE:C001:OOP Fundamentals:I001,ENROLL:S001:C001,ENROLL:S002:C001,INFO:S001,INFO:I001, הפלט שלך יהיה:
Instructor added: Dr. Smith
Student added: Alice
Student added: Bob
Course added: OOP Fundamentals
Alice enrolled in OOP Fundamentals
Bob enrolled in OOP Fundamentals
Student: Alice (1 courses)
Instructor: Dr. Smith - Java
--- Platform Summary ---
[C001] OOP Fundamentals by Dr. Smith - 2 student(s)האתגר הזה משלב ירושה (היררכיית User), ממשקים (Enrollable), פולימורפיזם (סוגי משתמשים שונים עם מימושי toString משלהם) ואנקפסולציה (שדות פרטיים עם גישה מבוקרת) למערכת אחידה!
נסו בעצמכם
import java.util.Scanner;
import java.util.HashMap;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
// TODO: צרו אוספים לאחסון מדריכים, סטודנטים וקורסים
// רמז: השתמשו ב-HashMap עם id כמפתח לחיפוש קל
// TODO: פצלו את input לפי פסיקים כדי לקבל פקודות נפרדות
// TODO: עבדו כל פקודה:
// - ADD_INSTRUCTOR:id:name:specialty -> צרו מדריך, הוסיפו אותו לאוסף והדפיסו "Instructor added: [name]"
// - ADD_STUDENT:id:name -> צרו סטודנט, הוסיפו אותו לאוסף והדפיסו "Student added: [name]"
// - ADD_COURSE:courseId:title:instructorId -> צרו קורס עם מדריך, הוסיפו אותו לאוסף והדפיסו "Course added: [title]"
// - ENROLL:studentId:courseId -> רשמו סטודנט לקורס והדפיסו "[studentName] enrolled in [courseTitle]"
// - INFO:userId -> מצאו משתמש (סטודנט או מדריך) והדפיסו את ה-toString() שלו
// TODO: לאחר עיבוד כל הפקודות, הדפיסו "--- Platform Summary ---"
// TODO: עבור כל קורס, הדפיסו "[courseDetails] - [count] student(s)"
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא לתכנות מונחה עצמיםמחלקות לעומת אובייקטיםמילת המפתח thisמתודותשדות (מאפיינים)מתודת הבנאיהעמסת בנאיםחזרה – מחשבון פשוט4ירושה
ירושה בסיסית (extends)מילת המפתח superדריסת מתודות (@Override)שרשור בנאיםהמחלקה Objectירושה יחידה ורב־רמתיתלמה אין ירושה מרובה של מחלקותסיכום – היררכיית עובדים7מתודות מיוחדות ומחלקת Object
מתודת toString()equals() ו-hashCode()מתודת clone()compareTo() ו-Comparableהממשק Comparatorסיכום – מיון מותאם אישית2מצייני גישה ואנקפסולציה
סקירה של רמות הגישהמתודות Getter ו-Setterהסתרת מידעמילת המפתח finalסיכום – מנהל חשבון בנק5פולימורפיזם
יסודות העמסת מתודותדריסת מתודות (בזמן ריצה)המרה כלפי מעלה וכלפי מטההאופרטור instanceofמחלקות ומתודות מופשטותסיכום – מחשבון צורות8מושגי OOP מתקדמים
הרכבה מול ירושהאגרגציה מול הרכבהמחלקות פנימיות, מקוננות ואנונימיותEnums ומתודות של EnumRecords (Java 16+)מחלקות חתומות (Java 17+)3מאפייני מחלקה וחברים סטטיים
משתני מופע לעומת משתנים סטטייםמתודות סטטיותבלוקים סטטייםקבועים (static final)סיכום — מונה ומחלקת עזר6ממשקים ומחלקות מופשטות
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםמתודות ברירת מחדל וסטטיות בממשקמחלקות מופשטות לעומת ממשקיםממשקים פונקציונלייםסיכום – מערכת תשלומיםתרגלו בעצמכם: קומפיילר Java אונליין