SlideShare ist ein Scribd-Unternehmen logo
1 von 47
Downloaden Sie, um offline zu lesen
BOAS PRÁTICAS
                           DE DESIGN EM
                           APLICAÇÕES RAILS
                           RINALDI FONSECA
                           rinaldifonseca.com
                           @rinaldifonseca




sábado, 12 de maio de 12
sábado, 12 de maio de 12
VAMOS CONSIDERAR PESSOAS COMO:

                   UNCLE BOB
                   MARTIN FOWLER
                   SANDI METZ
                   E OUTROS




sábado, 12 de maio de 12
CLEAN CODE
                   DESIGN PATTERNS
                   SOLID
                   TODOS NÓS JÁ OUVIMOS FALAR




sábado, 12 de maio de 12
APLICAR NA
                    PRÁTICA
                    É DIFÍCIL




sábado, 12 de maio de 12
VAMOS
                PENSAR
                NA
                ESSÊNCIA

sábado, 12 de maio de 12
O DESIGN

sábado, 12 de maio de 12
O QUE É DESIGN??


sábado, 12 de maio de 12
O CÓDIGO


sábado, 12 de maio de 12
A ARTE
                   DE
                   ORGANIZAR
                   O CÓDIGO


sábado, 12 de maio de 12
CADA LINHA
                 CADA CLASSE
                 CADA TESTE
                 FAZ PARTE DO DESIGN


sábado, 12 de maio de 12
E QUAL É O OBJETIVO
                       DO DESIGN?



sábado, 12 de maio de 12
REDUZIR O CUSTO
                       DA MUDANÇA



sábado, 12 de maio de 12
VAMOS PENSAR
                       QUE O CÓDIDO
                       DEVE FUNCIONAR HOJE
                       E APENAS ISSO.


sábado, 12 de maio de 12
DEVE
                       SER FÁCIL DE MUDAR
                       PARA SEMPRE.



sábado, 12 de maio de 12
FIM DA PARTE 1




sábado, 12 de maio de 12
DICAS PRÁTICAS




sábado, 12 de maio de 12
AVISO:


          O que vou falar, NÃO é
          papo de Javeiro =)



sábado, 12 de maio de 12
DICA 1


                    USAR CLASSES DE SERVIÇO
                     A.K.A. SERVICES



sábado, 12 de maio de 12
Rails e o MVC




sábado, 12 de maio de 12
FAT MODELS
                           THIN CONTROLLERS



sábado, 12 de maio de 12
DDD         ERIC EVANS




                  DOMAIN DRIVEN DESIGN




sábado, 12 de maio de 12
As vezes, lidamos com
                           “coisas” que não se
                           encaixam em
                           determinados objetos



sábado, 12 de maio de 12
APPLICATION SERVICE
                DOMAIN SERVICE
                INFRASTRUCTURE SERVICE



sábado, 12 de maio de 12
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
             end
            end




sábado, 12 de maio de 12
Domain Service

            class FundsTransferService
             def self.transfer(from, to, amount)
               Account.transaction do
                from.debit amount
                to.credit amount
               end
             end
            end




sábado, 12 de maio de 12
Infrastructure Service


          class MessagingService
           def self.overdrawn_account_sms(account)
             Rails.queue.push SmsJob, "#{account.number}!"
           end
          end




sábado, 12 de maio de 12
DICA 2



                     ENTITIES AND
                     VALUE OBJECTS


sábado, 12 de maio de 12
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
class Order < ActiveRecord::Base
             belongs_to :user
             has_one :address
            end




            class Address < ActiveRecord::Base
             belongs_to :order
            end




sábado, 12 de maio de 12
VALUE OBJECTS

       Objetos identificáveis por seu valores
       São imutáveis
       Descrevem “coisas”




sábado, 12 de maio de 12
class Address
             attr_reader :street, :city

               def initialize(street, city)
                @street, @city = street, city
               end

            end




sábado, 12 de maio de 12
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
DICA 3



                     PRESENTERS



sábado, 12 de maio de 12
*PRESENTERS
         *EXHIBTI OBJECTS


           DECORATORS
            Attach 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
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
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
           end
          end

