Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Maximização do Conceito DRY

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers. →
Avatar for Fabiow Fabiow
January 20, 2016

Maximização do Conceito DRY

Utilizando alguns conceitos de Ruby on Rails, é possível desenvolver novas funcionalidades de forma robusta, centralizada e produtiva, proporcionando uma experiência consistente ao usuário final e elegante ao desenvolvedor.

Avatar for Fabiow

Fabiow

January 20, 2016

Other Decks in Technology

Transcript

  1. Maximização do Conceito DRY Apresentação • Formado pela Universidade Federal

    do Ceará; • Desenvolvedor JAVA na E-novar; • Participante recente da comunidade Ruby :) Fabiow Quixadá IAQ - Instituto de Apoio ao Queimado
  2. Maximização do Conceito DRY Introdução • DRY – Don't Repeat

    Yourself - “Não se repita”; • Repaginação de um conceito antigo; • Partials, Concerns, Helpers e Módulos;
  3. Maximização do Conceito DRY Módulos • Blocos de código reutilizáveis;

    • Não existem por si só; • Injetáveis em classes; • Benefícios de hierarquia e composição; • Exemplo: Gênero dos modelos;
  4. Maximização do Conceito DRY Módulos • Exemplo: Gênero dos modelos

    updated: m: "%{model} atualizado com sucesso!" f: "%{model} atualizada com sucesso!" config/locales/pt-BR.yml Este caso é específico para o português, mas é facilmente expansível para outros idiomas com regras de gêneros diferentes.
  5. Maximização do Conceito DRY Módulos • Exemplo: Gênero dos modelos

    class Company < ActiveRecord::Base ... end Código comum a várias classes Potencialmente modularizável module ModelModule def genderize(verb) "#{verb}.#{self.gender}" end def gender 'm' end end def genderize(verb) "#{verb}.#{self.gender}" end def gender 'm' end include ModelModule updated: m: "%{model} atualizado com sucesso!" f: "%{model} atualizada com sucesso!"
  6. Maximização do Conceito DRY Módulos • Exemplo: Gênero dos modelos

    def was(verb) I18n.t("#{verb}.#{self.gender}", model: I18n.t('activerecord.models.' + self.class.model_name.param_key + '.one')) .capitalize end def genderize_tag(model, verb) t(model.genderize(verb), model: t('activerecord.models.' + model.class.model_name.param_key + '.one')) .capitalize end Localização: Helper ou no model? updated: m: "%{model} atualizado com sucesso!" f: "%{model} atualizada com sucesso!" # company,'updated' # company.was 'updated'
  7. Maximização do Conceito DRY Partials • “Pedaços” de views reutilizáveis;

    • Passagem de argumento; • Localizados em qualquer diretório dentro de /app/views; <%= render partial: "shared/form_commons" %> <%= render partial: "shared/form_commons", locals: {company: company, f: f} %> Exemplos: • Erros do formulário; • Helper de formulário;
  8. Maximização do Conceito DRY Concerns • “Oficial” a partir do

    Rails 4.0; • É um módulo que extende ActiveSupport::Concern; • Gerenciamento de dependência de módulos;
  9. Maximização do Conceito DRY Concerns • Exemplo de Action def

    create @model = Model.new model_validation if @model.save redirect_to models_path, notice: “modelo criado com sucesso!” else render '_form' end end É possível generalizar? Inferido através do nome do parâmetro Parâmetro Locale Colocar em um concern
  10. Maximização do Conceito DRY Concerns • Exemplo de Action def

    create @model = Company.new company_validation if @model.save redirect_to companies_path, notice: “Empresa criada com sucesso!” else render '_form' end end
  11. Maximização do Conceito DRY Concerns • Exemplo de Action def

    create @model = User.new user_validation if @model.save redirect_to users_path, notice: “Usuário criado com sucesso!” else render '_form' end end
  12. def create @model = Model.new model_validation if @model.save redirect_to models_path,

    notice: “modelo criado com sucesso!” else render '_form' end end Maximização do Conceito DRY Concerns • Exemplo de Action Inferido através do nome do parâmetro Parâmetro Locale class CompaniesController < ApplicationController include MainConcern … end arguable model_class: Company
  13. Maximização do Conceito DRY Concerns module MainConcern extend ActiveSupport::Concern module

    ClassMethods attr_reader :arguable_opts … private def arguable(opts={}) @arguable_opts = opts end end def create … end … end class CompaniesController < ApplicationController include MainConcern arguable model_class: Company … end Código completo do concern
  14. Maximização do Conceito DRY Concerns • Exemplo funcional de controller

    class CompaniesController < ApplicationController include MainConcern arguable model_class: Company private def company_params params.require(:company).permit(...) end end