iT邦幫忙

2021 iThome 鐵人賽

DAY 24
0
自我挑戰組

冒險村-30 Day Ruby on Rails Tips Challenge系列 第 24

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

  • 分享至 

  • xImage
  •  

24 - Design Pattern(4) - Calculator

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

Create app/services folder

  • service_price_calculator.rb

Add app > services > service_price_calculator.rb

  # 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

  # 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 來命名,也在閱讀上更好理解一個東西裡面只做單一事件,在撰寫測試上也更好寫。

My blog


上一篇
冒險村23 - Design Pattern(3) - Builder
下一篇
冒險村25 - Design Pattern(5) - Service Object
系列文
冒險村-30 Day Ruby on Rails Tips Challenge30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言