保护条款和单一责任原则(SRP)

时间:2016-04-18 10:52:37

标签: ruby oop single-responsibility-principle guard-clause

目前阅读精彩的书籍“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,但我看不出如何使用保护条款,除非将其作为第二责任添加到现有方法中。

可以吗?别人怎么做到了?

1 个答案:

答案 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的方法,我把它留在这里以便更好地理解