Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

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

Minqi Pan

July 16, 2014
Tweet

More Decks by Minqi Pan

Other Decks in Programming

Transcript

  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
  10. 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
  18. 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
  19. 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
  20. 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
  21. 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
  22. 因 此 , 使 ⽤用 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
  23. 欢 迎 关 注 H T T P S :

    / / G I T H U B . C O M / P M Q 2 0