SlideShare uma empresa Scribd logo
1 de 25
Baixar para ler offline
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
– 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
– 佚 名
“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
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
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
L O T U S 的 设 计
遵 循 关 注 点 分 离 原 则 。
H T T P : / / G I T H U B . C O M / P M Q 2 0
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
关 注 点 分 离
• 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
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
H T T P : / / G I T H U B . C O M / P M Q 2 0
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
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
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
let components to emerge
H T T P : / / G I T H U B . C O M / P M Q 2 0
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
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
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
完全不触及
数据库、完
全不触及⺴⽹网
络的
controller层
单元测试
封装
渲染属于MVC的其他层
H T T P : / / G I T H U B . C O M / P M Q 2 0
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
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
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
CRUD
纯内存对象
数据库⽆无关,真正的
脏活交给Adapter
H T T P : / / G I T H U B . C O M / P M Q 2 0
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
因 此 , 使 ⽤用 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
欢 迎 关 注
H T T P S : / / G I T H U B . C O M / P M Q 2 0

Mais conteúdo relacionado

Destaque

Embedding mruby into c and an actual example
Embedding mruby into c and an actual exampleEmbedding mruby into c and an actual example
Embedding mruby into c and an actual exampleMinqi Pan
 
How we scaled git lab for a 30k employee company
How we scaled git lab for a 30k employee companyHow we scaled git lab for a 30k employee company
How we scaled git lab for a 30k employee companyMinqi Pan
 
08 spazio associazioni_bambiniincucina
08 spazio associazioni_bambiniincucina08 spazio associazioni_bambiniincucina
08 spazio associazioni_bambiniincucinaCarmen Giordano
 
12 spazio associazioni_spazio_per_noi
12 spazio associazioni_spazio_per_noi12 spazio associazioni_spazio_per_noi
12 spazio associazioni_spazio_per_noiCarmen Giordano
 
Grammar simply
Grammar simplyGrammar simply
Grammar simplyGian Putra
 
Open Packaging Conventions - Your Data: Accessible, Manageable, and Secure
Open Packaging Conventions - Your Data: Accessible, Manageable, and SecureOpen Packaging Conventions - Your Data: Accessible, Manageable, and Secure
Open Packaging Conventions - Your Data: Accessible, Manageable, and SecureJack Davis
 
09 maggio 2011_come_mangiano_bambini
09 maggio 2011_come_mangiano_bambini09 maggio 2011_come_mangiano_bambini
09 maggio 2011_come_mangiano_bambiniCarmen Giordano
 

Destaque (20)

Embedding mruby into c and an actual example
Embedding mruby into c and an actual exampleEmbedding mruby into c and an actual example
Embedding mruby into c and an actual example
 
C++ 11
C++ 11C++ 11
C++ 11
 
How we scaled git lab for a 30k employee company
How we scaled git lab for a 30k employee companyHow we scaled git lab for a 30k employee company
How we scaled git lab for a 30k employee company
 
Natursenter
NatursenterNatursenter
Natursenter
 
09 maggio 2011_split
09 maggio 2011_split09 maggio 2011_split
09 maggio 2011_split
 
Just For Kids Game
Just For Kids GameJust For Kids Game
Just For Kids Game
 
Just For Kids Game
Just For Kids GameJust For Kids Game
Just For Kids Game
 
Just For Kids Game
Just For Kids GameJust For Kids Game
Just For Kids Game
 
08 spazio associazioni_bambiniincucina
08 spazio associazioni_bambiniincucina08 spazio associazioni_bambiniincucina
08 spazio associazioni_bambiniincucina
 
12 spazio associazioni_spazio_per_noi
12 spazio associazioni_spazio_per_noi12 spazio associazioni_spazio_per_noi
12 spazio associazioni_spazio_per_noi
 
Grammar simply
Grammar simplyGrammar simply
Grammar simply
 
JUST FOR KIDS GAME
JUST FOR KIDS GAMEJUST FOR KIDS GAME
JUST FOR KIDS GAME
 
Podo presentazione 2012 01-31
Podo presentazione 2012 01-31Podo presentazione 2012 01-31
Podo presentazione 2012 01-31
 
Trip journal
Trip journalTrip journal
Trip journal
 
Just For Kids Game
Just For Kids GameJust For Kids Game
Just For Kids Game
 
JUST for kids game
JUST for kids gameJUST for kids game
JUST for kids game
 
Attitudineevalutazione
AttitudineevalutazioneAttitudineevalutazione
Attitudineevalutazione
 
Open Packaging Conventions - Your Data: Accessible, Manageable, and Secure
Open Packaging Conventions - Your Data: Accessible, Manageable, and SecureOpen Packaging Conventions - Your Data: Accessible, Manageable, and Secure
Open Packaging Conventions - Your Data: Accessible, Manageable, and Secure
 
09 maggio 2011_come_mangiano_bambini
09 maggio 2011_come_mangiano_bambini09 maggio 2011_come_mangiano_bambini
09 maggio 2011_come_mangiano_bambini
 
La caramellabuona
La caramellabuonaLa caramellabuona
La caramellabuona
 

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

⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨Wen-Tien Chang
 
Git & Sourcetree 介紹
Git & Sourcetree 介紹Git & Sourcetree 介紹
Git & Sourcetree 介紹Adison wu
 
