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

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

por Maximiliano Contieri7m2023/04/07
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 - XXXIII) aqui.
featured image - Como encontrar as partes fedorentas do seu código [Parte XXXIV]
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 - XXXIII) aqui .


Vamos continuar...


Code Smell 166 - Erros de baixo nível na interface do usuário

Erro fatal: Erro não detectado: Classe 'logs_queries_web' não encontrada em /var/www/html/query-line.php:78


Rastreamento de pilha: #0 {main} lançado em /var/www/html/query-line.php na linha 718


TL;DR: Pegue seus erros. Mesmo aqueles que você não espera.

problemas

  • Segurança


  • Manipulação de erros


  • Registro de erros


  • Experiência UX Ruim

Soluções

  1. Use um manipulador de nível superior.


  2. Evite idiomas que favoreçam códigos de retorno .


  3. Espere erros de banco de dados e de baixo nível.

Contexto

Mesmo em 2022, podemos ver sites "sérios" mostrando aos usuários casuais uma pilha ou mensagem de depuração.

Código de amostra

Errado

 <? Fatal error: Uncaught Error: Class 'MyClass' not found in /nstest/src/Container.php:9

Certo

 <? // A user-defined exception handler function function myException($exception) { logError($exception->description()) // We don't show Exception to final users } // Set user-defined exception handler function set_exception_handler("myException");

Detecção

  • [x] Automático

Podemos usar o teste de mutação para simular problemas e ver se eles são tratados corretamente.

Tag

  • Segurança

Conclusão

Precisamos continuar amadurecendo.


Nossas soluções não devem ser desleixadas.



Precisamos melhorar nossa reputação como engenheiros de software sérios.

Relações

Code Smell 72 - Códigos de Retorno

Mais informações

Falhar rápido

Isenção de responsabilidade

Code Smells são apenas minha opinião .

Créditos

Foto de Jesse Orrico no Unsplash


80 por cento dos meus problemas são simples erros de lógica. 80 por cento dos problemas restantes são erros de ponteiro. Os problemas restantes são difíceis.

Mark Donner

Grandes Citações de Engenharia de Software


Code Smell 167 - Comparação de hashing

Hashing garante que dois objetos sejam diferentes. Não que sejam iguais.


TL;DR: Se você verificar o hash, também deverá verificar a igualdade

problemas

Soluções

  1. Verifique se há hash (rápido) e, em seguida, verifique se há igualdade (lento)

Contexto

Em 7 de outubro de 2022, um dos maiores blockchains teve que ser interrompido.


Esta notícia foi chocante, já que a maioria das blockchains são descentralizadas por definição.


Você pode ler um artigo completo aqui:

Como um hacker roubou US$ 566 milhões explorando um cheiro de código

Código de amostra

