1
resposta

[Refatoração do código da aula] - Organizando o programa em Classes

Bom dia, pessoal!! Vou compartilhar aqui com vocês minha refatoração no código da aula (organização em classes - OO).

Para tanto, criei duas novas classes (Http e GeraJson).

A Http é uma classe que faz as buscas do filme e já monta o TituloOmdb:

package br.com.alura.screenmatch.apis;

import br.com.alura.screenmatch.excecoes.ErroDeConversaoDeAnoException;
import br.com.alura.screenmatch.modelos.TituloOmdb;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

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

public class Http {
    private String endereco = "https://www.omdbapi.com/?t=";

    private TituloOmdb meuTituloOmdb;
    public Http (String filme) throws IOException, InterruptedException {
        this.endereco = endereco + filme.replace(" ","+") + "&apikey=90256809";
        HttpClient client = HttpClient.newHttpClient();
        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
                .setPrettyPrinting()
                .create();
        try {
            HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create(endereco))
                    .build();
            HttpResponse<String> response = client
                    .send(request, HttpResponse.BodyHandlers.ofString());

            System.out.println("Dados do filme: " + response.body());

            meuTituloOmdb = gson.fromJson(response.body(),TituloOmdb.class);
            System.out.println("Título Omdb: ");
            System.out.println(meuTituloOmdb);

        } catch (NumberFormatException e) {
            System.out.println("Aconteceu um erro: ");
            System.out.println(e.getMessage());
        } catch (IllegalArgumentException e) {
            System.out.println("Aconteceu um erro de argumento na busca, verifique o endereço!");
        }
    }

    public TituloOmdb getMeuTituloOmdb() {
        return meuTituloOmdb;
    }
}

A classe GeraJson é responsável por gerar o arquivo final Json com os filmes que pesquisamos:

package br.com.alura.screenmatch.apis;

import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

public class GeraJson {

    public GeraJson (List lista) throws IOException {
        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
                .setPrettyPrinting()
                .create();
        FileWriter escrita = new FileWriter("filmes.json");
        escrita.write(gson.toJson(lista));
        escrita.close();
    }

}

Por fim, a classe "PrincipalComBuscasOO" fica reestruturada da seguinte forma:

package br.com.alura.screenmatch.principal;

import br.com.alura.screenmatch.apis.GeraJson;
import br.com.alura.screenmatch.apis.Http;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import br.com.alura.screenmatch.excecoes.ErroDeConversaoDeAnoException;
import br.com.alura.screenmatch.modelos.Titulo;


public class PrincipalComBuscasOO {
    public static void main(String[] args) throws IOException, InterruptedException {

        Scanner sc = new Scanner(System.in);

        String busca = "";

        List<Titulo> titulos = new ArrayList<>();

        while (!busca.equalsIgnoreCase("sair")) { //usei o equals porque é assim que compara string e não com == e usei o IgnoreCase para ignorar letras maiúsculas
            // e usei o ! porque não quero que seja igual.

            System.out.print("Digite um filme para busca: ");
            busca = sc.nextLine();

            if (busca.equalsIgnoreCase("sair")) {
                break;     // uso o break para sair do loop while
            }

            Http http = new Http(busca);

            try{
                Titulo meuTitulo = new Titulo(http.getMeuTituloOmdb());
                System.out.println("Título já convertido: ");
                System.out.println(meuTitulo);

                titulos.add(meuTitulo);

            } catch (ErroDeConversaoDeAnoException e) {
                System.out.println(e.getMessage());
            }

        }
        GeraJson geraJson = new GeraJson(titulos);

        System.out.println("O programa finalizou!");

        sc.close();
    }
}
1 resposta

Olá João, tudo bem?

Fico feliz por se desafiar para refatorar o código disponibilizado durante a aula. E agradeço a sua iniciativa de compartilhar o seu resultado aqui no fórum, pode acabar ajudando outros alunos que estão tentando fazer o mesmo desafio que você. Continuem assim!

No mais, caso tenha dúvidas ou problemas, recorra ao fórum.

Bons estudos!