[RUBY] Wenn Sie komplizierte Berechnungen haben, erstellen wir eine CalcRule-Klasse

Wenn es einen Berechnungsprozess gibt, erstellen Sie eine Methode im zugehörigen ActiveRecord-Modell [^ 1].

product.rb


class Product < ApplicationRecord
  def billing_price
    price * consumption_tax_rate
  end

  def consumption_tax_rate
    #Verbrauchsteuersatz zurückgeben
  end
end

[^ 1]: Ich lasse es weg, weil es nicht das Hauptthema ist, aber lassen Sie uns die Berechnung der Gleitkommazahlen richtig durchführen! => [Ruby] Big Decimal für die Verbrauchsteuerberechnung verwenden

Ich habe kein so großes Problem bei der Berechnung des Steuerbetrags. Wenn jedoch Rabatte in Kampagnen gestartet werden oder die Rabattbedingungen kompliziert werden, scheint die Produktklasse eine monetäre Berechnungsklasse zu sein.

product.rb


class Product < ApplicationRecord
  def billing_price
    campaign_discounted_price * consumption_tax_rate
  end

  def consumption_tax_rate
    #Verbrauchsteuersatz zurückgeben
  end

  def campaign_discounted_price
    #Geben Sie den Preis zurück, auf den die Kampagne angewendet wurde
    #Diese Methode wird kompliziert, wenn die Kampagne kompliziert wird.
    #Die Anzahl der Methoden, die nur mit dieser Methode aufgerufen werden können, erhöht sich!
  end
end

Wenn nichts getan wird, wird es ein Fettmodell.

Erstellen wir eine Klasse für die Berechnung

Erstellen Sie eine Klasse, die die Verbrauchsteuer berechnet, und eine Klasse, die Kampagnenrabatte berechnet.

consumption_tax_calc_rule.rb


class ConsumptionTaxCalcRule
  attr_accessor :price, :product_type
  # product_Typ ist die Information, um zu entscheiden, ob der reduzierte Steuersatz angewendet werden soll (bitte beachten Sie)
  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
    #Verbrauchsteuersatz zurückgeben
  end
end

campaign_discount_calc_rule.rb


class CampaignDiscountCalcRule
  attr_accessor :price, :campaigns
  #Kampagnen sind Informationen für Kampagnenrabatte (bitte beachten Sie)
  def initialize(price, campaigns)
    self.price = price
    self.campaigns = campaigns
  end

  def discounted_price
    #Auch wenn mehr Methoden nur von dieser Methode aufgerufen werden
    #In der Berechnungsklasse für Kampagnenrabatte
    #Nichts ist falsch, denn es gibt nur mehr Methoden für Kampagnenrabatte!
  end
end

Die Produktklasse verwendet nur die CalcRule-Klasse.

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

Selbst wenn sich die Verbrauchssteuer oder die Kampagne ändert, müssen Sie jetzt nur noch die CalcRule-Klasse überprüfen!


Dieser Eintrag bezieht sich auf Geschäftsregeln (https://linyclar.github.io/software_development/requirements_analysis_driven_desgin/#%E3%83/) in Requirements Analysis Driven Design (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) Zeigt ein konkretes Beispiel und einen allgemeinen Inhalt Es wurde umgeschrieben. Es ist eine lange Geschichte, aber es ist eine Geschichte über DDD-ähnliche Dinge in Rails.

Recommended Posts

Wenn Sie komplizierte Berechnungen haben, erstellen wir eine CalcRule-Klasse
Wenn es einen Statusübergang gibt, erstellen wir eine Statusklasse
Was tun, wenn Sie versehentlich ein Modell erstellen?
Wenn Sie eine freeeAPI-Rechnung ausstellen, lassen Sie uns + automatisch aktualisieren! !!
Erstellen Sie eine temporäre Klasse mit new Object () {}