Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
2
respuestas

[Duda] Estoy empezando con el minidesafio de refactorizar todo de la clase main

Dentro de la clase 4 persistiendo datos en archivos cuando se termina el ultimo video de escribiendo la lista de peliculas en json, el instructor manda un desafio de refactorizar la clase main, estoy siguiendo las clases sugeridas:

  1. una encargada para obtener las peliculas
  2. otra para guardar las peliculas en JSON
  3. otra para transformar lo que viene del api de OMDB en la clase titulo

nada mas que me quede atorado en ideas :c, por ahora lo tengo asi comentado

package principal;

import com.aluracursos.screenmatch.modelos.Titulo;
import com.aluracursos.screenmatch.dto.TituloOmdb;
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.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class PrincipalConBusqueda {
    static void main(String[] args) throws IOException, InterruptedException {
        Scanner lectura = new Scanner(System.in);

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

        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
                .setPrettyPrinting()
                .create();

        String baseUrl = "http://www.omdbapi.com/?t=";
        String apiKey = "&apikey=18fcf0c5";

        while (true) {
            System.out.println("Escribe el nombre de la pelicula que quieres buscar: ");
            var busqueda = lectura.nextLine();
            if (busqueda.equalsIgnoreCase("salir")){
                break;
            }

            String direccionEncoder = URLEncoder.encode( busqueda, StandardCharsets.UTF_8 );
            String direccion = baseUrl + direccionEncoder + apiKey;

            try {
                //clase encargada de guardar las peliculas en json
                HttpClient client = HttpClient.newHttpClient();

                HttpRequest request = HttpRequest.newBuilder()
                        .uri(URI.create(direccion))
                        .build();

                HttpResponse<String> response = client
                        .send(request, HttpResponse.BodyHandlers.ofString());


                String json = response.body();
                System.out.println(json);

                TituloOmdb miTituloOmdb = gson.fromJson(json, TituloOmdb.class);
                System.out.println(miTituloOmdb);

                Titulo miTitulo = new Titulo(miTituloOmdb);
                System.out.println(miTitulo);

                titulos.add(miTitulo);

                //Exceptions
            } catch (NumberFormatException e) {
                System.out.println("La pelicula no cuenta con un valor valido 'runtime': " + e.getMessage());
            } catch (RuntimeException e) {
                System.out.println("Error, se malinterpreta: " + e.getMessage());
            } catch (UnsupportedEncodingException e){
                System.out.println("Error con la clase encoder: " + e.getMessage());
            }
        }

        System.out.println(titulos);
        //clase encargada de transformar lo que viene de omdb en la clase titulo
        //FileWriter
        FileWriter escritura = new FileWriter("Titulos.json");
        escritura.write(gson.toJson(titulos));
        //cerramos la escritura
        escritura.close();

        System.out.println("Fin del programa");


    }
}

pero no se si sea suficiente, me hago bolas solo

2 respuestas

Bueno ya hice algo no se si este bien:

  1. clase Main:
package principal;

import com.aluracursos.screenmatch.modelos.Titulo;
import com.aluracursos.screenmatch.dto.TituloOmdb;
import com.aluracursos.screenmatch.service.GetMovies;
import com.aluracursos.screenmatch.service.SaveMoviesInJson;
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.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class PrincipalConBusqueda {
    static void main(String[] args) throws IOException, InterruptedException {
        Scanner lectura = new Scanner(System.in);

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

        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
                .setPrettyPrinting()
                .create();



        String baseUrl = "http://www.omdbapi.com/?t=";
        String apiKey = "&apikey=18fcf0c5";

        while (true) {
            System.out.println("Escribe el nombre de la pelicula que quieres buscar: ");
            var busqueda = lectura.nextLine();
            if (busqueda.equalsIgnoreCase("salir")){
                break;
            }

            String direccionEncoder = URLEncoder.encode( busqueda, StandardCharsets.UTF_8 );
            String direccion = baseUrl + direccionEncoder + apiKey;

            try {
                //clase GetMovies
                String json = consult.getAllMovies(direccion);
                System.out.println(json);

                TituloOmdb miTituloOmdb = gson.fromJson(json, TituloOmdb.class);
                System.out.println(miTituloOmdb);

                Titulo miTitulo = new Titulo(miTituloOmdb);
                System.out.println(miTitulo);

                titulos.add(miTitulo);

                //Exceptions
            } catch (NumberFormatException e) {
                System.out.println("La pelicula no cuenta con un valor valido 'runtime': " + e.getMessage());
            } catch (RuntimeException e) {
                System.out.println("Error, se malinterpreta: " + e.getMessage());
            }
        }

        System.out.println(titulos);

        SaveMoviesInJson generator = new SaveMoviesInJson();
        generator.generateJson(titulos);


        System.out.println("Fin del programa");


    }
}
  1. clase GetMovies:
