2
respostas

[Projeto] Refatoração

Fiz algumas refatorações como foi proposto como desafio extra.

package com.lucasdevrj.lumiere.arquivo;

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

import java.io.FileWriter;
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.ArrayList;
import java.util.List;
import java.util.Scanner;

public class ApiOmdbArquivo {

    private String api = "https://www.omdbapi.com";
    private String key = "fa6df38e";
    private String url;
    Gson gson = new GsonBuilder()
            .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
            .setPrettyPrinting()
            .create();
    List<Titulo> listaDeTitulos = new ArrayList<>();
    private String nomeDoArquivo = "titulos.json";
    Scanner leitura = new Scanner(System.in);

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

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

    private HttpRequest criaRequisicaoHttp() {
        HttpRequest requisicao = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .build();
        return requisicao;
    }

    private String retornaRespostaHttpDoServidor() throws IOException, InterruptedException {
        HttpClient cliente = criaInstanciaDoClienteHttp();
        HttpRequest requisicao = criaRequisicaoHttp();
        HttpResponse<String> resposta = cliente.send(requisicao, HttpResponse.BodyHandlers.ofString());
        String json = resposta.body();
        return json;
    }

    private TituloOmdb serializarTitulo() throws IOException, InterruptedException {
        String json = retornaRespostaHttpDoServidor();
        TituloOmdb tituloOmdb = gson.fromJson(json, TituloOmdb.class);
        return tituloOmdb;
    }

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

    private void adicionarTituloNaLista() throws IOException, InterruptedException {
        Titulo titulo = converterTituloOmdbParaTitulo();
        listaDeTitulos.add(titulo);
        System.out.println("Título adicionado na lista com sucesso!");
    }

    private void escreveTitulosNoArquivo() throws IOException {
        FileWriter escrita = new FileWriter(nomeDoArquivo);
        escrita.write(gson.toJson(listaDeTitulos));
        escrita.close();
        System.out.println("Título escrito no arquivo com sucesso!");
    }

    private void exibeTitulosDoArquivo() {
        System.out.println("--------------------|Títulos do arquivo|--------------------");
        System.out.println(listaDeTitulos);
        System.out.println("------------------------------------------------------------");
    }

    public void consumirApi() throws IOException, InterruptedException {
        System.out.println("1 - Para pesquisar Título");
        System.out.println("2 - Para sair");
        System.out.print("Digite a opção desejada: ");
        int resposta = leitura.nextInt();

        while (resposta == 1) {
            pesquisarTitulo();
            adicionarTituloNaLista();
            escreveTitulosNoArquivo();

            System.out.print("Digite a opção desejada: ");
            resposta = leitura.nextInt();
        }

        exibeTitulosDoArquivo();
    }
}
package com.lucasdevrj.lumiere.principal;

import com.lucasdevrj.lumiere.arquivo.ApiOmdbArquivo;

import java.io.IOException;

public class PrincipalApiOmdbArquivo {
    public static void main(String[] args) throws IOException, InterruptedException {
        ApiOmdbArquivo apiOmdbArquivo = new ApiOmdbArquivo();
        apiOmdbArquivo.consumirApi();
    }
}

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

2 respostas

E o JSON ficou assim:

[
  {
    "Nome": "The Matrix",
    "Duracao": 136,
    "AnoDeLancamento": 1999,
    "IncluidoNoPlano": false,
    "Avaliacao": 0,
    "ClassificacaoIndicativa": 0,
    "SomaDasAvaliacoes": 0,
    "TotalDeAvaliacoes": 0,
    "EstaAssistindo": false,
    "Visualizacoes": 0
  },
  {
    "Nome": "Shutter Island",
    "Duracao": 138,
    "AnoDeLancamento": 2010,
    "IncluidoNoPlano": false,
    "Avaliacao": 0,
    "ClassificacaoIndicativa": 0,
    "SomaDasAvaliacoes": 0,
    "TotalDeAvaliacoes": 0,
    "EstaAssistindo": false,
    "Visualizacoes": 0
  },
  {
    "Nome": "American Psycho",
    "Duracao": 102,
    "AnoDeLancamento": 2000,
    "IncluidoNoPlano": false,
    "Avaliacao": 0,
    "ClassificacaoIndicativa": 0,
    "SomaDasAvaliacoes": 0,
    "TotalDeAvaliacoes": 0,
    "EstaAssistindo": false,
    "Visualizacoes": 0
  }
]

Oi, Lucas! Como vai?

Com base no que você explicou, chamou atenção a organização dos métodos e a separação clara de responsabilidades, como a criação da requisição HTTP, serializadão com Gson e escrita em arquivo. O uso de métodos pequenos deixou o fluxo mais legível e facilitou a manutenção do código, principalmente no ponto de conversão entre TituloOmdb e Titulo.

Uma dica interessante para o futuro e usar try-with-resources ao trabalhar com arquivos, pois isso garante o fechamento automático do recurso e evita problemas de memória. Veja este exemplo:


try (FileWriter escrita = new FileWriter(nomeDoArquivo)) {
    escrita.write(gson.toJson(listaDeTitulos));
}

Esse código escreve o JSON no arquivo e fecha o FileWriter automaticamente, mesmo se ocorrer algum erro durante a escrita.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abracos e bons estudos!