paint-brush
Como encontrar as partes fedorentas do seu código [Parte XX]: Chegamos a 100!por@mcsee
1,425 leituras
1,425 leituras

Como encontrar as partes fedorentas do seu código [Parte XX]: Chegamos a 100!

por Maximiliano Contieri1m2022/06/11
Read on Terminal Reader
Read this story w/o Javascript

Muito longo; Para ler

Entenda os cheiros de código com exemplos!

Company Mentioned

Mention Thumbnail
featured image - Como encontrar as partes fedorentas do seu código [Parte XX]: Chegamos a 100!
Maximiliano Contieri HackerNoon profile picture

20 histórias com 5 code smells cada são 100 code smells, certo?


Código anterior cheira

Vamos continuar...


Code Smell 96 - Meus Objetos

Você não possui objetos.

TL;DR: não use my como prefixo de nome.

problemas

  • Falta de contexto
  • Falha de bijeção

Soluções

  1. Remova meu prefixo.
  2. Mude para um nome sugerindo função.

Contexto

Vários tutoriais antigos usam a palavra 'meu' como um nome preguiçoso. Isso é vago e leva a erros de contexto.

Código de amostra

Errado

 MainWindow myWindow = Application.Current.MainWindow as MainWindow;

Certo

 MainWindow salesWindow = Application.Current.MainWindow as MainWindow; /* Since window is instanciated, we are currently working with a specialized window playing a special role */

Detecção

  • [x] Automático

Podemos dizer aos nossos linters e verificadores estáticos para procurar esse prefixo e nos avisar.

Tag

  • Nomenclatura

Conclusão

Evite usar meu . Os objetos mudam de acordo com o contexto de uso.

Mais informações

Créditos

Foto de Michał Bożek no Unsplash


Pensando em minha experiência de modificação de código, vejo que gasto muito mais tempo lendo o código existente do que escrevendo um novo código. Portanto, se eu quiser tornar meu código barato, devo torná-lo fácil de ler.

Kent Beck

Grandes Citações de Engenharia de Software


Code Smell 97 - Mensagens de erro sem empatia

Devemos ter cuidado especial com descrições de erros para os usuários (e para nós mesmos).

TL;DR: Use descrições significativas e sugira ações corretivas.

problemas

  • Princípio da menor surpresa

Soluções

  1. Use mensagens de erro declarativas
  2. Mostrar ações de saída claras

Contexto

Os programadores raramente são especialistas em UX.

Também subestimamos o fato de podermos estar dos dois lados do balcão.

Código de amostra

Errado

 alert("Cancel the appointment?", "Yes", "No"); // No consequences // Options not clear

Certo

 alert("Cancel the appointment? \n" + "You will lose all the history", "Cancel Appointment", "Keep Editing"); // Consequences are clear // Choice options have context

Detecção

  • [x] manual

Precisamos ler todas as mensagens de exceção nas revisões de código.

Tag

  • Exceções
  • experiência do usuário

Conclusão

Precisamos pensar em nossos usuários finais ao levantar exceções ou mostrar mensagens.

Créditos

Foto por visuais no Unsplash


Embora seja um fato conhecido que os programadores nunca cometem erros, ainda é uma boa ideia agradar os usuários verificando se há erros em pontos críticos do seu programa.

Robert D. Schneider



Code Smell 98 - Erros de ortografia

A ortografia e a legibilidade são muito importantes para os humanos e não são importantes para as máquinas.

TL;DR: Cuidem de seus nomes.

problemas

  • Legibilidade
  • Mais difícil de pesquisar termos no código.

Soluções

  1. Verifique a ortografia do seu código.
  2. Use um IDE com verificação ortográfica

Contexto

Muitos de nós não falam inglês como primeira língua.

Precisamos ter um cuidado redobrado com nossos textos e nomes.

Este artigo tem um erro de digitação no título como prova de contexto e também um clickbait 😀

Código de amostra

Errado

 comboFeededBySupplyer = supplyer.providers();

Certo

 comboFedBySupplier = supplier.providers();

Detecção

Tag

  • Legibilidade
  • Nomenclatura
  • Estilização de código

Conclusão

Preste muita atenção aos seus nomes.

Você provavelmente será a pessoa que lerá o código em alguns meses.

Relações

Code Smell 48 - Código Sem Padrões

Mais informações

O que exatamente é um nome - Parte I The Quest

O que exatamente é um nome - Parte II Reabilitação

