DEV Community

Cover image for Você programa de forma idiomática?
rodbv
rodbv

Posted on

4 1

Você programa de forma idiomática?

Você já deve ter reparado que ler é mais fácil do que escrever ou falar uma língua estrangeira: enquanto a leitura é um processo passivo, a escrita e fala são processos ativos e que exigem maior domínio da língua. Além disso, para escrevermos de forma fluente precisamos não só termos uma boa noção do vocabulário e gramática dessa língua, mas também entendermos como esse vocabulário é usado por aqueles que dominam a língua, quais expressões são comuns, quais palavras eles evitam usar etc.

Esse pulo para o uso mais rico de uma língua é quando paramos de traduzir as frases palavra-por-palavra e passamos a nos expressar no nível mais conceitual. Por exemplo, para expressar que uma tarefa é muito fácil, passamos a usar expressões como "this was a piece of cake" ou "this was a walk in the park" ao invés de sempre usarmos "this was very easy". Uma pessoa que conhece esses detalhes do idioma, que envolve inclusive um entendimento básico da cultura e da forma de pensar dos falantes dessa língua, é uma pessoa que consideramos fluente nessa língua.

O que programação tem a ver com isso?

Em programação, também existe esse pulo entre o uso "instrumental" e "fluente" de uma linguagem. Muitos de nós aprendemos programação através de um estilo imperativo de programação, ou seja, aquele estilo de programação em que a gente comanda o que o programa precisa fazer, passo-a-passo. Aprendemos como declarar loops de repetição, como tomar decisões com if e else, como inicializar listas, e não é incomum declararmos em algum momento da nossa carreira: "pronto, agora que já sei usar essas estruturas para representar algoritmos e padrões de projeto, eu encaro qualquer linguagem. Pra usar Python, Javascript ou Go é só descobrir como se escreve for, if, como se declara arrays e tô safo".

Ao nos contentarmos em ficar nesse conhecimento instrumental de uma linguagem, estamos perdendo a oportunidade de realmente aprender o que a linguagem tem de bacana: como que alguém que sabe programar de forma fluente resolveria os mesmos problemas que estamos tentando resolver? Como, em contraste como um estilo imperativo de programação, podemos subir o nível para algo mais declarativo, ou seja em que a gente represente (em geral de forma mais sucinta) a ideia que queremos implementar?

Vamos ilustrar isso com um exemplo: digamos que você queira filtrar, em uma determinada lista de pessoas, as pessoas que tenham mais de 21 anos e que nunca tenham votado. Nossos dados originais poderiam ser algo assim:

name age has_voted
Renato 24 False
Cecília 18 False
Ana 27 False
Marta 32 True
Julio 17 True

...e o resultado traria os nomes "Renato" e "Ana" em uma lista.

Uma forma não-idiomática (mas perfeitamente válida) de resolver esse problema, em Python, seria assim:

result = []
# supondo que a lista 'people' tem os dados da tabela acima
for i in range(0, len(people)):
    person = people[i]
    if person.age > 21 and not person.has_voted:
       result.append(person.name)

# vai imprimir ["Renato", "Ana"]
print(result)

Enter fullscreen mode Exit fullscreen mode

Para quem conhece Javascript, dá pra ver que é possível fazer uma tradução linha por linha dessa solução:

const result = [];
// supondo que a lista 'people' tem os dados da tabela acima
for (var i=0; i < people.length; i++){
   const person = people[i];
   if (person.age > 21 && !person.has_voted) {
      result.push(person.name);
   }
});

// vai imprimir ["Renato", "Ana"]
console.log(result);
Enter fullscreen mode Exit fullscreen mode

Notou que as soluções são praticamente idênticas? aliás, você também acha que fica até meio difícil saber em qual linguagem de programação a solução foi implementada? Sem contar o console.log ao fim, o código acima poderia facilmente ser confundido com C# ou Java, não?

Escrever de forma idiomática nos abre as portas para programação fluente e limpa

Uma vez que resolvemos aprendemos a "nos virar" na linguagem, podemos simplesmente adicioná-la na lista de linguagens que conhecemos, ou podemos nos perguntar: como resolveríamos esse problema como um desenvolvedor "fluente" na linguagem, de forma idiomática?

Uma outra desenvolvedora que vá ler esse código vai ter que inferir, a partir desses comandos detalhados, qual era a nossa intenção; por exemplo, para que servem as variáveis i e result. A leitura não é tão prazerosa, e é um pouco mais difícil saber se tem algum bug nesse código.

Para subirmos para o nível idiomático, vale a pena dar uma olhada na documentação da linguagem, e procurar exemplos (vamos falar mais sobre isso daqui a pouco).

Por exemplo no Python nós temos list comprehensions (compreensão de lista, mas o nome em inglês é muito usado pela comunidade) que nos permite iterar listas e retornar novas listas de forma declarativa, o que deixaria nosso exemplo assim:

result = [person.name for person in people if person.age > 21
          and not person.has_voted]

print(result)
Enter fullscreen mode Exit fullscreen mode

Note que se você ler o código em voz alta, vai basicamente estar "explicando" o que ele faz.

O mesmo vale para uma solução idiomática em Javascript:

result = people
    .filter(({ age }) => age > 21)
    .filter(({ has_voted }) => has_voted)
    .map(({ name }) => name);

console.log(result);
Enter fullscreen mode Exit fullscreen mode

Um ganho imediato que vemos nesses códigos, nas duas linguagens, é que nos livramos daquela variável i que servia para controlar a iteração no loop, e certamente é uma fonte em potencial de bugs. Nosso código ficou mais limpo.

Além disso, a pessoa que escreveu essa versão idiomática teve que digitar menos e ainda assim ser mais expressiva, e provavelmente se divertiu mais também.

Codewars: um jeito divertido de aprender programação mais idiomática

Naturalmente que um lugar fácil para encontrar bons exemplos de programação idiomática, em qualquer linguagem, é ver código existente em projetos open-source, ler livros/documentação da linguagem (por exemplo, os livros "Python Fluente" do Luciano Ramalho, e Javascript Eloquente do Marijn Haverbecke, ou assistir a vídeos de especialistas como o Codeshow do Bruno Rocha.

Mas eu também queria indicar um outro lugar legal para ver exemplos concisos e legais de programação idiomática, e poder praticar essas habiliades, que é o site Codewars. Conforme está descrito na Wiki deles:

Codewars é uma comunidade de desenvolvedores, que treinam para melhorar suas habilidades de desenvolvimento. Pense nisso como um dojo de programação - onde os desenvolvedores treinam uns com os outros e ajudam uns aos outros a melhorar através da prática.

Ao criar uma conta gratuita lá, você será apresentado a desafios mais ou menos como o desse artigo (porém bem mais interessantes) para resolver na linguagem que você escolher (eles suportam algumas dezenas de linguagens, inclusive umas bem obscuras), e o mais legal, ao terminar de resolver o problema você pode ver as soluções de outras pessoas, ordenadas das que receberam mais "votos", e que em geral são muito elegantes e idiomáticas. Mesmo programadores experientes vão ver formas de resolver problemas usando recursos da linguagem que vão expandir em muito a sua fluência.

E você, como tem feito para programar de forma mais idiomática?

P.S.: estou iniciando essa jornada voltando a escrever dicas de programação e desenvolvimento de software focado em iniciantes. Aceito dicas de futuros assuntos!

Fonte da foto de capa

AWS Security LIVE!

Tune in for AWS Security LIVE!

Join AWS Security LIVE! for expert insights and actionable tips to protect your organization and keep security teams prepared.

Learn More

Top comments (0)