20 histórias com 5 code smells cada são 100 code smells, certo? Código anterior cheira Parte I parte II Parte III Parte IV Parte V Parte VI Parte VII Parte VIII Parte IX Parte X Parte XI Parte XII Parte XIII Parte XIV Parte XV Parte XVI Parte XVII Parte XVIII Parte XIX Vamos continuar... Code Smell 96 - Meus Objetos Você não possui objetos. TL;DR: não use como prefixo de nome. my problemas Falta de contexto Falha de bijeção Soluções Remova prefixo. meu 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 Automático [x] Podemos dizer aos nossos linters e verificadores estáticos para procurar esse prefixo e nos avisar. Tag Nomenclatura Conclusão Evite usar . Os objetos mudam de acordo com o contexto de uso. meu Mais informações O que exatamente é um nome - Parte II Reabilitação Créditos Foto de no Michał Bożek 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 manual [x] 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 no visuais 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 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 no Brett Jordan 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 manual [x] 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 no Priscilla Du Preez 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 por código estruturado GOTO 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 Automático [x] Em linguagens que suportam , nossos linters podem nos alertar contra seu uso. GOTO Tag Legibilidade Conclusão Reconhecemos os problemas do GOTO algumas décadas atrás. O problema ainda está presente em como GoLang, PHP, Perl etc. linguagens modernas A maioria dos programadores felizmente evita a frase GOTO. O próximo objetivo será considerar prejudicial. o uso nulo Cortesia XKCD Relações Cheiro de Código 12 - Nulo Mais informações Declaração Goto considerada prejudicial Wikipédia Créditos Foto de no Jens Johnsson 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!