نماذج الكتاب والمستخدم
جزء من قسم Object Oriented Programming في رحلة 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)، وقائمة خاصة (private list) لتخزينIDsللكتب المستعارة. أضف خاصية للقراءة فقط (read-only property) باسمBorrowedCountترجع عدد الكتب التي يمتلكها المستخدم حاليًا. قم بتضمين الميثودزAddBorrowedBook(string bookId)وRemoveBorrowedBook(string bookId)لإدارة الكتب المستعارة للمستخدم. أضف أيضًا ميثودHasBook(string bookId)ترجعtrueإذا كان المستخدم قد استعار ذلك الكتاب المحدد.Library.cs: يجب أن تحتفظ فئةLibraryبمجموعات من الكتب والمستخدمين. قم بتضمين الميثودزAddBook(Book book)وRegisterUser(User user)لملء المكتبة. أضف ميثودGetBookById(string id)ترجع الكتاب الذي يحمل ذلك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)");
}
}
}
}جميع دروس 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 Injection3بنية الكلاسات
بيانات الـ Instance مقابل البيانات الـ Staticالكلمات المفتاحية 'readonly' و 'const'الحقول الخلفية (Backing Fields)مراجعة - مدير الحساب البنكي6التغليف
معدلات الوصولالخصائص من أجل التغليفتنفيذ إخفاء البياناتأنماط عدم القابلية للتغييرمراجعة - سجلات الطلاب12مشروع: نظام المكتبة
هيكلة المشروعنماذج الكتاب والمستخدممنطق نظام الاستعارةLINQ للبحثواجهة Console / واجهة المسؤولاختبار الوحدات (NUnit/xUnit)