2
respostas

[Refatoração do código da aula] - Duração em minutos errada

Bom dia, pessoal! Ao pesquisar pelo filme dogville, percebi que a duração em minutos era de 178 min e na nossa classe Titulo estava vindo somente com 17 min, devido ao seguinte trecho de código:

    public Titulo(TituloOmdb meuTituloOmdb) {
        this.nome = meuTituloOmdb.title();
        if (meuTituloOmdb.year().length() > 4) { 
            throw new ErroDeConversaoDeAnoException("Não consegui converter o ano porque tem mais de 4 caracteres!");
        }
        this.anoDeLancamento = Integer.valueOf(meuTituloOmdb.year());
        ***this.duracaoEmMinutos = Integer.valueOf(meuTituloOmdb.runtime().substring(0,2));***
    }

Realizei a correção da seguinte forma:

    public Titulo(TituloOmdb meuTituloOmdb) {
        this.nome = meuTituloOmdb.title();
        if (meuTituloOmdb.year().length() > 4) { 
            throw new ErroDeConversaoDeAnoException("Não consegui converter o ano porque tem mais de 4 caracteres!");
        }
        this.anoDeLancamento = Integer.valueOf(meuTituloOmdb.year());
       *** this.duracaoEmMinutos = Integer.valueOf(meuTituloOmdb.runtime().substring(0,3).replace(" ", ""));***
    }

É necessário inserir o replace para retirar os espaços em branco que sobram para filmes que tem duração menor que 100 min.

2 respostas

Olá, João!

Parece que você fez uma boa observação e a sua correção faz sentido. No entanto, gostaria de sugerir uma abordagem um pouco diferente que pode ser mais robusta e flexível.

O problema com o código original é que ele sempre pega os dois primeiros caracteres da string de tempo de execução, o que funciona bem para filmes com 100 minutos ou mais, mas falha para filmes com menos de 100 minutos. A sua solução proposta corrige isso ao pegar os três primeiros caracteres e remover os espaços em branco. No entanto, isso ainda pode falhar para filmes com 1000 minutos ou mais.

Uma solução mais robusta seria usar uma expressão regular para extrair o número de minutos, independentemente de quantos dígitos ele tenha. Aqui está um exemplo de como você poderia fazer isso:

public Titulo(TituloOmdb meuTituloOmdb) {
    this.nome = meuTituloOmdb.title();
    if (meuTituloOmdb.year().length() > 4) { 
        throw new ErroDeConversaoDeAnoException("Não consegui converter o ano porque tem mais de 4 caracteres!");
    }
    this.anoDeLancamento = Integer.valueOf(meuTituloOmdb.year());
    String runtime = meuTituloOmdb.runtime();
    Pattern pattern = Pattern.compile("\\d+");
    Matcher matcher = pattern.matcher(runtime);
    if (matcher.find()) {
        this.duracaoEmMinutos = Integer.valueOf(matcher.group());
    }
}

Neste código, a expressão regular "\d+" corresponde a um ou mais dígitos. O método matcher.find() procura a primeira correspondência na string de tempo de execução e o método matcher.group() retorna a correspondência encontrada. Assim, independente da quantidade de dígitos, o valor será corretamente extraído.

Espero ter ajudado e bons estudos!

Olá, Matheus. Tudo bem?

Sim, eu até pensei nessa possibilidade de ter algo dinâmico para pegar a duração do filme, mas não implementei porque achei difícil ter um filme com 1000 minutos ou mais e também não sabia como fazer. Gostei bastante da sua solução! Vou aderir!

Muito obrigado! :)