2
respostas

[BOA PRÁTICA?]

Olá. Nesse exemplo da aula, eu desenvolvi o seguinte código:

public class Conta {
    private double saldo;
    private int agencia;
    private int numero;
    private Cliente titular;

    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;
    }

    public double getSaldo() {
        return this.saldo;
    }

    public int getNumero() {
        return this.numero;
    }

    public void setNumero(int numero) {
        if (agencia <= 0) {
            System.out.println("Valor deve ser maior que zero.");
            return;
        }
        this.numero = numero;
    }

    public int getAgencia() {
        return this.agencia;
    }

    public void setAgencia(int agencia) {
        if (agencia <= 0) {
            System.out.println("Valor deve ser maior que zero.");
            return;
        }
        this.agencia = agencia;
    }

    public String getTitular() {
        return this.titular.getNome();
    }

    public void setTitular(Cliente novoCliente) {
        this.titular = novoCliente;
    }
}

Repare que no getTitular() eu retornei diretamente o this.titular.getNome(). Assim como no setTitular(), eu atribuí como parâmetro o Cliente novoCliente. Utilizar os getters e setters desta forma seria uma boa prática já que evitaria a repetição de mais código (pois o .getNome() ou o new Cliente() seria repetido mais vezes)?

2 respostas

Você está gerando um acoplamento entre as classes. Não é responsabilidade da classe Conta tratar atributos da classe Cliente. Nesse caso, o correto seria:

public Cliente getTitular() {
        return this.titular;

E, então, ao consumir essa classe utilizar:

Cliente cliente = conta.getTitular();
String nome = cliente.getNome();

Colocando um outro problema em questão:

  • Seu atributo Cliente é privado, ou seja, só é possível acessá-lo através do objeto que o possui;
  • Quando vc coloca this.titular.getNome(), se precisar de outro atributo do titular (cpf por exemplo), como vc faria?

Percebeu o problema? Por isso, a melhor prática é retornar o objeto Cliente, e, caso precise de algum atributo, invoque o método que retorne aquele atributo. Dessa forma, cada classe é responsável pelo seu dado e pelo seu comportamento. É isso que chamamos de acoplamento/desacoplamento. Normalmente, buscamos evitar acoplar classes.

Entretanto, sua dúvida é totalmente válida e existem casos onde usamos da forma que vc escreveu, isso se chama Hide Delegate, e serve justamente quando queremos um atributo, ou comportamento, de um objeto que está dentro de outro objeto. As vezes, isso é ruim, pois precisamos saber o funcionamento interno do objeto para extrair o que desejamos.

Esses conceito vc vai pegando com o tempo e aprendendo quando é melhor usar um ou outro.

Abraços e bons estudos!