# 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:

Depois:

## 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 });
}
````