منطق نظام الاستعارة
جزء من قسم Object Oriented Programming في رحلة C# على Coddy — الدرس 64 من 70.
التحدي
سهللنقم بإحياء نظام المكتبة الخاص بك من خلال تنفيذ منطق الاستعارة الأساسي! ستقوم بإنشاء نظام مركزي ينسق بين الكتب والمستخدمين، ويفرض قواعد المكتبة مثل حدود الاستعارة ويضمن عدم استعارة الكتب إلا عندما تكون متاحة.
ستستمر في البناء على هيكل الملفات الأربعة الحالي لديك:
Book.cs: احتفظ بفئة Book مع خصائصIdوTitleوAuthorوIsAvailable، بالإضافة إلى طريقتيBorrow()وReturn()من الدرس السابق.User.cs: احتفظ بفئة User معNameوMemberIdوBorrowedCount، والطرق الخاصة بإدارة الكتب المستعارة. أضف ثابتاًMaxBooksمضبوطاً على 3 يمثل الحد الأقصى لعدد الكتب التي يمكن للمستخدم استعارتها في وقت واحد. أضف طريقةCanBorrow()التي تعيد true فقط إذا كان المستخدم قد استعار أقل منMaxBooks.Library.cs: هذا هو المكان الذي يجتمع فيه منطق نظام الاستعارة الخاص بك. يجب أن تحتوي فئة Library على مجموعات من الكتب والمستخدمين، بالإضافة إلى طرق لإضافتهم. قم بتنفيذ طريقتين رئيسيتين:BorrowBook(string bookId, int memberId)- ينسق عملية الاستعارة. يجب أن يتحقق مما إذا كان الكتاب موجوداً، وما إذا كان المستخدم موجوداً، وما إذا كان الكتاب متاحاً، وما إذا كان بإمكان المستخدم استعارة المزيد من الكتب. قم بإرجاع الرسائل المناسبة لكل حالة فشل أو نجاح.ReturnBook(string bookId, int memberId)- يتعامل مع عمليات الإرجاع من خلال التحقق من أن المستخدم يمتلك الكتاب بالفعل قبل معالجة عملية الإرجاع.
Program.cs: معالجة عمليات المكتبة وعرض النتائج.
يجب أن تعيد طريقة BorrowBook هذه الرسائل بناءً على الموقف:
Book not found- عندما لا يكون معرف الكتاب موجوداًUser not found- عندما لا يكون معرف العضو موجوداً{Title} is not available- عندما يكون الكتاب مستعاراً بالفعل{Name} has reached the borrowing limit- عندما يكون لدى المستخدم بالفعل 3 كتب{Name} borrowed {Title}- عند نجاح الاستعارة
يجب أن تعيد طريقة ReturnBook ما يلي:
Book not foundأوUser not found- للمعرفات غير الصالحة{Name} did not borrow {Title}- عندما يحاول المستخدم إرجاع كتاب ليس لديه{Name} returned {Title}- عند نجاح الإرجاع
ستتلقى المدخلات التالية:
- اسم المكتبة
- عدد الكتب، ثم كل كتاب بتنسيق
id|title|author - عدد المستخدمين، ثم كل مستخدم بتنسيق
name|memberId - عدد العمليات، ثم كل عملية بتنسيق
action|bookId|memberId
اطبع نتيجة كل عملية في سطر مستقل.
على سبيل المثال، إذا كانت المدخلات هي:
Central Library
4
B001|The Hobbit|Tolkien
B002|1984|Orwell
B003|Dune|Herbert
B004|Foundation|Asimov
2
Alice|101
Bob|102
6
borrow|B001|101
borrow|B002|101
borrow|B003|101
borrow|B004|101
borrow|B001|102
return|B002|101يجب أن يكون المخرج:
Alice borrowed The Hobbit
Alice borrowed 1984
Alice borrowed Dune
Alice has reached the borrowing limit
The Hobbit is not available
Alice returned 1984لاحظ كيف تعمل فئة Library كمنسق - فهي تتحقق من جميع الشروط قبل السماح بالعمليات، مما يحافظ على تركيز فئتي Book و User على مسؤولياتهما الخاصة. هذا الفصل يجعل الكود الخاص بك أسهل في الصيانة والاختبار!
جرّب بنفسك
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());
// قراءة وتسجيل المستخدمين
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);
}
// قراءة عدد العمليات
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]);
if (action == "borrow")
{
string result = library.BorrowBook(bookId, memberId);
Console.WriteLine(result);
}
else if (action == "return")
{
string result = library.ReturnBook(bookId, memberId);
Console.WriteLine(result);
}
}
}
}
}
جميع دروس 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مشروع: نظام المكتبة
هيكلة المشروعنماذج الكتاب والمستخدم