ruby - 停止 ruby​​ 对象的初始化

标签 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

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

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

最佳答案

如果你有类似的东西

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

编辑:实际上,你甚至可以把它变成一个 mixin,它已经足够通用了:

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

关于ruby - 停止 ruby​​ 对象的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33427061/

相关文章:

ruby - oauth 不工作,对于基本的 LinkedIn http 请求

ruby - Rake 测试运行很慢

java - 检查对象是否已更改(保留良好的类设计)

java - 对象转换器的面向对象设计模式

ruby-on-rails - 如何使用 rails-ssl 需求插件在 rails 中的 https 页面中使用 http 参数

ruby - 如何终止其 PID 在 PID 文件中的进程?

ruby - 如何使用 -X GET -G 选项将 curl 转换为 Ruby Net::HTTP?

c# - 原始列表的浅克隆列表中的项目被清除会发生什么

oop - 实现接口(interface)的缺点

python - 没有行为的对象