DEV Community

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

Você programa de forma idiomática?

rodbv profile image rodbv ・5 min read

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

Discussion

pic
Editor guide