Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida no Ex. 10 da Aula 2 - Melhorando a coesão de nossas classes

Olá a todos, estou aplicando os conceitos do cursos em meus sistemas, segue abaixo um código onde recebo um arquivo atraves de um upload e armazeno em um vetor de bytes caso algumas verificações dêem certo, o código é procedural e cheio de responsabilidades e segue abaixo:

public class RemessaVM{

public void uploadArquivo() throws InterruptedException{

        try {
            Media media = Fileupload.get();
            if (media != null) {
                if(media.getName().endsWith(".xls")){
                    uploadedfile = org.apache.commons.io.IOUtils.toByteArray(media.getStreamData());
                    if(remessa.getTipoRemessa().getTipoRemessaId()!= 4 && remessa.getTipoRemessa().getTipoRemessaId()!= 5 
                    && remessa.getTipoRemessa().getTipoRemessaId()!= 6 &&  remessa.getTipoRemessa().getTipoRemessaId()!= 7
                    && remessa.getTipoRemessa().getTipoRemessaId()!= 8 && remessa.getTipoRemessa().getTipoRemessaId()!= 9){
                        HSSFWorkbook wb = new HSSFWorkbook(media.getStreamData());        
                        HSSFSheet sheet = wb.getSheet("Informações Iniciais");
                        HSSFRow row = sheet.getRow(556677);
                        HSSFCell cell = row.getCell(123);
                        String codigoVerificacao = cell.getStringCellValue();
                        if(codigoVerificacao == null || codigoVerificacao.equalsIgnoreCase("")){
                            throw new Exception("Você deve enviar as planilhas fornecidas pelo FINGER");
                        }
                        if(remessa.getTipoRemessa().getCodigo().equalsIgnoreCase("RGFPREF")){
                            if(!codigoVerificacao.startsWith("RGFPREF")){
                                throw new Exception("Envie a Planilha correta para esta remessa.");    
                            }
                        }else{
                            if(!remessa.getTipoRemessa().getCodigo().equals(codigoVerificacao)){
                                throw new Exception("Envie a Planilha correta para esta remessa.");
                            }
                        }
                    }
                    fileName= removerAcentos(media.getName());
                    patche ="../xx/xx/xx/xxx/xxx/xxxx/xxx/xxxx/";
                    patche.replace("/",File.separator);
                    nomeArquivo = removerAcentos(media.getName());
                    binder.loadAll();    
                }
                else{
                    Messagebox.show("O arquivo especificado não possui a extensão .xls!",
                            "Enviar planilha", Messagebox.OK,
                            Messagebox.INFORMATION);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
            Messagebox.show(e.getMessage(),"Erro",Messagebox.OK,Messagebox.ERROR);
        }
    }
    }

Quebrei esse método em vários métodos menores e extrai uma parte do código para a entidade Remessa

    public Class RemessaVM{


    @Command
    @NotifyChange("nomeArquivo")
    public void uploadArquivo(){

        try {
            uploadedFile = Fileupload.get();

            if(uploadedFile != null){

                checaExtensaoValida();
                if(this.remessa.necessitaVerificarCodigoPlanilha()){

                    verificaCodigoPlanilha();
                }
            }else{
                throw new RuntimeException("O arquivo não deve estar nulo");
            }
        } catch (Exception e) {

            uploadedFile = null;

            Messagebox.show(e.getMessage(),"FINGER",Messagebox.OK, Messagebox.ERROR);
        }
        }

        private void verificaCodigoPlanilha() throws IOException{

        HSSFWorkbook workBook = new HSSFWorkbook(this.uploadedFile.getStreamData());    
        ManipuladorPlanilha manipuladorPlanilha = new ManipuladorPlanilha();
        String codigoVerificacao = manipuladorPlanilha.getValorLiteral(workBook, "A4444444","Informações Iniciais");
        if(codigoVerificacao != null && !codigoVerificacao.isEmpty()){
            if(remessa.getTipoRemessa().getCodigo().equalsIgnoreCase("RGFPREF")){
                if(!codigoVerificacao.startsWith("RGFPREF")){// o código do código rgf muda conforme  +50000 e -50000

                    throw new RuntimeException("Envie a Planilha correta para esta remessa");
                }
            }else{

                if(!remessa.getTipoRemessa().getCodigo().equals(codigoVerificacao)){

                    throw new RuntimeException("Envie a Planilha correta para esta remessa");
                }
            }
        }

    }

    private void checaExtensaoValida(){

        if(!uploadedFile.getName().endsWith(".xls")){
            throw new RuntimeException("O arquivo especificado não possui a extensão .xls!");    
        }
    }
    }

    public class Remessa{
    //...
        @Transient
    public boolean necessitaVerificarCodigoPlanilha(){

        return (!this.getTipoRemessa().getNome().endsWith("RREO - EXECUTIVO ESTADUAL") 
                && !this.getTipoRemessa().getNome().equals("RGF - EXECUTIVO ESTADUAL") 
                && !this.getTipoRemessa().getNome().equals("RGF - LEGISLATIVO ESTADUAL") 
                &&  !this.getTipoRemessa().getNome().equals("RGF - JUDICIARIO")
                && !this.getTipoRemessa().getNome().equals("RGF - MINISTERIO PUBLICO")
                && !this.getTipoRemessa().getNome().equals("RGF - AUTONOMOS"));
    }
    }

A dúvida é a seguinte, sempre nas verificações eu lanço uma exceção quando as condições não são satisfeitas, mas no entanto eu poderia apenas retornar false( checaExtensaoValida() poderia simplesmente retornar false caso não fosse um xls). Oque é o mais correto sempre lançar a exceção quando eu tiver uma condição inválida para a minha regra de negócio? alguma sujestão pra melhorar o código de cima?

1 resposta
solução!

Oi Ricardo,

Não há uma regra. Você faz como achar melhor. Eu geralmente prefiro lançar exceção quando o usuário passou dados inválidos pra minha classe (tipo nulos e etc), e retornos mais elegantes (booleanos, lista de erros) quando a exceção aconteceu por algum problema com o conteúdo dos dados.

Um abraço!