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



目前正在阅读一本精彩的书《Ruby中面向对象的实用设计》,并通过一个简单的kata来真正实践它所讨论的一些原则。

我有一种方法可以做到以下几点:

def release_bike
  capacity_empty_error if empty?
  bike
end

这从我的DockingStation类中"释放了一个bike对象"(我知道bike对象应该是一个参数,但目前我只希望该方法返回bike对象,而不是删除它)。

#capacity_pempty_error执行以下操作:

def capacity_empty_error
  raise "Docking Station is empty."
end

还有#空?看起来像:

def empty?
  bike == nil
end

其中bike是我的实例变量@bike的包装方法。DockingStation类的当前容量因此为1,因为当#bike设置为某个值时,代码假设它已满(我计划稍后添加适当的容量)。

所以希望这能解释我的代码,请提出问题并提出改进建议,如果没有,我想问的问题是:

我觉得#release_bike:中的保护条款行

capacity_empty_error if empty?

是该方法的一个责任,并且在下一行上返回CCD_ 2是第二个责任。这显然违反了SRP,但我不知道如何使用保护条款,除非将其作为第二责任添加到现有方法中。

能做到吗?其他人是如何做到的?

将功能转移到其他类/模块怎么样?

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 

你可以放弃#空?方法,我把它留在这里是为了更好地理解

最新更新