نماذج الكتاب والمستخدم
جزء من قسم Object Oriented Programming في رحلة C# على Coddy — الدرس 63 من 70.
التحدي
سهلدعنا نوسع نظام المكتبة الخاص بك من خلال بناء نماذج Book و User بوظائف أغنى. ستضيف تتبع الحالة للكتب، وإمكانيات الاستعارة للمستخدمين، والتغليف (encapsulation) المناسب للحفاظ على أمان بياناتك.
ستستمر في العمل مع هيكل الملفات الأربعة الخاص بك:
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) لتخزين معرفات الكتب المستعارة. أضف خاصية للقراءة فقط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;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// قراءة المدخلات
string libraryName = Console.ReadLine();
string bookInput = Console.ReadLine();
string userInput = Console.ReadLine();
// تحليل مدخلات الكتاب (التنسيق: title|author)
string[] bookParts = bookInput.Split('|');
string bookTitle = bookParts[0];
string bookAuthor = bookParts[1];
// تحليل مدخلات المستخدم (التنسيق: name|memberId)
string[] userParts = userInput.Split('|');
string userName = userParts[0];
int memberId = Convert.ToInt32(userParts[1]);
// إنشاء مثيل Library باستخدام اسم المكتبة
Library library = new Library(libraryName);
// إنشاء مثيل Book باستخدام العنوان والمؤلف
Book book = new Book(bookTitle, bookAuthor);
// إنشاء مثيل User باستخدام الاسم ومعرف العضو memberId
User user = new User(userName, memberId);
// طباعة معلومات المكتبة باستخدام GetInfo()
Console.WriteLine(library.GetInfo());
// طباعة معلومات الكتاب بالتنسيق: Book: {Title} by {Author} - Available: {IsAvailable}
Console.WriteLine($"Book: {book.Title} by {book.Author} - Available: {book.IsAvailable}");
// طباعة معلومات المستخدم بالتنسيق: User: {Name} (ID: {MemberId})
Console.WriteLine($"User: {user.Name} (ID: {user.MemberId})");
}
}
}
جميع دروس 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مشروع: نظام المكتبة
هيكلة المشروعنماذج الكتاب والمستخدم