سؤال

لدي سؤال تصميم حول التواصل بين النموذج والمقدم في نمط تصميم MVP - أو بشكل أكثر دقة شكله المشتق عرض سلبي.

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

يجب أن يكون النموذج الخاص بي هو مجموعة جميع الملفات التي فتحتها.

يتبادر التنفيذ المباشر إلى الأمام (رمز Pseudo Python):

الحل أ

class Model():
     def add(filename):
         # add file
         ...
         # return True if successful
         return True

class Presenter():
    # event from GUI
    def onFileOpen():
        filename = FileSelectorStuff()
        isFileAdded = model.add(filename)
        if isFileAdded:
            view.insertItem(filename)

في هذه الحالة ، أعلم أنه تمت إضافة الملف إلى النموذج ، وبالتالي أقوم بتحديث العرض وفقًا لذلك.

من ناحية أخرى ، يمكنني إضافة الملف إلى النموذج ، ثم انتظر حتى يتغير النموذج لي ذلك ، وعلي مقدم العرض تحديث العرض ، مثل ذلك:

الحل ب

class Model():
     def add(filename):
         # add file
         ...
         # alert controller
         modelChanged(Type.FileAdded, filename)

class Presenter():
    # event from GUI
    def onFileOpen():
        filename = FileSelectorStuff()
        model.add(filename)

    # event from model
    def onModelChanged(type, filename):
        if type == Type.FileAdded:
            view.insertItem(filename)
        elif type == Type.FileRemoved:
            ...

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

سؤالي الآن هو: هل يجب أن أقوم بخلط الطريقتين لتحديث العرض (A للتحديثات المتزامنة ، و B لـ Async) أو بالأحرى الحفاظ على كل شيء مركزيًا في مكان واحد كما هو مقترح في الحل B؟

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

المحلول

من المحتمل أن يتم حل هذه المشكلة لفترة طويلة ، لكنني ضربتها من محرك بحث ، لذا إليك إجابتي:

استخدام B. نسيان الخلط.

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

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

إجابتي النهائية:استخدم A ، أو استخدم B. لا تخلط.

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