2014-10-18 49 views
0

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

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

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 

如果我们作出在运行时这样的这种变化

class User 
    ... lots of other code 

    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 

回答

2

的单一职责原则的基础上,我的知识和研究here,并here,为特定的上下文定义。通过这个定义,定义功能的文本的位置不一定重要。从类中提取功能到一个模块(至少如同例子所示)只有一个目的,似乎没有提取convert_attributes的责任,而是将其转移到仍然绑定到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模型不再负责对其数据进行外观修改。第三,这种方法消除了与convert_attributes实例实施相关的副作用。

总之,我不认为提取功能,因为你已经改变了你对SRP的遵守。要真正获得单一职责,我认为需要对班级界面进行(突破性)改变。

+0

可能需要副作用。 – jcm 2014-10-19 02:46:41

+1

非常真实,但所有事情都是平等的,我宁愿明确而不是隐含的状态改变。给每个人自己。 – 2014-10-19 16:44:31