单一责任原则(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
答案 0 :(得分:2)
基于我的知识和研究here和here的单一责任原则是针对特定背景而定义的。根据此定义,定义功能的文本的位置不一定重要。将类中的功能提取到模块中(至少如示例所示)只有一个目的似乎没有提取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的依从性。为了真正获得单一责任,我认为需要对类接口进行(破坏)更改。