هل أقوم بتنفيذ نمط واجهة المستخدم MVP / العرض التقديمي بشكل صحيح؟

StackOverflow https://stackoverflow.com/questions/3435834

سؤال

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


لقد قررت إعداد تبعيات على النحو التالي:

   Model <---- Presentation Model <---- View

هذا هو:

  • النموذج ليس على علم بأي شيء باستثناء نفسه.

  • يحتوي نموذج العرض التقديمي على إشارة إلى النموذج (ولكن ليس العكس).

  • يحتوي العرض على إشارة إلى نموذج العرض التقديمي (ولكن ليس العكس).

أنا أستخدم ربط بيانات WinForms للحفاظ على العرض ونموذج العرض التقديمي متزامن.

الآن كل هذا يعمل مثل السحر ، إلا عندما أحتاج إلى التعامل مع زر "إغلاق" النموذج على سبيل المثال. نظرًا لأن نموذج العرض التقديمي ليس له أي إشارة إلى العرض ، فلا يمكنه الاشتراك في أي أحداث نشرتها العرض. وهكذا توصلت إلى العكاز التالي:

Presentation Model                   View
+--+                                 +--+
|  |                                 |  |
|  |                                 | <--------X closeButton.Click event fires
|  |                                 |  |
|  |                         +--------X |
|  |   CloseRequested = true |       |  | 
|  |                         +--------> |
|  |                                 |  |
|  | CloseRequested   CloseRequested |  |
| <-----------------------------------< |
|  |                                 |  |
| X--------+                         |  |
|  |       | IsClosed = true         |  |
| <--------+                         |  |
|  |                                 |  |
|  | IsClosed              MustClose |  |
| >-----------------------------------> |
|  |                                 |  |
|  |                                 | X--------> view.Close()
|  |                                 |  |
+--+                                 +--+

هذا هو:

  • ينقر المستخدم على زر "إغلاق".

  • الزر Click يتم التقاط الحدث في العرض ، الذي يتفاعل عن طريق تعيين العقار CloseRequested.

  • يقوم ربط البيانات بنقل هذه القيمة إلى خاصية مقابلة في نموذج العرض التقديمي.

  • يتفاعل نموذج العرض التقديمي مع هذا التغيير عن طريق تعيين ممتلكاته IsClosed.

  • يقوم ربط البيانات بنقل هذه القيمة إلى العرض MustClose.

  • يتفاعل العرض مع هذا التغيير عن طريق إغلاق نفسه.

تم فصل نموذج العرض التقديمي بشكل جيد تمامًا من العرض ، والعكس بالعكس هذا كثير من العمل فقط لمعالجة أمر زر واحد. هل هناك طريقة أسهل ، بالنظر إلى الرسم البياني التبعي الذي قررته؟

هل كانت مفيدة؟

المحلول

لقد قمت مؤخرًا بتحويل تطبيق Windows Forms إلى بنية MVP ، ويبدو أنك قمت بإعداد تبعياتك بطريقة مماثلة لما كنت أفعله. ومع ذلك ، لدي ببساطة IPresenter الواجهة التي تحدد الطرق للسماح للعرض بتمرير طلبات المستخدم. نظرًا لأن العرض لديه بالفعل اعتماد على مقدم العرض والإشارة إليه ، يبدو من المعقول ببساطة استدعاء طرق طلبها مباشرة.

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

نصائح أخرى

إنه رأيي فقط.

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

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

يحتوي العرض على إشارة إلى نموذج العرض التقديمي (ولكن ليس العكس).

يجب أن يكون لدى AFAIK العرض التقديمي لعرض المزيد على وجه التحديد لواجهة IVIEW بحيث يكون العرض التقديمي مع عرض ملموسة. ثم في فئة العرض التقديمي ، يمكنك استدعاء طرق العرض والاشتراك لعرض الأحداث عبر IVIEW.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top