Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Metodos Saca/Deposita/Transfere com uso dos métodos "getSaldo" e "setSaldo".

A dúvida em questão é mais do tipo conceitual do que um problema real. Durante a explicação, é apresentado o conceito dos "getters e setters", mas também é dito que, no exemplo dado, não haveria a necessidade de se utilizar um metodo setSaldo(), uma vez que os métodos deposita(), saca() e transfere() já realizam as alterações nos valores do atributo "saldo".

  • Métodos originais:
    public void deposita(double valor) {
        this.saldo += valor;
    }

    public boolean saca(double valor) {
        if (this.saldo >= valor) {
            this.saldo -= valor;
            return true;
        }
        return false;
    }

    public boolean transfere(double valor, Conta destino) {
        if (this.saldo >= valor) {
            this.saca(valor);
            destino.deposita(valor);
            return true;
        }
        return false;
    }

Entretanto, podemos, assim como foi feito com o metodo transfere(), que internamente chama os metodos deposita(), saca(), chamar os metodos get e set da classe Conta, de forma interna nos outros métodos:

  • Métodos modificados (testados e funcionando):
    public void deposita(double valor) {
        this.setSaldo(this.getSaldo() + valor);
    }

    public boolean saca(double valor) {
        if (this.getSaldo() >= valor) {
            this.setSaldo(this.getSaldo() - valor);
            return true;
        }
        return false;
    }

    public boolean transfere(double valor, Conta destino) {
        if (this.getSaldo() >= valor) {
            this.saca(valor);
            destino.deposita(valor);
            return true;        
        }
        return false;    
    }

A minha duvida com relação a isso é o seguinte: No que diz respeito ao paradigma de Orientação a Objetos e a desempenho de código, essa abordagem de uso dos getters e setters seria vista como uma boa ou uma má prática de programação?

2 respostas
solução!

Bom dia André, tudo bem?

Cara eu não consigo analisar sobre desempenho precisamente, pois não sei esses por menores do java, se this.saldo é mais rápido que getSaldo(), mas sei também que isso não aumenta a ordem do programa. Não sei se você está familiarizado com o conceito de [BigO](https://dev.to/danielle8farias/complexidade-de-algoritmos-notacao-big-o-26al#:~:text=A%20nota%C3%A7%C3%A3o%20assint%C3%B3tica%20(Big%20O,quanto%20ao%20tamanho%20da%20entrada.&text=A%20ideia%20%C3%A9%20usar%20a,de%20um%20algoritmo%2C%20no%20gr%C3%A1fico.), mas é uma forma de analisar desempenho do código usando funções. Nos dois programas dado por você a ordem é polinomial de ordem O(n) então não há uma diferença substancial.

Mas acho que a melhor forma de responder isso é se perguntando e se embasando na regra de negócio. Continuando no exemplo do banco, há alguma utilidade para o setSaldo? Pode ser que sim dependendo das regras do seu negócio, mas nesse exemplo e cenário que estamos parece meio desenecessário e pode levar a um código mais difícil de ser interpretado, o que é sempre ruim!

Imagine que você fez esse sistema para um banco, fez muito sucesso por ser super eficiênte e confiável, você ganha muito dinheiro e decide sair do banco. A pessoa que for mexer numa outra função em outro lugar do código precisa usar a classe que você criou e ao invés de usar a função saque, por exemplo, ela usa o setSaldo e faz a conta de saque fora da classe. Pronto, agora todas as vantagens de ter uma única função que centraliza essa rotina foi por água abaixo! Ou se a pessoa se confunde e ao invés de usar saca() ela usa setSaldo() e quebra todo o programa. Você pode falar "Ah a culpa é da pessoa por ser descuidada" e sim é verdade, mas seu código também induziu ela ao erro, seu código deu a possibilidade da pessoa errar o que é não é bom. Um bom design (de código, de porduto, de UX) é um design intuitivo que não induz ao erro e seu código pode falhar nisso.

Bem, textão né? Mas acho que você consegue se responder se você se perguntar: "essas funções são realmente úteis no meu código?", "Meu código fica mais intuitivo e legível assim?".

Espero ter ajudado =)

Boa tarde Matheus, obrigado pela resposta.

Eu conheço sim o conceito de notação assintótica, e de fato, se nos embasarmos nela, o resultado para ambos os códigos é linear (o que nem de longe é o pior cenário de desempenho). O uso das funções get/set internamente na classe proprietária deles adiciona um passo a mais na conclusão da excução do programa, mas acredito que nada que altere drasticamente o desempenho a ponto se tornar um problema.

Com relação ao exemplo de cenário que você deu, faz todo o sentido também. Provavelmente para evitar que alguem utilizasse o setSaldo() (seja pelo método simplesmente estar disponivel ou por conta dos clássicos "frameworks opinativos") eu teria que deixar o metodo privado. O que levaria a ter que ficar procurando também todo metodo de acesso candidato a ser privado, o que geraria regras que apenas eu conheceria...