2014-10-18 72 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