نموذج ريلز، والعرض، ووحدة التحكم، والمساعد:ماذا يذهب أين؟

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

سؤال

في Ruby on Rails Development (أو MVC بشكل عام)، ما هي القاعدة السريعة التي يجب أن أتبعها فيما يتعلق بمكان وضع المنطق؟

الرجاء الإجابة بالإيجاب - مع ضع هذا هنا, ، بدلا من لا تضع ذلك هناك.

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

المحلول

MVC

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

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

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

نصائح أخرى

للإضافة إلى إجابة pauliephonic:

المساعد:وظائف لتسهيل إنشاء طريقة العرض.على سبيل المثال، إذا كنت تقوم دائمًا بالتكرار على قائمة الأدوات لعرض أسعارها، فضعها في مساعد (جنبًا إلى جنب مع جزء من العرض الفعلي).أو إذا كان لديك قطعة من RJS لا تريد أن تشوش العرض، فضعها في أداة مساعدة.

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

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

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

لاحظ أنني لا أتحدث عن ريلز هنا، فأنا أتحدث عن نمط معماري عام يعالج مشكلتك الخاصة.

تفسيرات مثالية هنا بالفعل، جملة واحدة بسيطة جدًا كخاتمة وسهلة التذكر:

نحن بحاجة إلى نماذج ذكية، ووحدات تحكم رفيعة، ووجهات نظر غبية.

http://c2.com/cgi/wiki?ModelViewController

طريقة ريلز هي أن تمتلك وحدات تحكم نحيفة ونماذج سمينة.

قم بوضع الأشياء المتعلقة بالتفويض/التحكم في الوصول في وحدة التحكم.

النماذج تدور حول بياناتك.التحقق من الصحة، العلاقات، CRUD، منطق الأعمال

المشاهدات تدور حول إظهار بياناتك.العرض والحصول على المدخلات فقط.

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

أحب أن أفكر في وحدة التحكم كحارس أمن/موظف استقبال يوجهك العميل (الطلب) إلى العداد المناسب حيث تطرح سؤالاً على الصراف (عرض).ثم يذهب الصراف (العرض) ويحصل على الإجابة من المدير (النموذج) الذي لا تراه أبدًا.أنت مقدم الطلب ثم ارجع إلى حارس الأمن/موظف الاستقبال (المراقب) وانتظر حتى يتم توجيهك للذهاب إلى صراف آخر (عرض) الذي يخبرك بالإجابة التي أخبرهم بها المدير (عارضة الأزياء) ردًا على سؤال الصراف الآخر (عرض) .

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

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

الشيء الوحيد الذي يساعد على الانفصال بشكل صحيح هو تجنب النمط المضاد "تمرير المتغيرات المحلية من وحدة التحكم إلى العرض".بدلا من هذا:

# app/controllers/foos_controller.rb:
class FoosController < ApplicationController

  def show
    @foo = Foo.find(...)
  end

end

#app/views/foos/show.html.erb:
...
<%= @foo.bar %>
...

حاول نقله إلى أداة getter المتوفرة كطريقة مساعدة:

# app/controllers/foos_controller.rb:
class FoosController < ApplicationController

  helper_method :foo

  def show
  end

  protected

  def foo
    @foo ||= Foo.find(...)
  end

end

#app/views/foos/show.html.erb:
...
<%= foo.bar %>
...

وهذا يجعل من السهل تعديل ما يتم وضعه في "@foo" وكيفية استخدامه.فهو يزيد من الفصل بين وحدة التحكم والعرض دون أن يزيد الأمر تعقيدًا.

حسنًا، الأمر يعتمد نوعًا ما على ما يجب أن يتعامل معه المنطق...

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

كما يكشف جزء سريع من Google عن بعض الأمثلة الملموسة لما يحدث وأين.

نموذج:متطلبات التحقق من الصحة، وعلاقات البيانات، وإنشاء الأساليب، وتحديث الأساليب، وتدمير الأساليب، والعثور على الأساليب (لاحظ أنه لا ينبغي أن يكون لديك فقط الإصدارات العامة من هذه الأساليب، ولكن إذا كان هناك شيء تفعله كثيرًا، مثل العثور على أشخاص ذوي شعر أحمر عن طريق الاسم الأخير، فيجب عليك استخراج هذا المنطق بحيث يكون كل ما عليك فعله هو الاتصال بـ find_redH_by_name("smith") أو شيء من هذا القبيل)

منظر:يجب أن يتعلق هذا بتنسيق البيانات، وليس بمعالجتها.

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

امل ان يساعد.

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

وحدات التحكم سيكون لها رمز/مؤشرات نحو النماذج ذات الصلة بالمهمة المطلوبة.

الآراء سيقبل إدخال/تفاعل المستخدم ويعرض الاستجابة الناتجة.

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

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

ي

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