JavaScript: Verificando condicionais ao estilo Permissões de Arquivos

Eliminando "if…else if…else" em casos de 2n+ condições

Image for post
Image for post
Créditos — Imagem a esquerda, imagem a direita

chmod -R 755, quem nunca precisou fazer isso em uma pasta /var/www, levanta a mão 🤚🤓

Agradeço a nova geração por estar lendo esse artigo 😂😁 #ftp #php #anos90

Permissões… do que?

-rw-r--r--   1 eduardorabelo staff    0 Sep 26 17:30 arquivo.txt

Vamos revisar rapidamente o que isso significa…

O primeiro conjunto, -rw-r--r-- pode ser dividido em 4 partes:

- | rw- | r-- | r-- , que é igual a type | owner | group | others .

  • - : É o tipo do arquivo. - significa que é um arquivo comum, d seria um diretório, l um link, etc
  • rw- : Permissões para o dono do arquivo (owner), o usuário que criou o arquivo
  • r-- : Permissões para um grupo (group), qualquer usuário que faça parte do mesmo grupo que o criador do arquivo
  • r-- : Permissões para todos os outros (others), também chamado de world, qualquer usuário fora do grupo do criador do arquivo

E para preencher cada - , nós temos um conjunto básico de permissões:

  • Para leitura, read, método número 4
  • Para escrita, write, método número 2
  • Para execução, execute, método número 1

Criando um cenário de exemplo:

Quero que o dono do arquivo consiga ler, escrever e executar nosso arquivo. Qualquer pessoa no grupo pode apenas ler e executar o arquivo e os outros não podem ter acesso.

  • dono: ler, escrever, executar = 4 + 2 + 1 = 7
  • grupo: ler, executar = 4 + 1 = 5
  • outros: nada = 0

Nosso comando final é chmod 750. Executando isso no nosso arquivo de exemplo anterior. Teríamos:

$ chmod 750 arquivo.txt
-rwxr-x--- 1 eduardorabelo staff 0 Sep 26 17:30 arquivo.txt

Viu como o primeiro grupo mudou? Conseguiu captar a idéia? Qualquer dúvida, deixa um comentário :)

Beleza… mas pode voltar ao JavaScript?

Você já deve ter se deparado com aquele pedaço de código, que contém várias condicionais. Um exemplo:

if (condicao01 && condicao02) {
// `condicao01` é `true`
// `condicao02` é `true`
} else if(!condicao01 && condicao02) {
// `condicao01` é `false`
// `condicao02` é `true`
} else if (condicao01 && !condicao02) {
// `condicao01` é `true`
// `condicao02` é `false`
}

E isso só piora, pois uma nova funcionalidade foi pedida e você precisa entrar nesse labirinto de ramos:

if (condicao01 && condicao02 && condicao03) {
// `condicao01` é `true`
// `condicao02` é `true`
// `condicao03` é `true`
} else if(!condicao01 && condicao02 && condicao03) {
// `condicao01` é `false`
// `condicao02` é `true`
// `condicao03` é `true`
} else if (condicao01 && !condicao02 && condicao03) {
// `condicao01` é `true`
// `condicao02` é `false`
// `condicao03` é `false`
}
... e por aí vai

Você deve estar pensando que é um "caso exagerado", "hoje em dia não é comum ver isso", "programação funcional vai resolver isso", o que temos que admitir é que já passamos por isso! 😬 #beenthere #donethat

E a idéia de Permissão de Arquivos?

Se cada condicional representar um valor único, na qual poderíamos corresponder o padrão (pattern matching) retornado e esgotar todos os casos (exhaustive)?

Poderíamos ter algo como:

const scenario = 0;if (condicao01) { scenario += 1 }
if (condicao02) { scenario += 10 }
if (condicao03) { scenario += 100 }
switch(scenario) {
case 1: {} // `condicao01` é `true`
case 10: {} // `condicao02` é `true`
case 100: {} // `condicao03` é `true`
// `condicao01` e `condicao02` é `true`
case 11: {}
// `condicao01` e `condicao03` é `true`
case 101: {}
// `condicao01`, `condicao02` e `condicao03` é `true`
case 111: {}
// `condicao02` e `condicao03` é `true`
case 110: {}
default: {
throw new Error(`Cenário inexistente, possível bug, aplicar um tratamento para o cenário ${scenario}`).
}
}

Bacana né? 🎉

Agora você pode adicionar mais casos e ter o tratamento necessário para todos eles, e ter uma ajuda quando um valor não especificado for criado

Apesar de que seria interessante reavaliar a implementação, porquê a idéia é sempre diminuir esses tipos de problemas, mas a vida real é outra história 😅.

Você pode trocar o switch por um objeto literal também ou usar Bitwise masks para o cálculo. Vai da preferência da equipe. O foco principal é ter um número finito de estados (finite state machines) e previnir bugs ou comportamentos não desejados no seu software.

Tem alguma observação, dica, quer compartilhar algo? Só deixar um comentário! Obrigado por ler até aqui ❤️

Referências

Written by

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store