سؤال

حاليا أنا إجراء بعض العمليات الحسابية في وجهات نظري ، وهو أمر سيء ، بطبيعة الحال:

<% categories.each do |c| %>
  ....
    <%= c.transactions.sum("amount_cents") %>
  ....
<% end %>

أنا أبحث عن طرق من شأنها أن تساعدني على إعادة صياغة المشكلة المذكورة أعلاه.

شيء واحد هو نقل الحساب إلى وحدة التحكم الخاصة بي

@category_sum = @transaction.sum("amount_cents")

وهو على الأرجح حل أفضل ، لكنك تعلم.ليس مثاليا.

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

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

المحلول

أحد وسائل عزل منطق العرض هو استخدام المقدمين.

مقدم يسمح لك أن تفعل شيئا من هذا القبيل :

<% categories.each do |c| %>
  ....
    <% present c do |category| %>
    <%= category.transaction_sum %>
    <% end %>
  ....
<% end %>

ثم لديك فئة مقدم في app/presenters/category_presenter.rb :

class CategoryPresenter < BasePresenter
  presents :category

  def transaction_sum
    category.transactions.sum("amount_cents")
  end
end

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

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

بديل شعبي آخر هو استخدام درابر, ، والتي تستخدم مفهوم الديكور ، ولكن مقدم هو في الأساس الديكور.

نصائح أخرى

تسمى رائحة الكود الرئيسية التي تراها قانون ديميتر (والتي ، مثل العديد من "قوانين" البرمجة ، يجب أن تفكر في الأمر أشبه بـ "دليل ديميتر").

ما يمكنك فعله هو نقل خطوة الحساب الفعلية إلى طريقة في الفئة ، على سبيل المثال.

class Category < ActiveRecord::Base
  def transaction_amount
    transactions.sum("amount_cents")
  end
end

<% categories.each do |c| %>
  ....
    <%= c.transaction_amount %>
  ....
<% end %>

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

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