boas práticas de design em aplicações ruby on rails

47
BOAS PRÁTICAS DE DESIGN EM APLICAÇÕES RAILS RINALDI FONSECA rinaldifonseca.com @rinaldifonseca sábado, 12 de maio de 12

Upload: rinaldifonsecanascimento

Post on 21-Jun-2015

642 views

Category:

Technology


2 download

DESCRIPTION

5º Encontro Guru Sorocaba - Secot Ufscar

TRANSCRIPT

Page 1: Boas Práticas de Design em Aplicações Ruby on Rails

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

sábado, 12 de maio de 12

Page 3: Boas Práticas de Design em Aplicações Ruby on Rails

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

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

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

VAMOSPENSARNAESSÊNCIA

sábado, 12 de maio de 12

Page 7: Boas Práticas de Design em Aplicações Ruby on Rails

O DESIGN

sábado, 12 de maio de 12

Page 8: Boas Práticas de Design em Aplicações Ruby on Rails

O QUE É DESIGN??

sábado, 12 de maio de 12

Page 9: Boas Práticas de Design em Aplicações Ruby on Rails

O CÓDIGO

sábado, 12 de maio de 12

Page 10: Boas Práticas de Design em Aplicações Ruby on Rails

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

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

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

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

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

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

FIM DA PARTE 1

sábado, 12 de maio de 12

Page 17: Boas Práticas de Design em Aplicações Ruby on Rails

DICAS PRÁTICAS

sábado, 12 de maio de 12

Page 18: Boas Práticas de Design em Aplicações Ruby on Rails

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

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

Rails e o MVC

sábado, 12 de maio de 12

Page 21: Boas Práticas de Design em Aplicações Ruby on Rails

FAT MODELSTHIN CONTROLLERS

sábado, 12 de maio de 12

Page 22: Boas Práticas de Design em Aplicações Ruby on Rails

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

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

APPLICATION SERVICEDOMAIN SERVICEINFRASTRUCTURE SERVICE

sábado, 12 de maio de 12

Page 25: Boas Práticas de Design em Aplicações Ruby on Rails

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

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

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

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

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

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

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

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

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

PRESENTERS

DICA 3

sábado, 12 de maio de 12

Page 35: Boas Práticas de Design em Aplicações Ruby on Rails

*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

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

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

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

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

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

ADAPTERS

DICA 4

sábado, 12 de maio de 12

Page 42: Boas Práticas de Design em Aplicações Ruby on Rails

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

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

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

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

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

OBRIGADO

sábado, 12 de maio de 12