Qual dos princípios SOLID é mais difícil de aplicar na prática?
sobes.tech IA
Resposta da IA
Princípio de substituição de Barbara Liskov (LSP).
A dificuldade reside no facto de que a violação do LSP nem sempre é evidente à primeira vista e pode revelar-se apenas ao usar subclasses num contexto onde se espera o comportamento da classe base. Isto requer uma compreensão profunda do comportamento previsto da classe base e testes rigorosos.
Exemplo de violação:
class Rectangle {
var width: Double = 0
var height: Double = 0
func setWidth(_ width: Double) { self.width = width }
func setHeight(_ height: Double) { self.height = height }
func area() -> Double { width * height }
}
class Square: Rectangle {
override func setWidth(_ width: Double) {
super.setWidth(width)
super.setHeight(width) // Violação do LSP: alterar a largura afeta a altura
}
override func setHeight(_ height: Double) {
super.setHeight(height)
super.setWidth(height) // Violação do LSP: alterar a altura afeta a largura
}
}
Se usar Square onde se espera Rectangle, o comportamento de Square ao alterar apenas um lado (largura ou altura) levará a resultados imprevisíveis, pois a classe base Rectangle não possui tal comportamento.
Para evitar violações do LSP, muitas vezes é necessário repensar as hierarquias de classes, usar composição em vez de herança ou introduzir interfaces/protocolos mais abstratos. Isto pode acrescentar complexidade ao projeto nas fases iniciais.
Tabela comparativa:
| Princípio SOLID | Descrição breve | Dificuldade principal na aplicação do LSP |
|---|---|---|
| S (SRP) | Uma classe - uma razão para mudar | Encontrar a "única razão" |
| O (OCP) | Aberto para extensão, fechado para modificação | Uso correto de abstrações |
| L (LSP) | Subclasses devem ser substituíveis por classes base | Não evidência de violações, requer compreensão do contrato da classe base |
| I (ISP) | Os clientes não devem depender de métodos não utilizados | Divisão de interfaces |
| D (DIP) | Dependência de abstrações, não de implementações concretas | Injeção de dependências |