Créditos

Foto de Brett Jordan no Unsplash


Dentro de cada grande programa bem escrito existe um pequeno programa bem escrito.

CAR Hoare


Cheiro de Código 99 - Primeiro Segundo

Quantas vezes vemos nomes de argumentos preguiçosos?

TL;DR: Nomeie seus argumentos de acordo com o papel e não a posição acidental

problemas

  • Legibilidade
  • Nomes reveladores de intenções

Soluções

  1. Use nomes significativos

Contexto

Ao escrever métodos, geralmente não paramos para encontrar nomes decentes.

Também nunca refatoramos o óbvio.

Código de amostra

Errado

 class Calculator: def subtract(self, first, second): return first - second class CalculatorTest def test_multiply(): assert equals(first, second)

Certo

 class Calculator: def subtract(self, minuend, subtrahend): return minuend - subtrahend class CalculatorTest def test_multiply(): assert equals(expectedValue, realValue)

Detecção

  • [x] manual

Podemos avisar sobre palavras proibidas como 'primeiro' e 'segundo' como nomes de argumentos.

Tag

  • Legibilidade

Conclusão

Siga sempre a regra sugerindo o parâmetro.

Nomeie seus colaboradores de acordo com a função.

Relações

Code Smell 65 - Variáveis nomeadas após tipos

Mais informações

O que exatamente é um nome - Parte II Reabilitação

Créditos

Foto de Priscilla Du Preez no Unsplash


O código-fonte final é o projeto de software real.

Jack Reeves


Code Smell 100 - GoTo

GOTO foi considerado prejudicial há 50 anos

TL;DR: Nunca use GoTo.

problemas

  • Legibilidade
  • Código difícil de seguir

Soluções

  1. Substitua GOTO por código estruturado
  2. Usar exceções

Contexto

Comecei a programar no Basic.

GOTO foi fortemente abusado lá.

Tive que aprender programação estruturada do zero no modo Rehab.

Código de amostra

Errado

 for x < 0 { if x > -1e-09 { goto small } z = z / x x = x + 1 } for x < 2 { if x < 1e-09 { goto small } z = z / x x = x + 1 } if x == 2 { return z } x = x - 2 p = (((((x*_gamP[0]+_gamP[1])*x+_gamP[2])*x+_gamP[3])*x+_gamP[4])*x+_gamP[5])*x + _gamP[6] q = ((((((x*_gamQ[0]+_gamQ[1])*x+_gamQ[2])*x+_gamQ[3])*x+_gamQ[4])*x+_gamQ[5])*x+_gamQ[6])*x + _gamQ[7] return z * p / q small: if x == 0 { return Inf(1) } return z / ((1 + Euler*x) * x) }

Certo

 for x < 0 { if x > -1e-09 { return small(x, z) } z = z / x x = x + 1 } for x < 2 { if x < 1e-09 { return small(x, z) } z = z / x x = x + 1 } if x == 2 { return z } x = x - 2 p = (((((x*_gamP[0]+_gamP[1])*x+_gamP[2])*x+_gamP[3])*x+_gamP[4])*x+_gamP[5])*x + _gamP[6] q = ((((((x*_gamQ[0]+_gamQ[1])*x+_gamQ[2])*x+_gamQ[3])*x+_gamQ[4])*x+_gamQ[5])*x+_gamQ[6])*x + _gamQ[7] return z * p / q small(x, z) { if x == 0 { return Inf(1) } return z / ((1 + Euler*x) * x) } }

Detecção

  • [x] Automático

Em linguagens que suportam GOTO , nossos linters podem nos alertar contra seu uso.

Tag

  • Legibilidade

Conclusão

Reconhecemos os problemas do GOTO algumas décadas atrás.

O problema ainda está presente em linguagens modernas como GoLang, PHP, Perl etc.

A maioria dos programadores felizmente evita a frase GOTO. O próximo objetivo será considerar o uso nulo prejudicial.


Cortesia XKCD

Relações

Cheiro de Código 12 - Nulo

Mais informações

Créditos

Foto de Jens Johnsson no Unsplash


É praticamente impossível ensinar boa programação para alunos que tiveram uma exposição anterior ao BASIC: como programadores em potencial, eles estão mentalmente mutilados além da esperança de regeneração.

Edsger Dijkstra

Grandes Citações de Engenharia de Software


E isso é tudo por enquanto, atingimos 100 marcos.


O próximo artigo explicará mais 5 code smells!