我只是希望得到关于这个我一直在辩论的其他意见,例如我有类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在打字时更容易。
编辑:转换真的很好,但我更喜欢这里的人。感谢大家。
答案 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)
等等)equals
,hashCode
,toString
,clone
,compareTo
等)由于人们不会期望在模型类中存在逻辑,因此您也应该避免使用它。它会让其他可能需要查看和维护代码的开发人员感到困惑。毕竟,这就是为什么有模式 - 帮助其他开发人员识别和维护您的代码。
答案 2 :(得分:0)
我相信第一个更好,你有一个模型和一个类,它拥有操作该模型所需的所有信息,并且该模型可能需要一些其他信息来进行一些操作。
尝试阅读有关Information Expert的更多信息。
答案 3 :(得分:0)
在这种情况下,应考虑权衡。 如果您确定用户类的大小不会在未来增长,那么最好在用户类中添加accept_friend。
另一方面,在以下场景中,最好将accept_friend移动到UserController等服务类中。
避免用户类增大。这些逻辑可以移动到这些子类(Usercontroller),从而使类看起来很简单
为了恢复原状。明天如果有一个名为superuser的类也需要accept_friend功能,那么UserController类可以像
user_controller = UserController.new
user_controller.accept_friend(Superuser1,Superuser2)