SlideShare uma empresa Scribd logo
1 de 77
Baixar para ler offline
Criando aplicações
                       melhores com Ruby e
                              Rails


segunda-feira, 12 de setembro de 11
Vinicius Baggio Fuentes
                         @vinibaggio


segunda-feira, 12 de setembro de 11
segunda-feira, 12 de setembro de 11
http://blog.plataformatec.com.br




segunda-feira, 12 de setembro de 11
segunda-feira, 12 de setembro de 11
a web em 2004



segunda-feira, 12 de setembro de 11
IE 6
segunda-feira, 12 de setembro de 11
<?xml version="1.0" encoding="ISO-8859-1" ?>
   <!DOCTYPE struts-config PUBLIC
         "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
         "http://struts.apache.org/dtds/struts-config_1_3.dtd">
   <struts-config>
       <form-beans>
           <form-bean
               name="logonForm"
               type="app.LogonForm"/>
       </form-beans>
       <action-mappings>
           <action
               path="/Welcome"
               forward="/pages/Welcome.jsp"/>
           <action
               path="/Logon"
               forward="/pages/Logon.jsp"/>
           <action



                                                                             XML
               path="/LogonSubmit"
               type="app.LogonAction"
               name="logonForm"
               scope="request"
               validate="true"
               input="/pages/Logon.jsp">
               <forward
                    name="success"
                    path="/pages/Welcome.jsp"/>
               <forward
                    name="failure"
                    path="/pages/Logon.jsp"/>
           </action>
           <action
               path="/Logoff"
               type="app.LogoffAction">
               <forward
                    name="success"
                    path="/pages/Logoff.jsp"/>
           </action>
       </action-mappings>
       <message-resources parameter="resources.application"/>
   </struts-config>

segunda-feira, 12 de setembro de 11
Complexidade



segunda-feira, 12 de setembro de 11
Alto Time-to-market



segunda-feira, 12 de setembro de 11
Baixa qualidade



segunda-feira, 12 de setembro de 11
www.rubyonrails.com
segunda-feira, 12 de setembro de 11
TDD



segunda-feira, 12 de setembro de 11
Convention over
                                       configuration


segunda-feira, 12 de setembro de 11
Mas são realmente
                                  coisas novas?


segunda-feira, 12 de setembro de 11
TDD - 2002!



segunda-feira, 12 de setembro de 11
Convention Over
                              Configuration?
                            Spring framework já
                              existia em 2002

segunda-feira, 12 de setembro de 11
segunda-feira, 12 de setembro de 11
segunda-feira, 12 de setembro de 11
Criador do Redis!




segunda-feira, 12 de setembro de 11
‘the messiest, nastiest big-
          ball-of-mud code I have
       seen in my entire career has
           been in Ruby on Rails
                  projects.’
                                        Avdi Grimm - Autor do Exceptional Ruby,
                                      com mais de 10 anos de experiência em C++




segunda-feira, 12 de setembro de 11
explicit dynamic_bitset(const std::basic_string<CharT, Traits, Alloc>& s,
        typename std::basic_string<CharT, Traits, Alloc>::size_type pos = 0,
        typename std::basic_string<CharT, Traits, Alloc>::size_type n =
                                               std::basic_string<CharT, Traits, Alloc>::npos,
        const Allocator& alloc = Allocator());




segunda-feira, 12 de setembro de 11
Assets Pipeline!
                                              Complexidade do Rails *




                        0.01            1.2             2.x             3.0          3.1




                                      * dados sem nenhum valor científico



segunda-feira, 12 de setembro de 11
Será que as opiniões do
                   rails são suficientes?


segunda-feira, 12 de setembro de 11
Skinny Controllers, Fat
                           Models:



segunda-feira, 12 de setembro de 11
Skinny Controllers, Fat
                           Models:
                             Overweight models


segunda-feira, 12 de setembro de 11
Ausência de qualquer
                          modelagem OO



segunda-feira, 12 de setembro de 11
Ausência de qualquer
                          modelagem OO

              manutenibilidade sofrível

segunda-feira, 12 de setembro de 11
Descarte de boas práticas



segunda-feira, 12 de setembro de 11
‘‘Se eu fizesse isso em
                      Java, seria chamado de
                             criminoso’’
                     -- Cliente anônimo, que estava olhando um código
                    <sarcasm>bonito</sarcasm> em Ruby, mas tolerante




