gpt4 book ai didi

ruby-on-rails - 这是重构 ActiveRecord 胖模型的正确方法吗?

转载 作者:行者123 更新时间:2023-12-04 16:39:54 26 4
gpt4 key购买 nike

例如,如果我有这个 ActiveRecord 模型:

应用程序/模型/order.rb

class Order < ActiveRecord::Base
# model logic
end
require "lib/someclass.rb"

库/somelass.rb
class Order
before_save :something
# more logic here
end

这是从模型中重构/提取逻辑的好方法吗?
或者也许使用关注类、服务类或其他东西?

最佳答案

就像很久以前有人告诉我的:

Code refactoring is not a matter of randomly moving code around.



在您的示例中,这正是您正在做的:将代码移动到另一个文件中

为什么不好?

通过像这样移动代码,您会使原始类更加复杂,因为逻辑被随机分成几个其他类。当然它看起来更好,一个文件中的代码越少在视觉上越好,但仅此而已。

更喜欢组合而不是继承。像这样使用 mixin 是要求通过将杂物倒入六个独立的垃圾抽屉并砰地关上来“清理”一个凌乱的房间。当然,它表面上看起来更干净,但垃圾抽屉实际上使识别和实现澄清域模型所需的分解和提取变得更加困难。

那我该怎么办?

你应该问自己:
  • 哪些代码组合在一起并且可以成为新类/模块的一部分?
  • 将代码提取到其他地方有什么意义?
  • 我是否有一些在我的应用程序中共享的代码?
  • 我可以在我的代码库中提取循环模式吗?

  • 提取服务对象

    当操作满足以下一个或多个标准时,我会使用服务对象:
  • Action 复杂
  • 行动跨越多个模型
  • 该操作与外部服务交互
  • 该操作不是底层模型的核心关注点
  • 执行操作有多种方式

  • 提取表单对象

    当单个表单提交可以更新多个模型时,您可能需要创建一个表单对象。

    这可以将所有表单逻辑(名称约定、验证等)放在一个地方。

    提取查询对象

    您应该将复杂的 SQL/NoSQL 查询提取到它们自己的类中。每个查询对象负责根据条件/业务规则返回一个结果集。

    提取演示者/装饰者

    将 View 逻辑提取到演示者中。您的模型不应处理特定的 View 逻辑。此外,它将使您能够在多个 View 中使用您的演示者。

    More on decorators

    感谢 this博客文章帮助我把这些放在一起。

    关于ruby-on-rails - 这是重构 ActiveRecord 胖模型的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18204565/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com