مراجعة - Validated User
جزء من قسم Object Oriented Programming في رحلة Java على Coddy — الدرس 63 من 87.
التحدي
سهللنقم ببناء نظام تسجيل مستخدم كامل يقوم بالتحقق من صحة بيانات الإدخال ويستخدم استثناءات مخصصة (custom exceptions) للتواصل بدقة حول الخطأ الذي حدث! ستجمع كل ما تعلمته في هذا الفصل: الاستثناءات المخصصة من نوع checked و unchecked، والتسلسل الهرمي للاستثناءات، و try-with-resources مع مدقق (validator) قابل للإغلاق التلقائي (auto-closeable).
ستقوم بتنظيم الكود الخاص بك عبر خمسة ملفات:
ValidationException.java: قم بإنشاء استثناء من نوع checked يعمل كقاعدة لجميع أخطاء التحقق. يجب أن يرث هذا الاستثناء منExceptionويتضمن منشئًا (constructor) يقبل رسالة.InvalidUsernameException.java: قم بإنشاء استثناء من نوع checked لفشل التحقق من اسم المستخدم. يجب أن يرث هذا من فئةValidationExceptionالخاصة بك، مما يؤدي إلى إنشاء تسلسل هرمي صغير للاستثناءات. قم بتضمين منشئ يقبل رسالة ويمررها إلى الفئة الأب.InvalidAgeException.java: قم بإنشاء استثناء من نوع unchecked للأخطاء المتعلقة بالعمر (مثل الأعمار السالبة، والتي تمثل أخطاء برمجية). يجب أن يرث هذا منRuntimeExceptionمع منشئ يقبل رسالة.UserValidator.java: قم بإنشاء فئة تنفذ واجهةAutoCloseableلمحاكاة جلسة تحقق يجب إغلاقها بشكل صحيح. يجب على المدقق الخاص بك:طباعة
Validator session startedفي المنشئ.امتلاك طريقة
validateUsername(String username)تطرحInvalidUsernameExceptionإذا كان اسم المستخدم null، أو فارغًا، أو أقل من 3 أحرف (مع الرسالة"Username must be at least 3 characters"). خلاف ذلك، اطبعUsername '[username]' is valid.امتلاك طريقة
validateAge(int age)تطرحInvalidAgeExceptionإذا كان العمر سالبًا (مع الرسالة"Age cannot be negative: [age]"). إذا كان العمر أقل من 13، اطرحValidationExceptionمع الرسالة"Must be at least 13 years old". خلاف ذلك، اطبعAge [age] is valid.تنفيذ
close()لطباعةValidator session closed.Main.java: اجمع نظام التحقق الخاص بك معًا! ستتلقى مدخلين: اسم مستخدم (String) وعمر (integer).استخدم try-with-resources لإنشاء
UserValidator. داخل كتلة try، قم أولاً بالتحقق من اسم المستخدم، ثم تحقق من العمر. إذا نجح كلاهما، اطبعUser registration successful!قم بالتقاط
InvalidUsernameExceptionواطبعUsername error: [message]. قم بالتقاطInvalidAgeExceptionواطبعAge error: [message]. قم بالتقاطValidationException(الأب) واطبعValidation error: [message].يجب أن يغلق المدقق تلقائيًا بغض النظر عما إذا كان التحقق قد نجح أم فشل!
ستتلقى مدخلين بالترتيب: اسم المستخدم (String) والعمر (integer).
يجمع هذا التحدي الفصل بأكمله: ستبني تسلسلاً هرميًا للاستثناءات مع ValidationException كأب، وتستخدم كلاً من استثناءات checked و unchecked بشكل مناسب، وتضمن تنظيف مورد المدقق دائمًا باستخدام try-with-resources. لاحظ كيف أن التقاط الأب ValidationException بعد ابنه InvalidUsernameException يتيح لك التعامل مع الحالات المحددة أولاً مع الاستمرار في التقاط أخطاء التحقق الأخرى!
جرّب بنفسك
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// قراءة المدخلات
String username = scanner.nextLine();
int age = scanner.nextInt();
// TODO: استخدم try-with-resources لإنشاء UserValidator
// داخل كتلة try:
// 1. تحقق من صحة username
// 2. تحقق من صحة age
// 3. إذا نجح كلاهما، اطبع "User registration successful!"
// TODO: قم بالتقاط InvalidUsernameException واطبع "Username error: [message]"
// TODO: قم بالتقاط InvalidAgeException واطبع "Age error: [message]"
// TODO: قم بالتقاط ValidationException (الأب) واطبع "Validation error: [message]"
// Note: يجب أن يغلق الـ validator تلقائياً بغض النظر عن النجاح أو الفشل!
}
}
جميع دروس 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 User2محددات الوصول والتغليف
نظرة عامة على مستويات الوصولدوال 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أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المكرر