1. L O T U S 让 我 们 写 出 更 S O L I D 的 R U B Y ⼯工 程
P. S . V. R @ [ 北 京 ] [ 2 0 1 4 年 7 ⽉月 1 9 ⽇日 ] R U B Y S A T U R D A Y
H T T P : / / G I T H U B . C O M / P M Q 2 0
2. – N I G H T _ S TA L K E R @ I T E Y E
“上上周在书店看到⼀一本《Ruby设计模式》,捡起
来 10 分钟看完,扔了(别问我为什么……) 下⾯面
⽤用 Ruby 写写设计模式,顺便批⼀一批 Java 和 Gof。”
H T T P : / / G I T H U B . C O M / P M Q 2 0
3. – 佚 名
“Patterns? Interfaces? Are you kidding me? This
isn't Java, it's Ruby! ”
H T T P : / / G I T H U B . C O M / P M Q 2 0
4. R A I L S 的 反 思
• Rails在过去极⼤大降低了web软件开发的⻔门槛,各语⾔言都
陆续⼭山寨了各⾃自的Rails
• 直接向views/models/controllers⽂文件夹⾥里搭积⽊木,没有
编程背景的⼈人也可以快速上⼿手
• 缺乏良好设计的代码会积攒技术债,到项⺫⽬目的后期就开
始出现问题
• ⽤用Rails做出来的项⺫⽬目结构千篇⼀一律,OO设计去哪了?
H T T P : / / G I T H U B . C O M / P M Q 2 0
5. L O T U S 的 设 计 思 想
• 简约——更少的领域特定语⾔言、更少的约定
• 宽容——不强加best-practice、留给开发者发挥空间
• 回归OO——⿎鼓励更多的对象、⾃自由构建对象继承结构
H T T P : / / G I T H U B . C O M / P M Q 2 0
6. L O T U S 的 设 计
遵 循 关 注 点 分 离 原 则 。
H T T P : / / G I T H U B . C O M / P M Q 2 0
7. S E PA R AT I O N O F C O N C E R N S , S O C
• is a design principle for separating a computer
program into distinct sections, such that each section
addresses a separate concern.
• 是处理复杂性的⼀一个原则。由于关注点混杂在⼀一起会导
致复杂性⼤大⼤大增加,所以能够把不同的关注点分离开来,
分别处理就是处理复杂性的⼀一个原则,⼀一种⽅方法。
H T T P : / / G I T H U B . C O M / P M Q 2 0
8. 关 注 点 分 离
• Lotus 由诸多独⽴立的框架构
成
• 模型、控制器、路由、视图、
实⽤用⼯工具、助⼿手
• 每个框架都是⼀一个单独的
gem
• 只要是Rack兼容的应⽤用都
可使⽤用Lotus::Router和
Lotus::Controller
H T T P : / / G I T H U B . C O M / P M Q 2 0
9. L O T U S 各 组 件 的 代 码 ⾏行 数
• Lotus: 1,979 loc
• Lotus::Controller - 2,411 loc
• Lotus::Helper - 12 loc
• Lotus::Model - 3,707 loc
• Lotus::Router - 2,199 loc
• Lotus::Utils - 1,751 loc
• Lotus::View - 2,502 loc
Each library is
designed to be
small, fast and
testable.
H T T P : / / G I T H U B . C O M / P M Q 2 0
11. L O T U S : : R O U T E R 与
R A I L S 路 由 有 什 么 区 别 ?
H T T P : / / G I T H U B . C O M / P M Q 2 0
12. T H E R A I L S R O U T E R
• gem install journey
• Journey is a router. It routes requests.
• journey was merged on Rails 4.0, coupled with
ActionPack code base.
• 路由退居次要⾓角⾊色,隐藏在不透明的⼀一套机制后⾯面
H T T P : / / G I T H U B . C O M / P M Q 2 0
13. L O T U S : : R O U T E R
• an high-level router, not just for a specific framework
• a router for all the Ruby web apps, including Sinatra
and even Rails :) can be used eg. to dispatch HTTP
requests for a pool of Sinatra applications
• 路由是⼀一个简单的对象,其DSL也只不过是在这个对象
上调⽤用公共⽅方法
H T T P : / / G I T H U B . C O M / P M Q 2 0
14. let components to emerge
H T T P : / / G I T H U B . C O M / P M Q 2 0
15. L O T U S : : C O N T R O L L E R 与
A C T I O N _ C O N T R O L L E R 有 什 么 区 别 ?
H T T P : / / G I T H U B . C O M / P M Q 2 0
16. A C T I O N _ C O N T R O L L E R
• action=method
• offers superclasses (eg.ActionController::Base) to be
inherited
• 控制器是⼀一个⼤大类,往往很臃肿
H T T P : / / G I T H U B . C O M / P M Q 2 0
17. L O T U S : : C O N T R O L L E R
• action=class
• offers modules (eg. Lotus::Action) to be included
• action将有更⾼高的内聚性,可防⽌止意外的数据泄漏、系
统的活动部件更少,因此鲁棒性、可靠度、可复⽤用性及
易懂性都能得到提⾼高
H T T P : / / G I T H U B . C O M / P M Q 2 0
19. L O T U S : : M O D E L 与
A C T I V E _ R E C O R D 有 什 么 区 别 ?
H T T P : / / G I T H U B . C O M / P M Q 2 0
20. A C T I V E _ R E C O R D
• 数据持久机制已经写死,必须是关系型数据库
• 往往⼀一个继承⾃自ActiveRecord::Base⼤大类,很臃肿
• ⼀一个模型类知道的太多,职责太多,出现了上帝对象
H T T P : / / G I T H U B . C O M / P M Q 2 0
21. L O T U S : : M O D E L
• 有三类对象:Entities、Data Mapper和Repositories
• 数据持久机制与上层逻辑分离,应⽤用程序依赖API,⽽而
不依赖低层次的细节 (提问:什么OO原则),可以推迟
实现持久层,持久层甚⾄至可以是某第三⽅方REST服务
• Entity实现使⽤用域逻辑、Data Mapper是⼀一个持久性映
射、Repositories结合两者供给查询接⼝口
H T T P : / / G I T H U B . C O M / P M Q 2 0
23. S O L I D : F I V E B A S I C P R I N C I P L E S O F
O B J E C T- O R I E N T E D D E S I G N
• 单⼀一功能
• 开闭原则
• ⾥里⽒氏替换
• 接⼝口隔离
• 依赖反转
H T T P : / / G I T H U B . C O M / P M Q 2 0
24. 因 此 , 使 ⽤用 L O T U S 框 架 促 使
让 我 们 写 出 更 S O L I D 的 R U B Y ⼯工 程 。
H T T P : / / G I T H U B . C O M / P M Q 2 0
25. 欢 迎 关 注
H T T P S : / / G I T H U B . C O M / P M Q 2 0