paint-brush
Cómo encontrar las partes apestosas de su código [Parte XXXIV]por@mcsee
725 lecturas
725 lecturas

Cómo encontrar las partes apestosas de su código [Parte XXXIV]

por Maximiliano Contieri7m2023/04/07
Read on Terminal Reader

Demasiado Largo; Para Leer

Huele porque es probable que haya muchos casos en los que podría editarse o mejorarse. La mayoría de estos olores son solo indicios de algo que podría estar mal. Por lo tanto, no es necesario que se arreglen per se... (Sin embargo, debe investigarlo). Olores de código anteriores Puede encontrar todos los olores de código anteriores (Parte i - XXXIII) aquí.
featured image - Cómo encontrar las partes apestosas de su código [Parte XXXIV]
Maximiliano Contieri HackerNoon profile picture

Huele porque es probable que haya muchos casos en los que podría editarse o mejorarse.


La mayoría de estos olores son solo indicios de algo que podría estar mal. Por lo tanto, no es necesario que se arreglen per se... (Sin embargo, debe investigarlo).

Olores de código anteriores

Puedes encontrar todos los olores del código anterior (Parte i - XXXIII) aquí .


Continuemos...


Code Smell 166 - Errores de bajo nivel en la interfaz de usuario

Error fatal: error no detectado: clase 'logs_queries_web' no encontrada en /var/www/html/query-line.php:78


Rastreo de pila: #0 {main} lanzado en /var/www/html/query-line.php en la línea 718


TL; DR: Atrapa tus errores. Incluso los que no esperas.

Problemas

  • Seguridad


  • Manejo de errores


  • Registro de errores


  • Mala experiencia UX

Soluciones

  1. Utilice un controlador de nivel superior.


  2. Evite idiomas que favorezcan los códigos de retorno .


  3. Espere errores de base de datos y de bajo nivel.

Contexto

Incluso en 2022, podemos ver sitios web "serios" que muestran a los usuarios ocasionales un mensaje de pila o depuración.

Código de muestra

Equivocado

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

Bien

 <? // 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");

Detección

  • [x] Automático

Podemos usar pruebas de mutación para simular problemas y ver si se manejan correctamente.

Etiquetas

  • Seguridad

Conclusión

Tenemos que seguir madurando.


Nuestras soluciones no deben ser descuidadas.



Necesitamos mejorar nuestra reputación como ingenieros de software serios.

Relaciones

Code Smell 72 - Códigos de retorno

Más información

Fallar rapido

Descargo de responsabilidad

Code Smells es solo mi opinión .

Créditos

Foto de jesse orrico en Unsplash


El 80 por ciento de mis problemas son simples errores lógicos. El 80 por ciento de los problemas restantes son errores de puntero. Los problemas restantes son difíciles.

marca donner

Grandes citas de ingeniería de software


Code Smell 167 - Comparación de hashing

Hashing garantiza que dos objetos son diferentes. No es que sean iguales.


TL; DR: si verifica el hash, también debe verificar la igualdad

Problemas

Soluciones

  1. Verifique el hash (rápido) y luego verifique la igualdad (lento)

Contexto

El 7 de octubre de 2022, una de las cadenas de bloques más grandes tuvo que detenerse.


Esta noticia fue impactante ya que la mayoría de las cadenas de bloques están descentralizadas por definición.


Puedes leer un artículo completo aquí:

Cómo un pirata informático robó $ 566 millones de dólares explotando un olor de código

Código de muestra

Equivocado

 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 }

Bien

 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 }

Detección

  • [x] Semiautomático

Muchos linters tienen reglas para la redefinición de hash y de igualdad.


Con las pruebas de mutación, podemos sembrar diferentes objetos con el mismo hash y verificar nuestras pruebas.

  • Identidad
  • Seguridad

Conclusión

Toda mejora del rendimiento tiene sus inconvenientes.


Los cachés y las replicaciones son ejemplos notables.


Podemos (debemos) usarlos con cuidado.

Relaciones

Code Smell 49 - Cachés

Code Smell 150 - Comparación igual

Más información

Igualdad y Hash

Código hash en Java

Hashcode vs Igual

Descargo de responsabilidad

Code Smells es solo mi opinión .


