最近做代码重构,用到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,减少了大量的重复代码,为以后的开发和重构提供了方便。