# Trabalho de ESA ### Gabriel Bernardo Martins - 0057757 ## 1 - Programa Angência bancária Foi realizado o "refactoring" de algumas variáveis para melhor o entendimento, algumas correções e remoção de código que não estava sendo utilizado. A classe "TesteBanco" foi renomeada para "Main". O método "imprimirInfoConta" foi renomeado para "toString". Foi realizada a junção das classes Banco, Agencia e Conta removendo assim grande parte do código que não estava sendo utilizado adequadamente, afim de simplicar o programa. ``` java (Agencia - ANTES) public class Agencia { private String nome; private int codigo; public Agencia(int codigo, String nome) { this.codigo = codigo; this.nome = nome; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public int getCodigo() { return codigo; } public void setCodigo(int codigo) { this.codigo = codigo; } protected void imprimirInfoAgencia() { System.out.println("#------------------------------------------#"); System.out.println("Código da Agência: " + getCodigo()); System.out.println("Nome da Agência: " + getNome()); } } ``` ``` java (Banco - ANTES) public class Banco { private String nome; private List<Agencia> listaAgencias = new ArrayList<>(); private List<Conta> listaContas = new ArrayList<>(); public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public List<Agencia> getListaAgencias() { return listaAgencias; } public void setListaAgencias(List<Agencia> listaAgencias) { this.listaAgencias = listaAgencias; } public List<Conta> getListaContas() { return listaContas; } public void setListaContas(List<Conta> contas) { listaContas = contas; } public void addAgencia(int codigo, String nome) { listaAgencias.add(new Agencia(codigo, nome)); } public void excluirAgencia(int codigo) { listaAgencias.remove(codigo); } public void imprimirAgencias() { System.out.println("# Agências Cadastradas # \n"); listaAgencias.forEach(lista -> { System.out.println(lista.getCodigo() + " - " + lista.getNome()); }); } public void addConta(Conta conta) { listaContas.add(conta); } public void pesquisaConta(int codigo) { for (int i = 0; i < listaContas.size(); i++) { if (listaContas.get(i).getNumero() == codigo) { System.out.println("Código encontrado: " + listaContas.get(i).getCliente().getNome()); break; } } } public void imprimirContas() { System.out.println("# Contas Cadastradas # \n"); listaContas.forEach(lista -> { System.out.println(lista.getNumero() + " - " + lista.getCliente().getNome() + " - " + lista.getCliente().getCpf()); }); } } ``` ``` java (Conta - ANTES) public class Conta implements IConta { private static int SEQUENCIAL = 1; protected Agencia agencia; protected int numero; protected double saldo; protected String tipo; protected Cliente cliente; public Conta(Cliente cliente) { this.agencia = new Agencia(1, "CENTRO"); this.numero = SEQUENCIAL++; this.cliente = cliente; } public Conta(Agencia agencia,Cliente cliente) { this.agencia = agencia; this.numero = SEQUENCIAL++; this.cliente = cliente; } public void sacar(double valor) { saldo -= valor; } public void depositar(double valor) { saldo += valor; } public Agencia getAgencia() { return agencia; } public int getNumero() { return numero; } public double getSaldo() { return saldo; } public String getTipo() { return tipo; } public void setTipo(String tipo) { this.tipo = tipo; } public Cliente getCliente() { return cliente; } public void setCliente(Cliente cliente) { this.cliente = cliente; } protected void imprimirInfoConta() { System.out.println("#------------------------------------------#"); System.out.println("Titular: " + this.cliente.getNome()); System.out.println("Tipo: " + this.tipo); System.out.println("Agencia: " + this.agencia.getNome()); System.out.println("Numero: " + this.numero); System.out.println("Saldo: " + this.saldo); System.out.println("#------------------------------------------#"); } } ``` ``` java (Conta - Depois) public class Banco { private Cliente dadosCliente; private int numeroConta; private String nomeAgencia; private int codigoAgencia; private String tipoConta; private double saldoConta; public Banco(Cliente dadosCliente, int numeroConta, String nomeAgencia, int codigoAgencia, String tipoConta) { this.dadosCliente = dadosCliente; this.numeroConta = numeroConta; this.nomeAgencia = nomeAgencia; this.codigoAgencia = codigoAgencia; this.tipoConta = tipoConta; this.saldoConta = 0d; } public Cliente getCliente() { return dadosCliente; } public void setCliente(Cliente cliente) { this.dadosCliente = cliente; } public int getNumeroConta() { return numeroConta; } public void setNumeroConta(int numeroConta) { this.numeroConta = numeroConta; } public String getNomeAgencia() { return nomeAgencia; } public void setNomeAgencia(String nomeAgencia) { this.nomeAgencia = nomeAgencia; } public int getCodigoAgencia() { return codigoAgencia; } public void setCodigoAgencia(int codigoAgencia) { this.codigoAgencia = codigoAgencia; } public Cliente getDadosCliente() { return dadosCliente; } public void setDadosCliente(Cliente dadosCliente) { this.dadosCliente = dadosCliente; } public String getTipoConta() { return tipoConta; } public void setTipoConta(String tipoConta) { this.tipoConta = tipoConta; } public double getSaldoConta() { return saldoConta; } public void setSaldoConta(double saldoConta) { this.saldoConta = saldoConta; } public double getSaldo() { return saldoConta; } public void setSaldo(double saldoConta) { this.saldoConta = saldoConta; } //Insere o valor no saldo da conta public void depositarSaldoConta(double valor) { // TODO Auto-generated method stub this.saldoConta += valor; } //Retira o valor do saldo da conta somente se o valor for menor que o saldo existente public void debitarSaldoConta(double valor) { if (valor <= getSaldo()) { this.saldoConta -= valor; } else { System.out.println("Saldo não é suficente"); } } //Exibe os dados cadastrados na conta public String toString() { return "Número da Conta: " + getNumeroConta() + "\n" + "Nome da Agência: " + getNomeAgencia() + "\n" + "Código da Agência: " + getCodigoAgencia() + "\n" + "Tipo de Conta: " + getTipoConta() + "\n" + "Saldo em Conta: " + getSaldoConta() + "\n" + "Dados do cliente: \n" + getDadosCliente(); } } ``` As classes ContaCorrente e ContaPoupança fora simplicadas devido às alterações acima, fazendo a junção dos códigos de Conta com contaCorrente ```` java (ANTES) public class ContaCorrente extends Conta { public ContaCorrente(Cliente cliente) { super(cliente); setTipo("Conta Corrente"); } public ContaCorrente(Agencia agencia, Cliente cliente) { super(agencia, cliente); setTipo("Conta Corrente"); } } ```` ```` java (DEPOIS) public class ContaCorrente extends Banco { public ContaCorrente(Cliente dadosCliente, int numeroConta, String nomeAgencia, int codigoAgencia) { super(dadosCliente, numeroConta, nomeAgencia, codigoAgencia, "CORRENTE"); } } ```` ```` java (ANTES) public class ContaPoupanca extends Conta { public ContaPoupanca(Cliente cliente) { super(cliente); setTipo("Conta Poupança"); } public ContaPoupanca(Agencia agencia, Cliente cliente) { super(agencia, cliente); setTipo("Conta Poupança"); } } ```` ```` java (DEPOIS) public class ContaPoupanca extends Banco { public ContaPoupanca(Cliente dadosCliente, int numeroConta, String nomeAgencia, int codigoAgencia) { super(dadosCliente, numeroConta, nomeAgencia, codigoAgencia, "POUPANÇA"); } } ```` O método imprimirInfoConta foi renomeado para toString e readequado ```` java (ANTES) protected void imprimirInfoConta() { System.out.println("#------------------------------------------#"); System.out.println("Titular: " + this.cliente.getNome()); System.out.println("Tipo: " + this.tipo); System.out.println("Agencia: " + this.agencia.getNome()); System.out.println("Numero: " + this.numero); System.out.println("Saldo: " + this.saldo); System.out.println("#------------------------------------------#"); } ```` ```` java (DEPOIS) public String toString() { return "Número da Conta: " + getNumeroConta() + "\n" + "Nome da Agência: " + getNomeAgencia() + "\n" + "Código da Agência: " + getCodigoAgencia() + "\n" + "Tipo de Conta: " + getTipoConta() + "\n" + "Saldo em Conta: " + getSaldoConta() + "\n" + "Dados do cliente: \n" + getDadosCliente(); } ```` Antes: ![](https://i.imgur.com/g6sbALq.png) Depois: ![](https://i.imgur.com/qDnuBTJ.png) ## 2 - Link para os códigos Antigo: https://github.com/gabrielb3r/AgenciaBanco Atualizado: https://github.com/gabrielb3r/Agencia-Banco-Java ## 3 - DENAM - Laravel Extraí o formulario de cadastro e também o campo de mensagens para reutiliza-los quando necessário usar a página para edição dos dadados cadastrados. ``` LARAVEL (ANTES) @extends('adminlte::page') @section('title', 'Editar usuário') @section('content_header') <h1>Editar usuário</h1> @stop @section('content') @if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <form action="{{route('usuarios.update', $usuario)}}" method="post"> @method('PUT') @csrf <div class="card"> <div class="card-body"> <fieldset> <legend> Cadastro de usuário </legend> <div class="row"> <div class="col-md-6"> <div class="form-group"> <label for="name">Nome</label> <input value="{{ old('name', $usuario->name ?? '') }}" type="text" class="form-control" name="name" id="name" placeholder="Digite o nome do usuário"> </div> </div> <div class="col-md-6"> <div class="form-group"> <label for="email">Email</label> <input value="{{ old('email', $usuario->email ?? '') }}" type="email" class="form-control" name="email" id="email" placeholder="Digite o Email"> </div> </div> </div> <div class="row"> <div class="col-md-6"> <div class="form-group"> <label for="password">Senha</label> <input type="password" class="form-control" name="password" id="password" placeholder="Digite a senha"> </div> </div> <div class="col-md-6"> <div class="form-group"> <label for="password_confirmation">Confirmação de senha</label> <input type="password" class="form-control" name="password_confirmation" id="password_confirmation" placeholder="Confirme a senha"> </div> </div> </div> </fieldset> <div class="row"> <div class="col-md-4"> <div class="form-group"> <button type="submit" class="btn btn-success"> @if (isset($usuario)) Atualizar @else Cadastrar @endif </button> </div> </div> </div> </div> </div> </form> @stop ``` ``` LARAVEL (DEPOIS - 1) @extends('adminlte::page') @section('title', 'Editar usuário') @section('content_header') <h1>Editar usuário</h1> @stop @section('content') @include('_mensagens') <form action="{{route('usuarios.update', $usuario)}}" method="post"> @method('PUT') @include('usuarios._form') </form> @stop ``` ``` LARAVEL (DEPOIS - 2) @extends('adminlte::page') @section('title', 'Novo usuário') @section('content_header') <h1>Novo usuário</h1> @stop @section('content') @include('_mensagens') <form action="{{route('usuarios.store')}}" method="post"> @include('usuarios._form') </form> @stop ``` Aplicando o code smells, foi adicionado comentários para melhor indentificar as rotas no programa ```` LARAVEL (Antes) Route::get('/', function () { return view('welcome'); })->name('welcome'); Auth::routes(); Route::middleware('auth')->group(function(){ Route::get('/home', [HomeController::class, 'index'])->name('home'); Route::resource('usuarios', UsuarioController::class); Route::get('/denuncias',[DenunciaController::class, 'index'])->name('denuncias.index'); Route::get('/denuncias/create',[DenunciaController::class, 'create'])->name('denuncias.create'); Route::post('/denuncias',[DenunciaController::class, 'store'])->name('denuncias.store'); Route::get('/denuncias/{denuncia}/edit',[DenunciaController::class, 'edit'])->name('denuncias.edit'); Route::put('/denuncias/{denuncia}',[DenunciaController::class, 'update'])->name('denuncias.update'); }); Route::get('/denunciasAnonimas/create',[DenunciaAnonimaController::class, 'create'])->name('denunciasAnonimas.create'); Route::post('/denunciasAnonimas',[DenunciaAnonimaController::class, 'store'])->name('denunciasAnonimas.store'); ```` ```` LARAVEL (Depois) //Página inicial Route::get('/', function () { return view('welcome'); })->name('welcome'); Auth::routes(); Route::middleware('auth')->group(function(){ //Página inicial (usuário logado) Route::get('/home', [HomeController::class, 'index'])->name('home'); //rota para a página de cadastro do usuário Route::resource('usuarios', UsuarioController::class); //rotas para os formulários de denúncia (usuário logado) Route::get('/denuncias',[DenunciaController::class, 'index'])->name('denuncias.index'); Route::get('/denuncias/create',[DenunciaController::class, 'create'])->name('denuncias.create'); Route::post('/denuncias',[DenunciaController::class, 'store'])->name('denuncias.store'); Route::get('/denuncias/{denuncia}/edit',[DenunciaController::class, 'edit'])->name('denuncias.edit'); Route::put('/denuncias/{denuncia}',[DenunciaController::class, 'update'])->name('denuncias.update'); }); //rotas para o formulário de denúncia (usuário deslogado) Route::get('/denunciasAnonimas/create',[DenunciaAnonimaController::class, 'create'])->name('denunciasAnonimas.create'); Route::post('/denunciasAnonimas',[DenunciaAnonimaController::class, 'store'])->name('denunciasAnonimas.store'); ```` Também foi adicionado comentários nos métodos do controller ```` LARAVEL (Antes) class UsuarioController extends Controller { public function index() { $usuarios = User::paginate(15); return view('usuarios.index', ['usuarios' => $usuarios]); } public function create() { return view('usuarios.create'); } public function store(UsuarioRequest $request) { User::create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), ]); return redirect()->route('usuarios.index') ->with('mensagem', 'Usuário cadastrado com sucesso!'); } public function edit(User $usuario) { return view('usuarios.edit', [ 'usuario' => $usuario ]); } public function update(UsuarioRequest $request, User $usuario) { $usuario->update([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), ]); return redirect()->route('usuarios.index') ->with('mensagem', 'Usuário atualizado com sucesso!'); } public function destroy(User $usuario) { $usuario->delete(); return redirect()->route('usuarios.index') ->with('mensagem', 'Usuário deletado com sucesso!'); } } ```` ```` LARAVEL (Depois) class UsuarioController extends Controller { /** * Exibe a listagem de usúarios cadastrados * * @return \Illuminate\Http\Response */ public function index() { $usuarios = User::paginate(15); return view('usuarios.index', ['usuarios' => $usuarios]); } /** * Exibe o formulário de cadastro de novo usuário * * @return \Illuminate\Http\Response */ public function create() { return view('usuarios.create'); } /** * Armazena o novo usuário * * @param UsuarioRequest $request * @return \Illuminate\Http\Response */ public function store(UsuarioRequest $request) { User::create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), ]); return redirect()->route('usuarios.index') ->with('mensagem', 'Usuário cadastrado com sucesso!'); } /** * Exibe o formulário para editar dados de um usuário já cadastrado * * @param User $usuario * @return \Illuminate\Http\Response */ public function edit(User $usuario) { return view('usuarios.edit', [ 'usuario' => $usuario ]); } /** * Atualiza os dados do usuário cadastrado * * @param UsuarioRequest $request * @param User $usuario * @return \Illuminate\Http\Response */ public function update(UsuarioRequest $request, User $usuario) { $usuario->update([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), ]); return redirect()->route('usuarios.index') ->with('mensagem', 'Usuário atualizado com sucesso!'); } /** * Remove um usuário cadastrado * * @param User $usuario * @return \Illuminate\Http\Response */ public function destroy(User $usuario) { $usuario->delete(); return redirect()->route('usuarios.index') ->with('mensagem', 'Usuário deletado com sucesso!'); } } ```` ## 4 - PWA - js Extração de metodos para que possa ser reutilizado, pois havia duplicidade em mais de uma página ```` JS (Depois) //Função para carregar dados de previsão do tempo do site Weathewidget !function (d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (!d.getElementById(id)) { js = d.createElement(s); js.id = id; js.src = 'https://weatherwidget.io/js/widget.min.js'; fjs.parentNode.insertBefore(js, fjs); } }(document, 'script', 'weatherwidget-io-js'); ```` ```` JS (Depois) // Detecta se o dispositivo está no iOS const isIos = () => { const userAgent = window.navigator.userAgent.toLowerCase(); return /iphone|ipad|ipod/.test(userAgent); } // Detects if device is in standalone mode const isInStandaloneMode = () => ('standalone' in window.navigator) && (window.navigator.standalone); // Verifica se deve exibir notificação popup de instalação: if (isIos() && !isInStandaloneMode()) { this.setState({ showInstallMessage: true }); } ````