معمارية البرمجيات / الأساسيات: الوعود والبنية والملكية / الدرس 4
صمّم الوحدات حول التغيير وقواعد الاعتماد
ابن وحدات حجز متماسكة وأبق آليات التسليم الخارجية خارج سياسة العمل.
في هذه الصفحة
أهداف الدرس
- تعرّف الترابط من التغييرات التي يجب تنفيذها معا.
- استخدم واجهات صريحة لاستقلال السياسة عن الآليات القابلة للاستبدال.
اجمع المعرفة التي تتغير للسبب نفسه
الوحدة حد للمسؤولية والمعرفة، وليست مجرد مجلد. تجتمع قواعد الحجز لأن سعة المقاعد وأهلية الإلغاء وحالة التأكيد يجب أن تتوافق. يتغير تنسيق البريد لسبب آخر ولا يلزم خلطه بتخصيص المقاعد. التماسك سياقي: قد تمثل عمليتان تشتركان في جدول سياسات مختلفة، وقد تدعم جداول عديدة قيدا تجاريا واحدا. افحص تغييرات ملموسة وملكية الفشل قبل تحديد بداية الوحدة وحجمها.
اكتشف الاعتماد الذي يفرض تعديلات منسقة
يظهر الترابط عندما يتطلب تغيير وحدة فهم أخرى أو تعديلها. تعتمد سياسة حجز تستورد استثناء خاصا بمورد البريد على تفاصيل آلية التسليم. وقد تصبح حزمة أدوات مشتركة مركزا خفيا إذا استوردت كل الوحدات أنواعها غير المستقرة. اعتبر عدد الاستيرادات قرينة فقط؛ فقد يوجد الترابط الدلالي عبر مخطط قاعدة أو صيغة ملف أو توقع توقيت غير موثق. اسأل ماذا يحدث إذا تغير المتعاون مستقلا، لا هل تبدو المجلدات مرتبة.
booking_policy -> reservation_port
booking_application -> notification_port
sql_reservation_adapter -> reservation_port
mail_vendor_adapter -> notification_port
تعني الأسهم اعتماد الشيفرة على واجهة. يستدعي التطبيق أثناء التشغيل محولات فعلية بعد تركيبها؛ فاتجاه الاعتماد واتجاه الاستدعاء مفهومان مختلفان.
صِغ الواجهة بلغة المستدعي
ينبغي أن تعبّر واجهة الحجز عن حاجة العمل، مثل حجز مقعد ذري، بدلا من إتاحة SQL اعتباطي. يترجم المحول العملية إلى تقنية التخزين. يحافظ ذلك على عقد مفهوم عند تغير الآلية، لكن الواجهة لا تمحو الفشل الموزع أو قيود الاتساق. ويجب أن تميز النتائج المؤكد والمرفوض والمجهول عند الحاجة. تجنب تجريد كل صنف؛ أنشئ الحد عندما يعزل تغييرا حقيقيا أو حاجة اختبار أو اعتمادية خارجية.
اختبر السياسة دون الاتصال بمزود خارجي
يحقن نموذج Python الكامل دالة تسليم في دالة تطبيق صغيرة. ويوضح نقطة فصل محلية، لا إطار معمارية كاملا. ترفض السياسة صفرا من المقاعد قبل التسليم وترسل رسالة لطلب موجب. تسجل قائمة الاستدعاء دون شبكة أو حساب أو بريد فعلي. يغيب تخزين الحجز عمدا؛ فلا يدعي النموذج تخصيصا ذريّا أو إعادة دائمة أو وصول الرسالة. يجعل نطاقه الصغير الاعتماد المعروض سهل الفحص.
def notify_reservation(seats, deliver):
if seats < 1:
return "rejected"
deliver("reservation accepted")
return "accepted"
messages = []
print(notify_reservation(1, messages.append))
print(notify_reservation(0, messages.append))
print(len(messages))
accepted
rejected
1
تعيد الدالة accepted ثم rejected وتحتوي القائمة رسالة واحدة. تمثل الأسماء سياسة تعليمية ولا يُخزّن حجز فعلي.
أبق قواعد الاعتماد مرئية بعد التصميم الأول
وثّق الاستيرادات المسموحة ونقاط الدخول العامة واختر فرضا يتناسب مع المشروع. قد تكفي المراجعة والاختبارات المركزة للمشروع الصغير، ويمكن للكبير إضافة فحص اعتماديات ثابت. اجعل القاعدة مفهومة واسمح باستثناءات مبررة لها مالكون وخطط إزالة. لا تصبح الوحدة مغلفة لمجرد وجود واجهة إذا تجاوزها الجميع بوصول مباشر إلى القاعدة. افحص بقاء التغييرات الممثلة داخل حدودها وعدّل التصميم إذا كشفت الاستثناءات المتكررة تقسيم مسؤوليات غير مناسب.
الأخطاء الشائعة وإصلاحها
تستورد سياسة العمل عميل بريد خاصا بمورد.
- لماذا يحدث؟
- عبرت تفاصيل الآلية حدود السياسة.
- كيف تصلحه؟
- قدّم واجهة إشعار بلغة المستدعي ونفذ محول المورد.
- كيف تتجنب تكراره؟
- راجع الاستيرادات وأنواع الاستثناء عند الحدود الخارجية.
تضاف واجهة لكل صنف دون سيناريو تغيير.
- لماذا يحدث؟
- أصبح عدد التجريدات هدفا بذاته.
- كيف تصلحه؟
- أبق الحدود التي تعزل غموضا فعليا وبسّط الباقي.
- كيف تتجنب تكراره؟
- اذكر حاجة الاستبدال أو الاختبار لكل تجريد.
تكتب الوحدات بحرية في جداول بعضها.
- لماذا يحدث؟
- اعتُبر فصل المجلدات ملكية مستقلة.
- كيف تصلحه؟
- حدّد مسار الكتابة المالك وانقل التجاوزات بخطة.
- كيف تتجنب تكراره؟
- أدرج الوصول للبيانات في مراجعة الاعتماديات.
اختبر فهمك
1. يتطلب مزود بريد جديد تعديل اختبارات تخصيص المقاعد. ماذا تفحص؟
اعرض الحل المشروح
ابحث عن أنواع المورد وافتراضات التنسيق واستثناءات التسليم المتسربة إلى السياسة. افصل فحوص المقاعد عن فحوص طلب المزود في المحول. وقد تكون بعض تغييرات التطبيق مشروعة إذا تغيرت دلالات التسليم فعلا. الهدف عزل تغيير الآلية مع حفظ السلوك، لا فرض عدد اختبارات ثابت.
2. لماذا لا يثبت مثال الدالة المحقونة موثوقية الإشعار؟
اعرض الحل المشروح
القائمة في ذاكرة العملية وتزول بعد التنفيذ. لا يوجد حجز دائم أو سجل رسالة ذري أو سياسة إعادة أو إقرار خارجي. يثبت المثال نقطة الفصل المحلية والاستدعاءات المذكورة فقط. يتطلب التنفيذ الموثوق عقودا واختبارات إضافية عند حدود التخزين والتسليم.
أهم ما تعلمته
- ينبغي أن تعزل حدود الوحدات المعرفة والتغيير.
- تدعم الواجهة عقدا ولا تنشئ ضمانات تشغيلية تلقائيا.