2
respostas

Preciso de uma opinião sobre esse código

Resolvi o exercício de uma forma diferente do proposto, o que vocês acham?

package br.com.welisson.designPatterns.chainOfResponsibility.exercice2;

public class Conta {
    private String titular;
    private double saldo;

    public Conta(String titular, double saldo) {
        this.titular = titular;
        this.saldo = saldo;
    }

    public String getTitular() {
        return titular;
    }

    public double getSaldo() {
        return saldo;
    }
}

package br.com.welisson.designPatterns.chainOfResponsibility.exercice2;

public enum Formato {
    XML,
    CSV,
    PORCENTO;
}

package br.com.welisson.designPatterns.chainOfResponsibility.exercice2;

public class Requisicao {
    private Formato formato;

    public Requisicao(Formato formato){
        this.formato = formato;
    }

    public Formato getFormato() {
        return formato;
    }
}

package br.com.welisson.designPatterns.chainOfResponsibility.exercice2;

public interface Resposta {
    String responde(Requisicao requisicao, Conta conta, Resposta nextResposta);

    boolean podeResponder(Requisicao requisicao);
}

package br.com.welisson.designPatterns.chainOfResponsibility.exercice2;

public class XML implements Resposta {

    @Override
    public String responde(Requisicao requisicao, Conta conta, Resposta nextResposta) {
        if(podeResponder(requisicao)){
            GeradorDeResposta gerarResposta = new GeraXML();
            try {
                return gerarResposta.gerar(conta);
            } catch (IllegalArgumentException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return nextResposta.responde(requisicao, conta, new Porcento());

    }

    @Override
    public boolean podeResponder(Requisicao requisicao) {
        return requisicao.getFormato().equals(Formato.XML);
    }

}

package br.com.welisson.designPatterns.chainOfResponsibility.exercice2;

public class Porcento implements Resposta {

    @Override
    public String responde(Requisicao requisicao, Conta conta, Resposta resposta) {
        if (podeResponder(requisicao)) {
            GeradorDeResposta geradorDeResposta = new GeraPorcento();
            try {
                return geradorDeResposta.gerar(conta);
            } catch (IllegalArgumentException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        throw new RuntimeException("Impossivel gerar Resposta");
    }

    @Override
    public boolean podeResponder(Requisicao requisicao) {
        return requisicao.getFormato().equals(Formato.PORCENTO);
    }

}

package br.com.welisson.designPatterns.chainOfResponsibility.exercice2;

public class CSV implements Resposta {

    @Override
    public String responde(Requisicao requisicao, Conta conta, Resposta nextResposta) {
        if (podeResponder(requisicao)) {
            GeradorDeResposta geradorDeResposta = new GeraCSV();
            try {
                return geradorDeResposta.gerar(conta);
            } catch (IllegalArgumentException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return nextResposta.responde(requisicao, conta, null);

    }

    @Override
    public boolean podeResponder(Requisicao requisicao) {

        return requisicao.getFormato().equals(Formato.CSV);
    }

}

package br.com.welisson.designPatterns.chainOfResponsibility.exercice2;

import java.lang.reflect.Field;

public class GeraPorcento implements GeradorDeResposta {

    @Override
    public String gerar(Conta conta) throws IllegalArgumentException, IllegalAccessException {
        final Class<?> clazz = conta.getClass();
        StringBuilder stringBuilder = new StringBuilder();
        for(Field field : clazz.getDeclaredFields()){
            field.setAccessible(true);
            stringBuilder.append(""+field.get(conta)+"%");
        }
        return stringBuilder.toString();
    }

}

package br.com.welisson.designPatterns.chainOfResponsibility.exercice2;

import java.lang.reflect.Field;

public class GeraXML implements GeradorDeResposta {

    @Override
    public String gerar(final Conta conta) throws IllegalArgumentException, IllegalAccessException {
        final Class<?> clazz = conta.getClass();
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("<"+clazz.getSimpleName()+">\n");
        for(Field field : clazz.getDeclaredFields()){
            stringBuilder.append("<"+field.getName()+">");
            field.setAccessible(true);
            stringBuilder.append("<"+field.get(conta)+">");
            stringBuilder.append("</"+field.getName()+">\n");
        }
        stringBuilder.append("</"+clazz.getSimpleName()+">\n");
        return stringBuilder.toString();
    }

}

package br.com.welisson.designPatterns.chainOfResponsibility.exercice2;

import java.lang.reflect.Field;

public class GeraCSV implements GeradorDeResposta{

    @Override
    public String gerar(Conta conta) throws IllegalArgumentException, IllegalAccessException {

        final Class<?> clazz = conta.getClass();
        StringBuilder stringBuilder = new StringBuilder();
        for(Field field : clazz.getDeclaredFields()){
            field.setAccessible(true);
            stringBuilder.append(""+field.get(conta)+";");
        }
        return stringBuilder.toString();
    }

}

package br.com.welisson.designPatterns.chainOfResponsibility.exercice2;

public class ResponderRequisicao {

    private Requisicao requisicao;
    private Conta conta;

    public ResponderRequisicao(Requisicao requisicao, Conta conta) {
        this.requisicao = requisicao;
        this.conta = conta;
    }

    public String responder(){
        return new XML().responde(requisicao, conta, new CSV());
    }

}
2 respostas

Errado não está. O fato de você ter criado classes separadas para converter a Conta para os formatos é interessante do ponto de vista que de que toda vez que precisar converter a classe nesses formatos, você poderá reusar o código. E se for necessário escrever em arquivos? Já teria a classe de conversão pronta, isso no meu ponto de vista é legal. Mas pro exercício eu não teria feito assim, teria feito o mais simples possível, mas ainda respeitando o padrão, levando em conta que nesse caso as classes de conversão não serão reusadas. Eu teria evitado o desperdício de tempo e código. Show de bola sua implementação.

Oi Wellison gostei da sua solução você entendeu o padrão.