20 histórias com 5 code smells cada são 100 code smells, certo?
Você não possui objetos.
TL;DR: não use my como prefixo de nome.
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 */
Evite usar meu . Os objetos mudam de acordo com o contexto de uso.
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.
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
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.
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();
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
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
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)
Code Smell 65 - Variáveis nomeadas após tipos
O que exatamente é um nome - Parte II Reabilitação
O código-fonte final é o projeto de software real.
Jack Reeves
GOTO foi considerado prejudicial há 50 anos
TL;DR: Nunca use GoTo.
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.
A maioria dos programadores felizmente evita a frase GOTO. O próximo objetivo será considerar o uso nulo prejudicial.
Cortesia
É 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