trabalho de refatoração
TRANSCRIPT
Trabalho de Refatoração
Aluno: Diogo F. Miranda
Aluno: Joel Antônio
6° período
Trabalho de Refatoração - Sistema de controle de Biblioteca
Iniciamos realizando a técnica de refatoração, trocar condicional por polimorfismo
Aqui temos o código com a instrução switch
private int MenuCadastroUsuarios(Scanner input) {
int opcao = -1;
switch (opcao) {
case OPCAO_CADASTRO_USUARIOS_CADASTRAR:
cadastrarUsuario(input);
opcao = -1;
break;
case OPCAO_CADASTRO_USUARIOS_EXCLUIR:
excluirUsuario(input);
opcao = -1;
break;
case OPCAO_CADASTRO_USUARIOS_CONSULTAR:
consultarUsuarios(input);
opcao = -1;
break;
case OPCAO_VOLTAR:
case OPCAO_QUIT:
break;
default:
opcao = -1;
break;
}
} while (opcao == -1);
return opcao;
}
Após ser refatorado o código ficou da seguinte forma:
public abstract class MenuCadastroUsuarios {
abstract public int getMenuCadastroUsuarios();
}
@Override
public class MenuUsuarioCadastrar extends MenuCadastroUsuarios {
int excluirUsuario(input) {
opcao = -1;
}
@Override
public class MenuUsuarioExcluir extends MenuCadastroUsuarios {
int caFdastrarUsuario(input) {
opcao = -1;
}
@Override
public class MenuUsuarioConsultar extends MenuCadastroUsuarios {
int consultaUsuario(input) {
opcao = -1;
}
Utilizamos também a técnica de refatorar , retirando nomes obscuros de variáveis.
public boolean inserir(Livro livro, int quantidade) {
EntityManager em = factory.createEntityManager();EntityTransaction t = em.getTransaction();boolean result = false;Estoque = null;
}
Alteramos o nome da variável para resultado_quantidade_livro.
Ficando o código da seguinte forma.
public boolean inserir(Livro livro, int quantidade) {
EntityManager em = factory.createEntityManager();EntityTransaction t = em.getTransaction();boolean resultado_quantidade_livro = false;Estoque estoque = null;
}
Exemplo variável sendo usada
public int buscarQuantidade(Livro livro) {
EntityManager em = factory.createEntityManager();EntityTransaction t = em.getTransaction();int resultado_quantidade_livro = 0; }
}
Agora utilizamos a técnica de refatoraração EXTRAIR MÉTODO.
Neste exemplo o desenvolvedor utilizou um comentário.
/** * Cadastra um Usuario * @param input Objeto da classe {@link Scanner} */
private void cadUsu(Scanner input) {
Usuario usuario = new Usuario();
System.out.print("Digite o nome do novo usuario: ");usuario.setNome(getStringFromInput(input));
if (bibliotecaNegocio.cadUsu(usuario)) {
System.out.println("Id: " + usuario.getIdUsuario()+ " Nome: \"" + usuario.getNome() + "\"");System.out.println("Usuario cadastrado “);
} else {
System.out.println("Erro ao cadastrar .");
}
Então alteramos o nome do método para um nome mais util. Pois comentários são válidos apenas para explicar códigos e facilitar manutenções futuras
private void cadastrar_Usuario(Scanner input) {
Usuario usuario = new Usuario();
System.out.print("Digite o nome do novo usuario: ");usuario.setNome(getStringFromInput(input));
if (bibliotecaNegocio.cadUsuario(usuario)) {
System.out.println("Id: " + usuario.getIdUsuario()+ " Nome: \"" + usuario.getNome() + "\"");
System.out.println("Usuario cadastrado “);
} else {
System.out.println("Erro ao cadastrar .");
}
Classes só valem a pena serem deixadas no código se realmente estiverem sendo usadas, caso contrário é melhor que sejam removidas.
Desta forma, apenas retiramos a classe FidelidadeUsuario que é um tipo de usuário, só que com benefícios a mais. Utilizamos a técnica de refatoração de Internalizar Classe.
Também realizamos a refatoração de MOVER MÉTODO.
O método de devolver livros estava na classe de cliente, ou seja estava na classe errada.
private void devolverLivro(Scanner input) {
int idUsuario = -1;String isbnLivro = null;
System.out.print("Digite o ISBN do livro: "); isbnLivro = getStringFromInput(input);
do {System.out.print("Digite o ID do usuario: ");idUsuario = getIntFromInput(input);
} while (idUsuario == -1);
if (promptConfirma(input)) {
if (bibliotecaNegocio.devolverLivro(isbnLivro, idUsuario))
System.out.println("Devolucao realizada com sucesso!");
} else {
System.out.println("Erro ao devolver livro.");}
}
Portanto Removemos o método da classe errada, pois usa informação de livro e não cliente. Passando a ficar na classe LIVRO
OBS:
Depois precisamos ajustar as referências do método antigo para o método novo.
Realizamos um exemplo da refatoração Consolidar Fragmentos Condicionais Duplicados. Aqui temos dois códigos comuns que geram a mesma mensagem
("Nao ha' nenhum usuario cadastrado.");
private void consultarUsuarios(Scanner input) {
List<Usuario> usuarios = bibliotecaNegocio.listarUsuarios();
if ( usuarios.size() == 0){System.out.println("Nao ha' nenhum usuario cadastrado.");}
if (usuarios == null) {
System.out.println("Nao ha' nenhum usuario cadastrado.");
} else {
System.out.println("Lista de usuarios cadastrados:");
for (Usuario usuario : usuarios) { System.out.println("Id: " + usuario.getIdUsuario()
" Nome: \"" + usuario.getNome() + "\"");}}
Ficando com o seguinte código
private void consultarUsuarios(Scanner input) {
List<Usuario> usuarios = bibliotecaNegocio.listarUsuarios();
if (usuarios == null || usuarios.size() == 0) {
System.out.println("Nao ha' nenhum usuario cadastrado.");
} else {
System.out.println("Lista de usuarios cadastrados:");
for (Usuario usuario : usuarios) {
System.out.println("Id: " + usuario.getIdUsuario()+ " Nome: \"" + usuario.getNome() + "\"");
}
}
Após a refatoração, ficou da seguinte forma