有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我只是想对这个问题有其他的看法,我一直在思考,例如我有类用户\控制器,还有类用户


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特有的,因为我认为Ruby更容易打字

编辑:有非常好的转换正在进行,但我很喜欢这里更多的人。谢谢大家


共 (4) 个答案

  1. # 1 楼答案

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

    Object-oriented programming (OOP) is a programming paradigm using "objects" – data structures consisting of data fields and methods together with their interactions – to design applications and computer programs.

    如果您正试图进行域驱动设计(您的标记暗示了这一点),这一点尤其正确。DDD是关于用对象表示域的

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

  2. # 2 楼答案

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

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

    因为人们不会期望模型类中有逻辑,所以您可能也应该避免它。这将使其他开发人员感到困惑,他们将来可能不得不查看和维护您的代码。毕竟,这就是为什么会有模式——帮助其他开发人员识别和维护您的代码

  3. # 3 楼答案

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

    尝试阅读更多关于信息专家的信息

  4. # 4 楼答案

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

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

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

    2. 可恢复性。明天,如果有一个名为superuser的类也需要accept\u friend功能,那么UserController类可以恢复如下

    user_controller = UserController.new

    user_controller.accept_friend(Superuser1, Superuser2)