1
resposta

Como evitar validação dupla ao atualizar um objeto em Kotlin?

Meu povo, tô com um problema aqui na minha API REST em Kotlin. Tenho duas funções, sendo que uma delas está fazendo uma validação desnecessária. A primeira, listarPorId, busca uma tarefa pelo ID e lança uma exceção se não encontrar. A segunda, atualizar, usa listarPorId pra pegara tarefa antes de atualizar, mas acabo validando duas vezes porque o Kotlin obriga.

Acho que vocês perceberam que não é necessário a validação de atualizar, já que a listarPorId já faz isso.

Como faço pra refatorar essas funções e evitar essa validação dupla? Já tentei remover a validação de atualizar mas fica dando erro em tarefas.minus(tarefa).plus(tarefaAtualizada) dizendo que tarefaAtualizada é Tarefa?.

https://github.com/LucasWithBoots/KotlinToDoAPI/blob/aac23628b1cf1ab70eff0edfc4c0b1c72958ea04/src/main/kotlin/io/github/lucaswithboots/kotlintodoapi/service/TarefaService.kt

fun listarPorId(id: Long): Tarefa? {

    val tarefa = tarefas.find { it.id == id }
    if (tarefa != null) {
        return tarefa
    } else {
        throw ResourceNotFoundException("Tarefa não cadastrada")
    }
}

fun atualizar(atualizarTarefaDTO: AtualizarTarefaDTO) {
    val tarefa = listarPorId(atualizarTarefaDTO.id)

    if (tarefa != null) {
        val tarefaAtualizada = Tarefa(
            id = atualizarTarefaDTO.id,
            titulo = atualizarTarefaDTO.titulo,
            descricao = atualizarTarefaDTO.descricao,
            usuario = tarefa.usuario
        )
        tarefas = tarefas.minus(tarefa).plus(tarefaAtualizada)

    } else {
        throw ResourceNotFoundException("Tarefa não cadastrada")
    }
}
1 resposta

Olá, Lucas.

Tudo bem?

Você pode tentar fazer com que a função listarPorId sempre retorne uma tarefa válida (não nula) ou lance uma exceção, e então ajustar a função atualizar para não precisar verificar novamente se a tarefa é nula. Veja.

Primeiro, vamos ajustar a função listarPorId para que ela retorne uma tarefa não nula:

fun listarPorId(id: Long): Tarefa {
    return tarefas.find { it.id == id } ?: throw ResourceNotFoundException("Tarefa não cadastrada")
}

Com essa mudança, listarPorId sempre retornará uma tarefa válida ou lançará uma exceção, eliminando a necessidade de verificar se a tarefa é nula na função atualizar.

Agora, vamos ajustar a função atualizar:

fun atualizar(atualizarTarefaDTO: AtualizarTarefaDTO) {
    val tarefa = listarPorId(atualizarTarefaDTO.id)

    val tarefaAtualizada = Tarefa(
        id = atualizarTarefaDTO.id,
        titulo = atualizarTarefaDTO.titulo,
        descricao = atualizarTarefaDTO.descricao,
        usuario = tarefa.usuario
    )

    tarefas = tarefas.minus(tarefa).plus(tarefaAtualizada)
}

Com essas mudanças, a função atualizar não precisa mais realizar a verificação nula, pois a função listarPorId já garante que a tarefa existe ou lança uma exceção.

Faça o teste e veja se funciona e se faz sentido.

Espero ter ajudado. Qualquer dúvida manda aqui. Bons estudos.