开源项目 全新的 Ruby Web 框架:Lotus

ashchan · 2014年06月24日 · 最后由 psvr 回复于 2014年08月01日 · 16428 次阅读
本帖已被管理员设置为精华贴

Introducing Lotus - A complete web framework for Ruby

介绍:http://lucaguidi.com/2014/06/23/introducing-lotus.html

官网:http://lotusrb.org

网站做的很漂亮。代码按不同组件分成了单独的 github repo,比较适合阅读学习。

这个项目我推荐大家用来学习 —— 代码非常整洁有条理。是继 Ruby Object Mapper 后首个让我眼前一亮的项目。:D

很早之前就看到 rkh 大神也被拉到这个项目之中,可惜我找遍了 commits 也没看到他有为这个项目提交代码。

暂时发现几个特点:

1, 颠覆 Rails 命名系统,直接使用 Ruby namespace 来管理。我觉得这个好,又简单又灵活。

  1. model 设计意见性很强,强制隐藏所有通用 query 比如 where, limit, oder 等等。强迫开发者自己写有意义的 API。这个好。

不明白的地方:

  1. 没有 migration,只有 create table。那要更改数据库结构怎么办?

好像没有 相关的命令来生成基本的模板文件?

#1 楼 @fredwu 是的,很适合阅读学习:-) #5 楼 @billy Lotus::Model 不支持 migration。他应该是把这件事交给实现了。如这个例子里用了 Sequel: https://github.com/lotus/model/blob/master/EXAMPLE.md#setup

#6 楼 @ruby_sky 没提供 generator。

#8 楼 @ashchan 谢谢楼主分享,已经在读源码了。

一看 model 的各种 EJB 名词就关了...

正常脑子都会想到 instance 和 class 而不是 entity 和 repository, 语言提供的设施不用,自己造一堆是为何...

怎么感觉像Padrino的亲兄弟呢

less DSLs。。。比较喜欢这点

@turingbook 匆忙写的几句话被你引用了,不好意思 :) 谢谢你的文章,介绍很详细,链接也很有帮助。

SOA 才是王道。

刚才在 Skype 上和作者 Luca 聊了一个多小时关于 Lotus::Model 的开发计划,受益不浅。相比较 Datamappify 的 Entity + Validation 和 Repository + Mapper 的设计,Luca 的 Lotus::Model 把所有东西都细分化了,架构更明显。接下去我会尽量抽点时间来为 Lotus::Model 做点微薄的贡献。😄

性能如何?

#20 楼 @rainchen 经你这么一分析这个框架有点过度设计了。当时粗读了一下代码觉得比较简单清晰,如果用起来会太繁琐那就太不 happy 了。

其实这东西模仿的是 camping 呀 和 padrino 一点关系没有吧

#20 楼 @rainchen 我接触过,如果负责的项目做底层的数据库迁移,比如从 sql 迁移到 nosql,那 rails 里面改起来是非常痛苦,如果是一部分用 sql 另一部分用 nosql,那就更痛苦了,所以当我看到 Lotus 的 Model 的时候我觉得非常开心

#23 楼 @ShiningRay AR 迁移数据库有什么问题?

值得学习。

#25 楼 @fredwu

repository 和 entity 的逻辑不是说分就能分的. 如果一个方法既包含业务逻辑,又包含持久化动作,应该放到 repository 还是 entity? 如果放到 repository, 它就必须有 entity 的知识,如果放到 entity, 它就必须有 repository 的知识。如果将两者完全隔离,那么这种方法就要放到更高一层,放到 controller 中,当 controller 膨胀了,就会想到加个 service 层... 层数越来越多,架构越来越 fancy, 做实际事情的代码却越来越难找...

AR 中拆分逻辑也很容易啊,可以 extend, 可以加 scope, 方法多种,又不需要定死在一个 repository/entity 的划分方式中,一开始就强制拆分开来把很多本来简单的 model 都弄复杂了。

#23 楼 @ShiningRay #25 楼 @fredwu

我只说一点个人感觉 model desgin 这快“怪味道”最浓烈的地方:用 repository 和 entity 分离逻辑和持久化后,但在 controller 里又用到 repository 来 select 数据,难道还能说 repository 就跟业务逻辑“分离”了?

我觉得 Rails 的 MVC 结构足够好,需求复杂的可以再加自己需要的层。Lotus 起点就引入这么多层次和模式,我不理解喜欢这样代码的人,不过也好,喜欢的人可以投入 Lotus,不用要求 Rails 迎合他们的趣味了。

#11 楼 @luikore 还不够啊,model 这边还缺少 DTO,PO,VO 等等,这样才能算是回到 EJB 时代。

#24 楼 @hooopo AR 到 mongoid 呢?再加上一些存在 redis 的 model

#27 楼 @luikore 如果一个方法既包含业务逻辑, 又包含持久化动作

不如举个具体的例子再展开讨论?

#27 楼 @luikore 我觉得 entity 跟 repository 得关系其实并不是完全隔离,作为 entity 不需要知道 repository 得内容,因为 business logic layer 调用 entity 的时候就不需要关心 data source。而 repository 根据 entity 得内容去实现相关得 data source,所以 repository 还是需要 entity 得内容得,并不是一个完全隔离得关系。这是个人理解,欢迎修正。

#32 楼 @fsword 譬如想在 lotus 上写个分页插件或者上传插件,会发现每个层都要修改,这分页插件的 api 怎么设计头大得很... 当然 rails 也要,不过层数少点更容易做

#33 楼 @benzhang 这样划分也可以,entity 专注无 IO 的内容,带 IO 的方法提升到 repository 中去,单元测 entity 就容易很多,repository 的方法可以放到集成测。不过和很多 java 项目类似,结果往往是绝大部分代码都会落到 repository 中去,而 entity 只剩下一个只带属性的空壳子...

至于不连接数据库,只用 memory adapter 模拟持久化的做法,也不是 repository pattern 专用的,ActiveRecord 也能做到,但做多就变成 OODB 了还不如不用数据库和 ORM 了直接上 maglev gemstone

If anything, controller actions are the service layer. Which is the point. Don't put another service layer on top of it. - DHH

https://twitter.com/dhh/status/280738775506763776

#20 楼 @rainchen #30 楼 @quakewang 严肃点,我们这儿讨论问题呢...

#35 楼 @Rei 其实你发的 dhh 的讨论到后来也很精彩,虽然很多人不喜欢 dhh 说他爱放炮,但如果仔细看他的讨论其实他说的好多东西都有道理的。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号