这种红宝石模式是否符合单一责任原则?

时间:2014-10-18 21:16:09

标签: ruby oop

单一责任原则(SRP)是否适用于定义类的文件的文本?或者它在运行程序时是否适用于活动对象?

我正在进行一个项目,我们正在从模型类中提取代码并将其放入模块中。我们这样做是为了坚持单一责任。

我们正在改变这一点:

class User
  ... lots of other code

  def convert_attributes
     { username: self.email , name: "#{self.first_name} #{self.last_name}" }
  end
end

这样的事情

class User
  include UserAttributeConverter

  ... lots of other code
end


module UserAttributeConverter
 def convert_attributes
     { username: self.email , name: "#{self.first_name} #{self.last_name}" }
  end
end 

如果我们在运行时这样做了这个改变怎么办?

user = User.find(42)
user.extend(UserAttributeConverter)
user.convert_attributes

1 个答案:

答案 0 :(得分:2)

基于我的知识和研究herehere的单一责任原则是针对特定背景而定义的。根据此定义,定义功能的文本的位置不一定重要。将类中的功能提取到模块中(至少如示例所示)只有一个目的似乎没有提取convert_attributes的责任,而是将其转移到仍然绑定到{{1 }}。我的评估是,真正提取这一责任可能就是创建一个类:

User

这有三个好处。首先是一个更简单的测试用例,我们不再需要class UserAttributeConverter def self.convert_attributes(first_name, last_name, email) { username: self.email , name: "#{self.first_name} #{self.last_name}" } end end 来测试User的功能。其次,covert_attributes模型不再对其数据的外观变化负责。第三,这种方法消除了与User的实例实现相关的副作用。

总而言之,我不认为提取功能会改变您对SRP的依从性。为了真正获得单一责任,我认为需要对类接口进行(破坏)更改。