Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Extraindo a regra de negócio para uma nova camada
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Gabriel Sobrinho
May 10, 2012
Programming
190
0
Share
Extraindo a regra de negócio para uma nova camada
Apresentado no Rails-MG em 2012
Gabriel Sobrinho
May 10, 2012
More Decks by Gabriel Sobrinho
See All by Gabriel Sobrinho
Arquiteturas Multi-Tenant RubyConf 2022
sobrinho
0
240
Introduction to Go
sobrinho
1
120
Casos de otimização em aplicações Ruby on Rails
sobrinho
0
320
Introduction to automated tests (Goiania)
sobrinho
0
160
Introduction to automated tests
sobrinho
3
250
Otimização de Aplicações RoR
sobrinho
1
290
Introdução ao React (Simplificado)
sobrinho
0
160
Algoritmos de pesquisa
sobrinho
0
690
Introdução ao Docker
sobrinho
1
130
Other Decks in Programming
See All in Programming
AI駆動開発で崩れていくコードベースを立て直す
kyoko_nr_nr
1
400
プラグインで拡張される Context をtype-safe にする難しさと設計判断
kazupon
2
460
Modding RubyKaigi for Myself
yui_knk
0
800
次世代リンターで探る、tsgo 時代における型認識カスタムルールの現実解
ytakahashii
3
1.3k
Inside Stream API
skrb
1
380
ふつうのFeature Flag実践入門
irof
7
3.3k
AIチームを指揮するOSS「TAKT」活用術 / How to Use “TAKT,” an OSS Tool for Orchestrating AI Teams
nrslib
6
750
1人1案件のプロダクトエンジニア時代に、"プロセス監督"としてチャレンジしたこと
non0113
0
350
AIエージェントと協働するCLI開発 — BunとOpenClawで学んだこと
yoshikouki
1
220
新規プロダクトを高速で生み出すハーネスエンジニアリング
seanchas116
15
7.4k
TSKaigi 2026 TypeScriptバックエンドのオブザーバビリティ戦略 — Datadog × NestJSの実践
taiseiyamamotoan
1
210
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
180
Featured
See All Featured
How to Talk to Developers About Accessibility
jct
2
210
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
240
Scaling GitHub
holman
464
140k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
420
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
440
The Cost Of JavaScript in 2023
addyosmani
55
10k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
370
Git: the NoSQL Database
bkeepers
PRO
432
67k
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.7k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
520
Transcript
Extraindo a regra de negócio para uma nova camada
@sobrinho • software architect @ nohup • https://github.com/sobrinho
Fat Controllers
Fat Models
Qual é o problema com essas abordagens?
Nenhum!
Por que pensar binário?
Se cada caso deve ser analisado individualmente...
Quem nunca fez um código macarrão?
None
None
Vamos fazer uma pequena aplicação
Eu preciso cadastrar meus contratos e seus itens
E também preciso cancelar os itens individualmente, salvando a data
do cancelamento
None
Rails Rails é um framework web full-stack Model-View-Controller (MVC)
Contractus ~/Code (1.9.3-p0) 21:08:25 $ rails new contractus ... create
app/controllers create app/models create app/views ...
Contractus ~/Code (1.9.3-p0) 21:08:25 $ rails new contractus ... create
app/controllers create app/models create app/views ...
Contractus ~/Code (1.9.3-p0) 21:08:25 $ rails new contractus ... create
app/controllers create app/models create app/views ...
Contractus ~/Code (1.9.3-p0) 21:08:25 $ rails new contractus ... create
app/controllers create app/models create app/views ...
Contractus ~/Code (1.9.3-p0) 21:08:25 $ rails new contractus ... create
app/controllers create app/models create app/views ...
Contractus ~/Code (1.9.3-p0) 21:08:25 $ rails new contractus ... create
app/controllers create app/models create app/views ...
Contractus ~/Code (1.9.3-p0) 21:08:25 $ rails new contractus ... create
app/controllers create app/models create app/views ...
Contractus ~/Code/contractus (1.9.3-p0) (master) 21:10:52 $ rails generate scaffold contract
name:string 21:21:49 $ rails generate scaffold item contract:references name:string price:decimal canceled_at:date
Contractus ~/Code/contractus (1.9.3-p0) (master) 21:10:52 $ rails generate scaffold contract
name:string 21:21:49 $ rails generate scaffold item contract:references name:string price:decimal canceled_at:date
Contractus ~/Code/contractus (1.9.3-p0) (master) 21:10:52 $ rails generate scaffold contract
name:string 21:21:49 $ rails generate scaffold item contract:references name:string price:decimal canceled_at:date
Contractus ~/Code/contractus (1.9.3-p0) (master) 21:10:52 $ rails generate scaffold contract
name:string 21:21:49 $ rails generate scaffold item contract:references name:string price:decimal canceled_at:date
Contractus ~/Code/contractus (1.9.3-p0) (master) 21:10:52 $ rails generate scaffold contract
name:string 21:21:49 $ rails generate scaffold item contract:references name:string price:decimal canceled_at:date
Contractus ~/Code/contractus (1.9.3-p0) (master) 21:10:52 $ rails generate scaffold contract
name:string 21:21:49 $ rails generate scaffold item contract:references name:string price:decimal canceled_at:date
Contractus ~/Code/contractus (1.9.3-p0) (master) 21:10:52 $ rails generate scaffold contract
name:string 21:21:49 $ rails generate scaffold item contract:references name:string price:decimal canceled_at:date
Contractus ~/Code/contractus (1.9.3-p0) (master) 21:10:52 $ rails generate scaffold contract
name:string 21:21:49 $ rails generate scaffold item contract:references name:string price:decimal canceled_at:date
Contractus ~/Code/contractus (1.9.3-p0) (master) 21:10:52 $ rails generate scaffold contract
name:string 21:21:49 $ rails generate scaffold item contract:references name:string price:decimal canceled_at:date
Contractus ~/Code/contractus (1.9.3-p0) (master) 21:10:52 $ rails generate scaffold contract
name:string 21:21:49 $ rails generate scaffold item contract:references name:string price:decimal canceled_at:date
Contractus ~/Code/contractus (1.9.3-p0) (master) 21:10:52 $ rails generate scaffold contract
name:string 21:21:49 $ rails generate scaffold item contract:references name:string price:decimal canceled_at:date
Contractus ~/Code/contractus (1.9.3-p0) (master) 21:10:52 $ rails generate scaffold contract
name:string 21:21:49 $ rails generate scaffold item contract:references name:string price:decimal canceled_at:date
Contractus ~/Code/contractus (1.9.3-p0) (master) 21:10:52 $ rails generate scaffold contract
name:string 21:21:49 $ rails generate scaffold item contract:references name:string price:decimal canceled_at:date
Contractus ~/Code/contractus (1.9.3-p0) (master) 21:10:52 $ rails generate scaffold contract
name:string 21:21:49 $ rails generate scaffold item contract:references name:string price:decimal canceled_at:date
Fat Controller
None
~/Code/contractus (1.9.3-p0) ((v0.1.0)) 07:28:35 $ time rspec spec/controllers ................................. Finished
in 0.42347 seconds 33 examples, 0 failures real 0m7.831s user 0m3.328s sys 0m0.651s
Fat Model
None
~/Code/contractus (1.9.3-p0) ((v0.2.0)) 02:28:40 $ time rspec spec/models . Finished
in 0.02556 seconds 1 example, 0 failures real 0m3.048s user 0m2.621s sys 0m0.413s
Business
None
~/Code/contractus (1.9.3-p0) ((v0.3.0)) 02:29:59 $ time rspec spec/business . Finished
in 0.00072 seconds 1 example, 0 failures real 0m0.535s user 0m0.397s sys 0m0.088s
Fluxo mais simples Controller x Business x Model
Testes isolados Regra de negócio não deve depender de absolutamente
nada para ser testada
Manutenção fácil Como proceder se somente os itens das últimas
24h puderem ser cancelados?
Dúvidas?
Obrigado!