sábado, 12 de maio de 12
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
         end
        end


sábado, 12 de maio de 12
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
Utilização


          <% present ProductPresenter, @product, :user =>
          current_user do |presenter| %>

             <%= presenter.display_name %>
             <%= presenter.display_description %>

          <% end %>




sábado, 12 de maio de 12
DICA 4



                     ADAPTERS



sábado, 12 de maio de 12
ADAPTAR A INTERFACE
                     DE UMA CLASSE




sábado, 12 de maio de 12
DEPENDÊNCIAS
                EXTERNAS
                GRANDES CHANCES DE
                MUDAR


sábado, 12 de maio de 12
Exemplo:

       Gem Koala
        github.com/arsduo/koala


          @graph = Koala::Facebook::API.new(oauth_access_token)
          @friends = @graph.get_connections("me", "friends")




sábado, 12 de maio de 12
Criando um Adapter
        class 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")
         end
        end




sábado, 12 de maio de 12
FINALIZANDO...


             Ao codificar, vamos
             pensar no DESIGN



sábado, 12 de maio de 12
OBRIGADO



sábado, 12 de maio de 12

Weitere ähnliche Inhalte

Andere mochten auch

Programacao Funcional Em Ruby
Programacao Funcional Em RubyProgramacao Funcional Em Ruby
Programacao Funcional Em RubyElomar Souza
 
Cientista de Dados – Dominando o Big Data com Software Livre
Cientista de Dados – Dominando o Big Data com Software Livre Cientista de Dados – Dominando o Big Data com Software Livre
Cientista de Dados – Dominando o Big Data com Software Livre Ambiente Livre
 
Pentaho, Hadoop , Big Data e Data Lakes
Pentaho, Hadoop , Big Data e Data LakesPentaho, Hadoop , Big Data e Data Lakes
Pentaho, Hadoop , Big Data e Data LakesAmbiente Livre
 
Pentaho com Hadoop – O Canivete Suíço do Cientistas de Dados para Big Data An...
Pentaho com Hadoop – O Canivete Suíço do Cientistas de Dados para Big Data An...Pentaho com Hadoop – O Canivete Suíço do Cientistas de Dados para Big Data An...
Pentaho com Hadoop – O Canivete Suíço do Cientistas de Dados para Big Data An...Ambiente Livre
 
NoSQL: onde, como e por quê? Cassandra e MongoDB
NoSQL: onde, como e por quê? Cassandra e MongoDBNoSQL: onde, como e por quê? Cassandra e MongoDB
NoSQL: onde, como e por quê? Cassandra e MongoDBRodrigo Hjort
 
Big Data Analytics - Do MapReduce ao dashboard com Hadoop e Pentaho
Big Data Analytics - Do MapReduce ao dashboard com Hadoop e PentahoBig Data Analytics - Do MapReduce ao dashboard com Hadoop e Pentaho
Big Data Analytics - Do MapReduce ao dashboard com Hadoop e PentahoAmbiente Livre
 
Big Data - O que é o hadoop, map reduce, hdfs e hive
Big Data - O que é o hadoop, map reduce, hdfs e hiveBig Data - O que é o hadoop, map reduce, hdfs e hive
Big Data - O que é o hadoop, map reduce, hdfs e hiveFlavio Fonte, PMP, ITIL
 
OS CINCO Vs DO BIG DATA
OS CINCO Vs DO BIG DATAOS CINCO Vs DO BIG DATA
OS CINCO Vs DO BIG DATALeonardo Dias
 

Andere mochten auch (9)

Programacao Funcional Em Ruby
Programacao Funcional Em RubyProgramacao Funcional Em Ruby
Programacao Funcional Em Ruby
 
Cientista de Dados – Dominando o Big Data com Software Livre
Cientista de Dados – Dominando o Big Data com Software Livre Cientista de Dados – Dominando o Big Data com Software Livre
Cientista de Dados – Dominando o Big Data com Software Livre
 
Pentaho, Hadoop , Big Data e Data Lakes
Pentaho, Hadoop , Big Data e Data LakesPentaho, Hadoop , Big Data e Data Lakes
Pentaho, Hadoop , Big Data e Data Lakes
 
