红宝石 – 何时使用模块,何时使用类

我正在通过Gregory Brown Ruby Best Practices的书.早期,他正在谈论从相关类的帮助方法重构一些功能,对模块的一些方法,然后模块扩展自身.

没有看到之前,一个快速的谷歌,发现扩展自己的模块让模块上定义的方法看到对方,这是有道理的.

现在,我的问题是你什么时候会这样做

module StyleParser
  extend self

  def process(text)
    ...
  end

  def style_tag?(text)
    ...
  end
end

然后在测试中引用它

@parser = Prawn::Document::Text::StyleParser

而不是像这样的东西?

class StyleParser

  def self.process(text)
    ...
  end

  def self.style_tag?(text)
    ...
  end
end

是否可以使用它作为mixin?还是有其他原因我没看到?

解决方法

应该使用一个类来进行实例化或需要跟踪状态的功能.模块可以用作将功能混合到多个类中的方式,或者作为提供不需要被实例化或跟踪状态的一次性特征的方式.后者也可以使用类方法.

考虑到这一点,我认为这个区别在于你是否真的需要上课.当您有一个需要某些单例功能的现有类时,类方法似乎更合适.如果你所做的只包括单例方法,那么将它实现为一个模块并直接通过模块访问就更有意义了.

相关文章

以下代码导致我的问题: class Foo def initialize(n=0) @n = n end attr_accessor :n d...
这是我的spec文件,当为上下文添加测试“而不是可单独更新用户余额”时,我得到以下错误. require 's...
我有一个拦截器:DevelopmentMailInterceptor和一个启动拦截器的inititializer setup_mail.rb. 但我想将...
例如,如果我有YAML文件 en: questions: new: 'New Question' other: recent: ...
我听说在RSpec中避免它,let,let !,指定,之前和主题是最佳做法. 关于让,让!之前,如果不使用这些,我该如...
我在Rails中使用MongoDB和mongo_mapper gem,项目足够大.有什么办法可以将数据从Mongoid迁移到 Postgres...