1
resposta

Minha solução para o desafio

Classe Principal

package formacao_java_orientacaoObjeto.consumindoAPI.consolidandoConhecimento;

import java.io.IOException;
import java.util.Scanner;

public class ViaCEP {
    public static void main(String[] args) {
        Consulta consulta = new Consulta();
        GeradorArquivo geradorArquivo = new GeradorArquivo();

        Scanner scanner = new Scanner(System.in);
        System.out.println("Digite o CEP para a busca.");
        String cep = scanner.nextLine();

        try {
            Endereco endereco = consulta.consultaCEP(cep);
            System.out.println(endereco);
            geradorArquivo.salvaArquivo(endereco);
            System.out.println("Busca realizada com Sucesso!");
            System.out.println("Acesse o arquivo Json para ver o resultado.");
            System.out.println("Klaus Santos Soluções!");

        } catch (RuntimeException | IOException | InterruptedException e) {
            System.out.println("Não foi possível localizar o CEP informado.");
            System.out.println("Sistema finalizado. Klaus Santos Soluções!");
        }

    }
}

Record

package formacao_java_orientacaoObjeto.consumindoAPI.consolidandoConhecimento;

public record Endereco(String logradouro, String bairro, String cep, String localidade, String uf) {
}

Classe para consulta API

package formacao_java_orientacaoObjeto.consumindoAPI.consolidandoConhecimento;

import com.google.gson.Gson;

import java.io.IOException;
import java.net.URI;
import java.net.http.*;

public class Consulta {
    public Endereco consultaCEP(String cep) throws IOException, InterruptedException {

        String endereco = "https://viacep.com.br/ws/" + cep + "/json/";

        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(endereco))
                .build();
        HttpResponse<String> response =client.send(request, HttpResponse.BodyHandlers.ofString());

        return new Gson().fromJson(response.body(), Endereco.class);
    }
}

Classe para gerar o arquivo Json

package formacao_java_orientacaoObjeto.consumindoAPI.consolidandoConhecimento;

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

import java.io.FileWriter;
import java.io.IOException;

public class GeradorArquivo {

    public void salvaArquivo(Endereco endereco) throws IOException {
        Gson gson = new GsonBuilder()
                .setPrettyPrinting()
                .create();

        FileWriter fileWriter = new FileWriter("Endereco_" + endereco.cep() + ".json");
        fileWriter.write(gson.toJson(endereco));
        fileWriter.close();
    }
}

Gostaria de sujestões no que pode ser melhorado para ficar próximo do princípio SOLID.

Obrigado a professora Jackeline e ao professor Paulo pelo curso.

1 resposta

Parabéns Klaus!

Sugestões para se adequar ao SOLID: Achei suas classes muito bem definidas. O que eu tenho de sugestão é:

Classe Consulta está criando o cliente no corpo da função consultaCEP. Para melhor se adequar ao princípio da inversão de dependências, ele poderia receber no construtor uma interface que implemente o método send, com os parâmetros que estão sendo usados, pois aí a classe Consulta não precisa ter conhecimento de qual cliente está sendo usado, pode ser um cliente Http, pode ser um cliente FTP, pode ser um cliente grpc, contanto que possa enviar um request, e receber uma response.

O mesmo com o FileWriter da classe GeradorArquivo, pois o gerador de arquivo não precisa ter conhecimento de como escrever, apenas receber uma interface que contenha a função write e a função close (Isso faria ela ser de uso único, então talvez existam outras maneiras melhores de fazê-lo, e você poderia pensar em cima disso).

Mas o seu programa está muito bom! São apenas sugestões para se adequar ao princípio D do SOLID.