MongoDB e Bancos de Dados Orientados a Documentos
MongoDB e Bancos de Dados Orientados a DocumentosMongoDB e Bancos de Dados Orientados a Documentos
MongoDB e Bancos de Dados Orientados a Documentos
 
Pentaho com Hadoop – O Canivete Suíço do Cientistas de Dados para Big Data An...
Pentaho com Hadoop – O Canivete Suíço do Cientistas de Dados para Big Data An...Pentaho com Hadoop – O Canivete Suíço do Cientistas de Dados para Big Data An...
Pentaho com Hadoop – O Canivete Suíço do Cientistas de Dados para Big Data An...
 
NoSQL: onde, como e por quê? Cassandra e MongoDB
NoSQL: onde, como e por quê? Cassandra e MongoDBNoSQL: onde, como e por quê? Cassandra e MongoDB
NoSQL: onde, como e por quê? Cassandra e MongoDB
 
Big Data Analytics - Do MapReduce ao dashboard com Hadoop e Pentaho
Big Data Analytics - Do MapReduce ao dashboard com Hadoop e PentahoBig Data Analytics - Do MapReduce ao dashboard com Hadoop e Pentaho
Big Data Analytics - Do MapReduce ao dashboard com Hadoop e Pentaho
 
Big Data - O que é o hadoop, map reduce, hdfs e hive
Big Data - O que é o hadoop, map reduce, hdfs e hiveBig Data - O que é o hadoop, map reduce, hdfs e hive
Big Data - O que é o hadoop, map reduce, hdfs e hive
 
OS CINCO Vs DO BIG DATA
OS CINCO Vs DO BIG DATAOS CINCO Vs DO BIG DATA
OS CINCO Vs DO BIG DATA
 

Ähnlich wie Boas Práticas de Design em Aplicações Ruby on Rails

Ähnlich wie Boas Práticas de Design em Aplicações Ruby on Rails (13)

Melhores apps rails
Melhores apps railsMelhores apps rails
Melhores apps rails
 
Apresentação
ApresentaçãoApresentação
Apresentação
 
SOLID Principles
SOLID PrinciplesSOLID Principles
SOLID Principles
 
Aula android 03
Aula android 03Aula android 03
Aula android 03
 
Palestra Puppet Hora Livre
Palestra Puppet Hora LivrePalestra Puppet Hora Livre
Palestra Puppet Hora Livre
 
Pre-processadores CSS e Ferramentas gráficas
Pre-processadores CSS e Ferramentas gráficasPre-processadores CSS e Ferramentas gráficas
Pre-processadores CSS e Ferramentas gráficas
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
Minicurso grails
Minicurso grailsMinicurso grails
Minicurso grails
 
Domain Driven Design PHP TDC2014
Domain Driven Design PHP TDC2014Domain Driven Design PHP TDC2014
Domain Driven Design PHP TDC2014
 
Flisol 2012
Flisol 2012Flisol 2012
Flisol 2012
 
Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013
 
Aula android 01.pdf
Aula android 01.pdfAula android 01.pdf
Aula android 01.pdf
 
