1
resposta

[Dúvida] Refatoração por extração em função

Na aula "Usando Pet em PetService" notei que além de criar um construtor, eu poderia transferir as variáveis locais que estão no loop da classe PetService para um método dentro de Pet que faria o tratamento dos dados e retornaria um objeto Pet. Entretanto, como já instanciaria um objeto Pet para realizar o tratamento desses dados, pensei em fazer este método estático dentro da classe Pet e, a questão é: penso que de alguma forma eu possa estar ferindo o SRP (Single Responsability Principle), já que estaria criando uma responsabilidade adicional para a classe de domínio Pet que deveria corresponder somente a questões de regra de negócio e não tratamento de dados.

Estou certo em pensar isso? Caso sim, o que vocês sugeririam como mudança afim de manter este método de tratamento de dados no projeto, mesmo que talvez seja necessário criar uma outra classe para isso...

Antes:

PetService.java

while ((line = reader.readLine()) != null) {
            String[] campos = line.split(",");
            String tipo = campos[0];
            String nome = campos[1];
            String raca = campos[2];
            int idade = Integer.parseInt(campos[3]);
            String cor = campos[4];
            Float peso = Float.parseFloat(campos[5]);

            String uri = "http://localhost:8080/abrigos/" + idOuNome + "/pets";
            HttpResponse<String> response = client.dispararRequisicaoPost(uri, json);

Depois:

PetService.java

while ((line = reader.readLine()) != null) {
            String[] campos = line.split(",");
            Pet pet = Pet.retornarPetDeAcordoComCampos(campos);
            
            String uri = "http://localhost:8080/abrigos/" + idOuNome + "/pets";
            HttpResponse<String> response = client.dispararRequisicaoPost(uri, pet);

Pet.java

public class Pet {
    
    private String tipo;
    private String nome;
    private String raca;
    private int idade;
    private String cor;
    private Float peso;
    
    public Pet(String tipo, String nome, String raca, int idade, String cor, Float peso) {
        this.tipo = tipo;
        this.nome = nome;
        this.raca = raca;
        this.idade = idade;
        this.cor = cor;
        this.peso = peso;
    }
    
    public static Pet retornarPetDeAcordoComCampos(String[] campos) {
        String tipo = campos[0];
        String nome = campos[1];
        String raca = campos[2];
        int idade = Integer.parseInt(campos[3]);
        String cor = campos[4];
        Float peso = Float.parseFloat(campos[5]);
        
        return new Pet(tipo, nome, raca, idade, cor, peso);
    }
1 resposta

Olá! Tudo certo?

Você está no caminho certo ao considerar o SRP (Single Responsibility Principle) na sua refatoração. O SRP sugere que uma classe deve ter apenas uma razão para mudar, ou seja, deve ter uma única responsabilidade. No seu caso, a classe Pet está sendo usada para representar um animal de estimação, e adicionar lógica de criação a partir de dados brutos pode ser visto como uma violação desse princípio.

Uma abordagem que você pode considerar é criar uma nova classe responsável por converter os dados brutos em objetos Pet. Essa classe poderia ser chamada, por exemplo, PetFactory ou PetConverter. Aqui está um exemplo de como isso poderia ser implementado:

public class PetConverter {

    public static Pet fromCampos(String[] campos) {
        String tipo = campos[0];
        String nome = campos[1];
        String raca = campos[2];
        int idade = Integer.parseInt(campos[3]);
        String cor = campos[4];
        Float peso = Float.parseFloat(campos[5]);

        return new Pet(tipo, nome, raca, idade, cor, peso);
    }
}

E no seu PetService, você usaria essa nova classe para criar os objetos Pet:

while ((line = reader.readLine()) != null) {
    String[] campos = line.split(",");
    Pet pet = PetConverter.fromCampos(campos);

    String uri = "http://localhost:8080/abrigos/" + idOuNome + "/pets";
    HttpResponse<String> response = client.dispararRequisicaoPost(uri, pet);
}

Dessa forma, você mantém a responsabilidade da classe Pet apenas como um modelo de dados, enquanto a lógica de conversão fica em uma classe separada. Isso ajuda a manter o código mais organizado e aderente aos princípios de design.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.