فئات الكتاب والمستخدم
جزء من قسم Object Oriented Programming في رحلة Java على Coddy — الدرس 78 من 87.
التحدي
سهلدعنا نواصل بناء نظام إدارة المكتبة من خلال توسيع فئتي Book و User من الدرس السابق. الآن ستضيف القدرة للمستخدمين على استعارة الكتب، مما يخلق اتصالاً حقيقياً بين هذين الكيانين.
ستقوم بتنظيم الكود الخاص بك عبر ثلاثة ملفات:
Book.java: قم بتحسين فئة Book الخاصة بك من التحدي السابق. احتفظ بجميع الوظائف الحالية (isbn، title، author، isAvailable مع getters/setters، وgetDetails()). أضف الآن حقلاً خاصاً (private field) باسمborrowedByمن نوعStringيقوم بتخزين معرف (ID) المستخدم الذي استعار الكتاب (أوnullإذا لم يكن مستعاراً). أضف getter لـborrowedByو setter يقوم أيضاً بتحديثisAvailableوفقاً لذلك—عندما يتم استعارة كتاب (يتم تعيين borrowedBy إلى قيمة غير null)، يصبح غير متاح؛ وعند إعادته (تعيينه إلى null)، يصبح متاحاً مرة أخرى.User.java: قم بتوسيع فئة User لتتبع الكتب المستعارة. احتفظ بـ id، name، المنشئ (constructor)، الـ getters، وtoString()الحالية. أضف حقلاً خاصاًArrayList<Book>يسمىborrowedBooks(قم بتهيئته في المنشئ). أنشئ طريقةborrowBook(Book book)تضيف الكتاب إلى قائمة المستخدم وتعينborrowedByالخاص بالكتاب إلى معرف هذا المستخدم. أنشئ طريقةreturnBook(Book book)تزيل الكتاب من القائمة وتعينborrowedByإلى null. أضف طريقةgetBorrowedCount()التي تعيد عدد الكتب التي يمتلكها المستخدم حالياً.Main.java: قم باستعراض نظام الاستعارة أثناء العمل. ستتلقى خمسة مدخلات: ISBN، العنوان (title)، المؤلف (author) لكتاب، ثم معرف المستخدم (user ID) واسمه.أنشئ Book و User باستخدام هذه المدخلات. اطبع تفاصيل الكتاب وحالة توفره. ثم اجعل المستخدم يستعير الكتاب. اطبع توفر الكتاب مرة أخرى، متبوعاً بمن استعاره بالتنسيق
Borrowed by: [userId]. اطبع عدد الكتب التي يمتلكها المستخدم بالتنسيق[name] has [count] book(s). أخيراً، اجعل المستخدم يعيد الكتاب واطبع التوفر مرة أخيرة.
ستتلقى خمسة مدخلات بالترتيب: ISBN (String)، العنوان (String)، المؤلف (String)، معرف المستخدم (String)، واسم المستخدم (String).
على سبيل المثال، مع المدخلات 978-0-13-468599-1، Effective Java، Joshua Bloch، U001، و Alice، سيكون مخرجك:
[978-0-13-468599-1] Effective Java by Joshua Bloch
Available: true
Available: false
Borrowed by: U001
Alice has 1 book(s)
Available: trueيعتمد هذا التحدي مباشرة على عملك السابق، حيث يضيف العلاقة الحاسمة بين الكتب والمستخدمين التي تجعل نظام المكتبة وظيفياً. ستستخدم التركيب (User "لديه" Books) وترى كيف يمكن للتغييرات في كائن واحد أن تؤثر على كائن آخر من خلال طرق مصممة جيداً!
جرّب بنفسك
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// قراءة معلومات الكتاب
String isbn = scanner.nextLine();
String title = scanner.nextLine();
String author = scanner.nextLine();
// قراءة معلومات المستخدم
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// إنشاء كائن Book باستخدام isbn والعنوان والمؤلف
Book book = new Book(isbn, title, author);
// إنشاء كائن User باستخدام userId و userName
User user = new User(userId, userName);
// طباعة تفاصيل الكتاب باستخدام getDetails()
System.out.println(book.getDetails());
// طباعة ما إذا كان الكتاب متاحاً (التنسيق: "Available: true" أو "Available: false")
System.out.println("Available: " + book.isAvailable());
// جعل المستخدم يستعير الكتاب
user.borrowBook(book);
// طباعة توفر الكتاب مرة أخرى
System.out.println("Available: " + book.isAvailable());
// طباعة من استعار الكتاب
System.out.println("Borrowed by: " + book.getBorrowedBy());
// طباعة عدد الكتب التي يملكها المستخدم
System.out.println(user.getName() + " has " + user.getBorrowedCount() + " book(s)");
// جعل المستخدم يعيد الكتاب
user.returnBook(book);
// طباعة التوفر مرة أخيرة
System.out.println("Available: " + book.isAvailable());
}
}جميع دروس 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أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المكرر