Criando aplicações                       melhores com Ruby e                              Railssegunda-feira, 12 de setemb...
Vinicius Baggio Fuentes                         @vinibaggiosegunda-feira, 12 de setembro de 11
segunda-feira, 12 de setembro de 11
http://blog.plataformatec.com.brsegunda-feira, 12 de setembro de 11
segunda-feira, 12 de setembro de 11
a web em 2004segunda-feira, 12 de setembro de 11
IE 6segunda-feira, 12 de setembro de 11
<?xml version="1.0" encoding="ISO-8859-1" ?>   <!DOCTYPE struts-config PUBLIC         "-//Apache Software Foundation//DTD ...
Complexidadesegunda-feira, 12 de setembro de 11
Alto Time-to-marketsegunda-feira, 12 de setembro de 11
Baixa qualidadesegunda-feira, 12 de setembro de 11
www.rubyonrails.comsegunda-feira, 12 de setembro de 11
TDDsegunda-feira, 12 de setembro de 11
Convention over                                       configurationsegunda-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á                 ...
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...
explicit dynamic_bitset(const std::basic_string<CharT, Traits, Alloc>& s,        typename std::basic_string<CharT, Traits,...
Assets Pipeline!                                              Complexidade do Rails *                        0.01         ...
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 modelssegunda-feira, 12 d...
Ausência de qualquer                          modelagem OOsegunda-feira, 12 de setembro de 11
Ausência de qualquer                          modelagem OO              manutenibilidade sofrívelsegunda-feira, 12 de sete...
Descarte de boas práticassegunda-feira, 12 de setembro de 11
‘‘Se eu fizesse isso em                      Java, seria chamado de                             criminoso’’                ...
‘‘Design Pattern é coisa                          de Javeiro’’                                      -- Trocentos rubistass...
Design Patternssegunda-feira, 12 de setembro de 11
Alguns patterns ficam                          desnecessáriossegunda-feira, 12 de setembro de 11
... e outros builtin:        irb(main):001:0> iterator = [1,2,3].each        => #<Enumerable::Enumerator:0x10ece8d30>     ...
Lei de Deméter e Princípio           da menor surpresasegunda-feira, 12 de setembro de 11
def verify_status_change(site, current_event)                               if current_event.status == :error &&          ...
def verify_status_change(site, current_event)                               if current_event.status == :error &&          ...
def verify_status_change(site, current_event)                               if site.success? && current_event.error?      ...
class TreeNodeParentTransferController < ApplicationController        def update          current_tree_node        = tree_...
class TreeNode < ActiveRecord::Base                    has_many :children, :foreign_key => :parent_id,                    ...
class TreeNode < ActiveRecord::Base                    has_many :children, :foreign_key => :parent_id,                    ...
DRYsegunda-feira, 12 de setembro de 11
DRY não é isolar                                 qualquer código                                    duplicadosegunda-feira...
DRY é isolar regras                              importantes de                                  negóciosegunda-feira, 12 ...
Princípios SOLIDsegunda-feira, 12 de setembro de 11
Violação de Single                                    Responsibility                class Client < ActiveRecord::Base     ...
Exemplos montados                   são fáceis de mostrar,                   mas é difícil aplicar no                  dia...
Programação Funcionalsegunda-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-...
Funções definidas a                      partir de outras        f(g(x)) = (f o g)(x) = h(x)segunda-feira, 12 de setembro d...
Programas inteiros                   definidos a partir de                         outrossegunda-feira, 12 de setembro de 11
‘‘A language that doesn’t                       affect the way you think                     about programming, is not    ...
Connascence, ou o Cálice                  Sagradosegunda-feira, 12 de setembro de 11
Baixo acoplamento                                      1. Connascence of Name                                      2. Conn...
1. Connascence of                                       Name                           def verify_status_change(site, curr...
1. Connascence of                                       Name                           def verify_status_change(site, curr...
1. Connascence of                                       Name                           def verify_status_change(site, curr...
4. Connascence of                                      Position   def find(type, conditions, joins, order, count)     ... ...
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                                       Namesegunda-feir...
Client.find(:all, {:conditions => {:name => John},                   :order => :balance,                   :limit => 10})s...
Client.find(:all, {:conditions => {:name => John},                   :limit => 10,                   :order => :balance})s...
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 confortosegunda-feira, 12 de s...
Entender as limitações                      e razões das regrassegunda-feira, 12 de setembro de 11
com a experiência, invente           as suas próprias regrassegunda-feira, 12 de setembro de 11
segunda-feira, 12 de setembro de 11
Menos blogs, mais livros             Menos blogs, mais códigosegunda-feira, 12 de setembro de 11
Conheça sua ferramentasegunda-feira, 12 de setembro de 11
Progresso é iterativo                errar é normal           o diferencial é perceber                 e melhorarsegunda-f...
E, por fim...segunda-feira, 12 de setembro de 11
‘Ruby é feito pra ser                 bonito. Se está feio, está                          errado.’                        ...
Obrigado!segunda-feira, 12 de setembro de 11
Referências     •      Design Patterns in Ruby (ISBN-13 978-0321490452)     •      Why Functional Programming Matters (htt...
Upcoming SlideShare
Loading in …5
×

Melhores apps rails

2,135 views

Published on

Palestra sobre melhores práticas em aplicações Ruby on Rails, dado em Setembro de 2011 no QCon São Paulo. Slides sem imagens.

Published in: Technology
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,135
On SlideShare
0
From Embeds
0
Number of Embeds
25
Actions
Shares
0
Downloads
63
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Melhores apps rails

    1. 1. Criando aplicações melhores com Ruby e Railssegunda-feira, 12 de setembro de 11
    2. 2. Vinicius Baggio Fuentes @vinibaggiosegunda-feira, 12 de setembro de 11
    3. 3. segunda-feira, 12 de setembro de 11
    4. 4. http://blog.plataformatec.com.brsegunda-feira, 12 de setembro de 11
    5. 5. segunda-feira, 12 de setembro de 11
    6. 6. a web em 2004segunda-feira, 12 de setembro de 11
    7. 7. IE 6segunda-feira, 12 de setembro de 11
    8. 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
    9. 9. Complexidadesegunda-feira, 12 de setembro de 11
    10. 10. Alto Time-to-marketsegunda-feira, 12 de setembro de 11
    11. 11. Baixa qualidadesegunda-feira, 12 de setembro de 11
    12. 12. www.rubyonrails.comsegunda-feira, 12 de setembro de 11
    13. 13. TDDsegunda-feira, 12 de setembro de 11
    14. 14. Convention over configurationsegunda-feira, 12 de setembro de 11
    15. 15. Mas são realmente coisas novas?segunda-feira, 12 de setembro de 11
    16. 16. TDD - 2002!segunda-feira, 12 de setembro de 11
    17. 17. Convention Over Configuration? Spring framework já existia em 2002segunda-feira, 12 de setembro de 11
    18. 18. segunda-feira, 12 de setembro de 11
    19. 19. segunda-feira, 12 de setembro de 11
    20. 20. Criador do Redis!segunda-feira, 12 de setembro de 11
    21. 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. 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. 23. Assets Pipeline! Complexidade do Rails * 0.01 1.2 2.x 3.0 3.1 * dados sem nenhum valor científicosegunda-feira, 12 de setembro de 11
    24. 24. Será que as opiniões do rails são suficientes?segunda-feira, 12 de setembro de 11
    25. 25. Skinny Controllers, Fat Models:segunda-feira, 12 de setembro de 11
    26. 26. Skinny Controllers, Fat Models: Overweight modelssegunda-feira, 12 de setembro de 11
    27. 27. Ausência de qualquer modelagem OOsegunda-feira, 12 de setembro de 11
    28. 28. Ausência de qualquer modelagem OO manutenibilidade sofrívelsegunda-feira, 12 de setembro de 11
    29. 29. Descarte de boas práticassegunda-feira, 12 de setembro de 11
    30. 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 tolerantesegunda-feira, 12 de setembro de 11
    31. 31. ‘‘Design Pattern é coisa de Javeiro’’ -- Trocentos rubistassegunda-feira, 12 de setembro de 11
    32. 32. Design Patternssegunda-feira, 12 de setembro de 11
    33. 33. Alguns patterns ficam desnecessáriossegunda-feira, 12 de setembro de 11
    34. 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):6segunda-feira, 12 de setembro de 11
    35. 35. Lei de Deméter e Princípio da menor surpresasegunda-feira, 12 de setembro de 11
    36. 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 endsegunda-feira, 12 de setembro de 11
    37. 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 endsegunda-feira, 12 de setembro de 11
    38. 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 endsegunda-feira, 12 de setembro de 11
    39. 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 endsegunda-feira, 12 de setembro de 11
    40. 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 endsegunda-feira, 12 de setembro de 11
    41. 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 endsegunda-feira, 12 de setembro de 11
    42. 42. DRYsegunda-feira, 12 de setembro de 11
    43. 43. DRY não é isolar qualquer código duplicadosegunda-feira, 12 de setembro de 11
    44. 44. DRY é isolar regras importantes de negóciosegunda-feira, 12 de setembro de 11
    45. 45. Princípios SOLIDsegunda-feira, 12 de setembro de 11
    46. 46. Violação de Single Responsibility class Client < ActiveRecord::Base validates_presence_of :name, :cnpj after_save :insert_in_workflow after_save :log endsegunda-feira, 12 de setembro de 11
    47. 47. Exemplos montados são fáceis de mostrar, mas é difícil aplicar no dia-a-dia, requer práticasegunda-feira, 12 de setembro de 11
    48. 48. Programação Funcionalsegunda-feira, 12 de setembro de 11
    49. 49. Why Functional Programming Matters (1984)segunda-feira, 12 de setembro de 11
    50. 50. Why Functional Programming Matters (1984) Ten so!segunda-feira, 12 de setembro de 11
    51. 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. 52. Programas inteiros definidos a partir de outrossegunda-feira, 12 de setembro de 11
    53. 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 compiladoressegunda-feira, 12 de setembro de 11
    54. 54. Connascence, ou o Cálice Sagradosegunda-feira, 12 de setembro de 11
    55. 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 acoplamentosegunda-feira, 12 de setembro de 11
    56. 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 endsegunda-feira, 12 de setembro de 11
    57. 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 endsegunda-feira, 12 de setembro de 11
    58. 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 endsegunda-feira, 12 de setembro de 11
    59. 59. 4. Connascence of Position def find(type, conditions, joins, order, count) ... endsegunda-feira, 12 de setembro de 11
    60. 60. Client.find(:all, :name => {John}, :balance, 10)segunda-feira, 12 de setembro de 11
    61. 61. ??? Client.find(:all, :name => {John}, :balance, 10)segunda-feira, 12 de setembro de 11 ✓
    62. 62. ??? Client.find(:all, :name => {John}, 10, :balance)segunda-feira, 12 de setembro de 11 ✗
    63. 63. Redução de C. of Position para C. of Namesegunda-feira, 12 de setembro de 11
    64. 64. Client.find(:all, {:conditions => {:name => John}, :order => :balance, :limit => 10})segunda-feira, 12 de setembro de 11 ✓
    65. 65. Client.find(:all, {:conditions => {:name => John}, :limit => 10, :order => :balance})segunda-feira, 12 de setembro de 11 ✓
    66. 66. Conceitos de pelo menos 8 anos atrás!segunda-feira, 12 de setembro de 11
    67. 67. Saia do mundo ‘feliz’ de ruby/rails e saia da zona de confortosegunda-feira, 12 de setembro de 11
    68. 68. Entender as limitações e razões das regrassegunda-feira, 12 de setembro de 11
    69. 69. com a experiência, invente as suas próprias regrassegunda-feira, 12 de setembro de 11
    70. 70. segunda-feira, 12 de setembro de 11
    71. 71. Menos blogs, mais livros Menos blogs, mais códigosegunda-feira, 12 de setembro de 11
    72. 72. Conheça sua ferramentasegunda-feira, 12 de setembro de 11
    73. 73. Progresso é iterativo errar é normal o diferencial é perceber e melhorarsegunda-feira, 12 de setembro de 11
    74. 74. E, por fim...segunda-feira, 12 de setembro de 11
    75. 75. ‘Ruby é feito pra ser bonito. Se está feio, está errado.’ -- Yukihiro ‘Matz’ Matsumoto, criador do Rubysegunda-feira, 12 de setembro de 11
    76. 76. Obrigado!segunda-feira, 12 de setembro de 11
    77. 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

    ×