محتويات الدورة

Java / المتقدم / الدرس 18

معمارية الواجهات والسجلات وتطورها

اجمع ثوابت المجال وأنواع نتائج ثابتة وحدود الاعتماد وتوافق الإصدار والفشل المرئي في تصميم Java صغير قابل للصيانة.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • فصل قرارات المجال من محولات الإدخال.
  • استخدام records والأنواع المختومة وحدودهما.
  • تطوير الواجهة بدليل توافق وتشغيل.

نظّم حول السياسة والآثار الخارجية

يستقبل الحد الإدخال ويصادق ويفوض ويحلل ويستدعي السياسة ويحول النتيجة للاستجابة. لا يحتاج حساب المجال معرفة ترميز HTTP أو مشغل القاعدة. تصف المنافذ القدرة المطلوبة وتنفذ المحولات الملفات والقواعد وغيرها، فيسهل اختبار السلوك دون خدمات حقيقية.

لا تحول كل صنف إلى تجريد إطار. أضف حداً لاعتماد خارجي أو سياسة قابلة للاستبدال أو مسؤولية عمر فعلية. وضّح المعاملة والإعادة والموارد بين المحولات. لا يضمن رسم حزم نظيف الصحة إن تكرر حفظ الطلب بعد تثبيت مجهول أو اقتصر التفويض على مستدعٍ واحد.

مثّل نتائج مجال مغلقة

يدعم17 السجلات والأنواع المختومة معيارياً. تقيد واجهة مختومة التنفيذات وتوفر records حوامل بقارئات ومساواة وتجزئة وتمثيل نص مولد. يمثل المثال قبولاً ورفضاً دون null أو مبلغ سالب رمزي. مطابقة instanceof معيارية هنا ولا نستخدم مطابقة switch كصياغة17 معيارية.

الثبات سطحي؛ يحتاج مكون قائمة متغيرة نسخاً أو ملكية موثقة. يبقى تحقق الباني ضرورياً وقد يكشف toString مكوناً حساساً بالسجل. تفيد البنية المغلقة إذا ملك المجال كل البدائل؛ وقد تحتاج إضافات مفتوحة عقداً آخر.

java سجلات17 وعقد نتائج مختوم
public class Main {
sealed interface Result permits Accepted,Rejected {}
record Accepted(int total) implements Result {}
record Rejected(String reason) implements Result {}
static Result price(int quantity,int unit) {
 if(quantity<=0 || unit<0) return new Rejected("invalid input");
 return new Accepted(Math.multiplyExact(quantity,unit));
}
 public static void main(String[] args) throws Exception {
Result result=price(3,4);
if(result instanceof Accepted accepted) {
 System.out.println(accepted.total());
} else { System.out.println("rejected"); }
 }
}
الناتج المتوقع
12

تنتج القيم الموجبة قبولاً بمجموع12 ويكون الرفض نوعاً مستقلاً لا عدداً اختيارياً.

احقن قدرة واختبر السياسة معزولة

يعتمد المثال قدرة Catalog لا قاعدة أوHTTP فعلياً. يوفر محول مصطنع سعر10 وتحسب الخدمة20 لوحدتين. ينشئ الباني المتعاون وتتحقق الدالة من الكمية. يمكن للاختبار توفير محول يكشف الغياب أو الفشل دون خدمة مضبوطة.

يفيد البديل إذا طابق عقد القدرة. أبق اختبارات تكامل للترميز والربط والمعاملة وترجمة الخطأ. لا تجعله يعيد بيانات لكل معرف إذا رفض المصدر الحقيقي الغائب. ميّز غياب المجال من تعطل الاعتماد كي تختار الاستجابة الصحيحة.

java سياسة مجال بمتعاون في الذاكرة
public class Main {
interface Catalog { int unitPrice(String code); }
static final class Checkout {
 private final Catalog catalog;
 Checkout(Catalog catalog) { this.catalog=java.util.Objects.requireNonNull(catalog); }
 int total(String code,int quantity) {
  if(quantity<=0) throw new IllegalArgumentException("quantity");
  int unit=catalog.unitPrice(code);
  if(unit<0) throw new IllegalStateException("negative catalog price");
  return Math.multiplyExact(unit,quantity);
 }
}
 public static void main(String[] args) throws Exception {
Catalog catalog=code->10;
Checkout checkout=new Checkout(catalog);
System.out.println(checkout.total("BOOK",2));
 }
}
الناتج المتوقع
20

