Aplicando SOLID Princípios em Ruby: Exemplos e Melhores Práticas

Single Responsibility Principle(SRP)

Este princípio afirma que cada classe deve ter uma única responsabilidade. Ele enfatiza que uma classe deve executar uma função específica e não ter muitos motivos para mudar.

Exemplo: gerenciamento de informações do usuário e envio de notificações por e-mail.

class UserManager  
  def create_user(user_data)  
    # Logic for creating a user  
  end  
end  
  
class EmailService  
  def send_email(email_data)  
    # Logic for sending an email  
  end  
end  

Open/Closed Principle(OCP)

Esse princípio incentiva a extensão da funcionalidade adicionando um novo código em vez de modificar o código existente.

Exemplo: Lidar com diferentes métodos de pagamento em um aplicativo de comércio eletrônico.

class PaymentProcessor  
  def process_payment  
    # Common logic for payment processing  
  end  
end  
  
class CreditCardPaymentProcessor < PaymentProcessor  
  def process_payment  
    # Logic for processing credit card payment  
  end  
end  
  
class PayPalPaymentProcessor < PaymentProcessor  
  def process_payment  
    # Logic for processing PayPal payment  
  end  
end  

Liskov Substitution Principle(LSP)

Este princípio afirma que objetos de uma classe derivada devem ser substituíveis por objetos da classe base sem afetar a correção do programa.

Exemplo: Gerenciamento de formas geométricas.

class Shape  
  def area  
    # Common logic for calculating area  
  end  
end  
  
class Rectangle < Shape  
  def area  
    # Logic for calculating area of rectangle  
  end  
end  
  
class Square < Shape  
  def area  
    # Logic for calculating area of square  
  end  
end  

Interface Segregation Principle(ISP)

Esse princípio aconselha dividir as interfaces em interfaces menores para evitar forçar as classes a implementar métodos de que não precisam.

Exemplo: Interfaces para atualização e exibição de dados.

module UpdateableFeature  
  def update_feature  
    # Logic for updating feature  
  end  
end  
  
module DisplayableFeature  
  def display_feature  
    # Logic for displaying feature  
  end  
end  

Dependency Inversion Principle(DIP)

Esse princípio sugere o uso de injeção de dependência para gerenciar dependências.

Exemplo: Usando injeção de dependência para gerenciar dependências.

class OrderProcessor  
  def initialize(db_connection, email_service)  
    @db_connection = db_connection  
    @email_service = email_service  
  end  
end  

Lembre-se de que a aplicação SOLID dos princípios Ruby deve ser feita de forma flexível com base no objetivo específico do seu projeto e na sua compreensão de SOLID e Ruby.