Sobes.tech
Senior

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