An Interest In:
Web News this Week
- April 29, 2024
- April 28, 2024
- April 27, 2024
- April 26, 2024
- April 25, 2024
- April 24, 2024
- April 23, 2024
Desvendando a Monad Result em JavaScript
Introduo:
Ao desenvolver em JavaScript, frequentemente nos deparamos com situaes em que precisamos lidar com operaes que podem ter sucesso ou falhar. Para facilitar esse cenrio, podemos recorrer monad Result
, uma ferramenta poderosa que nos permite lidar com essas situaes de forma elegante e segura. Neste artigo, vamos explorar como criar e usar a classe Result
em JavaScript, inspirada no Result
do Rust, e entender como ela se encaixa no conceito de monad.
O que a Monad Result?
A monad Result
encapsula um valor que pode representar um resultado bem-sucedido ou um erro. como uma caixinha que nos permite tratar operaes que podem falhar de forma mais estruturada e previsvel. Se voc j est familiarizado com o Result
em Rust, vai perceber que a ideia bem similar.
Criando a Classe Result em JavaScript:
Vamos dar uma olhada na implementao bsica da classe Result
em JavaScript:
class Result { constructor(value, error) { this.value = value; this.error = error; } static Ok(value) { return new Result(value, null); } static Err(error) { return new Result(null, error); } map(fn) { return this.error ? this : new Result(fn(this.value), null); } andThen(fn) { return this.error ? this : fn(this.value); } catch(fn) { return this.error ? fn(this.error) : this; } unwrap() { if (this.error) { throw new Error(this.error); } return this.value; }}// Definindo uma funo para dividir dois nmerosfunction dividir(a, b) { // Verificando se o divisor zero if (b === 0) { // Se for, retornamos um Result.Err com uma mensagem de erro return Result.Err("No possvel dividir por zero."); } else { // Caso contrrio, retornamos um Result.Ok com o resultado da diviso return Result.Ok(a / b); }}// Exemplo de uso da funo dividirconst resultadoDivisao = dividir(10, 2) .map(resultado => resultado * 3) // Multiplicando o resultado por 3 .andThen(resultado => Result.Ok(resultado + 5)) // Adicionando 5 ao resultado .unwrap(); // Desembrulhando o valor finalconsole.log(resultadoDivisao); // Resultado = 20// Tentativa de dividir por zero, erro propagadoconst resultadoVoid = dividir(10, 0) .map(resultado => resultado * 3) // No ser executado devido ao erro .andThen(resultado => Result.Ok(resultado + 5)) // No ser executado devido ao erro// Como no foi feito unwrap, o erro no foi tratado e permanece no objeto Result.console.log(resultadoVoid) // Result { value: null, error: 'No possvel dividir por zero.' }// Tentativa de dividir por zero, erro propagado e tratado com try-catchtry { dividir(10, 0) .map(resultado => resultado * 3) // No ser executado devido ao erro .andThen(resultado => Result.Ok(resultado + 5)) // No ser executado devido ao erro .unwrap();} catch (error) { console.log(error.message); // A mensagem de erro capturada e exibida: "No possvel dividir por zero."}// Tentativa de dividir por zero, erro capturado e manipuladoconst resultadoDivisaoPorZero = dividir(10, 0) .map(resultado => resultado * 3) // No ser executado devido ao erro .andThen(resultado => Result.Ok(resultado + 5)) // No ser executado devido ao erro .catch((e) => Result.Err(`Ocorreu um erro: ${e}`)); // O erro capturado e uma mensagem personalizada retornadaconsole.log(resultadoDivisaoPorZero); // Result { value: null, error: 'Ocorreu um erro: No possvel dividir por zero.' }
Concluso:
A monad Result
em JavaScript uma ferramenta valiosa para lidar com situaes de sucesso ou falha de forma estruturada e controlada. Ao entender como criar e usar essa classe, podemos escrever cdigo mais robusto e previsvel em nossos projetos.
Se voc quiser saber mais sobre monads e programao funcional, recomendo dar uma olhada nestes links:
Original Link: https://dev.to/joao_neto/desvendando-a-monad-result-em-javascript-31dk
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To