java - نمط MVC على Android





design-patterns model-view-controller (18)


MVC- الهندسة المعمارية على الروبوت من الأفضل أن تتبع أي MVP بدلا MVC في الروبوت. ولكن لا يزال الجواب على هذا السؤال هو الحل

الوصف والمبادئ التوجيهية

     Controller -
        Activity can play the role.
        Use an application class to write the
        global methods and define, and avoid
        static variables in the controller label
    Model -
        Entity like - user, Product, and Customer class.
    View -
        XML layout files.
    ViewModel -
        Class with like CartItem and owner
        models with multiple class properties
    Service -
        DataService- All the tables which have logic
        to get the data to bind the models - UserTable,
        CustomerTable
        NetworkService - Service logic binds the
        logic with network call - Login Service
Helpers -
        StringHelper, ValidationHelper static
        methods for helping format and validation code.
SharedView - fragmets or shared views from the code
        can be separated here

AppConstant -
        Use the Values folder XML files
        for constant app level

الملاحظة 1:

الآن هنا قطعة السحر التي يمكنك القيام بها. بمجرد تصنيف قطعة التعليمات البرمجية ، اكتب فئة واجهة أساسية مثل IEntity و IService. أعلن عن الطرق الشائعة. الآن إنشاء فئة مجردة BaseService وتعلن مجموعة من الأساليب الخاصة بك ويكون فصل التعليمات البرمجية.

ملاحظة 2: إذا كان نشاطك يقدم نماذج متعددة بدلاً من كتابة الكود / المنطق في النشاط ، فمن الأفضل تقسيم المشاهدات في الأجزاء. إذاً من الأفضل لذلك في المستقبل إذا كان هناك حاجة إلى المزيد من النماذج لتظهر في العرض ، أضف جزءًا آخر.

ملاحظة 3: فصل الكود مهم جدا. يجب أن يكون كل مكون في البنية مستقلاً وليس له منطق منطقي. إذا كان عن طريق الصدفة إذا كان لديك منطق مستقل ، فاكتب فئة منطقية للمناظرة بينهما. هذا سوف يساعدك في المستقبل.

هل من الممكن تطبيق نموذج وحدة التحكم في العرض في Java for Android؟

أم أنها نفذت بالفعل من خلال الأنشطة؟ أم أن هناك طريقة أفضل لتنفيذ نمط MVC لنظام Android؟




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

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

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




أعتقد أن التفسير المبسط الأكثر فائدة هو: http://www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf

من كل شيء آخر رأيته وقراءته هنا ، فإن تنفيذ كل هذه الأشياء يجعل الأمر أصعب ولا يتناسب بشكل جيد مع أجزاء أخرى من android.

وجود نشاط تنفيذ المستمعين الآخرين هو بالفعل طريقة أندرويد القياسية. الطريقة الأكثر ضررًا هي إضافة Java Observer مثل الشرائح ووصف مجموعة onClick وأنواع أخرى من الإجراءات في الوظائف التي لا تزال في النشاط.

طريقة أندرويد هي أن النشاط يقوم بهما. محاربته لا يجعل حقا تمديد أو القيام الترميز المستقبلية أسهل.

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




أفضل مورد وجدته لتنفيذ MVC على Android هو هذا المنشور :

لقد اتبعت نفس التصميم لأحد مشروعاتي ، وعملت بشكل رائع. أنا مبتدئ على Android ، لذا لا يمكنني القول أن هذا هو الحل الأفضل.

لقد قمت بإجراء تعديل واحد: قمت بإنشاء نموذج وحدة تحكم لكل نشاط في فئة التطبيق بحيث لا يتم إعادة إنشاء هذه الصور عند تغيير وضع عمودي - أفقي.







يمكنك تنفيذ MVC في Android ، ولكنه ليس "مدعومًا أصلاً" ويأخذ بعض الجهد.

ومع ذلك ، أنا شخصياً أميل إلى MVP كنمط معماري أنظف بكثير لتطوير Android. وبقول MVP أعني هذا:

لقد نشرت أيضًا إجابة أكثر تفصيلاً here .

بعد اللعب مع الطرق المختلفة لتنفيذ MVC / MVP في Android ، توصلت إلى نمط معماري معقول ، وصفته في هذا المنشور : MVP و MVC Patterns المعمارية في Android .




وفقا لشرح أن فريق Xamarin أوضح (على MVC iOS "أعلم أنه يبدو غريبا ، ولكن انتظر لحظة"):

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

أستطيع أن أقول هذا:

النموذج على Android هو ببساطة كائن قابل للتجزئة. العرض هو تخطيط XML ، ووحدة التحكم هي (النشاط + جزء منه).

* هذا مجرد رأيي ، وليس من أي مورد أو كتاب.




تعبت من كارثة MVx على Android قمت مؤخرًا بإنشاء مكتبة صغيرة توفر تدفقًا أحاديًا للبيانات وتشبه مفهوم MVC: https://github.com/zserge/anvil

