Rails Rails 自带的层级为什么只有两层?Rails 的分层哲学是什么呢?

willx · 2021年08月21日 · 最后由 adamshen 回复于 2021年08月26日 · 1088 次阅读

刚刚从 go/java 转来写 rails,在这两门语言的 web 框架里,都有很多层级用来解耦,例如 service、biz、DO、DTO、VO……很多很多层,但是 rails 的 api only 模式自带的只有 controller 和 model,这让我很困惑—当然,我可以自己去实现那些层级。但还想请教一下,Rails 提倡的分层哲学到底是什么样的呢?

不就是 MVC 么?

默认就 MVC 咯,但是系统复杂之后该有的层级一个都不会少

  1. Ruby 的动态特性,让它可以自然地不需要某些层而达到类似的功能。比如在 Ruby 里,其实依赖注入并没那么重要。而因为 ActiveRecord,Model 层可以轻量很多。
  2. 复杂又和数据不直接相关的业务逻辑被推荐放到 lib 里,而在 lib 中如何组织代码结构几乎没什么限制,自由度很高。

不要用静态语言的思维来思考动态语言,静态语言是数控车床,动态语言就是雕塑家手里的那把小刻刀

现在的年轻人都被 jetbrains 惯坏了,没经历过动态特性大爆发的弯路时代。

你想要在 Rails 中也做分层,可以看下这篇文章:https://ruby-china.org/topics/31742

有些需求,明明一两行代码能搞定的事,要分一堆层,这也是让我不解的...

xiaox 回复

因为如果会扩展,以及考虑到作为初始架构别人很有可能就跟着你的风格写了。

我之前在一个组见过一个 c++ 函数,写了 1500 行,里面各种 if 和 goto 乱跳,就是因为刚开始的哥们儿写的时候用了这种形式,全然不考虑后续的人可能就改吧改吧复制一下你的代码然后就怼上去的可能性。

就是充血模型跟贫血模型,Ruby 的表达能力强,比较适合容易实现充血模型。

piecehealth 回复

但我觉得 rails 这是胀血模型了….超级胖的 model

遵守面向对象的原则设计就好啦…

willx 回复

rails 是可以在不胖,胖,超胖之间取舍,别的只能选择不胖。

willx 回复

但是。很明明是很小规模的项目,orm 引入几行代码,一个方法定义体就能搞定的事。

这样代码读起来,一个代码文件,半屏代码,编辑滚动条都不用滚的,很方便又很清晰。

The Rails Doctrine 是 Rails 哲学的总结

原版:https://rubyonrails.org/doctrine/

中文翻译:https://github.com/ruby-china/the-rails-doctrine

其中“多元化的设计模式”这一节说了 model 层为什么是这样的,简单来说就是:实用。

如果还是觉得“我就是需要 service 层啊,Rails 不提供就是不对”,那么可以试试我写的这个 gem https://github.com/chloerei/active_service ……

ecnelises 回复

新的层在 app/ 下新增目录就行了,app/ 下的目录会加到 autoload 的路径里,lib/ 目录还需要配置。

是不是分层是按你复杂度来定的 比如有些跨很多模型才能实现的功能需要复用(当然基本不会出现) 比如你需要提供不同版本的 API,他们之间有共同的功能

你自己想分层自己约定一下就行了,只要项目里的人达成共识,分层分分钟的事情啊

tablecell Ruby Web 框架 RPS 及内存占用 提及了此话题。 09月14日 08:24
需要 登录 后方可回复, 如果你还没有账号请 注册新账号