O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

WTF Oriented Programming, com Fabio Akita

401 visualizações

Publicada em

Fábio Akita é co-fundador da Codeminer 42, empresa de desenvolvimento de software principalmente para startups. Desde 2008 é o criador e organizador do Rubyconf Brasil, uma das maiores conferências de tecnologia da América Latina. Tem experiência de 20 anos no mercado de software, tendo passado pelo mercado de grandes agências, consultoria SAP corporativo e pelo primeiro boom de startups em 2000. Nesta edição do 7Masters, ele trouxe a talk "WTF Oriented Programming".

Publicada em: Tecnologia
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

WTF Oriented Programming, com Fabio Akita

  1. 1. WTF ORIENTED PROGRAMMING by @AkitaOnRails
  2. 2. project_id  =  @user.project  ==  nil  ?  nil  :  @user.project.id
  3. 3. project_id  =  @user.project  ==  nil  ?  nil  :  @user.project.id project_id  =  @user.try(:project).try(:id)
  4. 4. @politician  =  Politician.where(name:  "Terminator").first   @politician.try(:studio).try(:name)
  5. 5. @politician  =  Politician.where(name:  "Terminator").first   @politician.try(:studio).try(:name) LAW OF DEMETER
  6. 6. @politician  =  Politician.where(name:  "Terminator").first   @politician.try(:studio).try(:name) LAW OF DEMETER
  7. 7. class  Politician      delegate  :name,  to:  :studio,          prefix:  true,  allow_nil:  true      #  ...   end   @politician.studio.name
  8. 8. class  Politician      delegate  :name,  to:  :studio,          prefix:  true,  allow_nil:  true      #  ...   end   @politician.studio.name@politician.studio_name
  9. 9. class  Politician      delegate  :name,  to:  :studio,          prefix:  true,  allow_nil:  true      #  ...   end   @politician.studio.name@politician.studio_name
  10. 10. array  =  []   list.each  do  |state|      array  <<  [state.name,  state.acronym]   end   array
  11. 11. array  =  []   list.each  do  |state|      array  <<  [state.name,  state.acronym]   end   array for  state  in  list
  12. 12. array  =  []   list.each  do  |state|      array  <<  [state.name,  state.acronym]   end   array list.map  {  |state|  [state.name,  state.acronym]  } for  state  in  list
  13. 13. array  =  []   list.each  do  |state|      if  state.name  =~  /^S/          array  <<  [state.name,  state.acronym]      end   end   array
  14. 14. array  =  []   list.each  do  |state|      if  state.name  =~  /^S/          array  <<  [state.name,  state.acronym]      end   end   array list.      select  {  |state|  state.name  =~  /^S/  }.      map  {  |state|  [state.name,  state.acronym]  }
  15. 15. def  formatdate(d)          months  =  Hash.new          months["Jan"]  =  "janeiro"          months["Feb"]  =  "fevereiro"          #  ...          months["Dec"]  =  "dezembro"              weeks  =  Hash.new          weeks["Sun"]  =  "Domingo"          #  ...          weeks["Fri"]  =  "Sexta"          weeks["Sat"]  =  "Sábado"                    return  weeks[d.strftime("%a")]+",  "+d.strftime("%d")+"  de  "+months[d.strftime("%b")]   end
  16. 16. def  formatdate(d)          months  =  Hash.new          months["Jan"]  =  "janeiro"          months["Feb"]  =  "fevereiro"          #  ...          months["Dec"]  =  "dezembro"              weeks  =  Hash.new          weeks["Sun"]  =  "Domingo"          #  ...          weeks["Fri"]  =  "Sexta"          weeks["Sat"]  =  "Sábado"                    return  weeks[d.strftime("%a")]+",  "+d.strftime("%d")+"  de  "+months[d.strftime("%b")]   end #  config/locales/pt-­‐BR.yml   pt-­‐BR:      time:          formats:              short_wday:  "%a,  %d  de  %B”   d.to_s(:short_wday)
  17. 17. <?php  if  (LANGUAGE  ==  'en')  {  ?>  <body  class="en">  <?php  }  ?>   <?php  if  (LANGUAGE  ==  'pt')  {  ?>  <body  class="pt">  <?php  }  ?>   <?php  if  (LANGUAGE  ==  'mx')  {  ?>  <body  class="mx">  <?php  }  ?>   <?php  if  (LANGUAGE  ==  'kp')  {  ?>  <body  class="kp">  <?php  }  ?>
  18. 18. <?php  if  (LANGUAGE  ==  'en')  {  ?>  <body  class="en">  <?php  }  ?>   <?php  if  (LANGUAGE  ==  'pt')  {  ?>  <body  class="pt">  <?php  }  ?>   <?php  if  (LANGUAGE  ==  'mx')  {  ?>  <body  class="mx">  <?php  }  ?>   <?php  if  (LANGUAGE  ==  'kp')  {  ?>  <body  class="kp">  <?php  }  ?> <body  class="<?php  LANGUAGE  ?>">
  19. 19. address  =  ((!client.street.to_s.nil?)?  client.street.to_s  :  "")  +     ((!client.number.to_s.nil?)?  "  Nº  "  +  client.number.to_s  :  "")  +  "  "  +     ((!client.city.to_s.nil?)?  client.city.to_s  :  "")  +     ((!client.zip.to_s.nil?)?  "  -­‐  CEP:  "  +  client.zip.to_s  :  "")
  20. 20. address  =  ((!client.street.to_s.nil?)?  client.street.to_s  :  "")  +     ((!client.number.to_s.nil?)?  "  Nº  "  +  client.number.to_s  :  "")  +  "  "  +     ((!client.city.to_s.nil?)?  client.city.to_s  :  "")  +     ((!client.zip.to_s.nil?)?  "  -­‐  CEP:  "  +  client.zip.to_s  :  "") address  =  "#{client.street}  Nº  #{client.number}  #{client.city}  -­‐  CEP:  #{client.zip}"
  21. 21. address  =  ((!client.street.to_s.nil?)?  client.street.to_s  :  "")  +     ((!client.number.to_s.nil?)?  "  Nº  "  +  client.number.to_s  :  "")  +  "  "  +     ((!client.city.to_s.nil?)?  client.city.to_s  :  "")  +     ((!client.zip.to_s.nil?)?  "  -­‐  CEP:  "  +  client.zip.to_s  :  "") address  =  "#{client.street}  Nº  #{client.number}  #{client.city}  -­‐  CEP:  #{client.zip}" address  =  "%s  Nº  %s  %s  -­‐  CEP:  %s"  %  [client.street,  client.number,  client.city,  client.zip]
  22. 22. address  =  ((!client.street.to_s.nil?)?  client.street.to_s  :  "")  +     ((!client.number.to_s.nil?)?  "  Nº  "  +  client.number.to_s  :  "")  +  "  "  +     ((!client.city.to_s.nil?)?  client.city.to_s  :  "")  +     ((!client.zip.to_s.nil?)?  "  -­‐  CEP:  "  +  client.zip.to_s  :  "") address  =  "#{client.street}  Nº  #{client.number}  #{client.city}  -­‐  CEP:  #{client.zip}" address  =  "%s  Nº  %s  %s  -­‐  CEP:  %s"  %  [client.street,  client.number,  client.city,  client.zip] class  ClientDecorator      #  ...      def  formatted_address          "%s  Nº  %s  %s  -­‐  CEP:  %s"  %  [street,  number,  city,  zip]      end   end
  23. 23. –Jamie Zawinksi “Some people, when confronted with a problem, think, “I know, I’ll use regular expressions.” Now they have two problems.” http://davidcel.is/blog/2012/09/06/stop-validating-email-addresses-with-regex/
  24. 24. class  User  <  ActiveRecord::Base      validates  :email,  format:  {  with:  /A[^@]+@([^@.]+.)+[^@.]+z/  }   end
  25. 25. class  User  <  ActiveRecord::Base      validates  :email,  format:  {  with:  /A[^@]+@([^@.]+.)+[^@.]+z/  }   end class  EmailValidator  <  ActiveModel::EachValidator      def  validate_each(record,  attribute,  value)          unless  email_valid?(value)              record.errors[attribute]  <<  (options[:message]  ||  "must  be  a  valid  email")          end      end    def  email_valid?(email)          Mail::Address.new(email)          true      rescue  Mail::Field::ParseError  =>  e          false      end     end
  26. 26. class  User  <  ActiveRecord::Base      validates  :email,  format:  {  with:  /A[^@]+@([^@.]+.)+[^@.]+z/  }   end class  EmailValidator  <  ActiveModel::EachValidator      def  validate_each(record,  attribute,  value)          unless  email_valid?(value)              record.errors[attribute]  <<  (options[:message]  ||  "must  be  a  valid  email")          end      end    def  email_valid?(email)          Mail::Address.new(email)          true      rescue  Mail::Field::ParseError  =>  e          false      end     end
  27. 27. class  User  <  ActiveRecord::Base      validates  :email,  format:  {  with:  /A[^@]+@([^@.]+.)+[^@.]+z/  }   end class  EmailValidator  <  ActiveModel::EachValidator      def  validate_each(record,  attribute,  value)          unless  email_valid?(value)              record.errors[attribute]  <<  (options[:message]  ||  "must  be  a  valid  email")          end      end    def  email_valid?(email)          Mail::Address.new(email)          true      rescue  Mail::Field::ParseError  =>  e          false      end     end class  User  <  ActiveRecord::Base      validates  :email,  email:  true   end
  28. 28. class  User  <  ActiveRecord::Base      validates  :link,  format:  {  with:          /(^$)|(^(http|https)://[a-­‐z0-­‐9]+([-­‐.]{1}[a-­‐z0-­‐9]+)*.[a-­‐z]{2,5}(([0-­‐9]{1,5})?/.*)?$)/ix      }   end https://coderwall.com/p/ztig5g/validate-urls-in-rails
  29. 29. class  User  <  ActiveRecord::Base      validates  :link,  format:  {  with:          /(^$)|(^(http|https)://[a-­‐z0-­‐9]+([-­‐.]{1}[a-­‐z0-­‐9]+)*.[a-­‐z]{2,5}(([0-­‐9]{1,5})?/.*)?$)/ix      }   end https://coderwall.com/p/ztig5g/validate-urls-in-rails class  UrlValidator  <  ActiveModel::EachValidator      def  validate_each(record,  attribute,  value)          unless  url_valid?(value)              record.errors[attribute]  <<  (options[:message]  ||  "must  be  a  valid  URL")          end      end      #  a  URL  may  be  technically  well-­‐formed  but  may        #  not  actually  be  valid,  so  this  checks  for  both.      def  url_valid?(url)          url  =  URI.parse(url)  rescue  false          url.kind_of?(URI::HTTP)  ||  url.kind_of?(URI::HTTPS)      end     end
  30. 30. class  User  <  ActiveRecord::Base      validates  :link,  format:  {  with:          /(^$)|(^(http|https)://[a-­‐z0-­‐9]+([-­‐.]{1}[a-­‐z0-­‐9]+)*.[a-­‐z]{2,5}(([0-­‐9]{1,5})?/.*)?$)/ix      }   end https://coderwall.com/p/ztig5g/validate-urls-in-rails class  UrlValidator  <  ActiveModel::EachValidator      def  validate_each(record,  attribute,  value)          unless  url_valid?(value)              record.errors[attribute]  <<  (options[:message]  ||  "must  be  a  valid  URL")          end      end      #  a  URL  may  be  technically  well-­‐formed  but  may        #  not  actually  be  valid,  so  this  checks  for  both.      def  url_valid?(url)          url  =  URI.parse(url)  rescue  false          url.kind_of?(URI::HTTP)  ||  url.kind_of?(URI::HTTPS)      end     end
  31. 31. class  User  <  ActiveRecord::Base      validates  :link,  url:  true   end class  User  <  ActiveRecord::Base      validates  :link,  format:  {  with:          /(^$)|(^(http|https)://[a-­‐z0-­‐9]+([-­‐.]{1}[a-­‐z0-­‐9]+)*.[a-­‐z]{2,5}(([0-­‐9]{1,5})?/.*)?$)/ix      }   end https://coderwall.com/p/ztig5g/validate-urls-in-rails class  UrlValidator  <  ActiveModel::EachValidator      def  validate_each(record,  attribute,  value)          unless  url_valid?(value)              record.errors[attribute]  <<  (options[:message]  ||  "must  be  a  valid  URL")          end      end      #  a  URL  may  be  technically  well-­‐formed  but  may        #  not  actually  be  valid,  so  this  checks  for  both.      def  url_valid?(url)          url  =  URI.parse(url)  rescue  false          url.kind_of?(URI::HTTP)  ||  url.kind_of?(URI::HTTPS)      end     end
  32. 32. def  query      Vote.connection.select_values  <<-­‐SQL          SELECT  voteable_id          FROM  votes          LEFT  OUTER  JOIN  authorships  ON  authorships.bill_id  =  voteable_id          LEFT  OUTER  JOIN  politicians  ON  politicians.id  =  politician_id          WHERE  voteable_type  =  'Bill'              AND  person_type  =  'User'              AND  votes.created_at  >=  now()  -­‐  interval  '90  days'              #{@condition.present??  "AND  #{@condition}"  :  ""}          GROUP  BY  voteable_id          ORDER  BY  count(*)  DESC  LIMIT  6;      SQL   end http://guides.rubyonrails.org/active_record_querying.html
  33. 33. def  query      Vote.connection.select_values  <<-­‐SQL          SELECT  voteable_id          FROM  votes          LEFT  OUTER  JOIN  authorships  ON  authorships.bill_id  =  voteable_id          LEFT  OUTER  JOIN  politicians  ON  politicians.id  =  politician_id          WHERE  voteable_type  =  'Bill'              AND  person_type  =  'User'              AND  votes.created_at  >=  now()  -­‐  interval  '90  days'              #{@condition.present??  "AND  #{@condition}"  :  ""}          GROUP  BY  voteable_id          ORDER  BY  count(*)  DESC  LIMIT  6;      SQL   end def  query      query  =  Vote.select('voteable_id')          joins("LEFT  OUTER  JOIN  authorships  ON  authorships.bill_id  =  voteable_id").          joins("LEFT  OUTER  JOIN  politicians  ON  politicians.id  =  politician_id").          where(voteable_type:  'Bill',  person_type:  'User').          where("votes.created_at  >=  now()  -­‐  interval  '90  days'").          group('voteable_id').          order('count(*)  desc').          limit(6)      query  =  query.where(@condition)  if  @condition.present?      query   end http://guides.rubyonrails.org/active_record_querying.html
  34. 34. OBRIGADO! @akitaonrails

×