segunda-feira, 12 de setembro de 11
‘‘Design Pattern é coisa
                          de Javeiro’’
                                      -- Trocentos rubistas




segunda-feira, 12 de setembro de 11
Design Patterns
segunda-feira, 12 de setembro de 11
Alguns patterns ficam
                          desnecessários


segunda-feira, 12 de setembro de 11
... e outros builtin:
        irb(main):001:0> iterator = [1,2,3].each
        => #<Enumerable::Enumerator:0x10ece8d30>
        irb(main):002:0> iterator.next
        => 1
        irb(main):003:0> iterator.next
        => 2
        irb(main):004:0> iterator.next
        => 3
        irb(main):005:0> iterator.next
        StopIteration: iteration reached at end
        ! from /Users/vinibaggio/.rbenv/versions/ree-2011.03/lib/ruby/
        1.8/generator.rb:193:in `next'
        ! from (irb):6




segunda-feira, 12 de setembro de 11
Lei de Deméter e Princípio
           da menor surpresa


segunda-feira, 12 de setembro de 11
def verify_status_change(site, current_event)
                               if current_event.status == :error &&
                                    site.last_event.status == :success

                                    site.create_error_change_report
                                  elsif current_event.status == :success &&
                                       site.last_event.status == :error

                                 site.create_success_change_report
                               end
                             end




segunda-feira, 12 de setembro de 11
def verify_status_change(site, current_event)
                               if current_event.status == :error &&
                                    site.last_event.status == :success

                                    site.create_error_change_report
                                  elsif current_event.status == :success &&
                                       site.last_event.status == :error

                                 site.create_success_change_report
                               end
                             end




segunda-feira, 12 de setembro de 11
def verify_status_change(site, current_event)
                               if site.success? && current_event.error?
                                 site.create_error_change_report
                               elsif site.error? && current_event.success?
                                 site.create_success_change_report




                                                                      ✓
                               end
                             end




segunda-feira, 12 de setembro de 11
class TreeNodeParentTransferController < ApplicationController
        def update
          current_tree_node        = tree_nodes.find(params[:id])
          current_tree_node.parent = tree_nodes.find(params[:parent_id])
          current_tree_node.save

             redirect_to tree_nodes_path
           end

        private
        def tree_nodes
          current_user.tree_nodes
        end
      end




segunda-feira, 12 de setembro de 11
class TreeNode < ActiveRecord::Base
                    has_many :children, :foreign_key => :parent_id,
                                        :class_name => 'TreeNode'

                       belongs_to :parent, :class_name => 'TreeNode'

                       before_save :update_name
                       after_save :update_parents

                       private

                       def update_name
                         self.full_name = "#{parent.full_name}::#{name}"
                       end

                    def update_children
                      children.each(&:save)
                    end
                  end




segunda-feira, 12 de setembro de 11
class TreeNode < ActiveRecord::Base
                    has_many :children, :foreign_key => :parent_id,
                                        :class_name => 'TreeNode'

                       belongs_to :parent, :class_name => 'TreeNode'

                       before_save :update_name
                       after_save :update_parents

                       private

                       def update_name
                         self.full_name = "#{parent.name_cache}::#{name}"
                       end

                    def update_children
                      children.each(&:save)
                    end
                  end




segunda-feira, 12 de setembro de 11
DRY



segunda-feira, 12 de setembro de 11
DRY não é isolar
                                 qualquer código
                                    duplicado


segunda-feira, 12 de setembro de 11
DRY é isolar regras
                              importantes de
                                  negócio


segunda-feira, 12 de setembro de 11
Princípios SOLID




segunda-feira, 12 de setembro de 11
Violação de Single
                                    Responsibility
                class Client < ActiveRecord::Base
                  validates_presence_of :name, :cnpj

                  after_save :insert_in_workflow
                  after_save :log
                end




segunda-feira, 12 de setembro de 11
Exemplos montados
                   são fáceis de mostrar,
                   mas é difícil aplicar no
                  dia-a-dia, requer prática

segunda-feira, 12 de setembro de 11
Programação Funcional
segunda-feira, 12 de setembro de 11
Why Functional Programming
                          Matters (1984)




segunda-feira, 12 de setembro de 11
Why Functional Programming
                          Matters (1984)
                                         Ten so!



segunda-feira, 12 de setembro de 11
Funções definidas a
                      partir de outras

        f(g(x)) = (f o g)(x) = h(x)

segunda-feira, 12 de setembro de 11
Programas inteiros
                   definidos a partir de
                         outros

segunda-feira, 12 de setembro de 11
‘‘A language that doesn’t
                       affect the way you think
                     about programming, is not
                           worth knowing’’
                     -- Alan Perlis, pioneiro em técnicas de construção de
                                           compiladores



segunda-feira, 12 de setembro de 11
Connascence, ou o Cálice
                  Sagrado


segunda-feira, 12 de setembro de 11
Baixo acoplamento
                                      1. Connascence of Name
                                      2. Connascence of Type
                                      3. Connascence of Meaning
                                      4. Connascence of Position
                                      5. Connascence of Algorithm
                                      6. Connascence of Execution
                                      7. Connascence of Timing
                                      8. Connascence of Identity
     Alto acoplamento
segunda-feira, 12 de setembro de 11
1. Connascence of
                                       Name
                           def verify_status_change(site, current_event)
                             if site.success? && current_event.error?
                               site.create_error_change_report
                             elsif site.error? && current_event.success?
                               site.create_success_change_report
                             end
                           end




segunda-feira, 12 de setembro de 11
1. Connascence of
                                       Name
                           def verify_status_change(site, current_event)
                             if site.success? && current_event.error?
                               site.create_error_change_report
                             elsif site.error? && current_event.success?
                               site.create_success_change_report
                             end
                           end




segunda-feira, 12 de setembro de 11
1. Connascence of
                                       Name
                           def verify_status_change(site, current_event)
                             if site.success? && current_event.error?
                               site.create_error_change_report
                             elsif site.error? && current_event.success?
                               site.create_success_change_report
                             end
                           end




segunda-feira, 12 de setembro de 11
4. Connascence of
                                      Position
   def find(type, conditions, joins, order, count)
     ...
   end




segunda-feira, 12 de setembro de 11
Client.find(:all, :name => {'John'}, :balance, 10)




segunda-feira, 12 de setembro de 11
???

  Client.find(:all, :name => {'John'}, :balance, 10)




segunda-feira, 12 de setembro de 11
                                        ✓
???

  Client.find(:all, :name => {'John'}, 10, :balance)




segunda-feira, 12 de setembro de 11
                                            ✗
Redução de C. of
                                Position para C. of
                                       Name


segunda-feira, 12 de setembro de 11
Client.find(:all, {:conditions => {:name => 'John'},
                   :order => :balance,
                   :limit => 10})




segunda-feira, 12 de setembro de 11
                                       ✓
Client.find(:all, {:conditions => {:name => 'John'},
                   :limit => 10,
                   :order => :balance})




segunda-feira, 12 de setembro de 11
                                       ✓
Conceitos de pelo
                            menos 8 anos atrás!


segunda-feira, 12 de setembro de 11
Saia do mundo ‘feliz’ de
                 ruby/rails e saia da zona
                       de conforto


segunda-feira, 12 de setembro de 11
Entender as limitações
                      e razões das regras


segunda-feira, 12 de setembro de 11
com a experiência, invente
           as suas próprias regras


segunda-feira, 12 de setembro de 11
segunda-feira, 12 de setembro de 11
Menos blogs, mais livros
             Menos blogs, mais código


segunda-feira, 12 de setembro de 11
Conheça sua ferramenta
segunda-feira, 12 de setembro de 11
Progresso é iterativo
                errar é normal
           o diferencial é perceber
                 e melhorar

segunda-feira, 12 de setembro de 11
E, por fim...



segunda-feira, 12 de setembro de 11
‘Ruby é feito pra ser
                 bonito. Se está feio, está
                          errado.’
                             -- Yukihiro ‘Matz’ Matsumoto, criador do Ruby




segunda-feira, 12 de setembro de 11
Obrigado!



segunda-feira, 12 de setembro de 11
Referências
     •      Design Patterns in Ruby (ISBN-13 978-0321490452)

     •      Why Functional Programming Matters (http://bit.ly/nGhPXj)

     •      Ruby Programming Language (http://amzn.to/quCVrx)

     •      Crafting Rails Applications (http://amzn.to/n1A4j2)

     •      Principles of OOD (http://bit.ly/n9eNOw, http://bit.ly/nNkrVr,
            http://bit.ly/qnZg4r, http://slidesha.re/p6XpX1)

     •      Law of demeter (http://bit.ly/pLlMCU)

     •      DRY (http://bit.ly/oT9zkA)

     •      DDD (http://amzn.to/oaYTvb)

     •      Connascence (http://bit.ly/r8Vgyi, http://amzn.to/oU8DQw)
segunda-feira, 12 de setembro de 11

Mais conteúdo relacionado

Semelhante a Melhores apps rails

Yet Another Ruby Framework - Como o Rails funciona por dentro
Yet Another Ruby Framework - Como o Rails funciona por dentroYet Another Ruby Framework - Como o Rails funciona por dentro
Yet Another Ruby Framework - Como o Rails funciona por dentroCarlos Brando
 
Otimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - TchelinuxOtimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - TchelinuxElton Minetto
 
Boas Práticas de Design em Aplicações Ruby on Rails
Boas Práticas de Design em Aplicações Ruby on RailsBoas Práticas de Design em Aplicações Ruby on Rails
Boas Práticas de Design em Aplicações Ruby on Railsrinaldifonsecanascimento
 
Boas práticas de Design em Aplicações Rails
Boas práticas de Design em Aplicações RailsBoas práticas de Design em Aplicações Rails
Boas práticas de Design em Aplicações Railsrinaldifonsecanascimento
 
XML Free Programming - Brazil
XML Free Programming - BrazilXML Free Programming - Brazil
XML Free Programming - BrazilStephen Chin
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JSRodrigo Urubatan
 
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Emerson Macedo
 
Apresentação sobre MVVMC
Apresentação sobre MVVMCApresentação sobre MVVMC
Apresentação sobre MVVMCAlisson Agiani
 
TDC2016POA | Trilha Ruby - Como não fazer do Rails o seu pesadelo
TDC2016POA | Trilha Ruby - Como não fazer do Rails o seu pesadeloTDC2016POA | Trilha Ruby - Como não fazer do Rails o seu pesadelo
TDC2016POA | Trilha Ruby - Como não fazer do Rails o seu pesadelotdc-globalcode
 
LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.jsGiovanni Bassi
 
Rails - EXATEC2009
Rails - EXATEC2009Rails - EXATEC2009
Rails - EXATEC2009Caue Guerra
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Rodrigo Urubatan
 
RubyConfBr 2015 - Rails & Javascript: faça isso direito
RubyConfBr 2015 - Rails & Javascript: faça isso direitoRubyConfBr 2015 - Rails & Javascript: faça isso direito
RubyConfBr 2015 - Rails & Javascript: faça isso direitoCezinha Anjos
 
Tecnologias para desenvolvimento ágil de aplicações Web-Isemanatsi_UTFPR
Tecnologias para desenvolvimento ágil de aplicações Web-Isemanatsi_UTFPRTecnologias para desenvolvimento ágil de aplicações Web-Isemanatsi_UTFPR
Tecnologias para desenvolvimento ágil de aplicações Web-Isemanatsi_UTFPRAlessandro Dias
 
Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013Pablo Dall'Oglio
 
Zend Framework 1.11
Zend Framework 1.11Zend Framework 1.11
Zend Framework 1.11Cezar Souza
 
AngularJS Abraçando o MVC Client-Side
AngularJS Abraçando o MVC Client-SideAngularJS Abraçando o MVC Client-Side
AngularJS Abraçando o MVC Client-SideSergio Azevedo
 

Semelhante a Melhores apps rails (20)

Yet Another Ruby Framework - Como o Rails funciona por dentro
Yet Another Ruby Framework - Como o Rails funciona por dentroYet Another Ruby Framework - Como o Rails funciona por dentro
Yet Another Ruby Framework - Como o Rails funciona por dentro
 
Otimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - TchelinuxOtimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - Tchelinux
 
Boas Práticas de Design em Aplicações Ruby on Rails
Boas Práticas de Design em Aplicações Ruby on RailsBoas Práticas de Design em Aplicações Ruby on Rails
Boas Práticas de Design em Aplicações Ruby on Rails
 
Boas práticas de Design em Aplicações Rails
Boas práticas de Design em Aplicações RailsBoas práticas de Design em Aplicações Rails
Boas práticas de Design em Aplicações Rails
 
XML Free Programming - Brazil
XML Free Programming - BrazilXML Free Programming - Brazil
XML Free Programming - Brazil
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
 
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
 
Apresentação sobre MVVMC
Apresentação sobre MVVMCApresentação sobre MVVMC
Apresentação sobre MVVMC
 
TDC2016POA | Trilha Ruby - Como não fazer do Rails o seu pesadelo
TDC2016POA | Trilha Ruby - Como não fazer do Rails o seu pesadeloTDC2016POA | Trilha Ruby - Como não fazer do Rails o seu pesadelo
TDC2016POA | Trilha Ruby - Como não fazer do Rails o seu pesadelo
 
Aula Ruby
Aula RubyAula Ruby
Aula Ruby
 
LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.js
 
Rails - EXATEC2009
Rails - EXATEC2009Rails - EXATEC2009
Rails - EXATEC2009
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
 
RubyConfBr 2015 - Rails & Javascript: faça isso direito
RubyConfBr 2015 - Rails & Javascript: faça isso direitoRubyConfBr 2015 - Rails & Javascript: faça isso direito
RubyConfBr 2015 - Rails & Javascript: faça isso direito
 
Tecnologias para desenvolvimento ágil de aplicações Web-Isemanatsi_UTFPR
Tecnologias para desenvolvimento ágil de aplicações Web-Isemanatsi_UTFPRTecnologias para desenvolvimento ágil de aplicações Web-Isemanatsi_UTFPR
Tecnologias para desenvolvimento ágil de aplicações Web-Isemanatsi_UTFPR
 
Introducao rubyonrails
Introducao rubyonrailsIntroducao rubyonrails
Introducao rubyonrails
 
Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013
 
Rails na prática
Rails na práticaRails na prática
Rails na prática
 
Zend Framework 1.11
Zend Framework 1.11Zend Framework 1.11
Zend Framework 1.11
 
AngularJS Abraçando o MVC Client-Side
AngularJS Abraçando o MVC Client-SideAngularJS Abraçando o MVC Client-Side
AngularJS Abraçando o MVC Client-Side
 

Melhores apps rails

  • 1. Criando aplicações melhores com Ruby e Rails segunda-feira, 12 de setembro de 11
  • 2. Vinicius Baggio Fuentes @vinibaggio segunda-feira, 12 de setembro de 11
  • 3. segunda-feira, 12 de setembro de 11
  • 5. segunda-feira, 12 de setembro de 11
  • 6. a web em 2004 segunda-feira, 12 de setembro de 11
  • 7. IE 6 segunda-feira, 12 de setembro de 11
  • 8. <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"> <struts-config> <form-beans> <form-bean name="logonForm" type="app.LogonForm"/> </form-beans> <action-mappings> <action path="/Welcome" forward="/pages/Welcome.jsp"/> <action path="/Logon" forward="/pages/Logon.jsp"/> <action XML path="/LogonSubmit" type="app.LogonAction" name="logonForm" scope="request" validate="true" input="/pages/Logon.jsp"> <forward name="success" path="/pages/Welcome.jsp"/> <forward name="failure" path="/pages/Logon.jsp"/> </action> <action path="/Logoff" type="app.LogoffAction"> <forward name="success" path="/pages/Logoff.jsp"/> </action> </action-mappings> <message-resources parameter="resources.application"/> </struts-config> segunda-feira, 12 de setembro de 11
  • 13. TDD segunda-feira, 12 de setembro de 11
  • 14. Convention over configuration segunda-feira, 12 de setembro de 11
  • 15. Mas são realmente coisas novas? segunda-feira, 12 de setembro de 11
  • 16. TDD - 2002! segunda-feira, 12 de setembro de 11
  • 17. Convention Over Configuration? Spring framework já existia em 2002 segunda-feira, 12 de setembro de 11
  • 18. segunda-feira, 12 de setembro de 11
  • 19. segunda-feira, 12 de setembro de 11
  • 20. Criador do Redis! segunda-feira, 12 de setembro de 11
  • 21. ‘the messiest, nastiest big- ball-of-mud code I have seen in my entire career has been in Ruby on Rails projects.’ Avdi Grimm - Autor do Exceptional Ruby, com mais de 10 anos de experiência em C++ segunda-feira, 12 de setembro de 11
  • 22. explicit dynamic_bitset(const std::basic_string<CharT, Traits, Alloc>& s, typename std::basic_string<CharT, Traits, Alloc>::size_type pos = 0, typename std::basic_string<CharT, Traits, Alloc>::size_type n = std::basic_string<CharT, Traits, Alloc>::npos, const Allocator& alloc = Allocator()); segunda-feira, 12 de setembro de 11
  • 23. Assets Pipeline! Complexidade do Rails * 0.01 1.2 2.x 3.0 3.1 * dados sem nenhum valor científico segunda-feira, 12 de setembro de 11
  • 24. Será que as opiniões do rails são suficientes? segunda-feira, 12 de setembro de 11
  • 25. Skinny Controllers, Fat Models: segunda-feira, 12 de setembro de 11
  • 26. Skinny Controllers, Fat Models: Overweight models segunda-feira, 12 de setembro de 11
  • 27. Ausência de qualquer modelagem OO segunda-feira, 12 de setembro de 11
  • 28. Ausência de qualquer modelagem OO manutenibilidade sofrível segunda-feira, 12 de setembro de 11
  • 29. Descarte de boas práticas segunda-feira, 12 de setembro de 11
  • 30. ‘‘Se eu fizesse isso em Java, seria chamado de criminoso’’ -- Cliente anônimo, que estava olhando um código <sarcasm>bonito</sarcasm> em Ruby, mas tolerante segunda-feira, 12 de setembro de 11
  • 31. ‘‘Design Pattern é coisa de Javeiro’’ -- Trocentos rubistas segunda-feira, 12 de setembro de 11
  • 33. Alguns patterns ficam desnecessários segunda-feira, 12 de setembro de 11
  • 34. ... e outros builtin: irb(main):001:0> iterator = [1,2,3].each => #<Enumerable::Enumerator:0x10ece8d30> irb(main):002:0> iterator.next => 1 irb(main):003:0> iterator.next => 2 irb(main):004:0> iterator.next => 3 irb(main):005:0> iterator.next StopIteration: iteration reached at end ! from /Users/vinibaggio/.rbenv/versions/ree-2011.03/lib/ruby/ 1.8/generator.rb:193:in `next' ! from (irb):6 segunda-feira, 12 de setembro de 11
  • 35. Lei de Deméter e Princípio da menor surpresa segunda-feira, 12 de setembro de 11
  • 36. def verify_status_change(site, current_event) if current_event.status == :error && site.last_event.status == :success site.create_error_change_report elsif current_event.status == :success && site.last_event.status == :error site.create_success_change_report end end segunda-feira, 12 de setembro de 11
  • 37. def verify_status_change(site, current_event) if current_event.status == :error && site.last_event.status == :success site.create_error_change_report elsif current_event.status == :success && site.last_event.status == :error site.create_success_change_report end end segunda-feira, 12 de setembro de 11
  • 38. def verify_status_change(site, current_event) if site.success? && current_event.error? site.create_error_change_report elsif site.error? && current_event.success? site.create_success_change_report ✓ end end segunda-feira, 12 de setembro de 11
  • 39. class TreeNodeParentTransferController < ApplicationController def update current_tree_node = tree_nodes.find(params[:id]) current_tree_node.parent = tree_nodes.find(params[:parent_id]) current_tree_node.save redirect_to tree_nodes_path end private def tree_nodes current_user.tree_nodes end end segunda-feira, 12 de setembro de 11
  • 40. class TreeNode < ActiveRecord::Base has_many :children, :foreign_key => :parent_id, :class_name => 'TreeNode' belongs_to :parent, :class_name => 'TreeNode' before_save :update_name after_save :update_parents private def update_name self.full_name = "#{parent.full_name}::#{name}" end def update_children children.each(&:save) end end segunda-feira, 12 de setembro de 11
  • 41. class TreeNode < ActiveRecord::Base has_many :children, :foreign_key => :parent_id, :class_name => 'TreeNode' belongs_to :parent, :class_name => 'TreeNode' before_save :update_name after_save :update_parents private def update_name self.full_name = "#{parent.name_cache}::#{name}" end def update_children children.each(&:save) end end segunda-feira, 12 de setembro de 11
  • 42. DRY segunda-feira, 12 de setembro de 11
  • 43. DRY não é isolar qualquer código duplicado segunda-feira, 12 de setembro de 11
  • 44. DRY é isolar regras importantes de negócio segunda-feira, 12 de setembro de 11
  • 46. Violação de Single Responsibility class Client < ActiveRecord::Base validates_presence_of :name, :cnpj after_save :insert_in_workflow after_save :log end segunda-feira, 12 de setembro de 11
  • 47. Exemplos montados são fáceis de mostrar, mas é difícil aplicar no dia-a-dia, requer prática segunda-feira, 12 de setembro de 11
  • 49. Why Functional Programming Matters (1984) segunda-feira, 12 de setembro de 11
  • 50. Why Functional Programming Matters (1984) Ten so! segunda-feira, 12 de setembro de 11
  • 51. Funções definidas a partir de outras f(g(x)) = (f o g)(x) = h(x) segunda-feira, 12 de setembro de 11
  • 52. Programas inteiros definidos a partir de outros segunda-feira, 12 de setembro de 11
  • 53. ‘‘A language that doesn’t affect the way you think about programming, is not worth knowing’’ -- Alan Perlis, pioneiro em técnicas de construção de compiladores segunda-feira, 12 de setembro de 11
  • 54. Connascence, ou o Cálice Sagrado segunda-feira, 12 de setembro de 11
  • 55. Baixo acoplamento 1. Connascence of Name 2. Connascence of Type 3. Connascence of Meaning 4. Connascence of Position 5. Connascence of Algorithm 6. Connascence of Execution 7. Connascence of Timing 8. Connascence of Identity Alto acoplamento segunda-feira, 12 de setembro de 11
  • 56. 1. Connascence of Name def verify_status_change(site, current_event) if site.success? && current_event.error? site.create_error_change_report elsif site.error? && current_event.success? site.create_success_change_report end end segunda-feira, 12 de setembro de 11
  • 57. 1. Connascence of Name def verify_status_change(site, current_event) if site.success? && current_event.error? site.create_error_change_report elsif site.error? && current_event.success? site.create_success_change_report end end segunda-feira, 12 de setembro de 11
  • 58. 1. Connascence of Name def verify_status_change(site, current_event) if site.success? && current_event.error? site.create_error_change_report elsif site.error? && current_event.success? site.create_success_change_report end end segunda-feira, 12 de setembro de 11
  • 59. 4. Connascence of Position def find(type, conditions, joins, order, count) ... end segunda-feira, 12 de setembro de 11
  • 60. Client.find(:all, :name => {'John'}, :balance, 10) segunda-feira, 12 de setembro de 11
  • 61. ??? Client.find(:all, :name => {'John'}, :balance, 10) segunda-feira, 12 de setembro de 11 ✓
  • 62. ??? Client.find(:all, :name => {'John'}, 10, :balance) segunda-feira, 12 de setembro de 11 ✗
  • 63. Redução de C. of Position para C. of Name segunda-feira, 12 de setembro de 11
  • 64. Client.find(:all, {:conditions => {:name => 'John'}, :order => :balance, :limit => 10}) segunda-feira, 12 de setembro de 11 ✓
  • 65. Client.find(:all, {:conditions => {:name => 'John'}, :limit => 10, :order => :balance}) segunda-feira, 12 de setembro de 11 ✓
  • 66. Conceitos de pelo menos 8 anos atrás! segunda-feira, 12 de setembro de 11
  • 67. Saia do mundo ‘feliz’ de ruby/rails e saia da zona de conforto segunda-feira, 12 de setembro de 11
  • 68. Entender as limitações e razões das regras segunda-feira, 12 de setembro de 11
  • 69. com a experiência, invente as suas próprias regras segunda-feira, 12 de setembro de 11
  • 70. segunda-feira, 12 de setembro de 11
  • 71. Menos blogs, mais livros Menos blogs, mais código segunda-feira, 12 de setembro de 11
  • 73. Progresso é iterativo errar é normal o diferencial é perceber e melhorar segunda-feira, 12 de setembro de 11
  • 74. E, por fim... segunda-feira, 12 de setembro de 11
  • 75. ‘Ruby é feito pra ser bonito. Se está feio, está errado.’ -- Yukihiro ‘Matz’ Matsumoto, criador do Ruby segunda-feira, 12 de setembro de 11
  • 77. Referências • Design Patterns in Ruby (ISBN-13 978-0321490452) • Why Functional Programming Matters (http://bit.ly/nGhPXj) • Ruby Programming Language (http://amzn.to/quCVrx) • Crafting Rails Applications (http://amzn.to/n1A4j2) • Principles of OOD (http://bit.ly/n9eNOw, http://bit.ly/nNkrVr, http://bit.ly/qnZg4r, http://slidesha.re/p6XpX1) • Law of demeter (http://bit.ly/pLlMCU) • DRY (http://bit.ly/oT9zkA) • DDD (http://amzn.to/oaYTvb) • Connascence (http://bit.ly/r8Vgyi, http://amzn.to/oU8DQw) segunda-feira, 12 de setembro de 11

Notas do Editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n