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

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

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

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
需要 登录 后方可回复, 如果你还没有账号请 注册新账号