BOAS PRÁTICAS                           DE DESIGN EM                           APLICAÇÕES RAILS                           ...
sábado, 12 de maio de 12
VAMOS CONSIDERAR PESSOAS COMO:                   UNCLE BOB                   MARTIN FOWLER                   SANDI METZ   ...
CLEAN CODE                   DESIGN PATTERNS                   SOLID                   TODOS NÓS JÁ OUVIMOS FALARsábado, 1...
APLICAR NA                    PRÁTICA                    É DIFÍCILsábado, 12 de maio de 12
VAMOS                PENSAR                NA                ESSÊNCIAsábado, 12 de maio de 12
O DESIGNsábado, 12 de maio de 12
O QUE É DESIGN??sábado, 12 de maio de 12
O CÓDIGOsábado, 12 de maio de 12
A ARTE                   DE                   ORGANIZAR                   O CÓDIGOsábado, 12 de maio de 12
CADA LINHA                 CADA CLASSE                 CADA TESTE                 FAZ PARTE DO DESIGNsábado, 12 de maio de...
E QUAL É O OBJETIVO                       DO DESIGN?sábado, 12 de maio de 12
REDUZIR O CUSTO                       DA MUDANÇAsábado, 12 de maio de 12
VAMOS PENSAR                       QUE O CÓDIDO                       DEVE FUNCIONAR HOJE                       E APENAS I...
DEVE                       SER FÁCIL DE MUDAR                       PARA SEMPRE.sábado, 12 de maio de 12
FIM DA PARTE 1sábado, 12 de maio de 12
DICAS PRÁTICASsá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. SERVICESsábado, 12 de maio de 12
Rails e o MVCsábado, 12 de maio de 12
FAT MODELS                           THIN CONTROLLERSsábado, 12 de maio de 12
DDD         ERIC EVANS                  DOMAIN DRIVEN DESIGNsábado, 12 de maio de 12
As vezes, lidamos com                           “coisas” que não se                           encaixam em                 ...
APPLICATION SERVICE                DOMAIN SERVICE                INFRASTRUCTURE SERVICEsábado, 12 de maio de 12
Application Service            class AccountCSVExporter             def self.to_csv(account)               CSV.generate do...
Domain Service            class FundsTransferService             def self.transfer(from, to, amount)               Account...
Infrastructure Service          class MessagingService           def self.overdrawn_account_sms(account)             Rails...
DICA 2                     ENTITIES AND                     VALUE OBJECTSsábado, 12 de maio de 12
ENTITIES       Objetos identificáveis por suas identidades       São mutáveis(mantendo a identidade)       Possuem um ciclo...
class Order < ActiveRecord::Base             belongs_to :user             has_one :address            end            class...
VALUE OBJECTS       Objetos identificáveis por seu valores       São imutáveis       Descrevem “coisas”sábado, 12 de maio d...
class Address             attr_reader :street, :city               def initialize(street, city)                @street, @c...
class Order < ActiveRecord::Base         belongs_to :user         composed_of :address,                       :mapping => ...
DICA 3                     PRESENTERSsábado, 12 de maio de 12
*PRESENTERS         *EXHIBTI OBJECTS           DECORATORS            Attach additional responsibilities to an object dynam...
Lógica na View            <% if user_signed_in? %>            <%= product.name %>            <% else %>            <%= lin...
BasePresenter          require “delegate”          class BasePresenter < SimpleDelegator           attr_accessor :context ...
BasePresenter        class ProductPresenter < BasePresenter          def display_name           if user             name  ...
PresenterHelper            module PresenterHelper                def present(presenter_class, model, objects)             ...
Utilização          <% present ProductPresenter, @product, :user =>          current_user do |presenter| %>             <%...
DICA 4                     ADAPTERSsábado, 12 de maio de 12
ADAPTAR A INTERFACE                     DE UMA CLASSEsábado, 12 de maio de 12
DEPENDÊNCIAS                EXTERNAS                GRANDES CHANCES DE                MUDARsábado, 12 de maio de 12
Exemplo:       Gem Koala        github.com/arsduo/koala          @graph = Koala::Facebook::API.new(oauth_access_token)    ...
Criando um Adapter        class FacebookAdapter         attr_accessor :access_token, :adapter            def initialize(ac...
FINALIZANDO...             Ao codificar, vamos             pensar no DESIGNsábado, 12 de maio de 12
OBRIGADOsábado, 12 de maio de 12
Próximos SlideShares
Carregando em…5
×

Boas práticas de Design em Aplicações Rails

900 visualizações

Publicada em

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

  • Seja a primeira pessoa a gostar disto

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

Nenhuma nota no slide

Boas práticas de Design em Aplicações 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

×