Rails Rails4 重大设计决策:“胖” Model 用 ActiveSupport::Concern 瘦身

xds2000 · 2012年12月20日 · 最后由 fsword 回复于 2013年09月24日 · 8042 次阅读

DHH推到master分支的决定。和2011年railsconf一个session DCI技术类似。但有很大不同是,更简单。DHH用8年的basecamp project经验验证他的这个决定是对的。anyway,我们就快点学习吧。

https://37signals.com/svn/posts/3372-put-chubby-models-on-a-diet-with-concerns

共收到 19 条回复

master 里面已经改了

最新一期的railscast 也是讲这个topic的吧

Concern 这个单词应该怎么翻译?

确实比DCI简单多了

#3楼 @tumayun 这些专有名词根本不需要翻译,就像 Monkey patch 翻译成猴子补丁,太呕心了

这就叫concern啊。。从写Rails就开始这么用。不过这东西也没解决对象身上职责过多的问题。只不过是把代码分离开了。并没有分离职责。

@hooopo 这眼镜不错

Concern 最好用的是和 model 的业务逻辑垂直的时候,其实就相当于是简化了的 DCI, 没有 context 只是 data 和 interaction

Concern相当于改进了的Module。用Concern实现的东西用普通的Module都能做,只是用Concern更便利些。

#6楼 @hooopo 是啊,关键是分离逻辑,并不是代码

@hooopo Rails是充血模型,所以并不是职责分离的问题吧,业务逻辑就是model的职责

代码过多加 module, 职责过多加 scope ...

#13楼 @luikore 后面一句没理解,举个例子?

#15楼 @fsword

scope 里面的方法不会污染别的 scope

class Trinity < ActiveRecord::Base
  scope :as_father do
    ...
  end
  scope :as_son do
    def bar
      ...
    end
  end
  scope :as_spirit do
    def foo
      ...
    end
  end
end

Trinity.as_spirit.foo
Trinity.as_son.bar
...

scope 的 where lambda 可省略, 不过职责有时也和 where 有关系

#16楼 @luikore 恩,以前不知道,不过想了一下似乎可用的场景不多

#17楼 @fsword 说明你的 model 设计得比较好, 职责没有混合在一起...

#18楼 @luikore 哦,明白了,如果面对一张大表......

victor 有谁能说下 Rails 4 的 concerns 吗 中提及了此贴 04月17日 10:35
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册