Legacy code 讀書會 1st (Ch1 - Ch5)
Legacy code 讀書會 1st (Ch1 - Ch5)Legacy code 讀書會 1st (Ch1 - Ch5)
Legacy code 讀書會 1st (Ch1 - Ch5)Fong Liou
 
Rest Ruby On Rails
Rest Ruby On RailsRest Ruby On Rails
Rest Ruby On Railsshaokun
 
Hadoop学习总结
Hadoop学习总结Hadoop学习总结
Hadoop学习总结ordinary2012
 
Strategic Planning of Charging Infrastructures for Electric Vehicles in Urban...
Strategic Planning of Charging Infrastructures for Electric Vehicles in Urban...Strategic Planning of Charging Infrastructures for Electric Vehicles in Urban...
Strategic Planning of Charging Infrastructures for Electric Vehicles in Urban...Sijie Chen
 
Ruby rails分享
Ruby rails分享Ruby rails分享
Ruby rails分享Cam Song
 
分布式流数据实时计算平台 Iprocess
分布式流数据实时计算平台 Iprocess分布式流数据实时计算平台 Iprocess
分布式流数据实时计算平台 Iprocessbabel_qi
 
Serverless Event Streaming with Pulsar Functions-xiaolong
Serverless Event Streaming with Pulsar Functions-xiaolongServerless Event Streaming with Pulsar Functions-xiaolong
Serverless Event Streaming with Pulsar Functions-xiaolongStreamNative
 
R統計軟體 -安裝與使用
R統計軟體 -安裝與使用R統計軟體 -安裝與使用
R統計軟體 -安裝與使用Person Lin
 
臺大圖書館RDA西文書目記錄編製經驗分享
臺大圖書館RDA西文書目記錄編製經驗分享臺大圖書館RDA西文書目記錄編製經驗分享
臺大圖書館RDA西文書目記錄編製經驗分享mingchinglee
 
N-layer design & development
N-layer design & developmentN-layer design & development
N-layer design & developmentXuefeng Zhang
 
給軟體工程師的不廢話 R 語言精要班
給軟體工程師的不廢話 R 語言精要班給軟體工程師的不廢話 R 語言精要班
給軟體工程師的不廢話 R 語言精要班台灣資料科學年會
 
使用Lua提高开发效率
使用Lua提高开发效率使用Lua提高开发效率
使用Lua提高开发效率gowell
 

Semelhante a lotus让我们写出更solid的ruby工程 (20)

⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨
 
Git & Sourcetree 介紹
Git & Sourcetree 介紹Git & Sourcetree 介紹
Git & Sourcetree 介紹
 
42qu thrift1
42qu thrift142qu thrift1
42qu thrift1
 
Legacy code 讀書會 1st (Ch1 - Ch5)
Legacy code 讀書會 1st (Ch1 - Ch5)Legacy code 讀書會 1st (Ch1 - Ch5)
Legacy code 讀書會 1st (Ch1 - Ch5)
 
When R meet Hadoop
When R meet HadoopWhen R meet Hadoop
When R meet Hadoop
 
Rest Ruby On Rails
Rest Ruby On RailsRest Ruby On Rails
Rest Ruby On Rails
 
Web gis技术
Web gis技术Web gis技术
Web gis技术
 
Hadoop学习总结
Hadoop学习总结Hadoop学习总结
Hadoop学习总结
 
Strategic Planning of Charging Infrastructures for Electric Vehicles in Urban...
Strategic Planning of Charging Infrastructures for Electric Vehicles in Urban...Strategic Planning of Charging Infrastructures for Electric Vehicles in Urban...
Strategic Planning of Charging Infrastructures for Electric Vehicles in Urban...
 
Ruby rails分享
Ruby rails分享Ruby rails分享
Ruby rails分享
 
分布式流数据实时计算平台 Iprocess
分布式流数据实时计算平台 Iprocess分布式流数据实时计算平台 Iprocess
分布式流数据实时计算平台 Iprocess
 
Serverless Event Streaming with Pulsar Functions-xiaolong
Serverless Event Streaming with Pulsar Functions-xiaolongServerless Event Streaming with Pulsar Functions-xiaolong
Serverless Event Streaming with Pulsar Functions-xiaolong
 
R統計軟體 -安裝與使用
R統計軟體 -安裝與使用R統計軟體 -安裝與使用
R統計軟體 -安裝與使用
 
臺大圖書館RDA西文書目記錄編製經驗分享
臺大圖書館RDA西文書目記錄編製經驗分享臺大圖書館RDA西文書目記錄編製經驗分享
臺大圖書館RDA西文書目記錄編製經驗分享
 
LabView with Lego NXT
LabView  with Lego NXTLabView  with Lego NXT
LabView with Lego NXT
 
N-layer design & development
N-layer design & developmentN-layer design & development
N-layer design & development
 
給軟體工程師的不廢話 R 語言精要班
給軟體工程師的不廢話 R 語言精要班給軟體工程師的不廢話 R 語言精要班
給軟體工程師的不廢話 R 語言精要班
 
使用Lua提高开发效率
使用Lua提高开发效率使用Lua提高开发效率
使用Lua提高开发效率
 
getPDF.aspx
getPDF.aspxgetPDF.aspx
getPDF.aspx
 
getPDF.aspx
getPDF.aspxgetPDF.aspx
getPDF.aspx
 

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

  • 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
  • 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