我的模型类或其他类中应该有逻辑吗?

时间:2012-03-27 07:12:32

标签: java ruby design-patterns domain-driven-design

我只是希望得到关于这个我一直在辩论的其他意见,例如我有类user_controller和类用户


class User
   attr_accessor :name, :username   
end

class UserController
   // do something about anything about users
end


问题是我的User类中是否应该有逻辑,所以它将是


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的,因为我的东西ruby在打字时更容易。

编辑:转换真的很好,但我更喜欢这里的人。感谢大家。

4 个答案:

答案 0 :(得分:8)

是的,您应该在模型中保留逻辑!也就是说,如果你做了实际的面向对象编程(看起来就像你那样)。引用Wikipedia

  

面向对象编程(OOP)是一种使用的编程范例   “对象” - 由数据字段和方法组成的数据结构   与他们的互动 - 设计应用程序和计算机   程序

如果您尝试进行域驱动设计(您的标签意味着),则尤其如此。 DDD就是用对象来表达你的域名。

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

答案 1 :(得分:1)

大多数人会说你不应该在你的模型类中保留逻辑。例外情况可能包括:

  • 帮助函数访问包含的集合(addToList(Object o)getFromList(int index)等等)
  • 标准对象和类似替代(equalshashCodetoStringclonecompareTo等)
  • 数据前/后处理(如将字符串固定为大写或类似的东西)

由于人们不会期望在模型类中存在逻辑,因此您也应该避免使用它。它会让其他可能需要查看和维护代码的开发人员感到困惑。毕竟,这就是为什么有模式 - 帮助其他开发人员识别和维护您的代码。

答案 2 :(得分:0)

我相信第一个更好,你有一个模型和一个类,它拥有操作该模型所需的所有信息,并且该模型可能需要一些其他信息来进行一些操作。

尝试阅读有关Information Expert的更多信息。

答案 3 :(得分:0)

在这种情况下,应考虑权衡。 如果您确定用户类的大小不会在未来增长,那么最好在用户类中添加accept_friend。

另一方面,在以下场景中,最好将accept_friend移动到UserController等服务类中。

  1. 避免用户类增大。这些逻辑可以移动到这些子类(Usercontroller),从而使类看起来很简单

  2. 为了恢复原状。明天如果有一个名为superuser的类也需要accept_friend功能,那么UserController类可以像

  3. 一样重新发送
      

    user_controller = UserController.new

         

    user_controller.accept_friend(Superuser1,Superuser2)