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

735 visualizações

Publicada em

5º Encontro Guru Sorocaba - Secot Ufscar

Publicada em: Tecnologia
0 comentários
2 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
735
No SlideShare
0
A partir de incorporações
0
Número de incorporações
3
Ações
Compartilhamentos
0
Downloads
10
Comentários
0
Gostaram
2
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

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

  1. 1. BOAS PRÁTICAS DE DESIGN EM APLICAÇÕES RAILS RINALDI FONSECA rinaldifonseca.com @rinaldifonsecasábado, 12 de maio de 12
  2. 2. sábado, 12 de maio de 12
  3. 3. VAMOS CONSIDERAR PESSOAS COMO: UNCLE BOB MARTIN FOWLER SANDI METZ E OUTROSsábado, 12 de maio de 12
  4. 4. CLEAN CODE DESIGN PATTERNS SOLID TODOS NÓS JÁ OUVIMOS FALARsábado, 12 de maio de 12
  5. 5. APLICAR NA PRÁTICA É DIFÍCILsábado, 12 de maio de 12
  6. 6. VAMOS PENSAR NA ESSÊNCIAsábado, 12 de maio de 12
  7. 7. O DESIGNsábado, 12 de maio de 12
  8. 8. O QUE É DESIGN??sábado, 12 de maio de 12
  9. 9. O CÓDIGOsábado, 12 de maio de 12
  10. 10. A ARTE DE ORGANIZAR O CÓDIGOsábado, 12 de maio de 12
  11. 11. CADA LINHA CADA CLASSE CADA TESTE FAZ PARTE DO DESIGNsábado, 12 de maio de 12
  12. 12. E QUAL É O OBJETIVO DO DESIGN?sábado, 12 de maio de 12
  13. 13. REDUZIR O CUSTO DA MUDANÇAsábado, 12 de maio de 12
  14. 14. VAMOS PENSAR QUE O CÓDIDO DEVE FUNCIONAR HOJE E APENAS ISSO.sábado, 12 de maio de 12
  15. 15. DEVE SER FÁCIL DE MUDAR PARA SEMPRE.sábado, 12 de maio de 12
  16. 16. FIM DA PARTE 1sábado, 12 de maio de 12
  17. 17. DICAS PRÁTICASsábado, 12 de maio de 12
  18. 18. AVISO: O que vou falar, NÃO é papo de Javeiro =)sábado, 12 de maio de 12
  19. 19. DICA 1 USAR CLASSES DE SERVIÇO A.K.A. SERVICESsábado, 12 de maio de 12
  20. 20. Rails e o MVCsábado, 12 de maio de 12
  21. 21. FAT MODELS THIN CONTROLLERSsábado, 12 de maio de 12
  22. 22. DDD ERIC EVANS DOMAIN DRIVEN DESIGNsábado, 12 de maio de 12
  23. 23. As vezes, lidamos com “coisas” que não se encaixam em determinados objetossábado, 12 de maio de 12
  24. 24. APPLICATION SERVICE DOMAIN SERVICE INFRASTRUCTURE SERVICEsábado, 12 de maio de 12
  25. 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 endsábado, 12 de maio de 12
  26. 26. Domain Service class FundsTransferService def self.transfer(from, to, amount) Account.transaction do from.debit amount to.credit amount end end endsábado, 12 de maio de 12
  27. 27. Infrastructure Service class MessagingService def self.overdrawn_account_sms(account) Rails.queue.push SmsJob, "#{account.number}!" end endsábado, 12 de maio de 12
  28. 28. DICA 2 ENTITIES AND VALUE OBJECTSsábado, 12 de maio de 12
  29. 29. ENTITIES Objetos identificáveis por suas identidades São mutáveis(mantendo a identidade) Possuem um ciclo de vida na aplicaçãosábado, 12 de maio de 12
  30. 30. class Order < ActiveRecord::Base belongs_to :user has_one :address end class Address < ActiveRecord::Base belongs_to :order endsábado, 12 de maio de 12
  31. 31. VALUE OBJECTS Objetos identificáveis por seu valores São imutáveis Descrevem “coisas”sábado, 12 de maio de 12
  32. 32. class Address attr_reader :street, :city def initialize(street, city) @street, @city = street, city end endsábado, 12 de maio de 12
  33. 33. class Order < ActiveRecord::Base belongs_to :user composed_of :address, :mapping => [%w(address_street street), %w(address_city city)] endsábado, 12 de maio de 12
  34. 34. DICA 3 PRESENTERSsábado, 12 de maio de 12
  35. 35. *PRESENTERS *EXHIBTI OBJECTS DECORATORS Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality. / Gang of Foursábado, 12 de maio de 12
  36. 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. 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 endsábado, 12 de maio de 12
  38. 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 endsábado, 12 de maio de 12
  39. 39. PresenterHelper module PresenterHelper def present(presenter_class, model, objects) presenter = presenter_class.new(model, self, objects) yield presenter if block_given? presenter end endsábado, 12 de maio de 12
  40. 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. 41. DICA 4 ADAPTERSsábado, 12 de maio de 12
  42. 42. ADAPTAR A INTERFACE DE UMA CLASSEsábado, 12 de maio de 12
  43. 43. DEPENDÊNCIAS EXTERNAS GRANDES CHANCES DE MUDARsábado, 12 de maio de 12
  44. 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. 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 endsábado, 12 de maio de 12
  46. 46. FINALIZANDO... Ao codificar, vamos pensar no DESIGNsábado, 12 de maio de 12
  47. 47. OBRIGADOsábado, 12 de maio de 12

×