Esto sorprenderá a algunos de sus lectores, pero mi principal interés no es la seguridad informática. Estoy principalmente interesado en escribir software que funcione según lo previsto.

Wietse Venema

Grandes citas de ingeniería de software


Code Smell 168 - Decisiones no documentadas

Tenemos que hacer algunos cambios. Tenemos que tener claro por qué

TL; DR: sea declarativo en sus decisiones de diseño o implementación.

Problemas

  • Código Comentarios
  • Falta de capacidad de prueba

Soluciones

  1. Sea explícito acerca de las razones.
  2. Convierta el comentario en un método.

Contexto

A veces encontramos reglas arbitrarias que no son tan fácilmente comprobables.


Si no podemos escribir una prueba fallida, necesitamos tener una función con un nombre excelente y declarativo en lugar de un comentario.

Código de muestra

Equivocado

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

Bien

 increase_memory_to_avoid_false_positives(); run_process();

Detección

  • [x] Semiautomático

Este es un olor semántico.


Podemos detectar comentarios y avisarnos.

Etiquetas

  • Comentarios

Conclusión

El código es prosa. Y las decisiones de diseño deben ser narrativas.

Relaciones

Code Smell 05 - Abusadores de comentarios

Code Smell 75 - Comentarios dentro de un método

Descargo de responsabilidad

Code Smells es solo mi opinión .

Créditos

Foto de Goh Rhy Yan en Unsplash


Los programas, como las personas, envejecen. No podemos prevenir el envejecimiento, pero podemos comprender sus causas, limitar sus efectos y revertir parte del daño.

mario fusco

Grandes citas de ingeniería de software


Code Smell 169 - Métodos pegados

No hagas dos o más cosas a la vez.

TL; DR: Trate de ser lo más atómico posible en sus métodos

Problemas

  • Código acoplado
  • Más difícil de probar
  • más difícil de leer

Soluciones

  1. romper el método

Refactorizaciones

https://maximilianocontieri.com/refactoring-002-metodo-extraccion

Contexto

Si nombra un método con 'Y', probablemente esté perdiendo una oportunidad de método de extracción y ruptura.

Código de muestra

Equivocado

 calculatePrimeFactorsRemoveDuplicatesAndPrintThem() // Three responsibilities

Bien

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

Detección

  • [x] Semiautomático

Algunos linters pueden advertirnos sobre métodos que incluyen el término 'y'.

Etiquetas

  • Acoplamiento

Conclusión

A la hora de crear métodos, es muy importante jugar a la historia del patito de goma y decirnos a nosotros mismos si estamos haciendo las cosas bien.

Relaciones

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

Descargo de responsabilidad

Code Smells es solo mi opinión .

Créditos

Foto de Scott Sanker en Unsplash


Aprender el arte de la programación, como la mayoría de las otras disciplinas, consiste en aprender primero las reglas y luego aprender cuándo romperlas.

Josué Bloch


Code Smell 170 - Refactor con cambios funcionales

El desarrollo es genial. la refactorización es increíble. No lo hagas al mismo tiempo

TL; DR: No cambie funcionalmente y refactorice al mismo tiempo.

Problemas

  • Soluciones difíciles de revisar
  • Fusionar conflictos

Soluciones

  1. Nunca cambie la funcionalidad durante la refactorización

Contexto

A veces detectamos que se necesita una refactorización para un mayor desarrollo.


Somos expertos en aprender.


Deberíamos poner nuestra solución en espera. Trabaje en la refactorización y continúe con nuestra solución.

Código de muestra

Equivocado

 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

Bien

 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

Detección

Este es un olor de refactorización.

  • [x] manuales

Etiquetas

  • refactorización

Conclusión

Deberíamos usar un token físico.


O estamos en la etapa de refactorización o en la etapa de desarrollo.

Descargo de responsabilidad

Code Smells es solo mi opinión .

Créditos

Foto de Dannie Jing en Unsplash


Cuando estoy estudiando código, la refactorización me lleva a niveles más altos de comprensión que de otro modo me perdería. Aquellos que descartan la refactorización por comprensión como un jugueteo inútil con el código no se dan cuenta de que nunca ven las oportunidades ocultas detrás de la confusión.

Martín Cazador


Próximamente llegarán 5 olores de código más...