Entendendo e Utilizando a Gem Dry e Seus Componentes em Projetos Ruby

Entendendo e Utilizando a Gem Dry e Seus Componentes em Projetos Ruby
Photo by Med Badr Chemmaoui / Unsplash

Post: Entendendo e Utilizando a Gem Dry e Seus Componentes em Projetos Ruby

Introdução:

A gem Dry é uma coleção de bibliotecas Ruby destinadas a melhorar a robustez, clareza e flexibilidade do código. Ela oferece uma série de ferramentas que ajudam a escrever código mais limpo e menos propenso a erros. Neste post, exploraremos quando e por que usar a gem Dry, suas vantagens e desvantagens, e em que tipos de projetos ela se encaixa melhor. Além disso, forneceremos um exemplo prático de como implementá-la em um projeto Ruby.

O que é a Gem Dry?

Dry (Do not Repeat Yourself) é um conjunto de gems Ruby que promove boas práticas de programação, ajudando a evitar a repetição de código e a tornar o código mais modular e testável. Algumas das gems mais populares incluem dry-validation, dry-transaction, dry-struct, entre outras.

Quando e Por Que Usar a Gem Dry?

  • Validação de Dados: Use dry-validation para uma abordagem mais flexível e poderosa para validar dados de entrada.
  • Organização de Lógica de Negócios: dry-transaction e dry-monads são úteis para organizar a lógica de negócios em operações discretas e manejáveis.
  • Definição de Estruturas de Dados: dry-struct é ideal para definir estruturas de dados claras e imutáveis.

Vantagens da Gem Dry:

  1. Modularidade: Promove a criação de componentes reutilizáveis.
  2. Manutenção: Facilita a manutenção e o teste do código.
  3. Flexibilidade: Oferece uma abordagem mais flexível e extensível em comparação com algumas alternativas padrão do Ruby.
  4. Redução de Boilerplate: Ajuda a reduzir o código repetitivo.

Desvantagens da Gem Dry:

  1. Curva de Aprendizado: Pode ser um pouco complexa para iniciantes.
  2. Overhead: Em projetos menores, pode adicionar uma complexidade desnecessária.
  3. Integração: Pode exigir algum esforço para integrar com outras gems ou frameworks.

Tipos de Projetos Adequados:

  • Projetos de médio a grande porte que exigem uma estrutura robusta e modular.
  • Aplicações que necessitam de uma lógica de negócios complexa e bem organizada.
  • Projetos que se beneficiam de uma validação de dados avançada e personalizável.

Exemplo Prático de Uso:

Passo 1: Instalação da Gem

Adicione a gem ao seu Gemfile:

gem 'dry-validation'

E execute:

bundle install

Passo 2: Criando um Esquema de Validação

Vamos criar um esquema de validação para um formulário de usuário:

require 'dry-validation'

class UserFormSchema < Dry::Validation::Contract
  params do
    required(:email).filled(:string, format?: /@/)
    required(:age).filled(:integer, gt?: 18)
  end
end

Passo 3: Usando o Esquema para Validar Dados

result = UserFormSchema.new.call(email: '[email protected]', age: 20)

if result.success?
  puts "Dados válidos: #{result.values.data.inspect}"
else
  puts "Erros: #{result.errors.to_h.inspect}"
end

A gem Dry e suas bibliotecas associadas oferecem uma poderosa ferramenta para melhorar a qualidade do código em aplicações Ruby. Ela é particularmente útil em projetos maiores que se beneficiam de uma estrutura de código mais organizada e modular. Embora possa ter uma curva de aprendizado inicial, as vantagens a longo prazo em termos de manutenção e escalabilidade do código são significativas.

Projeto Prático

nesta etapa, vamos explorar como implementar regras de negócio complexas em um projeto Rails usando a gem Dry-RB. Vamos criar uma aplicação Rails simples e aplicar uma regra de negócio utilizando dry-validation e dry-transaction para uma operação de cadastro de usuário.

Configuração do Projeto Rails

Passo 1: Criar um Novo Projeto Rails

rails new dryrb_example
cd dryrb_example

Passo 2: Adicionar Gems Dry-RB

Adicione as seguintes gems ao seu Gemfile:

gem 'dry-validation'
gem 'dry-transaction'
gem 'dry-monads'

E execute:

bundle install

Criando o Modelo e o Controlador

Passo 3: Gerar Modelo e Controlador

rails generate model User email:string age:integer
rails generate controller Users
rake db:migrate

Implementando Dry-Validation

Passo 4: Criar um Esquema de Validação

Crie um arquivo app/validators/user_validator.rb:

class UserValidator < Dry::Validation::Contract
  params do
    required(:email).filled(:string, format?: /@/)
    required(:age).filled(:integer, gt?: 18)
  end
end

Implementando Dry-Transaction

Passo 5: Criar uma Transação

Crie um arquivo app/transactions/register_user.rb:

require 'dry/transaction'

class RegisterUser
  include Dry::Transaction

  step :validate
  step :persist

  def validate(input)
    validation = UserValidator.new.call(input)
    if validation.success?
      Success(input)
    else
      Failure(validation.errors.to_h)
    end
  end

  def persist(input)
    user = User.create(input)
    Success(user)
  end
end

Integrando com o Controlador

Passo 6: Atualizar o Controlador de Usuários

Atualize app/controllers/users_controller.rb:

class UsersController < ApplicationController
  def create
    transaction = RegisterUser.new
    result = transaction.call(user_params)

    if result.success?
      render json: result.success, status: :created
    else
      render json: result.failure, status: :unprocessable_entity
    end
  end

  private

  def user_params
    params.require(:user).permit(:email, :age)
  end
end

Testando a Aplicação

Passo 7: Testar a Regra de Negócio

Inicie o servidor Rails e teste a criação de um usuário através de uma requisição POST para /users com os dados do usuário. Verifique se a validação e a persistência estão funcionando conforme esperado.

Com este exemplo, demonstramos como as gems Dry-RB podem ser utilizadas em um projeto Rails para implementar regras de negócio complexas de forma modular e testável. A combinação de dry-validation e dry-transaction oferece uma abordagem poderosa e flexível para validar e processar dados, garantindo que as operações sejam realizadas de maneira confiável e eficiente.

Read more