نظام الاستعارة
جزء من قسم Object Oriented Programming في رحلة Java على Coddy — الدرس 79 من 87.
التحدي
سهلدعنا نواصل بناء نظام إدارة المكتبة من خلال إنشاء نظام استعارة مناسب باستخدام فئة Library التي تدير مجموعة الكتب والمستخدمين. هذا هو المكان الذي يبدأ فيه نظامك في الشعور وكأنه مكتبة حقيقية - تتبع من يملك ماذا وفرض قواعد الاستعارة!
ستقوم بتنظيم الكود الخاص بك عبر أربعة ملفات:
Book.java: احتفظ بفئة Book الخاصة بك من التحدي السابق مع جميع وظائفها— isbn، title، author، isAvailable، borrowedBy، getDetails()، والمسترجعات/المعينات (getters/setters) المناسبة.User.java: احتفظ بفئة User الخاصة بك مع id، name، و borrowedBooks ArrayList، و borrowBook()، و returnBook()، و getBorrowedCount()، و toString().Library.java: أنشئ فئةLibraryالمركزية التي تدير كل شيء. يجب أن تحتفظ مكتبتك بقائمتين من نوع ArrayList—واحدة لكائناتBookوالأخرى لكائناتUser. قم بتضمين هذه الأساليب (methods):addBook(Book book)- يضيف كتاباً إلى مجموعة المكتبة.registerUser(User user)- يضيف مستخدماً إلى المستخدمين المسجلين في المكتبة.findBookByIsbn(String isbn)- يبحث عبر الكتب ويعيد الكتاب الذي يطابق ISBN، أوnullإذا لم يتم العثور عليه.findUserById(String id)- يبحث عبر المستخدمين ويعيد المستخدم الذي يطابق ID، أوnullإذا لم يتم العثور عليه.borrowBook(String userId, String isbn)- يجد المستخدم والكتاب، ثم إذا كان كلاهما موجوداً والكتاب متاحاً، يجعل المستخدم يستعير الكتاب ويطبع[userName] borrowed [bookTitle]. إذا لم يكن الكتاب متاحاً، اطبعBook not available. إذا لم يتم العثور على المستخدم أو الكتاب، اطبعInvalid user or book.returnBook(String userId, String isbn)- يجد المستخدم والكتاب، ثم يجعل المستخدم يعيد الكتاب ويطبع[userName] returned [bookTitle]. إذا لم يتم العثور على المستخدم أو الكتاب، اطبعInvalid user or book.Main.java: اجمع نظام مكتبتك معاً! ستتلقى مدخلات لكتابين (ISBN، العنوان، المؤلف لكل منهما)، ومستخدم واحد (ID، الاسم)، ثم سلسلة من العمليات.أنشئ Library، وأضف كلا الكتابين، وسجل المستخدم. ثم قم بمعالجة العمليات—ستتلقى سلسلة نصية مفصولة بفاصلة حيث يتم تنسيق كل عملية كـ
borrow:userId:isbnأوreturn:userId:isbn.بعد معالجة جميع العمليات، اطبع ملخصاً يوضح حالة كل كتاب بالتنسيق
[isbn]: [Available/Borrowed].
ستتلقى المدخلات بهذا الترتيب: book1 ISBN، book1 title، book1 author، book2 ISBN، book2 title، book2 author، user ID، user name، وأخيراً سلسلة العمليات.
على سبيل المثال، مع المدخلات ISBN-001، Clean Code، Robert Martin، ISBN-002، Design Patterns، Gang of Four، U001، Alice، و borrow:U001:ISBN-001,borrow:U001:ISBN-002,return:U001:ISBN-001، سيكون مخرجك هو:
Alice borrowed Clean Code
Alice borrowed Design Patterns
Alice returned Clean Code
ISBN-001: Available
ISBN-002: Borrowedيجمع هذا التحدي بين التركيب (composition)، والكبسلة (encapsulation)، وتصميم الأساليب (methods) لإنشاء نظام متماسك. تعمل فئة Library كمنسق، حيث تفوض منطق الاستعارة الفعلي إلى فئتي User و Book مع إدارة المجموعة الإجمالية!
جرّب بنفسك
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// قراءة معلومات الكتاب الأول
String isbn1 = scanner.nextLine();
String title1 = scanner.nextLine();
String author1 = scanner.nextLine();
// قراءة معلومات الكتاب الثاني
String isbn2 = scanner.nextLine();
String title2 = scanner.nextLine();
String author2 = scanner.nextLine();
// قراءة معلومات المستخدم
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// قراءة سلسلة العمليات (مفصولة بفاصلة، التنسيق: borrow:userId:isbn أو return:userId:isbn)
String operationsStr = scanner.nextLine();
// TODO: إنشاء كائنات Book للكتاب الأول والكتاب الثاني
// TODO: إنشاء كائن User
// TODO: إنشاء Library، وإضافة كلا الكتابين، وتسجيل المستخدم
// TODO: تقسيم operationsStr بواسطة "," ومعالجة كل عملية
// لكل عملية، قم بالتقسيم بواسطة ":" للحصول على الإجراء (action)، و userId، و isbn
// استدعاء library.borrowBook() أو library.returnBook() وفقاً لذلك
// TODO: طباعة ملخص لكل كتاب بالتنسيق "[isbn]: [Available/Borrowed]"
}
}جميع دروس Object Oriented Programming
1أساسيات الـ OOP
الملفات الخارجيةمقدمة في الـ OOPالفئات (Classes) مقابل الكائنات (Objects)الكلمة المفتاحية thisالدوال (Methods)الحقول (Attributes)دالة البناء (Constructor)تعدد أشكال دالة البناء (Constructor Overloading)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسية (extends)الكلمة المفتاحية superإعادة تعريف الدوال (@Override)تسلسل المنشئات (Constructor Chaining)كلاس Objectالوراثة الأحادية ومتعددة المستوياتلماذا لا توجد وراثة متعددة للكلاساتمراجعة - هيكلية الموظفين7الدوال الخاصة وفئة Object
دالة toString()equals() و hashCode()دالة clone()compareTo() و Comparableواجهة Comparatorمراجعة - الترتيب المخصص10معالجة الاستثناءات في OOP
التسلسل الهرمي لفئات الاستثناءاتالاستثناءات المخصصةالأخطاء من نوع Checked مقابل Uncheckedنمط Try With Resourcesمراجعة - Validated User13مشروع: إدارة المكتبة
نظرة عامة على المشروع وتصميم UMLفئات الكتاب والمستخدم2محددات الوصول والتغليف
نظرة عامة على مستويات الوصولدوال Getter و Setterإخفاء البياناتالكلمة المفتاحية finalمراجعة - مدير الحساب البنكي5تعدد الأشكال (Polymorphism)
أساسيات الـ Method Overloadingالـ Method Overriding (في وقت التشغيل)الـ Upcasting والـ Downcastingمعامل الـ instanceofالفئات والدوال المجردة (Abstract)مراجعة - حاسبة الأشكال8مفاهيم OOP المتقدمة
الـ Composition مقابل الـ Inheritanceالـ Aggregation مقابل الـ Compositionالفئات الداخلية والمتداخلة والمجهولة (Inner, Nested & Anonymous)الـ Enums ودوالهاالـ Records (Java 16+)الـ Sealed Classes (Java 17+)11أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singletonنمط Factoryنمط Builderنمط Observerنمط Strategy3خصائص الفئة والعضو الساكن
المتغيرات الخاصة بالكائن مقابل المتغيرات الساكنةالدوال الساكنةالكتل البرمجية الساكنةالثوابت (static final)ملخص - العداد والأدوات المساعدة6الواجهات (Interfaces) والأصناف المجردة (Abstract Classes)
مقدمة في الواجهات (Interfaces)تنفيذ الواجهات (Interfaces)تنفيذ واجهات متعددةالـ Default و Static في الواجهاتالأصناف المجردة مقابل الواجهاتالواجهات الوظيفية (Functional Interfaces)مراجعة - نظام الدفع9الأنواع العامة (Generics)
مقدمة في الأنواع العامةالأصناف العامة (Generic Classes)الدوال العامة (Generic Methods)معاملات الأنواع المقيدةالرموز البديلة (?, extends, super)مراجعة - الحاويات العامة12أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المكرر