如果对象未通过某些验证,最佳做法是不保存该对象?
我已经完成了这门课:
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/