保护条款和单一职责原则 (SRP)
Guard Clauses and the Single Responsibility Principle (SRP)
目前正在阅读这本很棒的书 'Practical Object Orientated Design In Ruby' 并通过一个简单的型来真正练习其中讨论的一些原则。
我有一个方法可以执行以下操作:
def release_bike
capacity_empty_error if empty?
bike
end
这个 'releases a bike object' 来自我的 DockingStation class(我知道 bike 对象应该是一个参数,但目前我只想要 return bike 的方法对象,而不是删除它)。
#capacity_empty_error 执行以下操作:
def capacity_empty_error
raise "Docking Station is empty."
end
还有#empty?看起来像:
def empty?
bike == nil
end
其中 bike 是我的实例变量 @bike 的包装器方法。因此,DockingStation class 的当前容量为 1,因为当 #bike 设置为某项时,代码假定它已满(我计划稍后添加适当的容量)。
希望这能解释我的代码,如果没有,请提出问题并提出改进建议,我想问的问题是:
我觉得#release_bike:
中的保护子句行
capacity_empty_error if empty?
是方法的一个责任,下一行 bike
的 return 是第二个责任。这显然会破坏 SRP,但我看不出如何使用保护子句,除非将其作为第二责任添加到现有方法中。
可以吗?其他人是如何做到的?
将功能转移到其他 classes/modules 怎么样?
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 的方法,我把它留在这里以便更好地理解
目前正在阅读这本很棒的书 'Practical Object Orientated Design In Ruby' 并通过一个简单的型来真正练习其中讨论的一些原则。
我有一个方法可以执行以下操作:
def release_bike
capacity_empty_error if empty?
bike
end
这个 'releases a bike object' 来自我的 DockingStation class(我知道 bike 对象应该是一个参数,但目前我只想要 return bike 的方法对象,而不是删除它)。
#capacity_empty_error 执行以下操作:
def capacity_empty_error
raise "Docking Station is empty."
end
还有#empty?看起来像:
def empty?
bike == nil
end
其中 bike 是我的实例变量 @bike 的包装器方法。因此,DockingStation class 的当前容量为 1,因为当 #bike 设置为某项时,代码假定它已满(我计划稍后添加适当的容量)。
希望这能解释我的代码,如果没有,请提出问题并提出改进建议,我想问的问题是:
我觉得#release_bike:
中的保护子句行capacity_empty_error if empty?
是方法的一个责任,下一行 bike
的 return 是第二个责任。这显然会破坏 SRP,但我看不出如何使用保护子句,除非将其作为第二责任添加到现有方法中。
可以吗?其他人是如何做到的?
将功能转移到其他 classes/modules 怎么样?
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 的方法,我把它留在这里以便更好地理解