Padrões de projeto
Padrões de projetoPadrões de projeto
Padrões de projeto
 

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

  • 1. BOAS PRÁTICAS DE DESIGN EM APLICAÇÕES RAILS RINALDI FONSECA rinaldifonseca.com @rinaldifonseca sábado, 12 de maio de 12
  • 2. sábado, 12 de maio de 12
  • 3. VAMOS CONSIDERAR PESSOAS COMO: UNCLE BOB MARTIN FOWLER SANDI METZ E OUTROS sábado, 12 de maio de 12
  • 4. CLEAN CODE DESIGN PATTERNS SOLID TODOS NÓS JÁ OUVIMOS FALAR sábado, 12 de maio de 12
  • 5. APLICAR NA PRÁTICA É DIFÍCIL sábado, 12 de maio de 12
  • 6. VAMOS PENSAR NA ESSÊNCIA sábado, 12 de maio de 12
  • 7. O DESIGN sábado, 12 de maio de 12
  • 8. O QUE É DESIGN?? sábado, 12 de maio de 12
  • 9. O CÓDIGO sábado, 12 de maio de 12
  • 10. A ARTE DE ORGANIZAR O CÓDIGO sábado, 12 de maio de 12
  • 11. CADA LINHA CADA CLASSE CADA TESTE FAZ PARTE DO DESIGN sábado, 12 de maio de 12
  • 12. E QUAL É O OBJETIVO DO DESIGN? sábado, 12 de maio de 12
  • 13. REDUZIR O CUSTO DA MUDANÇA sábado, 12 de maio de 12
  • 14. VAMOS PENSAR QUE O CÓDIDO DEVE FUNCIONAR HOJE E APENAS ISSO. sábado, 12 de maio de 12
  • 15. DEVE SER FÁCIL DE MUDAR PARA SEMPRE. sábado, 12 de maio de 12
  • 16. FIM DA PARTE 1 sábado, 12 de maio de 12
  • 18. AVISO: O que vou falar, NÃO é papo de Javeiro =) sábado, 12 de maio de 12
  • 19. DICA 1 USAR CLASSES DE SERVIÇO A.K.A. SERVICES sábado, 12 de maio de 12
  • 20. Rails e o MVC sábado, 12 de maio de 12
  • 21. FAT MODELS THIN CONTROLLERS sábado, 12 de maio de 12
  • 22. DDD ERIC EVANS DOMAIN DRIVEN DESIGN sábado, 12 de maio de 12
  • 23. As vezes, lidamos com “coisas” que não se encaixam em determinados objetos sábado, 12 de maio de 12
  • 24. APPLICATION SERVICE DOMAIN SERVICE INFRASTRUCTURE SERVICE sábado, 12 de maio de 12
  • 25. 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 end end sábado, 12 de maio de 12
  • 26. Domain Service class FundsTransferService def self.transfer(from, to, amount) Account.transaction do from.debit amount to.credit amount end end end sábado, 12 de maio de 12
  • 27. Infrastructure Service class MessagingService def self.overdrawn_account_sms(account) Rails.queue.push SmsJob, "#{account.number}!" end end sábado, 12 de maio de 12
  • 28. DICA 2 ENTITIES AND VALUE OBJECTS sábado, 12 de maio de 12
  • 29. 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
  • 30. class Order < ActiveRecord::Base belongs_to :user has_one :address end class Address < ActiveRecord::Base belongs_to :order end sábado, 12 de maio de 12
  • 31. VALUE OBJECTS Objetos identificáveis por seu valores São imutáveis Descrevem “coisas” sábado, 12 de maio de 12
  • 32. class Address attr_reader :street, :city def initialize(street, city) @street, @city = street, city end end sábado, 12 de maio de 12
  • 33. 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
  • 34. DICA 3 PRESENTERS sábado, 12 de maio de 12
  • 35. *PRESENTERS *EXHIBTI OBJECTS DECORATORS Attach 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
  • 36. 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
  • 37. 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 end end sábado, 12 de maio de 12
  • 38. 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 end end sábado, 12 de maio de 12
  • 39. 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
  • 40. Utilização <% present ProductPresenter, @product, :user => current_user do |presenter| %> <%= presenter.display_name %> <%= presenter.display_description %> <% end %> sábado, 12 de maio de 12
  • 41. DICA 4 ADAPTERS sábado, 12 de maio de 12
  • 42. ADAPTAR A INTERFACE DE UMA CLASSE sábado, 12 de maio de 12
  • 43. DEPENDÊNCIAS EXTERNAS GRANDES CHANCES DE MUDAR sábado, 12 de maio de 12
  • 44. Exemplo: Gem Koala github.com/arsduo/koala @graph = Koala::Facebook::API.new(oauth_access_token) @friends = @graph.get_connections("me", "friends") sábado, 12 de maio de 12
  • 45. Criando um Adapter class 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") end end sábado, 12 de maio de 12
  • 46. FINALIZANDO... Ao codificar, vamos pensar no DESIGN sábado, 12 de maio de 12