SÓLIDO — De Zero a Batata 2

Mar 30 2023
Sobre o Princípio Aberto/Fechado (OCP) Este artigo explica sobre 'SÓLIDO' em termos de exemplo, se você ainda não leu a Parte 1 ou se não sabe o que é o princípio da Responsabilidade Única, leia a Parte 1. Hoje vou explicar sobre o Princípio Aberto/Fechado (OCP).

Sobre o Princípio Aberto/Fechado (OCP)

Este artigo explica sobre 'SÓLIDO' em termos de exemplo, se você ainda não leu a Parte 1 ou se não sabe o que é o princípio da responsabilidade única , leia a Parte 1 .

Hoje vou explicar sobre o Princípio Aberto/Fechado (OCP). Na classe OCP , deve ser aberta para extensão, mas fechada para modificação. Esse princípio nos encoraja a escrever código de uma maneira que permita fácil extensão sem modificar o código existente.

No contexto de uma Studentclasse, devemos projetar a classe de forma que nos permita adicionar novos recursos ou comportamentos a um objeto de aluno sem ter que modificar o código da classe existente. Por exemplo, podemos usar a herança para criar diferentes tipos de alunos (como alunos online ou alunos internacionais) que herdam de uma Studentclasse base.

Você está confuso sobre como será o caso de uso em tempo real? Não se preocupe, você entenderá depois de ler o artigo.

Digamos que temos uma Studentclasse com um método que calcula a média de notas (GPA) do aluno com base em suas notas:

class Student(val name: String, val grades: List<Double>) {
    fun calculateGPA(): Double {
        var sum = 0.0
        for (grade in grades) {
            sum += grade
        }
        return sum / grades.size
    }
}

class Student(val name: String, val grades: List<Pair<Double, Int>>) {
    fun calculateGPA(): Double {
        var sum = 0.0
        var creditSum = 0
        for ((grade, credits) in grades) {
            sum += grade * credits
            creditSum += credits
        }
        return sum / creditSum
    }
}

Então, vamos encontrar a melhor maneira em termos de OCP, refatorei a classe acima usando herança e criei uma nova subclasse que adiciona a nova funcionalidade:

open class Student(val name: String, val grades: List<Double>) {
    open fun calculateGPA(): Double {
        var sum = 0.0
        for (grade in grades) {
            sum += grade
        }
        return sum / grades.size
    }
}

class WeightedGPAStudent(name: String, grades: List<Pair<Double, Int>>) : Student(name, grades) {
    override fun calculateGPA(): Double {
        var sum = 0.0
        var creditSum = 0
        for ((grade, credits) in grades) {
            sum += grade * credits
            creditSum += credits
        }
        return sum / creditSum
    }
}

Essa abordagem adere ao Princípio Aberto/Fechado porque nos permite estender a funcionalidade da Studentclasse sem modificar o código existente. A classe base é fechada para modificação, mas aberta para extensão por meio de herança.

A esperança será mais compreensiva sobre o Princípio Aberto/Fechado e este artigo será útil para você.