Your SlideShare is downloading. ×
Design de Códigoqualidade a longo prazo       Guilherme Silveira       @guilhermecaelum
o difícil de um projeto é implementar bem
Implementação   Design Arquitetura
Implementação   Design Arquitetura
IOC
IOCDESIGN
IOC                 Usando uma boa prática de designPaulo Silveira                 DESIGN
IOC                 Usando uma boa prática de designPaulo Silveira                 DESIGN    ARQUITETURA
IOC                 Usando uma boa prática de designPaulo Silveira                 DESIGN    Mudamos a arquitetura e      ...
DESIGNIMPLEMENTAÇÃO
DESIGN             Como seu código se comunica?            (design interface de comunicação)IMPLEMENTAÇÃO
DESIGN             Como seu código se comunica?            (design interface de comunicação)                Como seu códig...
design                             arquitetura    java, ruby, scala, objective-c, c#        servidores, firewalls etc      ...
(s
arquitetura toda bem definida é muito bonita...
arquitetura toda bem definida é muito bonita...       mas nem sempre é fácíl entender
A única coisa que existe  é a implementação
o difícil de um projeto é implementar bem
Interpreto o código através de como                  ele se comunica.ver através dos olhos      de design
ver através dos olhos    da arquitetura         Interpreto o código através de como        partes do sistema influenciam ou...
várias maneirasde ver o código
design := uma   interpretaçãoarquitetura := outra   interpretação
não posso falar de arquitetura ou de design      sem falar de implementação
.
arquitetura é o mínimose a arquitetura não atende, não há conversa
o que sobra é pensarmos no design...de interface ===> dificil manutenção de código ===> dificil manutenção
veremos   código
      def _read_attribute(attr_name)        attr_name = attr_name.to_s        attr_name = self.class.primary_key if attr_n...
      def _read_attribute(attr_name)        attr_name = attr_name.to_s        attr_name = self.class.primary_key if attr_n...
23...      def _read_attribute(attr_name)        attr_name = attr_name.to_s        attr_name = self.class.primary_key if a...
23...      def _read_attribute(attr_name)        attr_name = attr_name.to_s        attr_name = self.class.primary_key if a...
mas e se...                           23...      def _read_attribute(attr_name)        attr_name = attr_name.to_s        a...
mas eese...                            mas se...                             23...      def _read_attribute(attr_name)    ...
mas eese...                            mas ese...                            23...                             mas se...  ...
mas eese...                            mas ese...                            23...                             mas ese... ...
mas eese...                            mas ese...                            23...                             mas ese... ...
mas eese...                            mas ese...                            23...                             mas ese... ...
mas eese...                            mas ese...                            23...                             mas ese... ...
conciso?
      def _read_attribute(attr_name)        attr_name = attr_name.to_s        attr_name = self.class.primary_key if attr_n...
o fluxo é COMPLEXO      def _read_attribute(attr_name)        attr_name = attr_name.to_s        attr_name = self.class.prim...
o fluxo éSEMANTICA      não há COMPLEXO      def _read_attribute(attr_name)        attr_name = attr_name.to_s        attr_n...
variáveis         zoadas?Nico Steppat
variáveis         zoadas?               Non. Nonca vi.Nico Steppat
complexidade invisivel        def cached_attributes          @cached_attributes ||= columns.select { |c| cacheable_column?...
complexidade invisivel        def cached_attributes          @cached_attributes ||= columns.select { |c| cacheable_column?...
complexidade invisivel        def cached_attributes          @cached_attributes ||= columns.select { |c| cacheable_column?...
entendeu?        def cached_attributes          @cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |...
entendeu?      def cached_attributes        @cached_attributes ||= columns.select { |c|cheable_column?(c) }.map { |col| co...
quantos fors tem aqui?      def cached_attributes        @cached_attributes ||= columns.select { |c| cacheable_column?(c) ...
quantos fors tem aqui?      def cached_attributes        @cached_attributes ||= columns.select { |c| cacheable_column?(c) ...
quantos fors tem aqui?      def cached_attributes        @cached_attributes ||= columns.select { |c| cacheable_column?(c) ...
quantos fors tem aqui?      def cached_attributes        @cached_attributes ||= columns.select { |c| cacheable_column?(c) ...
quantos fors tem aqui?      def cached_attributes        @cached_attributes ||= columns.select { |c| cacheable_column?(c) ...
quantos fors tem aqui?      def cached_attributes        @cached_attributes ||= columns.select { |c| cacheable_column?(c) ...
quantos fors tem aqui?      def cached_attributes        @cached_attributes ||= columns.select { |c| cacheable_column?(c) ...
quantos fors tem aqui?      def cached_attributes        @cached_attributes ||= columns.select { |c| cacheable_column?(c) ...
quantos fors tem aqui?      def cached_attributes        @cached_attributes ||= columns.select { |c| cacheable_column?(c) ...
QUANTOS TESTES PRECISA?      def cached_attributes        @cached_attributes ||= columns.select { |c| cacheable_column?(c)...
e agora?     def cached_attributes       @cached_attributes ||= columns.select { |c| cacheable_column?(c) }               ...
,
dê   enter        tarefa do bem
menos palavras zoou seu código                  um enter não mata        def cached_attributes          @cached_attributes...
concisão = com o mínimo de   palavras, deixar claro               tarefa do bem
concisão =baixar o nível =
concisão = eu tô bembaixar o nível = ˆo b3w     especialista em linguagem de programação miguxês
cliente.a
cliente.a      meta-aspecto-meta-aspecto            programador
cliente.aQuer ver uma mágica?                       meta-aspecto-meta-aspecto                             programador
cliente.aacontece o método b, c, d, e, f, ... Quer ver uma mágica?                        meta-aspecto-meta-aspecto       ...
cliente.a    acontece o método b, c, d, e, f, ...     Quer ver uma mágica?Meta meta meta meta programming.                ...
       # Deletes the records according to the <tt>:dependent</tt> option.       def delete_records(records, method)       ...
quem escreveu?
meu amigo sérgio
       # Deletes the records according to the <tt>:dependent</tt> option.       def delete_records(records, method)       ...
um “if if if if if if” dói    (aka. sanduíche íche íche pattern)
ninguém acerta de primeira            É vital refatorar!
esse dói?select * from Contatos where a=b or (c=d && e=f)             order by primeiro_campo
esse dói? select * from Contatos where a=b or (c=d && e=f)              order by primeiro_campoMaurício Aniche
esse dói? select * from Contatos where a=b or (c=d && e=f)              order by primeiro_campo                    Como vo...
esse dói? select * from Contatos where a=b or (c=d && e=f)              order by primeiro_campo                          C...
esse dói? select * from Contatos where a=b or (c=d && e=f)              order by primeiro_campo                          C...
O objetivo não é usar outro, ou esconder o controle de fluxo.Quebre ele em dois. Mais faceis de            entender
O objetivo não é usar outro, ou esconder o controle de fluxo.Quebre ele em dois. Mais faceis de            entender
teste é moda, é positivo, é importante,        e garante várias coisas
mas
sua cobertura    mente
select * from Contatos where a=b or (c=d && e=f)          order by primeiro_campo limit 2
select * from Contatos where a=b or (c=d && e=f)          order by primeiro_campo limit 2
select * from Contatos where a=b or (c=d && e=f)          order by primeiro_campo limit 2
Facinho...select * from Contatos where a=b or (c=d && e=f)          order by primeiro_campo limit 2
Facinho...  select * from Contatos where a=b or (c=d && e=f)            order by primeiro_campo limit 2Martin Fowler
Facinho...  select * from Contatos where a=b or (c=d && e=f)            order by primeiro_campo limit 2                 sq...
Facinho...  select * from Contatos where a=b or (c=d && e=f)            order by primeiro_campo limit 2                 sq...
dá para fazer lógica sem fazer lógica? não dá!
menos de 5 testes não garantomas a cobertura diz “100%”...mentirosa                       ...
de verdade, não assim: - teste sem assert - teste verifica que uma string é passada - teste “salva”
Um código é dificil de entender         pois tem fluxos.São os fluxos que deixam ele dificil.
tarefa do bemfluxo “invisíveis”,   TESTE
conscientizar-se da complexidade               de nosso códigoJim Webber
conscientizar-se da complexidade               de nosso código                 não adianta esconder o spaguetti,          ...
conscientizar-se da complexidade               de nosso código                 não adianta esconder o spaguetti,          ...
tarefa do bem para trabalhar com algo complexonão se deve fingir que ele não existe mas ensinar a resolver o problema
esconder o complexo é    julgar alguem incapaza complexidade continuará lá...    agora com um gargalo
pior ainda, quem usa ele, vai usar mal usado   pois não sabe o que esta acontecendo
se você tem que executar algo sempre         que cria um Cliente?
se você tem que executar algosempre            que cria um Cliente?
se você tem que executar algo   sempre                que cria um Cliente?
declare dependência     e código no  CONSTRUTOR
declare dependência     e código no  CONSTRUTORmas e no Rails, Javabeans, Hibernate, etc?
construtor não faz nadaatributos públicos (get/set/attr)
O padrão de OO no mercado é a  “orgia dos objetos” pattern. Todo mundo pega todo mundo.
Duvidou?       Spring: CTRL+F staticRails: ActiveRecord.methods.size
Lição de Casa? Apague um getter e um setter.Um atributo. Controle o escopo.  Veja a caca que já está feita...
relacionamentos classe Clientes?
relacionamentos@OneToManyList<Usuario> clientes;+ 10 metodos        classe Clientes?
relacionamentos                          has_many :clientes, :class => Us                          +10 metodos@OneToManyLi...
classe Clientes
classe Clientespublic Clientes getClientes() {  return new Clientes(this.clientes);}
classe Clientes                            def clientes                             Clientes.new(super)                   ...
classe Clientes                            def clientes                             Clientes.new(super)                   ...
a questao da web nao ser OO              a web eh outra coisa          o outro sistema é outra coisaCLIENTE
a questao da web nao ser OO              a web eh outra coisa          o outro sistema é outra coisaCLIENTE
a questao da web nao ser OO              a web eh outra coisa          o outro sistema é outra coisaCLIENTE
a questao da web nao ser OO              a web eh outra coisa          o outro sistema é outra coisaCLIENTE               ...
a questao da web nao ser OO              a web eh outra coisa          o outro sistema é outra coisaCLIENTE               ...
invisivel (esconder) ou  clara e bem definida
frameworkscomponent based   escondem a web...
frameworkscomponent based      escondem a web...           Mas e se minha preocupação é fazer um           sistema otimiza...
frameworkscomponent based      escondem a web...           Mas e se minha preocupação é fazer um           sistema otimiza...
AR mistureba. menos camadas :)                   modelo                   domínio                                         ...
adiciona uma camda :(. entra o controle de escopo. :)                                                   banco      modelo ...
adiciona uma camda :(. entra o controle de escopo. :)                              modelo                               ba...
como moldar nosso sistema entao?
modele REGRAS
Qualquer coisa que eu  mudar, quebra...
Qualquer coisa que eu  mudar, quebra...
Qualquer coisa que eu  mudar, quebra...
Qualquer coisa que eu  mudar, quebra...
Qualquer coisa que eu  mudar, quebra...
no lugar ADEQUADO
post post postAh! Quebrou encapsulamento dá nisso!
post post postAh! Quebrou encapsulamento dá nisso!
post post postAh! Quebrou encapsulamento dá nisso!
post post postAh! Quebrou encapsulamento dá nisso!
post post postAh! Quebrou encapsulamento dá nisso!
Posso agulhar?      post post postAh! Quebrou encapsulamento dá nisso!
no lugar ADEQUADOse eu mudar, eu quebro... mas ai         tudo bem!                 encapsulamento++                      ...
no lugar ADEQUADOse eu mudar, eu quebro... mas ai         tudo bem!                 encapsulamento++                      ...
presentation code != domain code           controller                                       model             viewif discu...
presentation code != domain code          controller                                           model                      ...
esses ifs não ficam repetidos em várias views
abra *.jsp, *.erb, *.ssp, *.similares CTRL+F, if com algo != de booleanCTRL+F, if com chamada != de boolean
sem arquitetura   adequadanão há conversa
o código existeo resto, é interpretação
código é complicado
esconder o complicado   não é simplificar
se é difícil de testar,o código tem débito
@guilhermecaelumhttp://www.caelum.com.brhttp://online.caelum.com.brobrigado
Design de código: qualidade que faz a diferença, qcon 2011
Upcoming SlideShare
Loading in...5
×

Design de código: qualidade que faz a diferença, qcon 2011

3,279

Published on

Apresentação de design de código e a qualidade de um projeto a longo prazo. Apresentado por Guilherme Silveira na QCON sp 2011

Published in: Technology
1 Comment
12 Likes
Statistics
Notes
No Downloads
Views
Total Views
3,279
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
1
Likes
12
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
  • \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
  • Transcript of "Design de código: qualidade que faz a diferença, qcon 2011"

    1. 1. Design de Códigoqualidade a longo prazo Guilherme Silveira @guilhermecaelum
    2. 2. o difícil de um projeto é implementar bem
    3. 3. Implementação Design Arquitetura
    4. 4. Implementação Design Arquitetura
    5. 5. IOC
    6. 6. IOCDESIGN
    7. 7. IOC Usando uma boa prática de designPaulo Silveira DESIGN
    8. 8. IOC Usando uma boa prática de designPaulo Silveira DESIGN ARQUITETURA
    9. 9. IOC Usando uma boa prática de designPaulo Silveira DESIGN Mudamos a arquitetura e economizamos $$$. ARQUITETURA Sérgio Lopes
    10. 10. DESIGNIMPLEMENTAÇÃO
    11. 11. DESIGN Como seu código se comunica? (design interface de comunicação)IMPLEMENTAÇÃO
    12. 12. DESIGN Como seu código se comunica? (design interface de comunicação) Como seu código é executado? (design da implementação)IMPLEMENTAÇÃO
    13. 13. design arquitetura java, ruby, scala, objective-c, c# servidores, firewalls etc implementação
    14. 14. (s
    15. 15. arquitetura toda bem definida é muito bonita...
    16. 16. arquitetura toda bem definida é muito bonita... mas nem sempre é fácíl entender
    17. 17. A única coisa que existe é a implementação
    18. 18. o difícil de um projeto é implementar bem
    19. 19. Interpreto o código através de como ele se comunica.ver através dos olhos de design
    20. 20. ver através dos olhos da arquitetura Interpreto o código através de como partes do sistema influenciam outras. e caracteristicas que nascem disso
    21. 21. várias maneirasde ver o código
    22. 22. design := uma interpretaçãoarquitetura := outra interpretação
    23. 23. não posso falar de arquitetura ou de design sem falar de implementação
    24. 24. .
    25. 25. arquitetura é o mínimose a arquitetura não atende, não há conversa
    26. 26. o que sobra é pensarmos no design...de interface ===> dificil manutenção de código ===> dificil manutenção
    27. 27. veremos código
    28. 28.       def _read_attribute(attr_name)        attr_name = attr_name.to_s        attr_name = self.class.primary_key if attr_name == id        value = @attributes[attr_name]        unless value.nil?          if column = column_for_attribute(attr_name)            if unserializable_attribute?(attr_name, column)              unserialize_attribute(attr_name)            else              column.type_cast(value)            end          else            value          end        end      end fonte pequena?
    29. 29.       def _read_attribute(attr_name)        attr_name = attr_name.to_s        attr_name = self.class.primary_key if attr_name == id        value = @attributes[attr_name]        unless value.nil?          if column = column_for_attribute(attr_name)            if unserializable_attribute?(attr_name, column)              unserialize_attribute(attr_name)            else              column.type_cast(value)            end          else            value          end        end      end agora sim? fonte 16
    30. 30. 23...      def _read_attribute(attr_name)        attr_name = attr_name.to_s        attr_name = self.class.primary_key if attr_name == id        value = @attributes[attr_name]        unless value.nil?          if column = column_for_attribute(attr_name)            if unserializable_attribute?(attr_name, column)              unserialize_attribute(attr_name)            else              column.type_cast(value)            end          else            value          end        end      end
    31. 31. 23...      def _read_attribute(attr_name)        attr_name = attr_name.to_s        attr_name = self.class.primary_key if attr_name == id        value = @attributes[attr_name]        unless value.nil?          if column = column_for_attribute(attr_name)            if unserializable_attribute?(attr_name, column)              unserialize_attribute(attr_name)            else              column.type_cast(value)            end          else            value          end        end      end
    32. 32. mas e se... 23...      def _read_attribute(attr_name)        attr_name = attr_name.to_s        attr_name = self.class.primary_key if attr_name == id        value = @attributes[attr_name]        unless value.nil?          if column = column_for_attribute(attr_name)            if unserializable_attribute?(attr_name, column)              unserialize_attribute(attr_name)            else              column.type_cast(value)            end          else            value          end        end      end
    33. 33. mas eese... mas se... 23...      def _read_attribute(attr_name)        attr_name = attr_name.to_s        attr_name = self.class.primary_key if attr_name == id        value = @attributes[attr_name]        unless value.nil?          if column = column_for_attribute(attr_name)            if unserializable_attribute?(attr_name, column)              unserialize_attribute(attr_name)            else              column.type_cast(value)            end          else            value          end        end      end
    34. 34. mas eese... mas ese... 23... mas se...      def _read_attribute(attr_name)        attr_name = attr_name.to_s        attr_name = self.class.primary_key if attr_name == id        value = @attributes[attr_name]        unless value.nil?          if column = column_for_attribute(attr_name)            if unserializable_attribute?(attr_name, column)              unserialize_attribute(attr_name)            else              column.type_cast(value)            end          else            value          end        end      end
    35. 35. mas eese... mas ese... 23... mas ese... mas se...      def _read_attribute(attr_name)        attr_name = attr_name.to_s        attr_name = self.class.primary_key if attr_name == id        value = @attributes[attr_name]        unless value.nil?          if column = column_for_attribute(attr_name)            if unserializable_attribute?(attr_name, column)              unserialize_attribute(attr_name)            else              column.type_cast(value)            end          else            value          end        end      end
    36. 36. mas eese... mas ese... 23... mas ese... mas ese... mas se...      def _read_attribute(attr_name)        attr_name = attr_name.to_s        attr_name = self.class.primary_key if attr_name == id        value = @attributes[attr_name]        unless value.nil?          if column = column_for_attribute(attr_name)            if unserializable_attribute?(attr_name, column)              unserialize_attribute(attr_name)            else              column.type_cast(value)            end          else            value          end        end      end
    37. 37. mas eese... mas ese... 23... mas ese... mas ese... mas se...      def _read_attribute(attr_name)        attr_name = attr_name.to_s        attr_name = self.class.primary_key if attr_name == id        value = @attributes[attr_name]        unless value.nil?          if column = column_for_attribute(attr_name)            if unserializable_attribute?(attr_name, column)              unserialize_attribute(attr_name)            else              column.type_cast(value)            end          else            value          end        end      end
    38. 38. mas eese... mas ese... 23... mas ese... mas ese... mas ese... mas se...      def _read_attribute(attr_name)        attr_name = attr_name.to_s        attr_name = self.class.primary_key if attr_name == id        value = @attributes[attr_name]        unless value.nil?          if column = column_for_attribute(attr_name)            if unserializable_attribute?(attr_name, column)              unserialize_attribute(attr_name)            else              column.type_cast(value)            end          else            value          end        end      end
    39. 39. conciso?
    40. 40.       def _read_attribute(attr_name)        attr_name = attr_name.to_s        attr_name = self.class.primary_key if attr_name == id        value = @attributes[attr_name]        unless value.nil?          if column = column_for_attribute(attr_name)            if unserializable_attribute?(attr_name, column)              unserialize_attribute(attr_name)            else              column.type_cast(value)            end          else            value          end        end      end
    41. 41. o fluxo é COMPLEXO      def _read_attribute(attr_name)        attr_name = attr_name.to_s        attr_name = self.class.primary_key if attr_name == id        value = @attributes[attr_name]        unless value.nil?          if column = column_for_attribute(attr_name)            if unserializable_attribute?(attr_name, column)              unserialize_attribute(attr_name)            else              column.type_cast(value)            end          else            value          end        end      end
    42. 42. o fluxo éSEMANTICA não há COMPLEXO      def _read_attribute(attr_name)        attr_name = attr_name.to_s        attr_name = self.class.primary_key if attr_name == id        value = @attributes[attr_name]        unless value.nil?          if column = column_for_attribute(attr_name)            if unserializable_attribute?(attr_name, column)              unserialize_attribute(attr_name)            else              column.type_cast(value)            end          else            value          end        end      end
    43. 43. variáveis zoadas?Nico Steppat
    44. 44. variáveis zoadas? Non. Nonca vi.Nico Steppat
    45. 45. complexidade invisivel        def cached_attributes          @cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |col| col.name }.to_set        end
    46. 46. complexidade invisivel        def cached_attributes          @cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |col| col.name }.to_set        end Mateus, programador do cão
    47. 47. complexidade invisivel        def cached_attributes          @cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |col| col.name }.to_set        end Ahn? Mateus, programador do cão
    48. 48. entendeu?        def cached_attributes          @cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |col| col.name }.to_set        end
    49. 49. entendeu?      def cached_attributes        @cached_attributes ||= columns.select { |c|cheable_column?(c) }.map { |col| col.name }.to_set      end mas essa linha não cabe nem em slide!!!!! vergonha
    50. 50. quantos fors tem aqui?      def cached_attributes        @cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |col| col.name }.to_set      end
    51. 51. quantos fors tem aqui?      def cached_attributes        @cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |col| col.name }.to_set      end
    52. 52. quantos fors tem aqui?      def cached_attributes        @cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |col| col.name }.to_set      end for
    53. 53. quantos fors tem aqui?      def cached_attributes        @cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |col| col.name }.to_set      end UMA LINHA for
    54. 54. quantos fors tem aqui?      def cached_attributes        @cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |col| col.name }.to_set      end UMA LINHA for if
    55. 55. quantos fors tem aqui?      def cached_attributes        @cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |col| col.name }.to_set      end UMA LINHA for for if
    56. 56. quantos fors tem aqui?      def cached_attributes        @cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |col| col.name }.to_set      end UMA LINHA for for for if
    57. 57. quantos fors tem aqui?      def cached_attributes        @cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |col| col.name }.to_set      end UMA LINHA for for for oops... if if
    58. 58. quantos fors tem aqui?      def cached_attributes        @cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |col| col.name }.to_set      end UMA LINHA for for for oops... if if Mein Gott. Coisa assim nonca vi!
    59. 59. QUANTOS TESTES PRECISA?      def cached_attributes        @cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |col| col.name }.to_set      end
    60. 60. e agora?     def cached_attributes       @cached_attributes ||= columns.select { |c| cacheable_column?(c) } .map { |col| col.name } .to_set     end
    61. 61. ,
    62. 62. dê enter tarefa do bem
    63. 63. menos palavras zoou seu código um enter não mata        def cached_attributes          @cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |col| col.name }.to_set        end
    64. 64. concisão = com o mínimo de palavras, deixar claro tarefa do bem
    65. 65. concisão =baixar o nível =
    66. 66. concisão = eu tô bembaixar o nível = ˆo b3w especialista em linguagem de programação miguxês
    67. 67. cliente.a
    68. 68. cliente.a meta-aspecto-meta-aspecto programador
    69. 69. cliente.aQuer ver uma mágica? meta-aspecto-meta-aspecto programador
    70. 70. cliente.aacontece o método b, c, d, e, f, ... Quer ver uma mágica? meta-aspecto-meta-aspecto programador
    71. 71. cliente.a acontece o método b, c, d, e, f, ... Quer ver uma mágica?Meta meta meta meta programming. meta-aspecto-meta-aspecto programador
    72. 72.        # Deletes the records according to the <tt>:dependent</tt> option.       def delete_records(records, method)         if method == :destroy           records.each { |r| r.destroy }           update_counter(-records.length) unless inverse_updates_counter_cache?         else           keys = records.map { |r| r[reflection.association_primary_key] }           scope = scoped.where(reflection.association_primary_key => keys)           if method == :delete_all             update_counter(-scope.delete_all)           else             update_counter(-scope.update_all(reflection.foreign_key => nil))           end         end       end
    73. 73. quem escreveu?
    74. 74. meu amigo sérgio
    75. 75.        # Deletes the records according to the <tt>:dependent</tt> option.       def delete_records(records, method)         if method == :destroy           records.each { |r| r.destroy }           update_counter(-records.length) unless inverse_updates_counter_cache?         else           keys = records.map { |r| r[reflection.association_primary_key] }           scope = scoped.where(reflection.association_primary_key => keys)           if method == :delete_all             update_counter(-scope.delete_all)           else             update_counter(-scope.update_all(reflection.foreign_key => nil))           end         end       end
    76. 76. um “if if if if if if” dói (aka. sanduíche íche íche pattern)
    77. 77. ninguém acerta de primeira É vital refatorar!
    78. 78. esse dói?select * from Contatos where a=b or (c=d && e=f) order by primeiro_campo
    79. 79. esse dói? select * from Contatos where a=b or (c=d && e=f) order by primeiro_campoMaurício Aniche
    80. 80. esse dói? select * from Contatos where a=b or (c=d && e=f) order by primeiro_campo Como você testaria isso?Maurício Aniche
    81. 81. esse dói? select * from Contatos where a=b or (c=d && e=f) order by primeiro_campo Como você testaria isso? mock.assert(_.select(“select from ...”))?Maurício Aniche
    82. 82. esse dói? select * from Contatos where a=b or (c=d && e=f) order by primeiro_campo Como você testaria isso? mock.assert(_.select(“select from ...”))? 1 teste?Maurício Aniche
    83. 83. O objetivo não é usar outro, ou esconder o controle de fluxo.Quebre ele em dois. Mais faceis de entender
    84. 84. O objetivo não é usar outro, ou esconder o controle de fluxo.Quebre ele em dois. Mais faceis de entender
    85. 85. teste é moda, é positivo, é importante, e garante várias coisas
    86. 86. mas
    87. 87. sua cobertura mente
    88. 88. select * from Contatos where a=b or (c=d && e=f) order by primeiro_campo limit 2
    89. 89. select * from Contatos where a=b or (c=d && e=f) order by primeiro_campo limit 2
    90. 90. select * from Contatos where a=b or (c=d && e=f) order by primeiro_campo limit 2
    91. 91. Facinho...select * from Contatos where a=b or (c=d && e=f) order by primeiro_campo limit 2
    92. 92. Facinho... select * from Contatos where a=b or (c=d && e=f) order by primeiro_campo limit 2Martin Fowler
    93. 93. Facinho... select * from Contatos where a=b or (c=d && e=f) order by primeiro_campo limit 2 sql também é linguagem...Martin Fowler
    94. 94. Facinho... select * from Contatos where a=b or (c=d && e=f) order by primeiro_campo limit 2 sql também é linguagem... mina gata hein...Martin Fowler
    95. 95. dá para fazer lógica sem fazer lógica? não dá!
    96. 96. menos de 5 testes não garantomas a cobertura diz “100%”...mentirosa ...
    97. 97. de verdade, não assim: - teste sem assert - teste verifica que uma string é passada - teste “salva”
    98. 98. Um código é dificil de entender pois tem fluxos.São os fluxos que deixam ele dificil.
    99. 99. tarefa do bemfluxo “invisíveis”, TESTE
    100. 100. conscientizar-se da complexidade de nosso códigoJim Webber
    101. 101. conscientizar-se da complexidade de nosso código não adianta esconder o spaguetti, ele continua lá.Jim Webber
    102. 102. conscientizar-se da complexidade de nosso código não adianta esconder o spaguetti, ele continua lá. tem que deixar explícito!Jim Webber
    103. 103. tarefa do bem para trabalhar com algo complexonão se deve fingir que ele não existe mas ensinar a resolver o problema
    104. 104. esconder o complexo é julgar alguem incapaza complexidade continuará lá... agora com um gargalo
    105. 105. pior ainda, quem usa ele, vai usar mal usado pois não sabe o que esta acontecendo
    106. 106. se você tem que executar algo sempre que cria um Cliente?
    107. 107. se você tem que executar algosempre que cria um Cliente?
    108. 108. se você tem que executar algo sempre que cria um Cliente?
    109. 109. declare dependência e código no CONSTRUTOR
    110. 110. declare dependência e código no CONSTRUTORmas e no Rails, Javabeans, Hibernate, etc?
    111. 111. construtor não faz nadaatributos públicos (get/set/attr)
    112. 112. O padrão de OO no mercado é a “orgia dos objetos” pattern. Todo mundo pega todo mundo.
    113. 113. Duvidou? Spring: CTRL+F staticRails: ActiveRecord.methods.size
    114. 114. Lição de Casa? Apague um getter e um setter.Um atributo. Controle o escopo. Veja a caca que já está feita...
    115. 115. relacionamentos classe Clientes?
    116. 116. relacionamentos@OneToManyList<Usuario> clientes;+ 10 metodos classe Clientes?
    117. 117. relacionamentos has_many :clientes, :class => Us +10 metodos@OneToManyList<Usuario> clientes;+ 10 metodos classe Clientes?
    118. 118. classe Clientes
    119. 119. classe Clientespublic Clientes getClientes() { return new Clientes(this.clientes);}
    120. 120. classe Clientes def clientes Clientes.new(super) endpublic Clientes getClientes() { return new Clientes(this.clientes);}
    121. 121. classe Clientes def clientes Clientes.new(super) endpublic Clientes getClientes() { return new Clientes(this.clientes);} + encapsulamento
    122. 122. a questao da web nao ser OO a web eh outra coisa o outro sistema é outra coisaCLIENTE
    123. 123. a questao da web nao ser OO a web eh outra coisa o outro sistema é outra coisaCLIENTE
    124. 124. a questao da web nao ser OO a web eh outra coisa o outro sistema é outra coisaCLIENTE
    125. 125. a questao da web nao ser OO a web eh outra coisa o outro sistema é outra coisaCLIENTE BANCO
    126. 126. a questao da web nao ser OO a web eh outra coisa o outro sistema é outra coisaCLIENTE BANCO
    127. 127. invisivel (esconder) ou clara e bem definida
    128. 128. frameworkscomponent based escondem a web...
    129. 129. frameworkscomponent based escondem a web... Mas e se minha preocupação é fazer um sistema otimizado para a web? (keynote do sérgio)
    130. 130. frameworkscomponent based escondem a web... Mas e se minha preocupação é fazer um sistema otimizado para a web? (keynote do sérgio) booooo!
    131. 131. AR mistureba. menos camadas :) modelo domínio banco modelo banco queries insertstodo mundo tem acesso a tudo ESCOPO
    132. 132. adiciona uma camda :(. entra o controle de escopo. :) banco modelo do domínio ESCOPO ESCOPO
    133. 133. adiciona uma camda :(. entra o controle de escopo. :) modelo banco banco queries inserts modelo do domínio ESCOPO ESCOPO
    134. 134. como moldar nosso sistema entao?
    135. 135. modele REGRAS
    136. 136. Qualquer coisa que eu mudar, quebra...
    137. 137. Qualquer coisa que eu mudar, quebra...
    138. 138. Qualquer coisa que eu mudar, quebra...
    139. 139. Qualquer coisa que eu mudar, quebra...
    140. 140. Qualquer coisa que eu mudar, quebra...
    141. 141. no lugar ADEQUADO
    142. 142. post post postAh! Quebrou encapsulamento dá nisso!
    143. 143. post post postAh! Quebrou encapsulamento dá nisso!
    144. 144. post post postAh! Quebrou encapsulamento dá nisso!
    145. 145. post post postAh! Quebrou encapsulamento dá nisso!
    146. 146. post post postAh! Quebrou encapsulamento dá nisso!
    147. 147. Posso agulhar? post post postAh! Quebrou encapsulamento dá nisso!
    148. 148. no lugar ADEQUADOse eu mudar, eu quebro... mas ai tudo bem! encapsulamento++ demeter++
    149. 149. no lugar ADEQUADOse eu mudar, eu quebro... mas ai tudo bem! encapsulamento++ demeter++
    150. 150. presentation code != domain code controller model viewif discussion.author==myself || myself.roles[:moderator]
    151. 151. presentation code != domain code controller model if discussion.author==myself view myself.roles[:moderator]if mysel.canEdit(discussion)
    152. 152. esses ifs não ficam repetidos em várias views
    153. 153. abra *.jsp, *.erb, *.ssp, *.similares CTRL+F, if com algo != de booleanCTRL+F, if com chamada != de boolean
    154. 154. sem arquitetura adequadanão há conversa
    155. 155. o código existeo resto, é interpretação
    156. 156. código é complicado
    157. 157. esconder o complicado não é simplificar
    158. 158. se é difícil de testar,o código tem débito
    159. 159. @guilhermecaelumhttp://www.caelum.com.brhttp://online.caelum.com.brobrigado

    ×