ConstructiCat Logo
CodeBust.
Browse section ▾

تكرار البيانات المرصودة.

Problem

هل يتم تخزين بيانات النطاق (domain data) في فئات مسؤولة عن واجهة المستخدم الرسومية (GUI)؟

Solution

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

##Example

قبل
Duplicate Observed Data - Before
بعد
Duplicate Observed Data - After

##Why Refactor

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

##Benefits

  • تقوم بتقسيم المسؤولية بين فئات منطق العمل (business logic) وفئات العرض (presentation) (قارن مع مبدأ المسؤولية الفردية)، مما يجعل برنامجك أكثر وضوحاً وفهماً.

  • إذا كنت بحاجة إلى إضافة واجهة عرض جديدة، فستنشئ فئات عرض جديدة؛ ولا تحتاج إلى تعديل كود منطق العمل (قارن مع مبدأ المفتوح/المغلق).

  • الآن يمكن لأشخاص مختلفين العمل على منطق العمل وواجهات المستخدم بشكل مستقل.

##How to Refactor

  1. أخفِ الوصول المباشر إلى بيانات النطاق في فئة واجهة المستخدم الرسومية (GUI class). لهذا، من الأفضل استخدام طريقة التغليف الذاتي للحقل. وبالتالي تقوم بإنشاء دوال الحصول والتعيين (getters and setters) لهذه البيانات.

  2. في معالجات أحداث فئة واجهة المستخدم الرسومية، استخدم دوال التعيين لتعيين قيم الحقول الجديدة. سيسمح لك هذا بتمرير هذه القيم إلى كائن النطاق (domain object) المرتبط.

  3. أنشئ فئة نطاق (domain class) وانسخ الحقول اللازمة من فئة واجهة المستخدم الرسومية إليها. أنشئ دوال الحصول والتعيين لكل هذه الحقول.

  4. أنشئ نمط المراقب (Observer pattern) لهاتين الفئتين:

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

    • في فئة واجهة المستخدم الرسومية، أنشئ حقلاً لتخزين المراجع إلى فئة النطاق بالإضافة إلى دالة update()، والتي ستستجيب للتغييرات في الكائن وتحدث قيم الحقول في فئة واجهة المستخدم الرسومية. لاحظ أنه يجب تعيين تحديثات القيم مباشرة في الدالة لتجنب التكرار اللانهائي (recursion).

    • في منشئ فئة واجهة المستخدم الرسومية، أنشئ نسخة من فئة النطاق واحفظها في الحقل الذي أنشأته. سجل كائن واجهة المستخدم الرسومية كمراقب في كائن النطاق.

    • في دوال التعيين لحقول فئة النطاق، استدعِ دالة إشعار المراقب (بمعنى آخر، دالة التحديث في فئة واجهة المستخدم الرسومية) لتمرير القيم الجديدة إلى واجهة المستخدم الرسومية.

    • قم بتغيير دوال التعيين لحقول فئة واجهة المستخدم الرسومية بحيث تقوم بتعيين القيم الجديدة في كائن النطاق مباشرة. تأكد من عدم تعيين القيم عبر دالة تعيين فئة النطاق—وإلا فسيؤدي ذلك إلى تكرار لانهائي.