[RUBY] Si vous avez des calculs compliqués, créons une classe CalcRule

S'il existe un processus de calcul, vous allez créer une méthode dans le modèle ActiveRecord associé [^ 1].

product.rb


class Product < ApplicationRecord
  def billing_price
    price * consumption_tax_rate
  end

  def consumption_tax_rate
    #Taux de taxe de retour à la consommation
  end
end

[^ 1]: Je l'omets car ce n'est pas le sujet principal, mais faisons correctement le calcul des nombres à virgule flottante! => [Ruby] Utiliser Big Decimal pour le calcul de la taxe à la consommation

Je ne ressens pas beaucoup de problème lors du calcul du montant TTC. Cependant, lorsque les remises sont lancées dans les campagnes ou que les conditions de remise se compliquent, la classe de produits semble être une classe de calcul monétaire.

product.rb


class Product < ApplicationRecord
  def billing_price
    campaign_discounted_price * consumption_tax_rate
  end

  def consumption_tax_rate
    #Taux de taxe de retour à la consommation
  end

  def campaign_discounted_price
    #Renvoyer le prix auquel la campagne a été appliquée
    #Cette méthode se complique lorsque la campagne se complique,
    #Le nombre de méthodes qui ne peuvent être appelées qu'à partir de cette méthode augmentera!
  end
end

Si rien n'est fait, il deviendra un Fat Model.

Créons une classe pour le calcul

Créez une classe qui calcule la taxe à la consommation et une classe qui calcule les remises de campagne.

consumption_tax_calc_rule.rb


class ConsumptionTaxCalcRule
  attr_accessor :price, :product_type
  # product_type est l'information permettant de décider d'appliquer ou non le taux d'imposition réduit (veuillez garder à l'esprit)
  def initialize(price, product_type)
    self.price = price
    self.product_type = product_type
  end

  def tax_included_price
    price * tax_rate
  end

  def tax_rate
    #Taux de taxe de retour à la consommation
  end
end

campaign_discount_calc_rule.rb


class CampaignDiscountCalcRule
  attr_accessor :price, :campaigns
  #les campagnes sont des informations sur les remises de campagne (veuillez garder à l'esprit)
  def initialize(price, campaigns)
    self.price = price
    self.campaigns = campaigns
  end

  def discounted_price
    #Même si plus de méthodes sont appelées uniquement à partir de cette méthode
    #Dans la classe de calcul des remises de campagne
    #Rien ne va pas car il n'y a que plus de méthodes pour les remises promotionnelles!
  end
end

La classe de produit utilise simplement la classe CalcRule.

product.rb


class Product < ApplicationRecord
  def billing_price
    discount_rule = CampaignDiscountCalcRule.new(price, campaigns)
    tax_rule = ConsumptionTaxCalcRule.new(discount_rule.discounted_price, product_type)
    tax_rule.tax_included_price
  end
end

Désormais, même si la taxe à la consommation change ou la campagne change, il vous suffit de vérifier la classe CalcRule!


Cette entrée concerne les règles d'entreprise (https://linyclar.github.io/software_development/requirements_analysis_driven_desgin/#%E3%83/) dans la conception pilotée par l'analyse des exigences (https://linyclar.github.io/software_development/requirements_analysis_driven_desgin/) % 93% E3% 82% B8% E3% 83% 8D% E3% 82% B9% E3% 83% AB% E3% 83% BC% E3% 83% AB) Montre un exemple concret et un contenu à usage général Il a été réécrit en. C'est une longue histoire, mais c'est une histoire de choses de type DDD dans Rails.

Recommended Posts

Si vous avez des calculs compliqués, créons une classe CalcRule
S'il y a une transition d'état, créons une classe State
Que faire si vous créez accidentellement un modèle
Si vous émettez une facture freeeAPI, faisons + mise à jour automatiquement! !!
Créez une classe temporaire avec le nouvel Object () {}