Cheira porque provavelmente há muitos casos em que poderia ser editado ou melhorado.
A maioria desses cheiros são apenas indícios de algo que pode estar errado. Portanto, eles não precisam ser consertados per se... (Você deve dar uma olhada nisso, no entanto.)
Código anterior cheira
Você pode encontrar todos os cheiros de código anteriores (Parte i - XXXI) aqui .
Vamos continuar...
Code Smell 156 - Outra coisa implícita
Aprendemos if/else em nosso primeiro dia de programação. Então esquecemos o resto.
TL;DR: Seja explícito. Mesmo com Else.
problemas
- Legibilidade
- Carga cognitiva
- condições imprevistas
- Violação do princípio Fail Fast
Soluções
- Escreva o else explícito
Contexto
Se retornarmos antecipadamente em uma sentença IF, podemos omitir a parte else.
Depois, removemos o IF e usamos o polimorfismo.
É quando perdemos os casos reais.
Código de amostra
Errado
function carBrandImplicit(model) { if (model === 'A4') { return 'audi'; } return 'Mercedes-Benz'; }
Certo
function carBrandExplicit(model) { if (model === 'A4') { return 'audi'; } if (model === 'AMG') { return 'Mercedes-Benz'; } // Fail Fast throw new Exception('Model not found); }
Detecção
- [x] Automático
Podemos verificar as árvores de sintaxe, analisá-las e avisar sobre a falta de else.
Também podemos reescrevê-los e realizar testes de mutação.
Tag
- Condicionais
Conclusão
Esse tipo de cheiro traz muito debate público e ódio .
Devemos trocar opiniões e valorizar cada pró e contra.
Relações
Cheiro de Código 102 - Código de Seta
Code Smell 36 - Switch/case/else if/else/if declarações
Mais informações
Pare de usar o outro implícito
Como se livrar de IFs irritantes para sempre
Créditos
Foto de Elena Mozhvilo no Unsplash
O maior problema nas equipes de software é garantir que todos entendam o que todos estão fazendo.
Martin Fowler
Code Smell 157 - Equilíbrio em 0
Hoje, esperava um pagamento em minha carteira. O saldo era 0. Entrei em pânico.
TL;DR: Nulo não é 0. O erro não é 0. Apenas 0 é 0.
problemas
- Nulos
- experiência do usuário
- Usabilidade
Soluções
- Faça uma distinção clara entre um zero e um erro.
Contexto
Eu leio muito sobre questões de segurança.
Especialmente em criptografia.
Na semana passada, li sobre um tópico de hack de criptografia .
Quando minha carteira me mostrou 0 como saldo, entrei em pânico.
Era apenas um cheiro UX.
A blockchain estava inacessível 💩
Código de amostra
Errado
""" Below code is automatically generated by code-davinci-002 on GTP3 Codex 1. check balance with blockchain 2. If blockchain is unreachable show 0 as the balance """ import requests import json def get_balance(address): url = "https://blockchain.info/q/addressbalance/" + address response = requests.get(url) if response.status_code == 200: return response.text else: return 0
Certo
""" Below code is automatically generated by code-davinci-002 on GTP3 Codex 1. check balance with blockchain 2. If blockchain is unreachable throw an error """ import requests import json def get_balance(address): url = "https://blockchain.info/q/addressbalance/" + address response = requests.get(url) if response.status_code == 200: return response.text else: raise BlockchainNotReachableError("Error reaching blockchain")
Detecção
- [x] manual
Este é um cheiro de design.
Podemos encontrar padrões quando uma exceção ou código de retorno é lançado e mascarado com um 0.
Tag
- experiência do usuário
Conclusão
Sempre siga o princípio do menor espanto como um guia.
Relações
Code Smell 139 - Código comercial na interface do usuário
Code Smell 73 - Exceções para casos esperados
Code Smell 72 - Códigos de Retorno
Mais informações
Nulo: O erro de um bilhão de dólares
Crédito
Foto de Jasmin Sessler no Unsplash
Isenção de responsabilidade
Code Smells são apenas minha opinião .
Minha crítica real com Null é que ele traz de volta desnecessariamente toda a agonia de ter que escolher se deseja executar seu programa rapidamente sem verificar ou executá-lo lentamente com verificação.
Tony Hoare (Inventor Nulo)
Grandes Citações de Engenharia de Software
Code Smell 158 - Variáveis Não Variáveis
Você atribui um valor a uma variável e o usa, mas nunca o altera.
TL;DR: Seja declarativo sobre a mutabilidade.
problemas
- Legibilidade
- Honre a mutabilidade da Bijeção .
- Possíveis problemas de desempenho e memória.
Soluções
- Altere a variável para uma constante e seja claro em seu escopo.
Refatorações
Refatoração 003 - Extrair Constante
Refatoração 008 - Converter Variáveis em Constantes
Contexto
Estamos sempre aprendendo com o domínio.
Às vezes pensamos que um valor pode mudar com o MAPPER .
Mais tarde, aprendemos que não vai mudar.
Portanto, precisamos promovê-lo a uma constante.
Isso também evitará Magic Constants .
Código de amostra
Errado
<?php function configureUser() { $password = '123456'; // Setting a password on a variable is another vulnerability // And Code Smell $user = new User($password); // Notice Variable doesn't change }
Certo
<?php define("USER_PASSWORD", '123456') function configureUser() { $user = new User(USER_PASSWORD); } // or function configureUser() { $user = new User(userPassword()); } function userPassword() : string { return '123456'; } // Case is an oversimplification as usual
Detecção
- [x] Automático
Muitos linters verificam se a variável possui apenas uma atribuição.
Também podemos realizar testes de mutação e tentar modificar a variável para ver se os testes falham.
Tag
- Mutabilidade
Conclusão
Devemos nos desafiar e refatorar quando o escopo da variável estiver claro e aprendermos mais sobre suas propriedades e mutabilidade .
Relações
Code Smell 116 - Variáveis declaradas com 'var'
Code Smell 127 - Constantes Mutáveis
Code Smell 107 - Reutilização de Variáveis
Code Smell 02 - Constantes e Números Mágicos
Mais informações
Isenção de responsabilidade
Code Smells são apenas minha opinião .
Créditos
Foto de Noah Buscher no Unsplash
Um sistema complexo que funciona invariavelmente evoluiu de um sistema simples que funcionou.
John Gall
CoDe SmElL 159 - mIxEd_cASeI
O desenvolvimento sério é feito por muitas pessoas diferentes. Temos que começar a concordar.
TL;DR: Não misture diferentes conversões de maiúsculas e minúsculas
problemas
- Legibilidade
- Manutenibilidade
Soluções
Escolha um padrão de caso
Segure-se nisso
Contexto
Quando pessoas diferentes criam software juntas, elas podem ter diferenças pessoais ou culturais.
Alguns preferem camelCase 🐫, outros snake_case 🐍, MACRO_CASE🗣️ e muitos outros .
O código deve ser simples e legível.
Código de amostra
Errado
{ "id": 2, "userId": 666, "accountNumber": "12345-12345-12345", "UPDATED_AT": "2022-01-07T02:23:41.305Z", "created_at": "2019-01-07T02:23:41.305Z", "deleted at": "2022-01-07T02:23:41.305Z" }
Certo
{ "id": 2, "userId": 666, "accountNumber": "12345-12345-12345", "updatedAt": "2022-01-07T02:23:41.305Z", "createdAt": "2019-01-07T02:23:41.305Z", "deletedAt": "2022-01-07T02:23:41.305Z" // This doesn't mean THIS standard is the right one }
Detecção
- [x] Automático
Podemos informar nossos linters sobre os amplos padrões de nomenclatura de nossa empresa e aplicá-los.
Sempre que novas pessoas chegam à organização, um teste automatizado deve pedir educadamente a ele/ela que altere o código.
Exceções
Sempre que precisarmos interagir com código fora do nosso escopo, devemos usar os padrões do cliente, não os nossos.
Tag
- Nomenclatura
Conclusão
Lidar com padrões é fácil.
Precisamos aplicá-los.
Relações
Code Smell 48 - Código Sem Padrões
Mais informações
O que exatamente é um nome - Parte I The Quest
Todas as convenções de nomenclatura
Isenção de responsabilidade
Code Smells são apenas minha opinião .
Créditos
Foto de Wolfgang Hasselmann no Unsplash
Se você tem muitos casos especiais, está fazendo errado.
Craig Zerouni
Cheiro de código 160 - Id inválido = 9999
Maxint é um número muito bom para um ID inválido. Jamais o alcançaremos.
TL;DR: Não combine IDs reais com inválidos. Na verdade: Evite IDs.
problemas
- Violação da bijeção .
- Você pode alcançar o ID inválido mais cedo do que pensa.
- Também não use nulos para IDs inválidos.
- Sinalizadores de acoplamento do chamador às funções.
Soluções
Modele casos especiais com objetos especiais.
Evite 9999, -1 e 0, pois são objetos de domínio válidos e acoplamento de implementação.
Introduzir Objeto Nulo
Contexto
Nos primórdios da computação, os tipos de dados eram rígidos.
Então inventamos O erro de um bilhão de dólares .
Então crescemos e modelamos cenários especiais com valores especiais polimórficos.
Código de amostra
Errado
#include "stdio.h" #include "stdlib.h" #include "stdbool.h" #define INVALID_VALUE 999 int main(void) { int id = get_value(); if (id==INVALID_VALUE) { return EXIT_FAILURE; // id is a flag and also a valid domain value } return id; } int get_value() { // something bad happened return INVALID_VALUE; } // returns EXIT_FAILURE (1)
Certo
#include "stdio.h" #include "stdlib.h" #include "stdbool.h" // No INVALID_VALUE defined int main(void) { int id; id = get_value(); if (!id) { return EXIT_FAILURE; // Sadly, C Programming Language has no exceptions } return id; } get_value() { // something bad happened return false; } // returns EXIT_FAILURE (1)
Detecção
- [x] Semiautomático
Podemos verificar constantes e valores especiais no código.
Tag
- Nulo
Conclusão
Devemos usar números para nos relacionarmos com os identificadores externos.
Se não existir nenhum identificador externo, então não é um número.
Relações
Cheiro de código 120 - IDs sequenciais
Mais informações
Nulo: O erro de um bilhão de dólares
Y2K22 - O erro que nos envergonha
Isenção de responsabilidade
Code Smells são apenas minha opinião .
Créditos
Foto de Markus Spiske no Unsplash
Insetos espreitam nos cantos e se reúnem nos limites.
Boris Beizer
Mais 5 cheiros de código estão chegando em breve…