Executando verificação de segurança...
2

(Tutorial) Como fazer Object Literals em Python para remover condicionais desnecessárias

Imagem ilustrativa

Introdução

Olá, meu nome é Gabriel Felipe a sou estudante do primeiro período de Ciência da Computação. Recentemente acompanhei a playlist do Filipe Deschamps sobre a criação de um jogo multiplayer do zero. Nessa playlist absorvi muitos conceitos importantes sobre Arquitetura de Software. Certamente, um dos recursos aplicados que mais chamou a minha atenção foi o uso de Object Literals para reduzir a quantidades de condicionais na camada de input da aplicação. Achei uma sacada muito massa para aumentar a escalabilidade e o desacoplamento do código

Situação-problema

Para explicar melhor, vou usar o mesmo exemplo que o Filipe usou no vídeo dele de forma resumida.

Imagine uma camada de input de um jogo que vai capturar as teclas do teclado que o usuário pressionar. Imagine também que exista uma variável chamada keyPressed que recebe a tecla que o usuário pressionou. Para instruírmos a nossa aplicação sobre o que fazer com esse dado, poderíamos, naturalmente, escrever dessa forma:

if(keyPressed == 'ArrowUp') {
    player.y--
}

if(keyPressed == 'ArrowRight') {
    player.x++
}

if(keyPressed == 'ArrowDown') {
    player.y++
}

if(keyPressed == 'ArrowLeft') {
    player.x--
}

Exemplo original

O código funcionaria sem problemas. Porém, teríamos mais dores de cabeça no futuro: Para cada nova funcionalidade que queiramos implementar quando o usuário pressionar alguma outra tecla, precisaríamos implementar uma nova condicional, sou seja, modificar o código em dois lugares diferentes. Seria muito mais simples se pudéssemos apenas se preocupar em programar a nova funcionalidade e sem precisar gastar tempo adicionando uma condicional.

Object Literals (exemplo em Java Script)

Object Literals é um simples conceito, porém poderoso, de relacionar as chaves de um objeto com nomes de funcões bem definidas para fazer algo específico

Exemplo:

const calculadora = {
    somar = function(x, y) { return x + y },
    diminuir =  function(x, y) { return x - y }
}

Exemplo original

Para acessar essa função podemos fazer calculadora.somar(numero1, numero2) ou calculadora["somar"](numero1, numero2)

Pensando nisso, podemos aplicar isso no problema do nosso jogo:

const acceptedMoves = {
    ArrowUp(player) {
       player.y--
    }
    
    ArrowRight(player) {
        player.x++
    }
    
    ArrowDown(player) {
        player.y++
    }
    
    ArrowLeft(player) {
        player.x--
    }
}

Exemplo original

Para utilizar essas funções podemos fazer assim:

const move = acceptedMoves[keyPressed]
move(player)

E o Python??

Infelizmente, o Python não possui, de forma clara, recursos para construir esse design. Porém, é possível construi um design semelhante utilizando dicionários ao invés de objetos. Vale lembrar que, no Python, não teremos a mesma vantagem de modificar o código em um lugar só. Mas outras pequenas vantagens de implementar esse pattern podem valer a pena dependendo do contexto da situação

Vamos recriar o exemplo da calculadora usando Python, teríamos algo semelhante a isso:

def somar(x, y):
    return x + y
    
def diminuir(x, y):
    return x - y
    
calculadora = {
    "somar": somar,
    "diminuir": diminuir
}

E para acessar a função podemos fazer calculadora["somar"](numero1, numero2) também!

O mesmo exemplo do jogo em Python:

def ArrowUp(player):
    player.y--
    
def ArrowRight(player):
    player.x++
 
def ArrowDown(player):
    player.y++

def ArrowLeft(player):
    player.x--

acceptedMoves = {
    "ArrowDown": ArrowUp, "ArrowRight": ArrowRight, 
    "ArrowDown": ArrowDown, "ArrowLeft", ArrowLeft
}

Executando:

move = acceptedMoves[keyPressed]
move(player)

Espero ter ajudado com o pouco de conhecimento que possuo. Sou totalmente aberto à críticas e dicas pra melhorar minha programação. Um abraço, amigos!

Referências

Carregando publicação patrocinada...
1

Que post sensacional! Esse post tirou uma dúvida que tive umas semanas atrás, quando eu estava tentando implementar esse design em um jogo que fiz. Eu até tinha feito umas pesquisas, mas não tinha me aprofundado no assunto. Vou até implementar esse design no código.

1
1

Legal.
Por coincidência eu implementei algo semelhante na semana passada em uma aplicação Django.
Foi um middleware que fiz pra decidir se um usuário deve ter acesso a um recurso baseado em qual grupo do ad ele pertence.
Tem um dicionário com os grupos e seus acessos, aí basta pegar os grupos que o usuário pertence e usar buscar as permissões no dicionário.