ByteHub

Introdução aos Design Patterns: O SOLID e Sua Importância

Cover Image for  Introdução aos Design Patterns: O SOLID e Sua Importância
Renan Ribeiro Lage
Renan Ribeiro Lage

Introdução

Design Patterns ou Padrões de Projeto são um tópico crucial para qualquer desenvolvedor que busca escrever código mais eficiente, reutilizável e manutenível. No primeiro artigo desta série, focaremos nos princípios SOLID, um acrônimo que representa uma abordagem orientada a objeto para escrever código eficiente.

O Que é SOLID?

SOLID é um acrônimo para os cinco princípios básicos do design orientado a objetos e programação. Estes princípios são:

  1. Single Responsibility Principle (SRP) - Um classe deve ter apenas um motivo para mudar.
  2. Open/Closed Principle (OCP) - As entidades de software devem ser abertas para extensão, mas fechadas para modificação.
  3. Liskov Substitution Principle (LSP) - Objetos de um tipo derivado devem ser capazes de substituir objetos do tipo base.
  4. Interface Segregation Principle (ISP) - Uma classe não deve ser forçada a implementar interfaces que não usará.
  5. Dependency Inversion Principle (DIP) - Dependa de abstrações, não de implementações concretas.

Por Que SOLID?

  • Manutenibilidade: O código é mais fácil de entender e modificar.
  • Testabilidade: O código se torna mais modular, tornando mais fácil escrever testes unitários.
  • Reusabilidade: As classes bem definidas são mais fáceis de reutilizar em outros projetos.
  • Acoplamento Reduzido: O código bem estruturado é mais fácil de depurar e mantém um baixo nível de acoplamento.

Exemplos Práticos

Vamos aprofundar nos exemplos práticos de cada princípio SOLID usando como exemplo o Java, você pode aplica-lo em qualquer outra linguagem.

1. Single Responsibility Principle (SRP)

Uma classe Logger que possui apenas um motivo para mudar, ou seja, para cuidar do log do sistema.

public class Logger {
public void log(String message) {
// Grava o log aqui
}
}

2. Open/Closed Principle (OCP)

Uma interface Shape e classes Circle e Square que a implementam. A classe AreaCalculator é aberta para extensão, mas fechada para modificação.

public interface Shape {
double area();
}

public class Circle implements Shape {
public double radius;

@Override
public double area() {
return Math.PI * Math.pow(radius, 2);
}
}

public class Square implements Shape {
public double side;

@Override
public double area() {
return side * side;
}
}

public class AreaCalculator {
public double calculateArea(Shape shape) {
return shape.area();
}
}

3. Liskov Substitution Principle (LSP)

Classes filhas que podem substituir suas classes mães sem alterar a correção do programa.

public class Bird {
public void fly() {
// código genérico para voar
}
}

public class Penguin extends Bird {
@Override
public void fly() {
// Penguins não voam
throw new UnsupportedOperationException();
}
}

No exemplo acima, a classe Penguin quebra o LSP porque altera o comportamento do método fly. Uma forma de corrigir isso seria ter uma interface comum e classes diferentes para aves que voam e que não voam.

4. Interface Segregation Principle (ISP)

Separar interfaces que fazem muitas coisas em interfaces mais específicas.

public interface Printer {
void print();
}

public interface Fax {
void fax();
}

public class MultiFunctionPrinter implements Printer, Fax {
@Override
public void print() {
// código para imprimir
}

@Override
public void fax() {
// código para enviar fax
}
}

5. Dependency Inversion Principle (DIP)

Depender de abstrações e não de implementações concretas.

public interface Database {
void save();
}

public class MySQLDatabase implements Database {
@Override
public void save() {
// Salvar no banco MySQL
}
}

public class UserController {
private final Database database;

public UserController(Database database) {
this.database = database;
}

public void saveUser() {
database.save();
}
}

Com estes exemplos, espero que os princípios SOLID fiquem mais claros e que você possa aplicá-los em seus projetos Java.

Conclusão

Os princípios SOLID fornecem uma base sólida para escrever código limpo e manutenível, focando na eficiência e na eficácia. Ao adotar esses princípios, você estará investindo na qualidade do seu software a longo prazo.

Referências

  1. Martin, R. C. (2008). "Clean Code: A Handbook of Agile Software Craftsmanship".
  2. Gamma, E., Helm, R., Johnson, R., & Vlissides, J. (1994). "Design Patterns: Elements of Reusable Object-Oriented Software".

Comentários


Mais artigos

Cover Image for Monitoramento de Aplicações em Tempo Real com Grafana e Prometheus

Monitoramento de Aplicações em Tempo Real com Grafana e Prometheus

O artigo aborda a importância do monitoramento de aplicações web em tempo real e apresenta uma solução utilizando Grafana e Prometheus. Ele começa com uma introdução dessas duas ferramentas, seguida por instruções para instalação e configuração inicial. O foco principal está em como criar dashboards eficientes no Grafana, destacando métricas importantes como latência, throughput, taxa de erro e utilização de recursos. Além disso, o artigo explora como configurar alertas em Grafana para métricas que ultrapassam um determinado limite. O objetivo é fornecer um guia abrangente para monitorar o desempenho de aplicações web usando Grafana e Prometheus.

Renan Ribeiro Lage
Renan Ribeiro Lage
Cover Image for Usando Loki e Promtail para enviar logs para o Grafana

Usando Loki e Promtail para enviar logs para o Grafana

O artigo aborda como usar Loki e Promtail para enviar logs para uma plataforma Grafana. Loki é um sistema de agregação de logs, e Promtail é um agente que coleta e envia esses logs para Loki. Após uma breve introdução sobre cada componente, o artigo orienta sobre como instalar e configurar essas ferramentas. Ele também explica como criar um painel no Grafana para visualizar os logs coletados. A combinação dessas tecnologias oferece uma solução de monitoramento robusta, eficiente e altamente escalável, ideal para ambientes de microsserviços, aplicações em cloud e outros sistemas onde a observabilidade é crítica.

Renan Ribeiro Lage
Renan Ribeiro Lage