Errado

 public class Person { public String name; // Public attributes are another smell @Override public boolean equals(Person anotherPerson) { return name.equals(anotherPerson.name); } @Override public int hashCode() { return (int)(Math.random()*256); } // This is just an example of non-correlation // When using HashMaps we can make a mistake // and guess the object is not present in the collection }

Certo

 public class Person { public String name; // Public attributes are another smell @Override public boolean equals(Person anotherPerson) { return name.equals(anotherPerson.name); } @Override public int hashCode() { return name.hashCode(); } // This is just an example of non-correlation }

Detecção

  • [x] Semiautomático

Muitos linters têm regras para redefinição de hash e igualdade.


Com o teste de mutação, podemos semear diferentes objetos com o mesmo hash e verificar nossos testes.

  • Identidade
  • Segurança

Conclusão

Cada melhoria de desempenho tem suas desvantagens.


Caches e replicações são exemplos notáveis.


Podemos (devemos) usá-los com cuidado.

Relações

Code Smell 49 - Caches

Code Smell 150 - Comparação Igual

Mais informações

Igualdade e Hash

Código Hash em Java

Código Hash vs Igual

Isenção de responsabilidade

Code Smells são apenas minha opinião .


Isso vai surpreender alguns de seus leitores, mas meu interesse principal não é a segurança do computador. Estou interessado principalmente em escrever software que funcione como pretendido.

Wietse Venema

Grandes Citações de Engenharia de Software


Code Smell 168 - Decisões não documentadas

Precisamos fazer algumas mudanças. Precisamos ser claros sobre o porquê

TL;DR: Seja declarativo em suas decisões de design ou implementação.

problemas

  • Comentários do código
  • Falta de testabilidade

Soluções

  1. Seja explícito sobre os motivos.
  2. Converta o comentário em um método.

Contexto

Às vezes, encontramos regras arbitrárias não tão facilmente testáveis.


Se não podemos escrever um teste com falha, precisamos ter uma função com um nome excelente e declarativo em vez de um comentário.

Código de amostra

Errado

 // We need to run this process with more memory set_memory("512k) run_process();

Certo

 increase_memory_to_avoid_false_positives(); run_process();

Detecção

  • [x] Semiautomático

Este é um cheiro semântico.


Podemos detectar comentários e nos avisar.

Tag

  • Comentários

Conclusão

Código é prosa. E as decisões de design devem ser narrativas.

Relações

Code Smell 05 - Abusadores de comentários

Code Smell 75 - Comentários dentro de um método

Isenção de responsabilidade

Code Smells são apenas minha opinião .

Créditos

Foto de Goh Rhy Yan no Unsplash


Os programas, como as pessoas, envelhecem. Não podemos prevenir o envelhecimento, mas podemos entender suas causas, limitar seus efeitos e reverter alguns dos danos.

Mário Fusco

Grandes Citações de Engenharia de Software


Code Smell 169 - Métodos colados

Não faça duas ou mais coisas ao mesmo tempo.

TL;DR: Tente ser o mais atômico possível em seus métodos

problemas

  • Código Acoplado
  • Mais difícil de testar
  • Mais difícil de ler

Soluções

  1. Quebre o método

Refatorações

https://maximilianocontieri.com/refactoring-002-extract-method

Contexto

Se você nomear um método com 'E', provavelmente está perdendo uma oportunidade de extrair e quebrar o método.

Código de amostra

Errado

 calculatePrimeFactorsRemoveDuplicatesAndPrintThem() // Three responsibilities

Certo

 calculatePrimeFactors(); removeDuplicates(); printNumbers(); // Three different methods // We can test them and reuse them

Detecção

  • [x] Semiautomático

Alguns linters podem nos alertar sobre métodos, incluindo o termo 'e'.

Tag

  • Acoplamento

Conclusão

Ao fazer métodos, é muito importante jogar alguma história de pato de borracha e dizer a nós mesmos se estamos fazendo as coisas certas.

Relações

%[ https://maximilianocontieri.com/code-smell-85-and-functions ]

Isenção de responsabilidade

Code Smells são apenas minha opinião .

Créditos

Foto de Scott Sanker no Unsplash


Aprender a arte da programação, como a maioria das outras disciplinas, consiste primeiro em aprender as regras e depois aprender quando quebrá-las.

Joshua Bloch


Code Smell 170 - Refatore com mudanças funcionais

Desenvolver é ótimo. a refatoração é incrível. Não faça isso ao mesmo tempo

TL;DR: Não altere funcionalmente e refatore ao mesmo tempo.

problemas

  • Difícil revisar soluções
  • Mesclar Conflitos

Soluções

  1. Nunca altere a funcionalidade durante a refatoração

Contexto

Às vezes, detectamos que uma refatoração é necessária para um maior desenvolvimento.


Somos especialistas em aprender.


Devemos colocar nossa solução em espera. Trabalhe na refatoração e continue com nossa solução.

Código de amostra

Errado

 getFactorial(n) { return n * getFactorial(n); } // Rename and Change factorial(n) { return n * factorial(n-1); } // This is a very small example // Things go works while dealing with huge code

Certo

 getFactorial(n) { return n * getFactorial(n); } // Change getFactorial(n) { return n * getFactorial(n-1); } // Run the tests factorial(n) { return n * factorial(n-1); } // Rename

Detecção

Este é um cheiro de refatoração.

  • [x] manual

Tag

  • Reestruturação

Conclusão

Devemos usar um token físico.


Ou estamos no estágio de refatoração ou no estágio de desenvolvimento.

Isenção de responsabilidade

Code Smells são apenas minha opinião .

Créditos

Foto de Dannie Jing no Unsplash


Quando estou estudando código, a refatoração me leva a níveis mais altos de compreensão que, de outra forma, perderia. Aqueles que descartam a refatoração de compreensão como uma manipulação inútil do código não percebem que nunca veem as oportunidades escondidas por trás da confusão.

Martin Fowler


Mais 5 cheiros de código estão chegando em breve…