1
resposta

[Projeto] Minha solução até o momento.

Segue meu código até o momento atual, e aproveito pra tirar uma dúvida sobre a minha criação de classes. Vejo pelas próprias videoaulas do curso e solução de outras pessoas aqui no fórum que criaram classes diferentes do que a do meu código. A maneira que fiz criando métodos dentro de uma única classe (CEP) é considerada errada? Existem maneiras para melhorar meu código?

Classe CEP:

package models;
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.Scanner;

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

public class Cep {
    private String numeroCep;
    private String logradouroCep;
    private String complementoCep;
    private String bairroCep;
    private String localidadeCep;
    private String estadoCep;
    private String ibgeCep;

    public Cep(CepRecord CepRecord) {
        this.numeroCep = CepRecord.cep();
        this.logradouroCep = CepRecord.logradouro();
        this.complementoCep = CepRecord.complemento();
        this.bairroCep = CepRecord.bairro();
        this.localidadeCep = CepRecord.localidade();
        this.estadoCep = CepRecord.uf();
        this.ibgeCep = CepRecord.ibge();
    }

    public Cep() {
    }

    public String getCep(){
        Scanner scanner = new Scanner(System.in);
        System.out.println("Digite um CEP para fazer a busca: ");
        String cep = scanner.nextLine();
        scanner.close();
        return cep;
    }

    public int validateCep(String cep){
        if(cep.length() != 8){
            return 0;
        } else{
            return 1;
        }
    }

    public String getCepJson(String cep) throws IOException, InterruptedException{
        String address = "https://viacep.com.br/ws/"+ cep + "/json/";
        HttpClient client = HttpClient.newHttpClient();
            HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create(address))
                    .build();
            HttpResponse<String> response = client
                    .send(request, HttpResponse.BodyHandlers.ofString());

        String json = response.body();
        return json;
    }

    public void createCepJson(String json) throws IOException{
        Gson gson = new GsonBuilder()
                    .setPrettyPrinting()
                    .create();
        CepRecord cepJson = gson.fromJson(json, CepRecord.class);
        Cep finalCep = new Cep(cepJson);
        FileWriter writer = new FileWriter("CEP.json");
        writer.write(gson.toJson(finalCep));
        writer.close();
    }

    @Override
    public String toString() {
        return "Cep [numeroCep=" + numeroCep + ", logradouroCep=" + logradouroCep + ", complementoCep=" + complementoCep
                + ", bairroCep=" + bairroCep + ", localidadeCep=" + localidadeCep + ", estadoCep=" + estadoCep
                + ", ibgeCep=" + ibgeCep + "]";
    }
}

Record:

package models;
public record CepRecord(String cep, String logradouro, String complemento, String bairro, String localidade, String uf, String ibge) {
}

Principal:

package main;
import models.Cep;

public class App {
    public static void main(String[] args) throws Exception {
        Cep cep = new Cep();
        String cepNumber = cep.getCep();
        int choice = cep.validateCep(cepNumber);

        if(choice == 1){
            System.out.println("Processando...");
            String json = cep.getCepJson(cepNumber);
            cep.createCepJson(json);
            System.out.println("Foi criado um arquivo JSON com o resultado :)");
        } else {
            System.out.println("CEP não pode ser validado.");
        }
    }
}
1 resposta

Olá, Diogo! Primeiramente, parabéns pelo seu esforço em desenvolver o projeto. É muito bom ver seu progresso e sua iniciativa em buscar melhorias.

Sobre a sua dúvida, a maneira que você estruturou seu código não é errada, mas existem maneiras de melhorá-lo seguindo alguns princípios de design de código e orientação a objetos.

O princípio da Responsabilidade Única (Single Responsibility Principle - SRP) sugere que uma classe deve ter apenas uma responsabilidade. No seu caso, a classe CEP está lidando com várias responsabilidades como validação de CEP, obtenção de dados da API, conversão de JSON e escrita de arquivos.

Uma sugestão seria dividir essas responsabilidades em classes diferentes. Por exemplo, você poderia ter uma classe CepValidator que cuida apenas da validação do CEP, uma classe CepApiService que lida com a comunicação com a API, uma classe CepJsonConverter que lida com a conversão de JSON e uma classe CepFileWriter que lida com a escrita de arquivos.

Aqui está um exemplo de como poderia ser a classe CepValidator:

public class CepValidator {
    public boolean isValid(String cep){
        return cep.length() == 8;
    }
}

E a classe CepApiService:

public class CepApiService {
    public String getCepJson(String cep) throws IOException, InterruptedException{
        String address = "https://viacep.com.br/ws/"+ cep + "/json/";
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create(address))
                    .build();
        HttpResponse<String> response = client
                    .send(request, HttpResponse.BodyHandlers.ofString());

        return response.body();
    }
}

Essa abordagem torna o código mais modular, mais fácil de entender e de manter. Além disso, facilita a reutilização de código e a realização de testes unitários.

Espero ter ajudado e bons estudos!