מודלים של ספרים ומשתמשים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C# של Coddy. שיעור 63 מתוך 70.
אתגר
קלבואו נרחיב את מערכת הספרייה שלך באמצעות הוספת יכולות עשירות יותר למודלים Book ו-User. תוסיף מעקב אחר מצב הספרים, אפשרות להשאיל ספרים למשתמשים וכימוס מתאים כדי לשמור על בטיחות הנתונים שלך.
תמשיך לעבוד עם המבנה בן ארבעת הקבצים שלך:
Book.cs: שפר את המחלקה Book באמצעות מזהה ייחודי ומעקב אחר מצב הספר. לכל ספר צריכים להיותId(string),Title(string),Author(string) ו-IsAvailable(bool, עם ערך ברירת מחדל true). הוסף את המתודותBorrow()ו-Return(), שמשנות את מצב הזמינות ומחזירות הודעה המציינת הצלחה או כישלון. אם מישהו מנסה לשאול ספר שאינו זמין, החזר"{Title} is not available". אם מישהו מנסה להחזיר ספר שכבר זמין, החזר"{Title} was not borrowed". פעולות מוצלחות צריכות להחזיר"{Title} has been borrowed"או"{Title} has been returned".User.cs: הרחב את המחלקה User כך שתעקוב אחר ספרים שאולים. כלולName(string),MemberId(int) ורשימה פרטית לאחסון מזהי הספרים השאולים. הוסף מאפיין לקריאה בלבד בשםBorrowedCount, שמחזיר את מספר הספרים שהמשתמש מחזיק כרגע. כלול את המתודותAddBorrowedBook(string bookId)ו-RemoveBorrowedBook(string bookId)לניהול הספרים השאולים של המשתמש. הוסף גם מתודהHasBook(string bookId), שמחזירה true אם המשתמש שאל את הספר המסוים הזה.Library.cs: המחלקה Library שלך צריכה לנהל אוספים של ספרים ומשתמשים. כלול את המתודותAddBook(Book book)ו-RegisterUser(User user)להוספת ספרים ומשתמשים לספרייה. הוסף מתודהGetBookById(string id), שמחזירה את הספר עם המזהה הזה (או null אם הוא לא נמצא), ואתGetUserById(int memberId), שפועלת באופן דומה עבור משתמשים.Program.cs: חבר את כל הרכיבים יחד באמצעות עיבוד פעולות הספרייה על סמך הקלט.
הקלט שיתקבל יהיה מהסוגים הבאים:
- שם הספרייה
- מספר הספרים להוספה
- עבור כל ספר:
id|title|author - מספר המשתמשים לרישום
- עבור כל משתמש:
name|memberId - מספר הפעולות לביצוע
- עבור כל פעולה:
action|bookId|memberId, כאשר action הואborrowאוreturn
עבור כל פעולה, הדפס את תוצאת פעולת ההשאלה או ההחזרה. לאחר כל הפעולות, הדפס סיכום עבור כל משתמש, המציג את שמו ואת מספר הספרים שהוא מחזיק כרגע בפורמט {Name}: {BorrowedCount} book(s).
לדוגמה, אם הקלט הוא:
Downtown Library
2
B001|Clean Code|Robert Martin
B002|Design Patterns|Gang of Four
2
Alice|101
Bob|102
4
borrow|B001|101
borrow|B002|101
borrow|B001|102
return|B001|101הפלט צריך להיות:
Clean Code has been borrowed
Design Patterns has been borrowed
Clean Code is not available
Clean Code has been returned
Alice: 1 book(s)
Bob: 0 book(s)שימו לב: Alice מצליחה לשאול שני ספרים, אבל כש-Bob מנסה לשאול את Clean Code (שכבר נמצא אצל Alice), הפעולה נכשלת. לאחר ש-Alice מחזירה את Clean Code, מספר הספרים שלה יורד ל-1. כך אפשר לראות כיצד המודלים שלך פועלים יחד כדי לאכוף את כללי הספרייה!
נסו בעצמכם
using System;
using System.Collections.Generic;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// קרא את שם הספרייה
string libraryName = Console.ReadLine();
// צור מופע של Library עם שם הספרייה
Library library = new Library(libraryName);
// קרא את מספר הספרים
int numBooks = Convert.ToInt32(Console.ReadLine());
// קרא והוסף ספרים
for (int i = 0; i < numBooks; i++)
{
string bookInput = Console.ReadLine();
string[] bookParts = bookInput.Split('|');
string bookId = bookParts[0];
string bookTitle = bookParts[1];
string bookAuthor = bookParts[2];
Book book = new Book(bookId, bookTitle, bookAuthor);
library.AddBook(book);
}
// קרא את מספר המשתמשים
int numUsers = Convert.ToInt32(Console.ReadLine());
// קרא ורשום משתמשים
List<User> usersList = new List<User>();
for (int i = 0; i < numUsers; i++)
{
string userInput = Console.ReadLine();
string[] userParts = userInput.Split('|');
string userName = userParts[0];
int memberId = Convert.ToInt32(userParts[1]);
User user = new User(userName, memberId);
library.RegisterUser(user);
usersList.Add(user);
}
// קרא את מספר הפעולות
int numOperations = Convert.ToInt32(Console.ReadLine());
// עבד את הפעולות
for (int i = 0; i < numOperations; i++)
{
string operationInput = Console.ReadLine();
string[] opParts = operationInput.Split('|');
string action = opParts[0];
string bookId = opParts[1];
int memberId = Convert.ToInt32(opParts[2]);
Book book = library.GetBookById(bookId);
User user = library.GetUserById(memberId);
if (action == "borrow")
{
string result = book.Borrow();
Console.WriteLine(result);
if (result.Contains("has been borrowed"))
{
user.AddBorrowedBook(bookId);
}
}
else if (action == "return")
{
string result = book.Return();
Console.WriteLine(result);
if (result.Contains("has been returned"))
{
user.RemoveBorrowedBook(bookId);
}
}
}
// הדפס סיכום עבור כל משתמש
foreach (User user in usersList)
{
Console.WriteLine($"{user.Name}: {user.BorrowedCount} book(s)");
}
}
}
}כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמרחבי שמות והנחיותמבוא למחלקות ולאובייקטיםמילת המפתח 'this'מתודות ופרמטריםשדות לעומת מאפייניםבנאיםאתחול אובייקטיםסיכום – מחשבון פשוט4ירושה
תחביר ירושה בסיסית (:)מילת המפתח 'base'מילות המפתח Virtual ו-Overrideמחלקות Sealedמחלקת הבסיס 'object'סיכום – היררכיית עובדים7תכונות מתקדמות
העמסת אופרטוריםאינדקסרים (this[])דריסת ToString()מתודות הרחבהסיכום – רשימה מותאמת אישית2מאפיינים וחברים סטטיים
מאפיינים במימוש אוטומטימאפיינים לקריאה בלבד ולכתיבה בלבדשדות ומתודות סטטייםמחלקות סטטיותחברים עם גוף ביטוי5פולימורפיזם וממשקים
פולימורפיזם בזמן קומפילציה לעומת בזמן ריצהממשק לעומת מחלקה מופשטתממשקים מרוביםממשקים מפורשיםהמרה כלפי מעלה והמרה כלפי מטהחזרה: מחשבון צורות8מושגים מתקדמים בתכנות מונחה עצמים
קומפוזיציה במקום ירושהGenerics (מחלקות ומתודות)נציגים ואירועיםמאפיינים ורפלקציהIDisposable והצהרת usingיסודות הזרקת תלויות3ארכיטקטורת מחלקות
נתוני מופע לעומת נתונים סטטייםמילות המפתח 'readonly' ו-'const'שדות גיבויסיכום – מנהל חשבונות בנק12פרויקט: מערכת ספרייה
מבנה הפרויקטמודלים של ספרים ומשתמשיםלוגיקת השאלת ספריםחיפוש באמצעות LINQממשק משתמש בקונסולה / ממשק מנהלבדיקות יחידה (NUnit/xUnit)תרגלו בעצמכם: קומפיילר C# אונליין