Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

É necessária a extração de métodos?

Na minha opinião não há mais necessidade de extrair para um método. A forma como a classe ficou no final do exercício pra mim está correta. Alguém sugere alguma outra extração de método?

public List<Gasto> importa(InputStream entrada) throws ParseException {
        Scanner leitor = new Scanner(entrada);
        List<Gasto> gastos = new ArrayList<Gasto>();

        while (leitor.hasNextLine()) {
            String line = leitor.nextLine();

            String tipoDeDespesa = line.substring(0, 6);
            String dataDespesaTxt = line.substring(6, 14);
            String valorDespesaTxt = line.substring(14, 23);
            String matriculaTxt = line.substring(23, 26);
            String nome = line.substring(26, 56);
            String dataNascTxt = line.substring(56);

            double valor = Double.parseDouble(valorDespesaTxt);
            int matricula = Integer.parseInt(matriculaTxt);

            Calendar dataNascimento = converteDataTxtParaCalendar(dataNascTxt);

            Calendar dataDespesa = converteDataTxtParaCalendar(dataDespesaTxt);

            Funcionario funcionario = new Funcionario(nome, matricula,
                    dataNascimento);
            gastos.add(new Gasto(valor, tipoDeDespesa, funcionario, dataDespesa));
        }
        return gastos;
    }
4 respostas
solução!

Ola Raul!

Acho que ficaria legal um Builder para sua classe Gasto.

Deixar tudo encapsulado, esses parses e esses converter de texto para Calendar.

Já pensou nisso ?

Abraço!

Não tinha pensado Cristiano. Vou implementar.

Obrigado.

Abraço!

Legal Raul!

Depois posta seu código aqui...

Abraço!

Os atributos; data, valor e pagoEmDinheiro estão como atributos opcionais. E os atributos obrigatórios são; tipo e funcionario.

public class ImportadorDeGastos {

    SimpleDateFormat df = new SimpleDateFormat("ddMMyyyy");

    public List<Gasto> importa(InputStream entrada) throws ParseException {
        Scanner leitor = new Scanner(entrada);
        List<Gasto> gastos = new ArrayList<Gasto>();

        while (leitor.hasNextLine()) {

            String line = leitor.nextLine();
            String tipo = line.substring(0, 6);
            String dataGastoTxt = line.substring(6, 14);
            String valorGastoTxt = line.substring(14, 23);
            String matriculaFuncionarioTxt = line.substring(23, 26);
            String nomeFuncionario = line.substring(26, 56);
            String dataNascTxt = line.substring(56);

            int matriculaFuncionario = Integer.parseInt(matriculaFuncionarioTxt);

            Calendar dataNascimento = converteData(dataNascTxt);

            Funcionario funcionario = new Funcionario(nomeFuncionario, matriculaFuncionario, dataNascimento);

            gastos.add(new Gasto.GastoBuilder(tipo, funcionario).
                    comData(dataGastoTxt).
                    comValor(valorGastoTxt).
                    comPagamentoEmDinheiro(true).
                    builder());

        }

        return gastos;

    }

    private Calendar converteData(String dataNascTxt) throws ParseException {
        Calendar dataNascimento = Calendar.getInstance();
        dataNascimento.setTime(df.parse(dataNascTxt));
        return dataNascimento;
    }
}
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class Gasto {
    private double valor;
    private String tipo;
    private Funcionario funcionario;
    private boolean pagoEmDinheiro;
    private Calendar data;

    public Gasto(GastoBuilder builder) {

        this.valor = builder.getValor();
        this.tipo = builder.getTipo();
        this.funcionario = builder.getFuncionario();
        this.pagoEmDinheiro = builder.isPagoEmDinheiro();
        this.data = builder.getData();

    }

    public double getValor() {
        return valor;
    }

    public String getTipo() {
        return tipo;
    }

    public Funcionario getFuncionario() {
        return funcionario;
    }

    public boolean isPagoEmDinheiro() {
        return pagoEmDinheiro;
    }

    public Calendar getData() {
        return data;
    }

    @Override
    public String toString() {
        return "Gasto: " + this.valor + " por " + funcionario.getNome();
    }

    // Classe Builder
    public static class GastoBuilder {

        private SimpleDateFormat df = new SimpleDateFormat("ddMMyyyy");

        private double valor;
        private String tipo;
        private Funcionario funcionario;
        private boolean pagoEmDinheiro;
        private Calendar data;

        public double getValor() {
            return valor;
        }

        public String getTipo() {
            return tipo;
        }

        public Funcionario getFuncionario() {
            return funcionario;
        }

        public boolean isPagoEmDinheiro() {
            return pagoEmDinheiro;
        }

        public Calendar getData() {
            return data;
        }

        public GastoBuilder(String tipo, Funcionario funcionario) {
            this.tipo = tipo;
            this.funcionario = funcionario;
        }

        public GastoBuilder comData(String dataTxt) {
            Calendar dataNascimento = Calendar.getInstance();
            try {
                dataNascimento.setTime(df.parse(dataTxt));
                this.data = dataNascimento;
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return this;
        }

        public GastoBuilder comValor(String valorTxt) {
            this.valor = Double.parseDouble(valorTxt);
            return this;
        }

        public GastoBuilder comPagamentoEmDinheiro(boolean emDinheiro){
            this.pagoEmDinheiro = emDinheiro;
            return this;
        }

        public Gasto builder() {
            return new Gasto(this);
        }
    }

}