Se você já lidou com flags binárias, sabe como é fácil perder o fio da meada quando o código começa a ter muitos &
e |
. A lógica funciona, mas a leitura rápida já se torna um desafio.
A função compareBitwise()
proposta aqui, surge justamente para esse ponto: ela não elimina a complexidade, mas organiza de forma que seja mais fácil entender o que está sendo verificado. Adicionando um nível de abstração para ganhar clareza e legibilidade.
A função compareBitwise()
function compareBitwise(flags: number, flagsBuild: number = 0) {
return {
match(flag: number) {
return compareBitwise(flags, flagsBuild | flag);
},
all(): boolean {
return (flags & flagsBuild) === flagsBuild;
},
any(): boolean {
return (flags & flagsBuild) !== 0;
},
};
}
Cada match
adiciona uma flag ao "contexto" interno, sem precisar mexer diretamente nos bits. Depois, all()
ou any()
retornam se todos ou alguma das flags batem.
Exemplo de uso
Vamos criar uma constante de permissões:
const PERMISSIONS = {
READ: 0b0001,
WRITE: 0b0010,
DELETE: 0b0100,
ADMIN: 0b1000,
};
const userPermissions = PERMISSIONS.READ | PERMISSIONS.DELETE | PERMISSIONS.ADMIN;
// Verificar se o usuário pode editar e deletar
const canEditAndDelete = compareBitwise(userPermissions)
.match(PERMISSIONS.WRITE)
.match(PERMISSIONS.DELETE)
.all(); // false
// Verificar se o usuário tem pelo menos uma permissão crítica
const hasCriticalPermission = compareBitwise(userPermissions)
.match(PERMISSIONS.DELETE)
.match(PERMISSIONS.ADMIN)
.any(); // true
Compare com a forma tradicional usando apenas operadores bitwise:
const canEditAndDeleteTraditional =
(userPermissions & (PERMISSIONS.WRITE | PERMISSIONS.DELETE)) ===
(PERMISSIONS.WRITE | PERMISSIONS.DELETE);
Com compareBitwise()
, a intenção do código fica explícita sem precisar interpretar operadores binários mentalmente.
Sugestões de melhoria
Hoje, o match
só aceita uma flag por vez. Um desafio interessante é pensar em como permitir múltiplas flags de uma só vez, seja com múltiplos argumentos ou um array:
// Ideia de sintaxe desejada
compareBitwise(userPermissions)
.match(PERMISSIONS.WRITE, PERMISSIONS.DELETE)
.all();
// ou
compareBitwise(userPermissions)
.match([PERMISSIONS.WRITE, PERMISSIONS.DELETE])
.all();
Conclusão
A função compareBitwise()
não substitui o operador bitwise, nem pretende ser a solução para tudo.
Mas, quando o código precisa deixar explícito quem pode fazer o quê, ele transforma uma expressão difícil de ler em algo que praticamente "fala por si só".
Top comments (0)