Introdução aos Design Patterns: O SOLID e Sua Importância
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:
- Single Responsibility Principle (SRP) - Um classe deve ter apenas um motivo para mudar.
- Open/Closed Principle (OCP) - As entidades de software devem ser abertas para extensão, mas fechadas para modificação.
- Liskov Substitution Principle (LSP) - Objetos de um tipo derivado devem ser capazes de substituir objetos do tipo base.
- Interface Segregation Principle (ISP) - Uma classe não deve ser forçada a implementar interfaces que não usará.
- 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
- Martin, R. C. (2008). "Clean Code: A Handbook of Agile Software Craftsmanship".
- Gamma, E., Helm, R., Johnson, R., & Vlissides, J. (1994). "Design Patterns: Elements of Reusable Object-Oriented Software".