package com.aluracursos.screenmatch.service;

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

public class GetMovies {

    public String getAllMovies(String direccion) {
        try {
            HttpClient client = HttpClient.newHttpClient();

            HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create(direccion))
                    .build();

            HttpResponse<String> response = client
                    .send(request, HttpResponse.BodyHandlers.ofString());

            return response.body();

        } catch (Exception e) {
            throw new RuntimeException("No se pudo obtener los datos de la pelicula" + e.getMessage());
        }
    }
}
  1. Clase SaveMoviesInJson:
package com.aluracursos.screenmatch.service;

import com.aluracursos.screenmatch.modelos.Titulo;
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 SaveMoviesInJson {
    private Gson gson = new GsonBuilder()
            .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
            .setPrettyPrinting()
            .create();

    //clase encargada de transformar lo que viene de omdb en la clase titulo
    public void generateJson(List<Titulo> titulos) throws IOException {

        try(FileWriter escritura = new FileWriter("Titulos.json")) {
            escritura.write(gson.toJson(titulos));

        }
    }
}

estoy empezando a usar variables y todo en ingles, por buenas practicas, cree una carpeta llamada service y meti estas clases dentro, cree otra carpeta llamada dto y movi la dto de modelos a su package, y para terminar cree otro package llamado repository y movi los repositorios de calculos a esta mencionada...

¡Hola Erik, espero que estés bien!

Entiendo que te sientas un poco perdido al intentar refactorizar tu código. Es un proceso que puede ser confuso al principio, pero es una excelente manera de mejorar la estructura y legibilidad de tu código. Vamos a intentar desglosar el problema en partes más manejables. La idea es separar las responsabilidades en diferentes clases, lo que hará que tu código sea más organizado y fácil de mantener.

  1. Clase para obtener las películas: Esta clase se encargará de realizar la solicitud HTTP a la API de OMDB y devolver el resultado. Puedes llamarla MovieFetcher.

    public class MovieFetcher {
        private final String baseUrl = "http://www.omdbapi.com/?t=";
        private final String apiKey = "&apikey=18fcf0c5";
        private final Gson gson;
    
        public MovieFetcher(Gson gson) {
            this.gson = gson;
        }
    
        public Titulo fetchMovie(String movieName) throws IOException, InterruptedException {
            String direccionEncoder = URLEncoder.encode(movieName, StandardCharsets.UTF_8);
            String direccion = baseUrl + direccionEncoder + apiKey;
    
            HttpClient client = HttpClient.newHttpClient();
            HttpRequest request = HttpRequest.newBuilder().uri(URI.create(direccion)).build();
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
    
            String json = response.body();
            TituloOmdb miTituloOmdb = gson.fromJson(json, TituloOmdb.class);
            return new Titulo(miTituloOmdb);
        }
    }
    
  2. Clase para guardar las películas en JSON: Esta clase se encargará de escribir la lista de películas en un archivo JSON. Puedes llamarla MovieSaver.

    public class MovieSaver {
        private final Gson gson;
    
        public MovieSaver(Gson gson) {
            this.gson = gson;
        }
    
        public void saveMovies(List<Titulo> titulos, String fileName) throws IOException {
            try (FileWriter escritura = new FileWriter(fileName)) {
                escritura.write(gson.toJson(titulos));
            }
        }
    }
    
  3. Clase principal: Ahora, tu clase principal PrincipalConBusqueda se verá más limpia y enfocada en el flujo general del programa.

    public class PrincipalConBusqueda {
        public static void main(String[] args) throws IOException, InterruptedException {
            Scanner lectura = new Scanner(System.in);
            List<Titulo> titulos = new ArrayList<>();
            Gson gson = new GsonBuilder()
                    .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
                    .setPrettyPrinting()
                    .create();
    
            MovieFetcher fetcher = new MovieFetcher(gson);
            MovieSaver saver = new MovieSaver(gson);
    
            while (true) {
                System.out.println("Escribe el nombre de la pelicula que quieres buscar: ");
                String busqueda = lectura.nextLine();
                if (busqueda.equalsIgnoreCase("salir")) {
                    break;
                }
    
                try {
                    Titulo miTitulo = fetcher.fetchMovie(busqueda);
                    titulos.add(miTitulo);
                    System.out.println(miTitulo);
                } catch (Exception e) {
                    System.out.println("Error al obtener la película: " + e.getMessage());
                }
            }
    
            saver.saveMovies(titulos, "Titulos.json");
            System.out.println("Fin del programa");
        }
    }
    

Espero que estas sugerencias te ayuden a avanzar con tu refactorización. Recuerda que el objetivo es hacer que el código sea más modular y fácil de entender. ¡Espero haber ayudado y buenos estudios!