في الأساس ، لديك مكون (نشاط ، جزء ، ومجموعة عرض). في داخلك تعرّف بنية ونمط طبقة العرض. كما يمكنك تحديد كيفية ربط البيانات مع وجهات النظر. وأخيرًا ، يمكنك ربط المستمعين في نفس المكان.

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

في ما يلي مثال للمكوِّن الذي يحتوي على كل شيء بداخله لاكتمال الرمز (يمكن بالطبع الفصل بين الطراز ووحدة التحكم). هنا "العد" هو نموذج ، وطريقة العرض () هي طريقة عرض ، و "v -> count ++" هي وحدة تحكم تستمع إلى نقرات الزر وتحديث النموذج.

public MyView extends RenderableView {
  public MyView(Context c) {
      super(c);
  }

  private int count = 0;

  public void view() {
    frameLayout(() -> {              // Define your view hierarchy
      size(FILL, WRAP);
      button(() -> {
          textColor(Color.RED);      // Define view style
          text("Clicked " + count);  // Bind data
          onClick(v -> count++);     // Bind listeners
      });
    });
  }

مع النموذج المنفصل ووحدة التحكم ، سيبدو الأمر كما يلي:

button(() -> {
   textColor(Color.RED);
   text("Clicked " + mModel.getClickCount());
   onClick(mController::onButtonClicked);
});

هنا على كل زر انقر على الرقم الذي سيتم زيادته ، ثم سيتم استدعاء "render ()" ، وسيتم تحديث نص الزر.

يصبح بناء الجملة أكثر متعة إذا كنت تستخدم Kotlin: http://zserge.com/blog/anvil-kotlin.html . أيضا ، هناك صيغة بديلة لجافا دون lambdas.

المكتبة نفسها خفيفة الوزن للغاية ، وليس لها اعتمادية ، ولا تستخدم أي انعكاس ، إلخ.

(إخلاء المسؤولية: أنا مؤلف هذه المكتبة)




وحدة تحكم عرض النموذج (MVC)

وصف:

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

نمط MVC هو في الأساس هذا:

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

ميزة هامة لـ MVC: يمكننا تعديل إما أن النموذج أو العرض أو وحدة التحكم لا يزالان غير مؤثرين على النموذج الآخر

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



عندما نطبق MVC أو MVVM أو نموذج العرض التقديمي على تطبيق Android ، فإن ما نريده حقًا هو وجود مشروع منظم واضح والأهم من ذلك بالنسبة لاختبارات الوحدة.

في الوقت الحالي ، بدون إطار لجهة خارجية ، عادة ما يكون لديك الكثير من التعليمات البرمجية (مثل addXXListener () ، findViewById () ، إلخ.) ، والتي لا تضيف أي قيمة تجارية.

ما هو أكثر من ذلك ، عليك تشغيل اختبارات وحدة Android بدلاً من اختبارات JUnit العادية ، والتي تستغرق أعمارًا للتشغيل وجعل اختبارات الوحدة غير عملية إلى حدٍ ما. لهذه الأسباب ، بدأنا منذ بضع سنوات مشروعًا مفتوح المصدر ، RoboBinding - إطار عرض نموذج ربط البيانات لمنصة Android.

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




في Android ، ليس لديك MVC ، ولكن لديك ما يلي:

  • يمكنك تعريف واجهة المستخدم الخاصة بك في ملفات XML المختلفة من خلال القرار ، والأجهزة ، إلخ.
  • يمكنك تحديد resources الخاصة بك في ملفات XML المختلفة حسب الإعدادات المحلية ، إلخ.
  • يمكنك توسيع ListActivity مثل ListActivity و TabActivity والاستفادة من ملف XML بواسطة inflaters .
  • يمكنك إنشاء العديد من الفئات التي ترغب فيها لمنطق عملك.
  • لقد تم بالفعل كتابة الكثير من Utils لك - DatabaseUtils، Html.



لا يوجد نمط MVC فريد عالميًا. MVC هو مفهوم وليس إطار عمل برمجة قوي. يمكنك تنفيذ MVC الخاص بك على أي نظام أساسي. طالما أنك تلتزم بالفكرة الأساسية التالية ، فأنت تقوم بتنفيذ MVC:

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

فكّر أيضًا بهذه الطريقة: عند برمجة نموذجك ، لا داعي لأن يقلق النموذج بشأن العرض (أو رمز معين في النظام الأساسي). سيقول النموذج في طريقة العرض ، لا يهمني إذا كان العرض الخاص بك هو Android أو iOS أو Windows Phone ، هذا ما أحتاجه لتقديمه. سيتعامل العرض مع شفرة العرض الخاصة بالنظام الأساسي فقط.

وهذا مفيد بشكل خاص عند استخدام Mono لمشاركة النموذج لتطوير تطبيقات عبر النظام الأساسي.




على الرغم من أن هذه المشاركة قديمة ، إلا أنني أود إضافة الرقمين التاليين للإبلاغ عن التطوير الأخير في هذا المجال لنظام Android:

android-binding - توفير إطار عمل يعمل على تجليد عناصر واجهة التعامل مع عرض android لنموذج البيانات. فهو يساعد على تنفيذ أنماط MVC أو MVVM في تطبيقات Android.

roboguice - RoboGuice يأخذ التخمين من التنمية. قم بحقن العرض أو الموارد أو خدمة النظام أو أي كائن آخر ، واترك RoboGuice يهتم بالتفاصيل.




نمط MVC الخاص بنظام Android هو (نوع) تم تنفيذه مع فئات Adapter الخاصة به. يستبدلون وحدة تحكم مع "محول". يوضح وصف حالات المحول:

يعمل كائن المهايئ كجسر بين محول Adapter والبيانات الأساسية لهذا العرض.

أنا أبحث فقط في هذا عن تطبيق Android الذي يقرأ من قاعدة بيانات ، لذلك لا أعرف مدى نجاحها حتى الآن. ومع ذلك ، يبدو الأمر وكأنه نموذج كيو تي في العرض - المندوب ، الذي يزعمون أنه خطوة من نمط MVC التقليدي. على الأقل على جهاز الكمبيوتر ، يعمل نمط كيو تي بشكل جيد.




لقد رأيت أن العديد من الأشخاص يقولون إن MVC قد تم تنفيذه بالفعل في Android ، ولكن هذا ليس صحيحًا. لا يتبع نظام Android أي MVC افتراضيًا.

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

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

http://www.therealjoshua.com/2011/11/android-architecture-part-1-intro/




كان من المستغرب أن نرى أن أيا من المشاركات هنا أجاب على السؤال. فهي إما عامة جدًا أو غامضة أو غير صحيحة أو لا تتناول التنفيذ في Android.

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

يمكن تلخيص هذا التدفق على النحو التالي:

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

في الجزء المتعلق بالتنفيذ ، من أول الأشياء التي تتبادر إلى الذهن هو ما يجب استخدام مكون android للعرض؟ Activity أو Fragment ؟

الجواب هو أنه لا يهم ، ويمكن استخدام كليهما. يجب أن يكون العرض قادرًا على تقديم واجهة المستخدم (UI) على الجهاز والرد على تفاعل المستخدم مع واجهة المستخدم. يوفر كل من Activity Fragment الطرق المطلوبة لذلك.

في نموذج التطبيق المستخدم في هذه المقالة ، استخدمت Activity طبقة العرض ، ولكن يمكن أيضًا استخدام Fragment .

التطبيق عينة كاملة يمكن العثور عليها في فرع "mvc" من بلدي ريبو جيث here .

لقد تعاملت أيضا مع إيجابيات وسلبيات بنية MVC في الروبوت من خلال مثال هنا .

لأولئك المهتمين ، لقد بدأت سلسلة من المقالات حول بنية التطبيق الروبوت here والتي أقارن فيها البنى المختلفة ، أي MVC ، MVP ، MVVM ، لتطوير تطبيقات الروبوت من خلال تطبيق عمل كامل.




أتفق مع JDPeckham ، وأعتقد أن XML وحده لا يكفي لتنفيذ جزء واجهة المستخدم من التطبيق.

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

(بدلاً من ذلك ، يمكنك استخدام نمط المفرد كما هو موضح في وثائق التطبيق)




لا أعرف ما إذا كانت هذه هي حالة الاستخدام "الرسمية" ، ولكن ما يلي ينتج تحذيرًا في Java (يمكن أن ينتج المزيد من أخطاء الترجمة إذا تم مزجها بعبارات return ، مما يؤدي إلى رمز غير قابل للوصول):

while (1 == 2) { // Note that "if" is treated differently
    System.out.println("Unreachable code");
}

ومع ذلك هذا قانوني:

while (isUserAGoat()) {
    System.out.println("Unreachable but determined at runtime, not at compile time");
}

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

يشير JLS إلى if (false) لا يؤدي إلى تشغيل "كود يتعذر الوصول إليه" لسبب محدد وهو أن هذا سيؤدي إلى قطع الدعم عن إشارات التصحيح ، أي أساسًا حالة الاستخدام هذه (h / tauselen). (القيمة static final boolean DEBUG = false; على سبيل المثال).

أنا محل في while ل ، if ، إنتاج حالة استخدام أكثر غموضا. أعتقد أنه يمكنك تحريك IDE الخاص بك ، مثل Eclipse ، مع هذا السلوك ، ولكن هذا التعديل هو 4 سنوات في المستقبل ، وليس لدي بيئة Eclipse للعب معها.





java android design-patterns model-view-controller