From 5ec63fb1c397036a1dbc36d24e613ac04509b841 Mon Sep 17 00:00:00 2001 From: vigusmao Date: Thu, 5 Aug 2021 10:17:33 -0300 Subject: [PATCH] Mais sobre heranca e encapsulamento --- Banco/src/Banco.java | 33 +++++++++++++++--- Banco/src/ContaCorrente.java | 29 +++++++++++++++ Banco/src/ContaCorrenteTest.java | 60 ++++++++++++++++++++++++++++++-- Banco/src/Correntista.java | 18 ++++++---- Banco/src/Gerente.java | 47 +++++++++++++++++-------- Banco/src/GerenteGeral.java | 22 ++++++++++++ Banco/src/PessoaFisica.java | 24 +++++++++++-- 7 files changed, 202 insertions(+), 31 deletions(-) create mode 100644 Banco/src/GerenteGeral.java diff --git a/Banco/src/Banco.java b/Banco/src/Banco.java index 51e76e3..5d9ec36 100644 --- a/Banco/src/Banco.java +++ b/Banco/src/Banco.java @@ -1,16 +1,39 @@ public class Banco { + + + + + public static void main(String[] args) { - Correntista correntista = new Correntista(); + Correntista cicrano = new Correntista("Cicrano", 231232); - System.out.println(correntista.getNome()); - System.out.println(correntista.getLimiteChequeEspecial()); + System.out.println(cicrano.getNome()); + System.out.println(cicrano.getLimiteChequeEspecial()); - PessoaFisica fulano = new PessoaFisica(); + PessoaFisica fulano = new PessoaFisica("Beltrana", 432212); System.out.println(fulano.getNome()); - System.out.println(fulano.getLimiteChequeEspecial()); + + + ContaCorrente contaDoCicrano = new ContaCorrente(111, cicrano); + + + Gerente meuGerente = new Gerente("João", 12345678, 1111); + meuGerente.setEndereco("Novo endereço, numero tal"); + + System.out.println(meuGerente.getNome()); + System.out.println(meuGerente.getDataDeAdmissao()); + + + + + GerenteGeral gerentona = new GerenteGeral("Mariza Silva", 12333, 1); + +// gerentona.gerenciarConta(contaDoCicrano); + gerentona.encerrarConta(contaDoCicrano); + } } diff --git a/Banco/src/ContaCorrente.java b/Banco/src/ContaCorrente.java index 304f580..77827e4 100644 --- a/Banco/src/ContaCorrente.java +++ b/Banco/src/ContaCorrente.java @@ -14,6 +14,8 @@ public class ContaCorrente { private Gerente gerente; + private boolean ativa; + public static final float SALDO_INICIAL_DA_CONTA = 10; // "constante" private static int quantidadeDeTransacoesDeTodasAsContas = 0; @@ -27,6 +29,7 @@ public ContaCorrente(int numeroDaConta, Correntista correntista) { this.transacoes = new ArrayList<>(); this.transacoes.add(String.format( "Conta criada com saldo de R$%.2f", this.saldoEmReais)); + this.ativa = true; } public float getSaldoEmReais() { @@ -60,6 +63,10 @@ public String getExtrato() { return resultado; } + public boolean isAtiva() { + return this.ativa; + } + /** * Retorna a quantidade total de transações do banco, ou seja, * de todas as contas correntes que já foram criadas. @@ -106,4 +113,26 @@ private void registrarTransacao(String registro) { String obterDataAtualAsString() { return String.format("%s", new Date()); } + + public void encerrar() { + if (this.saldoEmReais < 0) { + // ToDo lançar exceção + // não deixa encerrar conta com saldo negativo + } + this.ativa = false; // desativou a conta + + System.out.printf("\nConta %d encerrada", this.numero); + } + + public Gerente getGerente() { + return gerente; + } + + public void setGerente(Gerente novaGerente) { + if (this.gerente != null) { + // avisa ao gerente antigo que ele não é mais gerente + this.gerente.deixarDeGerenciarConta(this); + } + this.gerente = novaGerente; + } } diff --git a/Banco/src/ContaCorrenteTest.java b/Banco/src/ContaCorrenteTest.java index ee4b5ba..f834a61 100644 --- a/Banco/src/ContaCorrenteTest.java +++ b/Banco/src/ContaCorrenteTest.java @@ -1,7 +1,9 @@ import org.junit.Before; import org.junit.Test; +import static junit.framework.TestCase.assertTrue; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; public class ContaCorrenteTest { @@ -13,17 +15,17 @@ public class ContaCorrenteTest { private ContaCorrente contaDoJoao; private long cpfDaMaria = 22222; - private Correntista maria = new Correntista(cpfDaMaria, "Maria"); + private Correntista maria; private ContaCorrente contaDaMaria = new ContaCorrente(2, maria); private float saldoInicial; @Before public void setUp() { - joao = new Correntista(cpfDoJoao, "João"); + joao = new Correntista("João", cpfDoJoao); contaDoJoao = new ContaCorrente(1, joao); - maria = new Correntista(cpfDaMaria, "Maria"); + maria = new Correntista("Maria", cpfDaMaria); contaDaMaria = new ContaCorrente(2, maria); saldoInicial = contaDoJoao.getSaldoEmReais(); @@ -145,6 +147,58 @@ public void testarGetCpfDoCorrentista() { cpfDoJoao, contaDoJoao.getCpfDoCorrentista()); } + @Test + public void testarContaEncerradaPeloGerenteDeContaErrado() { + Gerente gerenteDeContaCarlos = new Gerente("Carlos Roberto", 999, 20); + + gerenteDeContaCarlos.encerrarConta(contaDoJoao); + + assertTrue("Uma conta não pode ser encerrada por gerentes de conta " + + "que não gerenciem aquela conta", contaDoJoao.isAtiva()); + } + + @Test + public void testarContaEncerradaPeloGerenteDeContaCorreto() { + Gerente gerenteDeContaCarlos = new Gerente("Carlos Roberto", 999, 20); + + gerenteDeContaCarlos.gerenciarConta(contaDoJoao); + + // sanity check + assertTrue(gerenteDeContaCarlos.ehGerenteDaConta(contaDoJoao)); + + gerenteDeContaCarlos.encerrarConta(contaDoJoao); + + assertFalse("Uma conta deve ficar com status de inativa após ser encerrada " + + "pelo seu gerente", contaDoJoao.isAtiva()); + + assertFalse("Contas encerradas não devem constar da lista de contas " + + "gerenciadas por gerente algum", gerenteDeContaCarlos.ehGerenteDaConta(contaDoJoao)); + } + + @Test + public void testarContaEncerradaPorUmGerenteGeral() { + Gerente gerenteDeContaCarlos = new Gerente("Carlos Roberto", 999, 20); + + gerenteDeContaCarlos.gerenciarConta(contaDoJoao); + + GerenteGeral gerenteGeralMariza = new GerenteGeral("Mariza Silva", 888, 2); + + // sanity check + assertTrue(gerenteDeContaCarlos.ehGerenteDaConta(contaDoJoao)); + + gerenteGeralMariza.encerrarConta(contaDoJoao); + + assertFalse("Uma conta deve ficar com status de inativa após ser encerrada " + + "por um gerente geral", contaDoJoao.isAtiva()); + + assertFalse("Uma conta encerrada não deve constar da lista de contas " + + "gerenciadas pelo gerente geral que a encerrou", gerenteGeralMariza.ehGerenteDaConta(contaDoJoao)); + + assertFalse("Contas encerradas não devem constar da lista de contas " + + "gerenciadas por gerente algum", gerenteDeContaCarlos.ehGerenteDaConta(contaDoJoao)); + } + + // @Test // public void testarExtrato() { // String extratoEsperado = "Conta criada com saldo de R$10,00\n"; diff --git a/Banco/src/Correntista.java b/Banco/src/Correntista.java index 1919369..1742773 100644 --- a/Banco/src/Correntista.java +++ b/Banco/src/Correntista.java @@ -2,19 +2,21 @@ public class Correntista extends PessoaFisica { + private static final int LIMITE_DEFAULT = 100; + private float limiteChequeEspecial; private ArrayList contas; private ArrayList investimentos; - public float getLimiteChequeEspecial() { - if (this.dataNascimento != null) { - - } + public Correntista(String nome, long cpf) { + super(nome, cpf); + this.contas = new ArrayList<>(); + this.investimentos = new ArrayList<>(); + this.limiteChequeEspecial = LIMITE_DEFAULT; + } + public float getLimiteChequeEspecial() { return limiteChequeEspecial; - - - } public void setLimiteChequeEspecial(float limiteChequeEspecial) { @@ -24,4 +26,6 @@ public void setLimiteChequeEspecial(float limiteChequeEspecial) { public float getTotalInvestido() { return 0; // ToDo IMPLEMENT ME!! } + + } diff --git a/Banco/src/Gerente.java b/Banco/src/Gerente.java index 3afb8b6..c74d11c 100644 --- a/Banco/src/Gerente.java +++ b/Banco/src/Gerente.java @@ -3,37 +3,56 @@ public class Gerente extends PessoaFisica { - private final long numeroMatricula; + private long numeroMatricula; private Date dataDeAdmissao; private ArrayList contasGerenciadas; public Gerente(String nome, long cpf, long numeroMatricula) { - this.nome = nome; - this.cpf = cpf; + super(nome, cpf); + this.numeroMatricula = numeroMatricula; - this.contasGerenciadas = new ArrayList<>(); this.dataDeAdmissao = new Date(); // data corrente + this.contasGerenciadas = new ArrayList<>(); + } + + public long getNumeroMatricula() { + return numeroMatricula; } - public Date getDataDeNascimento() { - return dataDeNascimento; + public Date getDataDeAdmissao() { + return dataDeAdmissao; } - public void setDataDeNascimento(Date dataDeNascimento) { - this.dataDeNascimento = dataDeNascimento; + public void gerenciarConta(ContaCorrente conta) { + this.contasGerenciadas.add(conta); + conta.setGerente(this); } - public long getCpf() { - return cpf; + public void deixarDeGerenciarConta(ContaCorrente conta) { + this.contasGerenciadas.remove(conta); } - public String getNome() { - return nome; + public boolean ehGerenteDaConta(ContaCorrente conta) { + return this.contasGerenciadas.contains(conta); + } + + public void encerrarConta(ContaCorrente conta) { + if (!this.contasGerenciadas.contains(conta)) { + return; // ToDo lançar exceção + // não vai encerrar se não é conta gerenciada por ele + } + + conta.sacar(conta.getSaldoEmReais()); // sacar valor restante na conta + conta.encerrar(); + + deixarDeGerenciarConta(conta); } - public void setNome(String nome) { - this.nome = nome; + @Override + public String toString() { + return String.format("Gerente %s (matrícula %d)", + getNome(), this.numeroMatricula); } } diff --git a/Banco/src/GerenteGeral.java b/Banco/src/GerenteGeral.java new file mode 100644 index 0000000..d836732 --- /dev/null +++ b/Banco/src/GerenteGeral.java @@ -0,0 +1,22 @@ +public class GerenteGeral extends Gerente { + + public GerenteGeral(String nome, long cpf, int matricula) { + super(nome, cpf, matricula); + } + + /** + * Encaminha email ao correntista informado, + * oferecendo empréstimo no valor igual a 10x o limite do cheque especial. + * + * @param correntista O correntista alvo + */ + public void oferecerEmprestimo(Correntista correntista) { + + } + + @Override + public void encerrarConta(ContaCorrente conta) { + gerenciarConta(conta); + super.encerrarConta(conta); + } +} diff --git a/Banco/src/PessoaFisica.java b/Banco/src/PessoaFisica.java index 688a4cf..bb6cd20 100644 --- a/Banco/src/PessoaFisica.java +++ b/Banco/src/PessoaFisica.java @@ -2,10 +2,27 @@ public class PessoaFisica { - private long cpf; + // private: acessível apenas de dentro da própria classe + // sem modificador de acesso (default): disponível de dentro domesmo package + // protected: disponível de dentro do mesmo package, e de dentro de qualquer subclasse + // public: acessível de qualquer lugar do seu código + + private final long cpf; private String nome; + private Date dataNascimento; private String endereco; - protected Date dataNascimento; + +// // construtor DEFAULT: se não o escrevermos, será injetado automaticamente +// public PessoaFisica() { +// super(); +// } + + public PessoaFisica(String nome, long cpf) { + this.nome = nome; + this.cpf = cpf; + this.endereco = "Nao informado"; + // etc. + } public Date getDataNascimento() { return dataNascimento; @@ -24,6 +41,9 @@ public String getNome() { } public void setNome(String nome) { + if (nome.length() > 30) { + return; // ToDo lançaria uma exceção + } this.nome = nome; }