浅谈 rails中的 module

最近做代码重构,用到module,发现用起来有些疑问,所以花点时间学习整理一下,其实module还蛮有意思的。

module简介

  • 模块(Module)是一种把方法、类和常量组合在一起的方式。模块(Module)为您提供了两大好处。

    • 模块提供了一个命名空间和避免名字冲突。
    • 模块实现了mixin装置。
  • 模块(Module)定义了一个命名空间,相当于一个沙盒,在里边您的方法和常量不会与其他地方的方法常量冲突。

  • 模块类似于类(Class),但有以下不同:

    • 模块不能实例化

    • 模块没有子类

    • 模块只能被另一个模块定义

  • 作为工具模块,放通用方法,别的类里面直接include或者extend以后使用

module 用法

  • 定义
module PurchaseAndPriceCalculator
  extend ActiveSupport::Concern
  extend self
  module ClassMethods
    def test_class_methods
      puts "这是一个类方法"
    end
  end

  def test_instant_methods
    puts "这是一个实例方法"
  end
end
  • class中include
class ConfirmedPrice < ApplicationRecord
  # 价格相关计算逻辑
  include PurchaseAndPriceCalculator
end

class PurchaseItem < ApplicationRecord
  # 价格相关计算逻辑
  include PurchaseAndPriceCalculator
end
  • 用法
Loading development environment (Rails 5.1.4)
[1] pry(main)> PurchaseItem.new.test_instant_methods
这是一个实例方法
=> nil
[2] pry(main)> PurchaseItem.test_class_methods
这是一个类方法
=> nil
[3] pry(main)> PurchaseAndPriceCalculator.test_instant_methods
这是一个实例方法
=> nil

用例中用到extend ActiveSupport::Concern,使module间的依赖从属关系处理起来变得简单多了,将两个model中的公用逻辑提取出来放入module,减少了大量的重复代码,为以后的开发和重构提供了方便。

你可能感兴趣的:(浅谈 rails中的 module)