停止ruby对象的初始化

时间:2015-10-30 00:32:55

标签: ruby object-oriented-analysis

哪种不保存对象的最佳做法是因为没有通过某些验证?

我做过这堂课:

class Articles
  attr_reader :doi, :title, :issn

  def initialize data, doi_validator: Validators::Doi.new, title_validator: Validators::Title.new, issn_validator: Validators::Issn.new
    @doi, @title, @issn = data

    @doi_validator   = doi_validator
    @title_validator = title_validator
    @issn_validator  = issn_validator

    raise_error unless valid?
  end

  private

  def valid?
    (
      doi_validator.call(doi) && 
      title_validator.call(title) && 
      issn_validator.call(issn)
    )
  end

  attr_reader :doi_validator, :title_validator, :issn_validator
end

问题是,我希望停止实例化过程而不影响应用程序的流程,而不是引发错误。

可能最好的方法是在初始化实例化之前检查它,但这会使应用程序变得复杂。你有什么方法可以推荐吗?

1 个答案:

答案 0 :(得分:1)

如果您有类似

的内容
article = Articles.new(data)

然后只有两种可能性:

  • 提出异常; article =任务不会发生。你需要抓住例外。
  • 未提出异常; article现在包含Article个对象(可能无效)。

你可以走中间路线并制作一个新的类方法:

class Article
  def self.new_if_valid(*args)
    self.new(*args)
  rescue InitializationInvalidError
    nil
  end
end
class InitializationInvalidError < StandardError; end

编辑:实际上,你甚至可以把它变成混音,这很通用:

module NilIfInitializationFails
  def self.new_if_valid(*args)
    self.new(*args)
  rescue InitializationInvalidError
    nil
  end
end
class InitializationInvalidError < StandardError; end

class Article
  include NilIfInitializationFails
  # ....
end