返回一个类型根据方法的内部逻辑而改变的对象是一个好主意吗?
例如:
class Error
attr_reader :details
def initialize(details)
@details = details
end
end
def div(a, b)
return Error.new("error: division by zero") if b == 0
a / b
end
# declare foo, bar here
result = div(foo, bar)
if result.is_a?(Error)
puts result.details
else
puts "result of division: #{result}"
end
可以看出,div方法返回一个Error示例或一个Integer示例。
这是一种不好的做法(为什么)?它是否违反了单一责任原则?
顺便说一句,我知道另一个选项是返回一个哈希{error:错误,div_结果:div_result},但我很好奇它是否可以仅用一个对象替换。
谢谢你。
1条答案
按热度按时间hc2pp10m1#
Ruby已经有了Exception Handling,而且它还包含一个
ZeroDivisionError
,当整数被零除时,ZeroDivisionError
会增加:请注意,您的
div
方法也不是必需的,您也可以编写result = 6 / 0
。返回一个类型根据方法的内部逻辑而改变的对象是一个好主意吗?
“type”在Ruby中是一个很难理解的术语。我猜你指的是“某个特定类的示例”之类的东西,比如整数或字符串?这要看情况而定。对于大多数方法来说,这肯定是个好主意,但也有一些例外。
例如,
Integer#+
返回基于其参数的结果:(您可能会认为这些都是Numeric
的子类)String#index
通常返回整数,但也可能返回nil
以指示“未找到”:Array#[]
返回存储在指定索引处的任何对象,因此具有任意返回值: