---
# System prepended metadata

title: Trabalho de ESA

---

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

````
