MVP: اتصال النموذج
-
30-09-2019 - |
سؤال
لدي سؤال تصميم حول التواصل بين النموذج والمقدم في نمط تصميم 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. لا تخلط.