哪种不保存对象的最佳做法是因为没有通过某些验证?
我做过这堂课:
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
问题是,我希望停止实例化过程而不影响应用程序的流程,而不是引发错误。
可能最好的方法是在初始化实例化之前检查它,但这会使应用程序变得复杂。你有什么方法可以推荐吗?
答案 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