Clean code aplicado a Python: 7 práticas avançadas

Marca Empregadora Grupo OLX
Grupo OLX Tech
Published in
5 min readFeb 9, 2022

Você já copiou a matéria da lousa de qualquer jeito e quando foi estudar para a prova não sabia o que estava escrito? Pois é…A mesma coisa acontece em programação! A boa notícia é que existe a prática clean code (código limpo) aplicado a Python.

Aliás, você sabia que ele é a segunda linguagem mais utilizada no mundo? De acordo com a SlashData, cerca de 11 milhões de pessoas programam com Phyton, principalmente em Ciência de Dados, Inteligência Artificial e Internet das Coisas (IoT). Inclusive, esse número ultrapassa a quantidade de usuários em Java, que atualmente são por volta de 9, 6 milhões.

Mas isso não é uma competição, certo? Criamos esse artigo somente para te ajudar a criar códigos mais claros e eficientes, tanto para você quanto para a sua equipe. Então, bora conferir algumas dicas?

Como saber se o seu código está ilegível?

Bom, antes de falarmos sobre as dicas, é importante determinarmos o que exatamente seria um código ilegível, né?

A primeira pergunta que te fazemos é: você demora mais de três minutos para entender o que está escrito? Se sim, esse já é um spoiler para as demais dificuldades que virão pela frente. Se para você já está complicado, imagine para quem terá que utilizar seus códigos depois?

Por isso, é preciso que as suas funções sejam:

- curtas;
- executem uma ação de cada vez;
- apresentem o mesmo nível de abstração;
- contem com menos de 4 argumentos;
- tenham nomes descritivos.

Dessa forma, além dos seus códigos se tornarem mais legíveis, você também terá maior facilidade para identificar possíveis erros ou bugs. Dito isso, vamos descobrir como conquistar o clean code?

Começando com um exemplo prático…

Acima, temos a função load_data, responsável por fazer o download e extrair dados do Google Drive. Por outro lado, é difícil entender que esse é o seu papel, pois ela contém todas aquelas características que um clean code não deve ter!

Logo, é importante que você…

Crie funções curtas

Sim, concordamos que significado de curto seja meio relativo. Mas em Python, o ideal é que cada função não ultrapasse 20 linhas de código. Inclusive, seu nível de identidade pode ser bem pequeno, como no exemplo abaixo:

Dê apenas um papel para cada função

A partir de agora, suas funções serão mais curtas, né? Consequentemente, cada uma delas deverá executar apenas uma ação.

No exemplo acima, vemos que a função load_data tenta fazer, ao mesmo tempo: o download dos dados, descompactar as pastas, encontrar o nome dos arquivos que contém dados de treino e de teste, além de extrair os textos de cada arquivo.

Isso vai totalmente contra um dos cinco princípios SOLID, o S.R.P — Single Responsibility Principle, que se refere ao “S” do acrônimo. Ele defende que cada responsabilidade deve ser uma classe e cada classe deve ter uma única responsabilidade.

Pensando nisso, podemos dividir essa grande função em três:

Mantenha o mesmo nível de abstração

O nível de abstração refere-se à complexidade que um código é visualizado ou programado. Aqui, quanto maior forem os detalhes, menor a abstração. E quando a descrição for mais curta, aí a abstração é bem maior.

Ah! E isso te lembra alguma coisa? É claro: o princípio KISS (Keep It Simple Stupid).

No exemplo acima, vemos que a função extract_texts_from_multiple_files tem um nível mais alto de abstração. Já o código list_of_text_in_one_file =[r.text for r in ET.parse(join(path_to_file, file_name)).getroot()[0], tem um nível mais baixo.

Para deixarmos ambas no mesmo grau, é preciso fazer o seguinte:

Evite duplicações

Para facilitar a aplicação de clean code, é importante que você evite fazer duplicações, pois elas aumentam a probabilidade de erros. Em outras palavras, quando você altera uma parte do código, também terá que mudar a outra.

Perceba que há muitas semelhanças entre os códigos de extração de textos de arquivos de treino de arquivos de teste. Logo, o melhor caminho para o clean code é juntá-los em uma função.

Use nomes descritivos

Sabemos que em muitos casos precisamos escrever de maneira sucinta, mas em programação isso nem sempre é verdade. Uma descrição longa é muito mais legível do que uma descrição breve e enigmática.

Se você ainda está com receio, lembre-se de que outras pessoas vão precisar entender o que você escreveu. Imagine o vai e volta que dá um código sujo? Acaba virando um telefone sem fio, né?

Por exemplo, é muito mais fácil entender o objetivo da função extract_texts_from_multiple_files do que simplesmente get_texts.

No entanto, tudo na vida tem um limite! Se um nome descritivo estiver tão longo como

download_file_from_ Google_drive_and_extract_text_from_that_file, é sinal de que esta função está realizando várias ações ao mesmo tempo. E já vimos que isso acaba com o clean code, não é mesmo?

Não ultrapasse 4 argumentos por função

Outro sinal de que uma função está desempenhando mais tarefas do que o necessário é a quantidade de argumentos. Inclusive, também é difícil testar uma função com mais de 3 combinações de variáveis.
Caso isso aconteça, considere transformar os argumentos em uma classe. Como no caso da função load_data, que conta com 4 deles: url, outuput_path, path_train, e path_test.

Em outras palavras, esta função quer utilizar o url para fazer o download dos dados; salvá-los no output_path e, por fim, extrair os arquivos de treino e de teste do output_path para salvá-los no path_train e path_test.

Para colocar todos os argumentos na mesma classe, você deve começar separando eles 3 em funções:

Já que as funções download_zip_data_from_google_drive, unzip_data , and get_train_test_docs tem o objetivo de pegar os dados, você pode juntá-los numa classe chamada “Data Getter”.

Depois de todos esses passos, chegamos nesse resultado:

Ficou grande, né? Mas muito mais legível. Dá para saber facilmente o que cada código faz!

Dicas finais

Não tente fazer tudo perfeitinho. Comece escrevendo do seu jeito, de acordo com o que faz sentido para você. Confirme seus códigos forem crescendo, aí sim, você deve observar se as suas funções estão de acordo com as regrinhas que passamos hoje.

Caso contrário, refatore e siga para a próxima função, combinado?

No fim, será muito mais fácil para você testar suas funções e garantir que elas passem nos testes de unidade quando uma alteração for feita. Além disso, seus códigos serão reutilizáveis e o trabalho de todo mundo será mais tranquilo!

Agora, que tal colocar em prática todos esses aprendizados aqui na OLX? Inscreva-se no nosso banco de talentos!

--

--