paint-brush
Como encontrar as partes fedorentas do seu código [Parte XXXII]por@mcsee
809 leituras
809 leituras

Como encontrar as partes fedorentas do seu código [Parte XXXII]

por Maximiliano Contieri9m2023/03/08
Read on Terminal Reader

Muito longo; Para ler

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.) Cheiros de código anteriores Você pode encontrar todos os cheiros de código anteriores (Parte i - XXXI) aqui.
featured image - Como encontrar as partes fedorentas do seu código [Parte XXXII]
Maximiliano Contieri HackerNoon profile picture

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

Soluções

  1. 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

Quando usar o Else implícito

Falhar rápido

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

  1. 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

Cheiro de Código 12 - Nulo

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

  1. 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

O poder maligno dos mutantes

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

  1. Escolha um padrão de caso


  2. 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


  • 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

  1. Modele casos especiais com objetos especiais.


  2. Evite 9999, -1 e 0, pois são objetos de domínio válidos e acoplamento de implementação.


  3. 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

Cheiro de Código 12 - Nulo

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…