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 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