目前阅读精彩的书籍“Ruby中的实用面向对象设计”,并通过一个简单的kata来真正实践它所讨论的一些原理。
我有一个方法可以执行以下操作:
def release_bike
capacity_empty_error if empty?
bike
end
这会从我的DockingStation类中释放一个自行车对象(我知道自行车对象应该是一个参数,但暂时我只想让方法返回自行车对象,而不是删除它。)
#capacity_empty_error执行以下操作:
def capacity_empty_error
raise "Docking Station is empty."
end
和#empty?看起来像:
def empty?
bike == nil
end
其中bike是我的实例变量@bike的包装器方法。因此,DockingStation类的当前容量为1,因为当#bike设置为某个值时,代码假定它已满(我计划稍后添加适当的容量)。
希望这能解释我的代码,请提出问题并提出改进建议,如果没有,我想问的问题是:
我觉得#release_bike中的守护条款行:
capacity_empty_error if empty?
是该方法的一项责任,下一行中bike
的返回是第二项责任。然后显然打破了SRP,但我看不出如何使用保护条款,除非将其作为第二责任添加到现有方法中。
可以吗?别人怎么做到了?
答案 0 :(得分:1)
将功能移动到其他类/模块怎么样?
module BikeChecker
def capacity_empty_error
raise "Docking Station is empty."
end
def release_bike
capacity_empty_error if empty?
end
def empty?
false
end
end
class YourClass
include BikeChecker
def release_bike
super
bike
end
def empty?
bike == nil
end
end
你可以放弃#empty吗?来自BikeChecker的方法,我把它留在这里以便更好地理解