冒險村24 - Design Pattern(4) - Calculator

24 - Design Pattern(4) - Calculator

Calculator 的 design pattern 在平常算是沒看到的,主要是之前專案的規範裡面有看到這樣子的做法,覺得也算滿清楚且實用的。主要目的在偏向計算像是某服務的剩餘使用天數總和,或者是目前的價格,過去五天的價格平均計算。

Create app/services folder

  • service_price_calculator.rb

Add app > services > service_price_calculator.rb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# frozen_string_literal: true
class ServicePriceCalculator
def initialize(services)
@price_statistic = Hash.new(0)
@services = services
end

def perform
sum_price_by_services
end

private

def sum_price_by_services
@services.each do |service|
@price_statistic[service.price] += service.added_price
end
@price_statistic
end
end

可能某個 presenter 內需要用到這個計算,這邊就可以與前篇的部分來做結合了。

Add app > presenters > service_price_presenter.rb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# frozen_string_literal: true
class ServicePricePresenter
include Enumerable
def initialize(services)
@services = services
prepare_statistics
end

def each(&_block)
@statistics.each do |s|
yield ...
end
end

private

def prepare_statistics
calculate_result = ServicePriceCalculator.new(@services).perform
@statistics = calculate_result #...
end
end

其實東西滿簡單的,只是整理成一個好理解的獨立 service 來命名,也在閱讀上更好理解一個東西裡面只做單一事件,在撰寫測試上也更好寫。