20 histórias com 5 code smells cada são 100 code smells, certo?
Vamos continuar...
Você não possui objetos.
TL;DR: não use my como prefixo de nome.
Vários tutoriais antigos usam a palavra 'meu' como um nome preguiçoso. Isso é vago e leva a erros de contexto.
MainWindow myWindow = Application.Current.MainWindow as MainWindow;
MainWindow salesWindow = Application.Current.MainWindow as MainWindow; /* Since window is instanciated, we are currently working with a specialized window playing a special role */
Podemos dizer aos nossos linters e verificadores estáticos para procurar esse prefixo e nos avisar.
Evite usar meu . Os objetos mudam de acordo com o contexto de uso.
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
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.
Os programadores raramente são especialistas em UX.
Também subestimamos o fato de podermos estar dos dois lados do balcão.
alert("Cancel the appointment?", "Yes", "No"); // No consequences // Options not clear
alert("Cancel the appointment? \n" + "You will lose all the history", "Cancel Appointment", "Keep Editing"); // Consequences are clear // Choice options have context
Precisamos ler todas as mensagens de exceção nas revisões de código.
Precisamos pensar em nossos usuários finais ao levantar exceções ou mostrar mensagens.
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
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.
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 😀
comboFeededBySupplyer = supplyer.providers();
comboFedBySupplier = supplier.providers();
Preste muita atenção aos seus nomes.
Você provavelmente será a pessoa que lerá o código em alguns meses.
Code Smell 48 - Código Sem Padrões
O que exatamente é um nome - Parte I The Quest
O que exatamente é um nome - Parte II Reabilitação
Foto de Brett Jordan no Unsplash
Dentro de cada grande programa bem escrito existe um pequeno programa bem escrito.
CAR Hoare
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
Ao escrever métodos, geralmente não paramos para encontrar nomes decentes.
Também nunca refatoramos o óbvio.
class Calculator: def subtract(self, first, second): return first - second class CalculatorTest def test_multiply(): assert equals(first, second)
class Calculator: def subtract(self, minuend, subtrahend): return minuend - subtrahend class CalculatorTest def test_multiply(): assert equals(expectedValue, realValue)
Podemos avisar sobre palavras proibidas como 'primeiro' e 'segundo' como nomes de argumentos.
Siga sempre a regra sugerindo o parâmetro.
Nomeie seus colaboradores de acordo com a função.
Code Smell 65 - Variáveis nomeadas após tipos
O que exatamente é um nome - Parte II Reabilitação
Foto de Priscilla Du Preez no Unsplash
O código-fonte final é o projeto de software real.
Jack Reeves
GOTO foi considerado prejudicial há 50 anos
TL;DR: Nunca use GoTo.
Comecei a programar no Basic.
GOTO foi fortemente abusado lá.
Tive que aprender programação estruturada do zero no modo Rehab.
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) }
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) } }
Em linguagens que suportam GOTO , nossos linters podem nos alertar contra seu uso.
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
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!