Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

lotus让我们写出更solid的ruby工程

430 views

Published on



P.S.v.R @ [北京][2014年7月19日]Ruby Saturday

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

lotus让我们写出更solid的ruby工程

  1. 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. 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. 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. 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. 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. 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. 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. 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. 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
  10. 10. H T T P : / / G I T H U B . C O M / P M Q 2 0
  11. 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. 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. 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. 14. let components to emerge H T T P : / / G I T H U B . C O M / P M Q 2 0
  15. 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. 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. 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
  18. 18. 完全不触及 数据库、完 全不触及⺴⽹网 络的 controller层 单元测试 封装 渲染属于MVC的其他层 H T T P : / / G I T H U B . C O M / P M Q 2 0
  19. 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. 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. 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
  22. 22. CRUD 纯内存对象 数据库⽆无关,真正的 脏活交给Adapter H T T P : / / G I T H U B . C O M / P M Q 2 0
  23. 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. 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. 25. 欢 迎 关 注 H T T P S : / / G I T H U B . C O M / P M Q 2 0

×