【问题标题】:should I have logic in my model class or other classes我的模型类或其他类中应该有逻辑吗
【发布时间】:2012-03-27 07:12:32
【问题描述】:

我只是想对我脑子里一直在争论的这个有其他意见,例如我有类 user_controller 和类 user

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​​ 更容易打字。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        1. 为了避免用户类变大。这样的逻辑可以移动到这些子类(用户控制器),从而使类看起来简单

        2. 为了可重复性。明天如果有一个名为 superuser 的类也需要 accept_friend 功能,那么 UserController 类可以重新使用

        user_controller = UserController.new

        user_controller.accept_friend(Superuser1, Superuser2)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-07-19
          • 2019-10-30
          • 1970-01-01
          • 1970-01-01
          • 2012-07-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多