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

Usando Matemática Discreta e Mario Kart para deixar o seu código mais limpo

Imagine que você precisa validar se o Mário foi o campeão. Nas aulinhas de programação (não interessa a linguagem), você deve ter aprendido algo bem parecido com isso:

def mario_campeao(posicao):
    if(posicao == 1):
        return True`
    else:
        return False

Mas, se queremos deixar esse código mais limpo, você também deve ter aprendido nas aulinhas que o operador ternário é a opção.

Em Python, temos uma implementação parecida com esse operador:

def mario_campeao(posicao):
  return True if posicao == 1 else False

E a linguagem Python, do jeito que foi desenhada, nos faz acreditar que o código realmente ficou o mais limpo possível. Praticamente, o que se lê na linha do “return” da função é uma frase em inglês, totalmente inteligível:

retorne verdadeiro se posição for igual a 1, ou então falso.

Mas, será que esse código não poderia ficar ainda mais limpo?

Bem, já que estamos falando em linguagem humana, vamos transformar a premissa do nosso código em uma frase. O que ela diz é o seguinte:

“Se a posição do Mário for igual a 1, então o Mário é campeão”.

Temos duas orações nessa frase, que poderiam ser muito bem divididas assim:

(oração p): Se a posição do Mário for igual a 1, (oração q): então o Mário é campeão

Essas duas orações tem uma relação de dependência. O Mário só pode ser campeão se sua posição for igual a 1. Ou seja, a veracidade da oração “q” depende totalmente da veracidade da oração “p”.

Se a oração “p” for verdadeira, então a oração “q” é verdadeira, ou seja, se é verdade que a posição do Mário na corrida é 1, então também é verdade que ele é o campeão.

Mas, se a oração “p” for falsa, então a afirmação da oração “q” (o Mário é campeão”) é falsa.
Logo, podemos resumir assim:

(p): Se a posição do Mário for igual a 1, (q): então o Mário é campeão
A posição do Mário é igual a 1
Então... O Mário é campeão

Sendo assim, uma vez que o resultado “q” está 100% amarrado a afirmação “p”, o nosso código não precisa tratar explicitamente a possibilidade de falsidade, pois ele está sendo redundante, uma vez que é lógico que se a posição não é 1, então a afirmação é falsa, uma vez que só existem duas possibilidades. Sendo assim, podemos inferir a veracidade de "q" através da veracidade de "p"

Ou seja, depois de todo esse devaneio, descobrimos que, se quisermos realmente “limpar” esse trecho de código, bastaria fazer o seguinte:

def mario_campeao(posicao):
  return posicao == 1

Pois, como já dissemos, se a afirmação “posição == 1” for verdade, logo, o Mário é campeão. E, por consequência, se “posição == 1” for falso, podemos deduzir que o Mário não pode ser campeão.

Se você ainda não tinha sido apresentado à Matemática Discreta, então muito prazer!

Isso que nós tratamos é, mais especificamente, o Modus Ponens, ou o “modo de afirmação”, que é a regra de inferência (foco neste verbo: inferir) que diz que posso inferir, ou deduzir a validade de um argumento através do seguinte raciocínio lógico:

Se a premissa é verdadeira, então a consequência é verdadeira
A premissa é verdadeira.
Logo, a consequência é verdadeira.

Por isso afirmar que posição é igual a 1 no nosso “return” funciona. Quando fazemos essa afirmação, estamos afirmando que a premissa é verdadeira. Então:

Se a premissa for verdadeira, a consequência é verdadeira
Se a premissa for falsa, a consequência é falsa

O campo da Matemática Discreta que trata desses assuntos é a Lógica Proposicional. Este é o termo que você deve procurar no Google. Estudando Lógica Proposicional, você terá acesso a muitas outrass regras de inferência, que te ajudarão a construir argumentações fortes, seja na dialética, seja na programação.

Receio que não tem como escrever “clean code”, o termo que está na moda, sem dominar lógica proposicional. Até mesmo a forma declarativa de escrever código (que ficou em evidência com o hype do paradigma funcional) depende muito desses conceitos que tratamos.

A Matemática Discreta trata de mais assuntos igualmente importantes, mas por hoje está bom né?

(Se você puder dar um feedback a respeito da explicação, ficaria muito agradecido! Nunca havia escrito um texto sobre matemática na minha vida. É mais difícil do que parece. Foi um desafio! rsrs.)

Carregando publicação patrocinada...
3

Deu uma visão nova pro assunto, incrível!
Eu estudei matemática discreta na faculdade, lembrando do que vi e te lendo, vou ter um olhar totalmente diferenciado ao meu código agora.
Muito interessante pensar que códigos para serem "limpos" precisam ter uma argumentação concisa, lógica e argumentativa pra que de fato tenha uma comunicação com quem está lendo e conversando com aquele código.

2

A gente não dá muita bola pra matematica discreta na faculdade, mas é um tesouro desconhecido. Eu mesmo demorei pra perceber a importância dessa matéria.

Acho que o problema é que, como normalmente essa materia está no inicio da grade, não tem como relacionar os conceitos com as boas práticas de código. Uma pena.