Cuando la lógica condicional silencia las señales críticas
TL;DR: Saltar los informes de estado en las ramas condicionales provoca retrasos silenciosos y condiciones de carrera.
TL;DR: Saltar los informes de estado en las ramas condicionales provoca retrasos silenciosos y condiciones de carrera.
Problemas
- Usuarios retrasados
- Pobre experiencia
- Tiempos impredecibles
- Iniciación incompleta
- Dependencias ocultas
- La mala gestión política
- Los fracasos silenciosos
- Compatibilidad retroactiva
Soluciones
- Validar todos los caminos de código
- Utilización de mecanismos de información por defecto
- Los casos de prueba de Edge rigurosamente
- Refactor Policy verifica tempranamente
- Hacer pruebas de rendimiento
- Mover informes fuera de los condicionados
Contexto
Cuando se añade lógica condicional (por ejemplo, políticas de grupo) al código de inicialización, saltar pasos críticos como los informes de disponibilidad provoca retrasos en todo el sistema.
Los casos de borde son condiciones excepcionales que ocurren fuera de los parámetros de funcionamiento normales.
Cuando no manejas correctamente estos casos de borde, tu código puede comportarse de manera impredecible.
EsteNoticias del blog de MicrosoftDestaca un ejemplo clásico donde falta el manejo de casos de bordecausó que Windows 7 tuviera tiempos de inicio de sesión más lentos cuando los usuarios eligieron un fondo de color sólido en lugar de una imagen de fondo.
El código responsable de cargar los fondos de escritorio casi "listo" sólo cuando cargó con éxito una imagen de fondo.
Pero cuando los usuarios seleccionaron un fondo de color sólido (un caso de borde), este camino de código nunca desencadenó la notificación "listo".
Como resultado, el sistema esperó el tiempo completo de 30 segundos antes de proceder con la secuencia de inicio de sesión.
Este problema muestra cómo la falta de un caso de borde aparentemente pequeño puede afectar significativamente la experiencia del usuario.
Lo que debería haber sido un proceso de inicio de sesión de 5 segundos se convirtió en un frustrante retraso de 30 segundos para los usuarios que eligieron una opción de configuración simple.
Multiplica este inocente retraso de 30 segundos por cada usuario que tenía la versión.
El buen diseño de software requiere que usted considere todos los caminos posibles a través de su código, no sólo los comunes.
Cuando se saltan los casos de manejo del borde, se crea una deuda técnica que se manifiesta como misteriosos problemas de rendimiento, temporadas y malas experiencias de los usuarios.
Código de muestreo
equivocado 🙂
public static class WallpaperInitializer
{
private static bool wallpaperWasDefined = false;
public static void InitializeWallpaper()
{
if (wallpaperWasDefined)
// Assume this was defined previously
// and PLEASE DON'T use NULLs in case you hadn't
{
LoadWallpaperBitmap();
Report(WallpaperReady); // Missed if wallpaper is undefined
}
// No default report, causing delays
}
private static void LoadWallpaperBitmap()
{
}
private static void Report(string status)
{
// The Asynchronous loading keeps on
}
}
Derecho
public static class WallpaperInitializer
{
private static bool wallpaperWasDefined = false;
public static void InitializeWallpaper()
{
if (wallpaperWasDefined)
{
LoadWallpaperBitmap();
}
Report(WallpaperReady);
// Always report, regardless of condition
}
private static void LoadWallpaperBitmap()
{
}
}
Detección
- [x] Semi-automático
Utilice herramientas de análisis estático para marcar los condicionantes que guardan las llamadas críticas de reportaje.
Las revisiones de código deben verificar que todos los caminos de inicialización señalen la finalización.
Tags ️
- El desempeño
Nivel
- [x] El Intermedio
¿Por qué es importante la bijeción ️
El comportamiento del sistema en el mundo real (por ejemplo, la velocidad de inicio de sesión) depende de la modelización precisa de los estados de preparación.
El software debe mantener una correspondencia uno a uno entre los estados del mundo real y los estados del programa.
Cuando los usuarios seleccionan un fondo de color sólido en Windows, esa elección representa un estado real válido.
(Mi elección personal también regresó entonces)
El programa debe modelar correctamente esta elección con un estado del programa correspondiente que se comporte correctamente.
Cuando rompe esta bijeción al no manejar los casos de borde, introduce desconecciones entre las expectativas del usuario y el comportamiento del sistema. En este ejemplo, los usuarios esperaban que su elección de un fondo de color sólido funcionara normalmente, pero en su lugar experimentaron misteriosos retrasos.
La bijeción que falta crea disonancia cognitiva: "He hecho una elección simple, ¿por qué mi ordenador se comporta extrañamente?"
Cada bijection roto introduce una grieta en el modelo de fiabilidad del sistema, lo que lo hace cada vez más impredecible con el tiempo.
La ruptura de este vínculo causa discrepancias entre las expectativas del usuario y la ejecución del software, lo que lleva a retrasos impredecibles yMapaviolaciones del mundo real.
La generación
Los generadores de IA pueden crear este olor al envolver ingenuamente el código heredado en condicionales sin validar todos los caminos.
Detección
Pide a la IA que "asegure que los informes de estado se ejecuten en todas las ramas", y se marcará o arreglará este olor al mover Report() fuera de las condicionales.
¡Pruébelo!
Recuerda: los asistentes de IA cometen muchos errores
Prompt sugerido: encontrar los otros informes perdidos
Prompt sugerido: encontrar los otros informes perdidos
Without Proper Instructions |
With Specific Instructions |
---|---|
Conclusión
Siempre señale la finalización incondicionalmente en el código de inicialización.
La lógica condicional debe modificar el comportamiento, no silenciar los pasos críticos de información.
Relaciones
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxxii
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxxx
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xviii
Más información
Disclaimer
Los olores son míosOpinión.
La prueba conduce al fracaso, y el fracaso conduce a la comprensión.
La prueba conduce al fracaso, y el fracaso conduce a la comprensión.
Burt Rutan
Este artículo es parte de la serie CodeSmell.