冒险村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

  # 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


<<:  Wrap-up : Alpine Linux on LiteX/VexRiscv

>>:  JavaScript学习日记 : Day27 - 重做原生方法 -- Object

Day 24 | 在flutter 中串接 restful api - MobX的非同步操作

那今天就来让这个非同步资料透过MobX 来串接到画面上: 首先一样建立一个 UsersViewMod...

20 - Husky - Git Hooks 工具

为了维护专案程序码的品质,我们需要对提交的代码做各式的检查(例如: Lint 、 Format 、 ...

前端工程师也能开发全端网页:挑战 30 天用 React 加上 Firebase 打造社群网站|Day16 文章留言区块

连续 30 天不中断每天上传一支教学影片,教你如何用 React 加上 Firebase 打造社群...

[Day1] 前言

各位朋友好! 这是第一次参加iThome铁人赛~ 本次参加主要目标为完成挑战後,有能力制作个人网站,...

Android Studio初学笔记-Day13-ScrollView

ScrollView 今天要介绍的元件,当介面的内容开始变多时就派上用场了,毕竟手机萤幕或着各类3c...