(Tutorial) Como fazer Object Literals em Python para remover condicionais desnecessárias
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--
}
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 }
}
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--
}
}
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
Fonte: https://youtu.be/Lf3ZV0UsnEo