2012-03-27 47 views
4

我只是想有這一個,我已經在我腦海中一直爭論不休的其他意見,比如我有類user_controller和類用戶我應該有邏輯在我的模型類或者其他類

 

class User 
    attr_accessor :name, :username 
end 

class UserController 
    // do something about anything about users 
end 

 

現在的問題是我應該有邏輯,我的用戶類,所以這將是

 

user = User.new 
user.do_something(user1) 

or it should be 

user_controller = UserController.new 
user_controller.do_something(user1, user2) 
 

我不知道哪一個是最好的設計,我個人很喜歡的第一個因此,例如,它會念想

 

john = User.new 
john.accept_friend(jane) 

instead of 
user_controller = UserController.new 
user_controller.accept_friend(john, jane) 

 

這些模式的優缺點是什麼?這不僅僅是Ruby特有的,這是因爲我的紅寶石打字更容易。

編輯:有很好的轉換正在進行,但我非常喜歡在這裏更多的人。感謝大家。

回答

7

是的,你應該保持你的模型邏輯!也就是說,如果你做了實際的面向對象的編程(它看起來像你)。引述Wikipedia

面向對象編程(OOP)是使用 「對象」一種編程範式 - 包括數據字段的數據結構和方法 與他們互動起來 - 設計應用和計算機 程序。

如果您嘗試進行域驅動設計(您的標籤暗示),這尤其如此。 DDD就是用對象來表達你的域名。

Martin Fowler says putting the logic outside your model is an anti-pattern.

+0

我很喜歡這個想法,非常感謝。 – toy 2012-03-27 08:49:56

+0

@Dennis:恰恰相反,它在Rails社區中被廣泛接受,並且保持你的控制器不變,而你的模型變胖:http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat -model等 – 2012-03-27 11:02:49

+0

好啊,然後我會從我的答案中刪除最後一段。謝謝! – 2012-03-27 13:53:56

1

大多數人會說你不應該在你的模型類中保留邏輯。例外情況可能包括:

  • 輔助函數訪問包含集合(addToList(Object o)getFromList(int index),等等等等)
  • 標準對象和類似的覆蓋(equalshashCodetoStringclonecompareTo等)
  • 數據預/後處理(如固定字符串大寫或類似的東西)

因爲人們不會預計那裏有模型類的邏輯,你應該也可以避免它。它會混淆其他開發人員,他們將來可能不得不查看和維護您的代碼。畢竟,這就是爲什麼有模式 - 以幫助其他開發人員識別和維護您的代碼。

0

我相信第一個更好,你有一個模型和一個具有操作該模型所需的所有信息的類,該模型可能需要一些其他信息來執行一些操作。

嘗試閱讀更多關於信息專家。

0

在這樣的情況下,權衡應予以考慮。 如果您確定用戶類的大小未來會增長,那麼在用戶類中添加accept_friend是很好的做法。

另一方面,在下列情況下,最好將accept_friend移動到像UserController這樣的服務類中。

  1. 爲了避免用戶類增長的大小。這樣的邏輯可以移動到這些子類(Usercontroller),從而使類看起來很簡單

  2. 爲了可恢復性。明天如果有一類稱爲超級用戶還需要accept_friend功能,那麼UserController類可以resued像

user_controller = UserController.new

user_controller.accept_friend(Superuser1,Superuser2)

相關問題