保护条款和单一职责原则 (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 的方法,我把它留在这里以便更好地理解