![Page 1: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/1.jpg)
BOAS PRÁTICASDE DESIGN EMAPLICAÇÕES RAILSRINALDI FONSECArinaldifonseca.com@rinaldifonseca
sábado, 12 de maio de 12
![Page 2: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/2.jpg)
sábado, 12 de maio de 12
![Page 3: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/3.jpg)
UNCLE BOBMARTIN FOWLERSANDI METZE OUTROS
VAMOS CONSIDERAR PESSOAS COMO:
sábado, 12 de maio de 12
![Page 4: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/4.jpg)
CLEAN CODEDESIGN PATTERNSSOLIDTODOS NÓS JÁ OUVIMOS FALAR
sábado, 12 de maio de 12
![Page 5: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/5.jpg)
APLICAR NA PRÁTICAÉ DIFÍCIL
sábado, 12 de maio de 12
![Page 6: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/6.jpg)
VAMOSPENSARNAESSÊNCIA
sábado, 12 de maio de 12
![Page 7: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/7.jpg)
O DESIGN
sábado, 12 de maio de 12
![Page 8: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/8.jpg)
O QUE É DESIGN??
sábado, 12 de maio de 12
![Page 9: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/9.jpg)
O CÓDIGO
sábado, 12 de maio de 12
![Page 10: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/10.jpg)
A ARTEDE ORGANIZARO CÓDIGO
sábado, 12 de maio de 12
![Page 11: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/11.jpg)
CADA LINHACADA CLASSECADA TESTEFAZ PARTE DO DESIGN
sábado, 12 de maio de 12
![Page 12: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/12.jpg)
E QUAL É O OBJETIVODO DESIGN?
sábado, 12 de maio de 12
![Page 13: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/13.jpg)
REDUZIR O CUSTODA MUDANÇA
sábado, 12 de maio de 12
![Page 14: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/14.jpg)
VAMOS PENSARQUE O CÓDIDODEVE FUNCIONAR HOJEE APENAS ISSO.
sábado, 12 de maio de 12
![Page 15: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/15.jpg)
SER FÁCIL DE MUDARPARA SEMPRE.
DEVE
sábado, 12 de maio de 12
![Page 16: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/16.jpg)
FIM DA PARTE 1
sábado, 12 de maio de 12
![Page 17: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/17.jpg)
DICAS PRÁTICAS
sábado, 12 de maio de 12
![Page 18: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/18.jpg)
AVISO:
O que vou falar, NÃO épapo de Javeiro =)
sábado, 12 de maio de 12
![Page 19: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/19.jpg)
USAR CLASSES DE SERVIÇO
A.K.A. SERVICES
DICA 1
sábado, 12 de maio de 12
![Page 20: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/20.jpg)
Rails e o MVC
sábado, 12 de maio de 12
![Page 21: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/21.jpg)
FAT MODELSTHIN CONTROLLERS
sábado, 12 de maio de 12
![Page 22: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/22.jpg)
DDD
DOMAIN DRIVEN DESIGN
ERIC EVANS
sábado, 12 de maio de 12
![Page 23: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/23.jpg)
As vezes, lidamos com “coisas” que não se encaixam emdeterminados objetos
sábado, 12 de maio de 12
![Page 24: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/24.jpg)
APPLICATION SERVICEDOMAIN SERVICEINFRASTRUCTURE SERVICE
sábado, 12 de maio de 12
![Page 25: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/25.jpg)
Application Service
class AccountCSVExporter def self.to_csv(account) CSV.generate do |csv| account.transactions.each do |transaction| csv << [transaction.amount, transaction.created_on] end end endend
sábado, 12 de maio de 12
![Page 26: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/26.jpg)
Domain Service
class FundsTransferService def self.transfer(from, to, amount) Account.transaction do from.debit amount to.credit amount end endend
sábado, 12 de maio de 12
![Page 27: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/27.jpg)
Infrastructure Service
class MessagingService def self.overdrawn_account_sms(account) Rails.queue.push SmsJob, "#{account.number}!" endend
sábado, 12 de maio de 12
![Page 28: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/28.jpg)
ENTITIES ANDVALUE OBJECTS
DICA 2
sábado, 12 de maio de 12
![Page 29: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/29.jpg)
ENTITIES
Objetos identificáveis por suas identidades
São mutáveis(mantendo a identidade)
Possuem um ciclo de vida na aplicação
sábado, 12 de maio de 12
![Page 30: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/30.jpg)
class Order < ActiveRecord::Base belongs_to :user has_one :addressend
class Address < ActiveRecord::Base belongs_to :orderend
sábado, 12 de maio de 12
![Page 31: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/31.jpg)
VALUE OBJECTS
Objetos identificáveis por seu valores
São imutáveis
Descrevem “coisas”
sábado, 12 de maio de 12
![Page 32: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/32.jpg)
class Address attr_reader :street, :city
def initialize(street, city) @street, @city = street, city end
end
sábado, 12 de maio de 12
![Page 33: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/33.jpg)
class Order < ActiveRecord::Base belongs_to :user composed_of :address, :mapping => [%w(address_street street), %w(address_city city)]
end
sábado, 12 de maio de 12
![Page 34: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/34.jpg)
PRESENTERS
DICA 3
sábado, 12 de maio de 12
![Page 35: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/35.jpg)
*PRESENTERS*EXHIBTI OBJECTS
DECORATORSAttach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality. / Gang of Four
sábado, 12 de maio de 12
![Page 36: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/36.jpg)
Lógica na View
<% if user_signed_in? %><%= product.name %><% else %><%= link_to product.name, product_path(product) %><% end %>
sábado, 12 de maio de 12
![Page 37: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/37.jpg)
BasePresenter
require “delegate”class BasePresenter < SimpleDelegator attr_accessor :context
def initialize(model, context = nil, objects = []) objects.each do |key, value| self.class.send :define_method, key do value end end
@context = context super model endend
sábado, 12 de maio de 12
![Page 38: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/38.jpg)
BasePresenter
class ProductPresenter < BasePresenter def display_name if user name else context.link_to name, context.product_path(self) end end
def display_description context.render “products/description”, :product => self endend
sábado, 12 de maio de 12
![Page 39: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/39.jpg)
PresenterHelper
module PresenterHelper def present(presenter_class, model, objects) presenter = presenter_class.new(model, self, objects) yield presenter if block_given? presenter end
end
sábado, 12 de maio de 12
![Page 40: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/40.jpg)
Utilização
<% present ProductPresenter, @product, :user => current_user do |presenter| %>
<%= presenter.display_name %> <%= presenter.display_description %>
<% end %>
sábado, 12 de maio de 12
![Page 41: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/41.jpg)
ADAPTERS
DICA 4
sábado, 12 de maio de 12
![Page 42: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/42.jpg)
ADAPTAR A INTERFACEDE UMA CLASSE
sábado, 12 de maio de 12
![Page 43: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/43.jpg)
DEPENDÊNCIASEXTERNAS
GRANDES CHANCES DE MUDAR
sábado, 12 de maio de 12
![Page 44: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/44.jpg)
Exemplo:
Gem Koalagithub.com/arsduo/koala
@graph = Koala::Facebook::API.new(oauth_access_token)@friends = @graph.get_connections("me", "friends")
sábado, 12 de maio de 12
![Page 45: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/45.jpg)
Criando um Adapterclass FacebookAdapter attr_accessor :access_token, :adapter
def initialize(access_token, adapter = Koala::Facebook::API) @access_token = access_token @adapter = adapter.new(access_token) end
def friends adapter.get_connections("me", "friends", :fields => "name") endend
sábado, 12 de maio de 12
![Page 46: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/46.jpg)
FINALIZANDO...
Ao codificar, vamospensar no DESIGN
sábado, 12 de maio de 12
![Page 47: Boas Práticas de Design em Aplicações Ruby on Rails](https://reader038.vdocuments.net/reader038/viewer/2022102815/55864a87d8b42a41018b460a/html5/thumbnails/47.jpg)
OBRIGADO
sábado, 12 de maio de 12