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.)
Você pode encontrar todos os cheiros de código anteriores (Parte i - XXXI) aqui .
Vamos continuar...
Aprendemos if/else em nosso primeiro dia de programação. Então esquecemos o resto.
TL;DR: Seja explícito. Mesmo com Else.
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.
function carBrandImplicit(model) { if (model === 'A4') { return 'audi'; } return 'Mercedes-Benz'; }
function carBrandExplicit(model) { if (model === 'A4') { return 'audi'; } if (model === 'AMG') { return 'Mercedes-Benz'; } // Fail Fast throw new Exception('Model not found); }
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.
Esse tipo de cheiro traz muito debate público e ódio .
Devemos trocar opiniões e valorizar cada pró e contra.
Cheiro de Código 102 - Código de Seta
Code Smell 36 - Switch/case/else if/else/if declarações
Pare de usar o outro implícito
Como se livrar de IFs irritantes para sempre
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
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.
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 💩
""" 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
""" 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")
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.
Sempre siga o princípio do menor espanto como um guia.
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
Nulo: O erro de um bilhão de dólares
Foto de Jasmin Sessler no Unsplash
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
Você atribui um valor a uma variável e o usa, mas nunca o altera.
TL;DR: Seja declarativo sobre a mutabilidade.
Refatoração 003 - Extrair Constante
Refatoração 008 - Converter Variáveis em Constantes
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 .
<?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 }
<?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
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.
Devemos nos desafiar e refatorar quando o escopo da variável estiver claro e aprendermos mais sobre suas propriedades e mutabilidade .
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
Code Smells são apenas minha opinião .
Foto de Noah Buscher no Unsplash
Um sistema complexo que funciona invariavelmente evoluiu de um sistema simples que funcionou.
John Gall
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
Escolha um padrão de caso
Segure-se nisso
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.
{ "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" }
{ "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 }
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.
Sempre que precisarmos interagir com código fora do nosso escopo, devemos usar os padrões do cliente, não os nossos.
Lidar com padrões é fácil.
Precisamos aplicá-los.
Code Smell 48 - Código Sem Padrões
O que exatamente é um nome - Parte I The Quest
Todas as convenções de nomenclatura
Code Smells são apenas minha opinião .
Foto de Wolfgang Hasselmann no Unsplash
Se você tem muitos casos especiais, está fazendo errado.
Craig Zerouni
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.
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
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.
#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)
#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)
Podemos verificar constantes e valores especiais no código.
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.
Cheiro de código 120 - IDs sequenciais
Nulo: O erro de um bilhão de dólares
Y2K22 - O erro que nos envergonha
Code Smells são apenas minha opinião .
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…