يوفر المحول سعراً مصطنعاً وتحسب الخدمة الكمية دون إدخال أوإخراج خارجي.

راجع توافق المصدر والثنائي والسلوك

قد يتوافق التغيير مصدرياً ويكسر السلوك أو يكسر مستهلكاً مترجماً ثنائياً. يؤثر حذف دالة أو تغيير واصف أو تشديد المدخل أو الترتيب أو الاستثناء بصورة مختلفة. اختبر مستهلكين ممثلين لا ترجمة المنتج وحده ووضح الإهمال والترحيل.

الإصدار محور آخر؛ لا تغير صيغة25 المدمجة عقد تشغيل17 بأثر رجعي. ترجم المكتبة المقصودة لـ17 بهدفه وتجنب واجهاته الأحدث. يؤثر تصدير الوحدة أو الوصول الانعكاسي أيضاً ولو ثبت اسم الدالة التجارية.

تحقق من الحد كله دون إخفاء الغموض

يجب أن يتحقق مسار الطلب من الكمية ويفوض الحساب ويحسب مبلغاً دقيقاً محدوداً ويحفظ عبر محول مالك للمعاملة ويستخدم مفتاحاً دائماً للإعادة. تحتاج الإشعارات تنسيقاً كالصندوق الصادر وتسليماً آمناً للتكرار. لا تعكس استثناءات Java فعلاً بعيداً اكتمل.

اختبر الصالح وغير الصالح وفشل المحول والتكرار والإلغاء والإغلاق. سجل معرف عملية وسبباً مقيداً لا أسراراً أو محتوى شخصياً كاملاً. ينبغي أن يشرح التصميم موضع الحالة ومالك الموارد وانتقال النتائج والفشل ودليل التمييز بين فشل مؤكد وإكمال مجهول. يفوق ذلك إضافة طبقات بلا عقد.

الأخطاء الشائعة وإصلاحها

A record exposed mutable internal data

لماذا يحدث؟
خُلط الثبات السطحي بالملكية العميقة.
كيف تصلحه؟
انسخ المكونات أو استخدم تمثيلاً ثابتاً.
كيف تتجنب تكراره؟
اختبر تعديل المستدعي بعد الإنشاء.

NoSuchMethodError after a library update

لماذا يحدث؟
تختلف ثنائيات المستهلك والمكتبة.
كيف تصلحه؟
انشر مجموعة متوافقة أو أعد بناء المستهلك.
كيف تتجنب تكراره؟
اختبر المستهلك المحزم واعتمادياته.

A retry duplicated an external notification

لماذا يحدث؟
غاب تنسيق دائم للعمل والأثر البعيد.
كيف تصلحه؟
استخدم هوية وصندوقاً صادراً أو تصميماً مراجعاً.
كيف تتجنب تكراره؟
اختبر الانقطاع بين التسليم والتأكيد.

اختبر فهمك

1. يخزن record قائمة مستدعي. ما الحماية من تعديلها لاحقاً؟

اعرض الحل المشروح

انسخها دفاعياً مثل List.copyOf مع سياسة null أو وثق المشاركة. لا تجمد final وحدها قائمة المستدعي.

2. قد يغيب المنتج أو يفشل مصدره. هل يصبح كلاهما سعراً صفرياً؟

اعرض الحل المشروح

لا؛ الصفر قيمة مجال إن سمحت. ميّز الغياب من الفشل واحفظ السبب واختبرهما كيلا ينشأ طلب مجاني من جلب فاشل.

أهم ما تعلمته

  • تظهر المعمارية السياسة والملكية والفشل.
  • السجلات والأنواع المختومة أدوات17 بحدود واضحة.
  • يشمل التوافق السلوك وآثار النشر.

المراجع الرسمية