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
- Remova meu prefixo.
- 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
- Use mensagens de erro declarativas
- 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
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
- Verifique a ortografia do seu código.
- 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
- 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
- Substitua GOTO por código estruturado
- 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
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!