1
resposta

[Projeto] Minha refatoração

Fiz minhas alterações para melhorar o código, deixando-o mais separado.

package com.lucasdevrj.lumiere.api;

import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.lucasdevrj.lumiere.modelos.Titulo;
import com.lucasdevrj.lumiere.modelos.TituloOmdb;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.Scanner;

public class ApiOmdb {

    private String api = "https://www.omdbapi.com";
    private String key = "fa6df38e";
    private String url;

    private void pesquisa() {
        Scanner leitura = new Scanner(System.in);
        System.out.print("Digite um filme para a busca: ");

        var busca = leitura.nextLine();
        busca = busca.replaceAll(" ", "+");

        url = "%s/?apikey=%s&t=%s".formatted(api, key, busca);
    }

    private HttpClient criaInstanciaDeClienteHttp() {
        HttpClient cliente = HttpClient.newHttpClient();
        return cliente;
    }

    private HttpRequest criaRequisicaoHttp() {
        HttpRequest requisicao = null;
        try {
            requisicao = HttpRequest.newBuilder()
                    .uri(URI.create(url))
                    .build();
        } catch (IllegalArgumentException erro) {
            System.out.println("Valor inválido digitado!");
            System.out.println("Erro: " + erro.getMessage());
        }
        return requisicao;
    }

    private String retornaRespostaDoServidor() throws IOException, InterruptedException {
        HttpClient cliente = criaInstanciaDeClienteHttp();
        HttpRequest requisicao = criaRequisicaoHttp();

        HttpResponse<String> resposta = cliente.send(requisicao, HttpResponse.BodyHandlers.ofString());
        String json = resposta.body();

        return json;
    }

    private TituloOmdb converteJsonParaObjeto() throws IOException, InterruptedException {
        Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create();
        return gson.fromJson(retornaRespostaDoServidor(), TituloOmdb.class);
    }

    private Titulo converteTituloOmdbParaTitulo() throws IOException, InterruptedException {
        TituloOmdb tituloOmdb = converteJsonParaObjeto();
        Titulo titulo = new Titulo(tituloOmdb);
        return titulo;
    }

    public void realizarRequisicao() throws IOException, InterruptedException {
        pesquisa();
        String json = retornaRespostaDoServidor();
        System.out.println("--------------------|JSON da API OMDB|--------------------");
        System.out.println(json);
        System.out.println("----------------------------------------------------------");
    }

    public void exibeJsonConvertidoEmObjetoTitulo() throws IOException, InterruptedException {
        TituloOmdb tituloOmdb = converteJsonParaObjeto();
        System.out.println("--------------------|Record do Título|--------------------");
        System.out.println("Título: " + tituloOmdb.title());
        System.out.println("Duração: " + tituloOmdb.runtime());
        System.out.println("Ano: " + tituloOmdb.year());
        System.out.println("Gênero: " + tituloOmdb.genre());
        System.out.println("Diretor: " + tituloOmdb.director());
        System.out.println("Atores: " + tituloOmdb.actors());
        System.out.println("Prêmios: " + tituloOmdb.awards());
        System.out.println("Poster: " + tituloOmdb.poster());
        System.out.println("País: " + tituloOmdb.country());
        System.out.println("----------------------------------------------------------");
    }

    public void exibeTituloConvertido() throws IOException, InterruptedException {
        Titulo titulo = converteTituloOmdbParaTitulo();
        System.out.println("--------------------|Classe Título|--------------------");
        System.out.println(titulo);
        System.out.println("-------------------------------------------------------");
    }
}
package com.lucasdevrj.lumiere.principal;

import com.lucasdevrj.lumiere.api.ApiOmdb;
import java.io.IOException;

public class PrincipalApiOmdb {

    public static void main(String[] args) throws IOException, InterruptedException {
        ApiOmdb apiOmdb = new ApiOmdb();
        apiOmdb.realizarRequisicao();
        apiOmdb.exibeJsonConvertidoEmObjetoTitulo();
        apiOmdb.exibeTituloConvertido();
    }
}

Terminal:
Insira aqui a descrição dessa imagem para ajudar na acessibilidade
O que acharam?

1 resposta

Bom dia, Lucas! Tudo bem?

Mandou muito bem nessa sua refatoração, a estrutura do projeto tá ótima, nenhum ponto em que ela fica redundante.

Mas, ainda assim, há pontos que podem ser melhorados, porém são como uma perfumaria para o projeto.

  1. As variáveis api e key definidas logo no início da classe podem apresentar a definição de final, pois as mesmas são apenas adicionadas em outros contextos e não serão alteradas. O código ficaria assim:

    private final api = "https://www.omdbapi.com";
    private final key = "fa6df38e";
    
  2. A sua variável leitura que é do tipo Scanner, ela precisa ser finalizada após concluir o seu processo de leitura para que essa captura de contexto do terminal não fique em espera até que a compilação do projeto seja finalizada. Logo o seria necessário chamar o método close dela. A chamada deve ser feita assim:

    private void pesquisa() {
        Scanner leitura = new Scanner(System.in);
        System.out.print("Digite um filme para a busca: ");
    
        var busca = leitura.nextLine();
        busca = busca.replaceAll(" ", "+");
    
        url = "%s/?apikey=%s&t=%s".formatted(api, key, busca);
        leitura.close();
    }
    

No mais, está tudo certo e espero que continue empenhado para os próximos desafios e projetos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!