Código Saudável =>Programador Feliz
[~]$ whoami
@rlm ores
1993-1995
Ruby
2003-2004
Ruby on Rails
2011       Text
Sua aplicação
ArquiteturaModelosProdução
MVC
Model                View        Controller
Model              ControllerView   View      View      View   View
class ArticlesController < ActionController::Base def index   if params[:user_id].blank?     @articles = Article.all   els...
ModelDeslogado                                    Logado        Controller                   Controller View       View   ...
class ArticlesController < ActionController::Base def index   @articles = Article.all endendclass Users::ArticlesControlle...
class UsersControllers < ApplicationController def index   @users = User.all endendclass Admin::UsersControllers < Applica...
DRY
module UsersIndex def index  @users = User.all endendclass UsersController < ApplicationController include UsersIndexendcl...
module UsersIndex def index  @users = User.all endendclass UsersController < ApplicationController include UsersIndexendcl...
Acoplamento     XRepetição de  código
“Every piece of knowledgemust have a single,unambiguous, authoritativerepresentation within asystem.”              Pragmat...
Repeat code   =Repeat Logic
Repeat code   =Repeat Logic
Não economizar nonúmero de controllers
Cada Controller é uma   lógica diferente
DRY não é economizar código, mas manter aslógicas em um lugar só
ArquiteturaModelosProdução
SkinnyController,Fat Model
OOP
Obese Models
MuitasDifícil Manter                 Responsabilidades                      DifícilBaixa Coesão                   Compreen...
Sintoma #1     MuitaResponsabilidade
x
class Account < ActiveRecord::Base validates_numericality_of :amount validates_inclusion_of :currency, :in => %w( us_dolla...
UML 1
composed_of
class Money def initialize(amount, currency)   @amount, @currency = amount, currency end def convert_to_us_dollar  if curr...
class Account < ActiveRecord::Base validates_numericality_of :amount validates_inclusion_of :currency, :in => %w( us_dolla...
Mais fácil de manter Responsabilidades   (e reutilizar!)       divididas                     Mais simples de   APIs menore...
Sintoma #2Lógicas repetidas
Lixeira
class Post < ActiveRecord::Base # (...) default_scope where(trashed: false) scope :trashed, where(trashed: true) def trash...
class Comment < ActiveRecord::Base # (...) default_scope where(trashed: false) scope :trashed, where(trashed: true) def tr...
DRY!
module Trashable extend ActiveSupport::Concern included do   default_scope where(trashed: false)   scope :trashed, where(t...
class Post < ActiveRecord::Base include Trashableendclass Comment < ActiveRecord::Base include Trashableend
Sintoma #3 “Super Abstração”do Banco de Dados
Models retiram dados do BD
post.comments.sizepost.comments.countpost.comments.length
post.comments.count
SQL (0.3ms) SELECT COUNT(*) FROM `comments`WHERE (`comments`.post_id = 1)
post.comments.length
Comment Load (0.4ms) SELECT `comments`.* FROM`comments` WHERE (`comments`.post_id = 1)
post.comments.size
# File activerecord/lib/active_record/relation.rb, line 84def size loaded? ? @records.length : countend
Active Record é bom!Mas que de olho no       banco!
<% comments.each do |comment| %> <% if comment.post %>  (...) <% end %><% end %>
Comment Load (0.6ms) SELECT `comments`.* FROM `comments`Post Load (0.4ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`id`...
N+1
<% comments.each do |comment|%> <% if comment.post_id %>  (...) <% end %><% end %>
Comment Load (0.6ms) SELECT `comments`.* FROM`comments`
@comments = Comment.all(:include => :post)
Comment Load (0.7ms) SELECT `comments`.* FROM`comments`Post Load (46.4ms) SELECT `posts`.* FROM `posts` WHERE(`posts`.`id`...
Extrair funcionalidades dos modelos: Composed ofEliminar duplicação de lógicas     ConcernFicar de olho nas Queries       ...
ArquiteturaModelosProdução
Um dia a hora  chega ...
Checklist!
AnalyticsException noti erPerformance loggerMonitoramento de ServidorNota A no YSlowDeploy automatizadoBackup
Solução Open SourceSolução via “serviço”
Analytics
Exception Noti er
Performance   Logger
Monitoramento de Servidor
Nota Ano YSlow
DeployAutomatizado
git pulltouch tmp/restart.txt
git pulljammittouch tmp/restart.txt
rake db:backupgit pullrake db:migratejammittouch tmp/restart.txt
ps aux | ... | kill ...rake db:backupgit pull(...) rake resque:(...)rake db:migratejammittouch tmp/restart.txt
ps aux | ... | kill ...rake db:backupgit pull(...) rake resque:(...)rake sphinx:rebuildrake db:migratejammit
Mais de uma máquina ?Rollback ?Múltiplos Ambientes
Backup!
Cron + RSync
Teste seu Backup!
Crie um padrão de qualidade !Invista tempo (ou $$ ) em melhorias !Faça e cumpra um checklist
Código bem feito +Aplicação bem monitorada=> Programador Mais Feliz!
Make it work (and writetests to ensure that)Make it awesome(with tests you know that it still works)if you need, make it f...
Rodrigo Flores    blog.plataformatec.com   @rlmflores                 Perguntas?
ID                     blog             twitterRodrigo Flores    blog.plataformatec.com   @rlmflores                 Pergun...
Créditos das ImagensLego tristehttp://www. ickr.com/photos/kalexanderson/5421517469/Parquímetro de Portugalhttp://weblog.s...
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
Upcoming SlideShare
Loading in...5
×

Código Saudável => Programador Feliz - Rs on Rails 2010

9,224

Published on

Palestra do Rs On Rails, na qual demos algumas dicas de boas práticas para manter seu código mais limpo e ter absoluto controle da sua aplicação em produção.

Published in: Technology, Business
0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
9,224
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
0
Comments
0
Likes
10
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
  • \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
  • Código Saudável => Programador Feliz - Rs on Rails 2010

    1. 1. Código Saudável =>Programador Feliz
    2. 2. [~]$ whoami
    3. 3. @rlm ores
    4. 4. 1993-1995
    5. 5. Ruby
    6. 6. 2003-2004
    7. 7. Ruby on Rails
    8. 8. 2011 Text
    9. 9. Sua aplicação
    10. 10. ArquiteturaModelosProdução
    11. 11. MVC
    12. 12. Model View Controller
    13. 13. Model ControllerView View View View View
    14. 14. class ArticlesController < ActionController::Base def index if params[:user_id].blank? @articles = Article.all else @articles = current_user.articles end endend
    15. 15. ModelDeslogado Logado Controller Controller View View View View View View
    16. 16. class ArticlesController < ActionController::Base def index @articles = Article.all endendclass Users::ArticlesController < ActionContro... def index @articles = current_user.articles.all endend
    17. 17. class UsersControllers < ApplicationController def index @users = User.all endendclass Admin::UsersControllers < ApplicationCont...def index @users = User.all endend
    18. 18. DRY
    19. 19. module UsersIndex def index @users = User.all endendclass UsersController < ApplicationController include UsersIndexendclass Admin::UsersControllers < ApplicationController include UsersIndexend
    20. 20. module UsersIndex def index @users = User.all endendclass UsersController < ApplicationController include UsersIndexendclass Admin::UsersControllers < ApplicationController include UsersIndexend
    21. 21. Acoplamento XRepetição de código
    22. 22. “Every piece of knowledgemust have a single,unambiguous, authoritativerepresentation within asystem.” Pragmatic Programmer
    23. 23. Repeat code =Repeat Logic
    24. 24. Repeat code =Repeat Logic
    25. 25. Não economizar nonúmero de controllers
    26. 26. Cada Controller é uma lógica diferente
    27. 27. DRY não é economizar código, mas manter aslógicas em um lugar só
    28. 28. ArquiteturaModelosProdução
    29. 29. SkinnyController,Fat Model
    30. 30. OOP
    31. 31. Obese Models
    32. 32. MuitasDifícil Manter Responsabilidades DifícilBaixa Coesão Compreender
    33. 33. Sintoma #1 MuitaResponsabilidade
    34. 34. x
    35. 35. class Account < ActiveRecord::Base validates_numericality_of :amount validates_inclusion_of :currency, :in => %w( us_dollar euro (...)) def convert_to_us_dollar if currency == :us_dollar currency elsif currency == :euro currency * ConversionRate.rate(:dollar,:euro) (...) end end def convert_to_euro if currency == :euro currency elsif currency == :dollar currency * ConversionRate.rate(:euro,:dollar) (...) end endend
    36. 36. UML 1
    37. 37. composed_of
    38. 38. class Money def initialize(amount, currency) @amount, @currency = amount, currency end def convert_to_us_dollar if currency == :us_dollar @currency elsif currency == :euro @currency * ConversionRate.rate(:dollar,:euro) (...) end end def convert_to_euro if currency == :euro @currency elsif @currency == :dollar @currency * ConversionRate.rate(:euro,:dollar) (...) end end
    39. 39. class Account < ActiveRecord::Base validates_numericality_of :amount validates_inclusion_of :currency, :in => %w( us_dollareuro (...)) composed_of :balance, :class_name =>Money, :mapping => %w( amount currency)end
    40. 40. Mais fácil de manter Responsabilidades (e reutilizar!) divididas Mais simples de APIs menores compreender
    41. 41. Sintoma #2Lógicas repetidas
    42. 42. Lixeira
    43. 43. class Post < ActiveRecord::Base # (...) default_scope where(trashed: false) scope :trashed, where(trashed: true) def trash update_attribute :trashed, true endend
    44. 44. class Comment < ActiveRecord::Base # (...) default_scope where(trashed: false) scope :trashed, where(trashed: true) def trash update_attribute :trashed, true endend
    45. 45. DRY!
    46. 46. module Trashable extend ActiveSupport::Concern included do default_scope where(trashed: false) scope :trashed, where(trashed: true) end def trash update_attribute :trashed, true endend
    47. 47. class Post < ActiveRecord::Base include Trashableendclass Comment < ActiveRecord::Base include Trashableend
    48. 48. Sintoma #3 “Super Abstração”do Banco de Dados
    49. 49. Models retiram dados do BD
    50. 50. post.comments.sizepost.comments.countpost.comments.length
    51. 51. post.comments.count
    52. 52. SQL (0.3ms) SELECT COUNT(*) FROM `comments`WHERE (`comments`.post_id = 1)
    53. 53. post.comments.length
    54. 54. Comment Load (0.4ms) SELECT `comments`.* FROM`comments` WHERE (`comments`.post_id = 1)
    55. 55. post.comments.size
    56. 56. # File activerecord/lib/active_record/relation.rb, line 84def size loaded? ? @records.length : countend
    57. 57. Active Record é bom!Mas que de olho no banco!
    58. 58. <% comments.each do |comment| %> <% if comment.post %> (...) <% end %><% end %>
    59. 59. Comment Load (0.6ms) SELECT `comments`.* FROM `comments`Post Load (0.4ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`id` =1 LIMIT 1Post Load (0.2ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`id` =2 LIMIT 1(...)Post Load (0.2ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`id` =99 LIMIT 1Post Load (0.2ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`id`= 100 LIMIT 1
    60. 60. N+1
    61. 61. <% comments.each do |comment|%> <% if comment.post_id %> (...) <% end %><% end %>
    62. 62. Comment Load (0.6ms) SELECT `comments`.* FROM`comments`
    63. 63. @comments = Comment.all(:include => :post)
    64. 64. Comment Load (0.7ms) SELECT `comments`.* FROM`comments`Post Load (46.4ms) SELECT `posts`.* FROM `posts` WHERE(`posts`.`id` IN (1,2,(...),100))
    65. 65. Extrair funcionalidades dos modelos: Composed ofEliminar duplicação de lógicas ConcernFicar de olho nas Queries Query Reviewer
    66. 66. ArquiteturaModelosProdução
    67. 67. Um dia a hora chega ...
    68. 68. Checklist!
    69. 69. AnalyticsException noti erPerformance loggerMonitoramento de ServidorNota A no YSlowDeploy automatizadoBackup
    70. 70. Solução Open SourceSolução via “serviço”
    71. 71. Analytics
    72. 72. Exception Noti er
    73. 73. Performance Logger
    74. 74. Monitoramento de Servidor
    75. 75. Nota Ano YSlow
    76. 76. DeployAutomatizado
    77. 77. git pulltouch tmp/restart.txt
    78. 78. git pulljammittouch tmp/restart.txt
    79. 79. rake db:backupgit pullrake db:migratejammittouch tmp/restart.txt
    80. 80. ps aux | ... | kill ...rake db:backupgit pull(...) rake resque:(...)rake db:migratejammittouch tmp/restart.txt
    81. 81. ps aux | ... | kill ...rake db:backupgit pull(...) rake resque:(...)rake sphinx:rebuildrake db:migratejammit
    82. 82. Mais de uma máquina ?Rollback ?Múltiplos Ambientes
    83. 83. Backup!
    84. 84. Cron + RSync
    85. 85. Teste seu Backup!
    86. 86. Crie um padrão de qualidade !Invista tempo (ou $$ ) em melhorias !Faça e cumpra um checklist
    87. 87. Código bem feito +Aplicação bem monitorada=> Programador Mais Feliz!
    88. 88. Make it work (and writetests to ensure that)Make it awesome(with tests you know that it still works)if you need, make it fast
    89. 89. Rodrigo Flores blog.plataformatec.com @rlmflores Perguntas?
    90. 90. ID blog twitterRodrigo Flores blog.plataformatec.com @rlmflores Perguntas?
    91. 91. Créditos das ImagensLego tristehttp://www. ickr.com/photos/kalexanderson/5421517469/Parquímetro de Portugalhttp://weblog.savanne.be/423-youre-doing-it-wrong“Cafeteira”http://therei xedit.failblog.orgAirplanehttp://www. ickr.com/photos/irish yguy/2426063460/

    ×