Principio KISS aplicado en C#

Resumen

El principio KISS en C# te ayuda a escribir código simple, legible y libre de sobreingeniería. Si estás aprendiendo buenas prácticas de programación, esta guía te muestra cómo identificar nested ifs, reemplazar bucles for con LINQ y aplicar lambda expressions para reducir líneas innecesarias.

¿Qué significa el principio KISS en programación?

KISS son las siglas de Keep It Simple, Stupid, aunque también lo encuentras como Keep It Short and Simple para evitar el tono brusco de la palabra original. La idea central es que tu código resuelva el problema con la menor cantidad de elementos posibles, sin fragmentar ni complicar lo que puede resolverse de forma directa [0:30].

¿Qué es la sobreingeniería? Es cuando diseñas una aplicación demasiado grande o compleja para resolver algo simple. La frase que lo resume bien: nunca uses una bazuca para matar una mosca.

Separar responsabilidades es buena práctica, pero llevarla al extremo te lleva al efecto contrario. La clave está en ajustar la solución a la complejidad real del problema: cuando algo es sencillo, aplica algo sencillo.

¿Cómo identificar un nested if y por qué deberías evitarlo?

Un nested if ocurre cuando colocas un if dentro de otro if para validar condiciones que perfectamente podrían ir juntas. Es uno de los errores más comunes que rompen el principio KISS [2:00].

En el proyecto de C# de la clase, había exactamente ese caso: dos validaciones encadenadas que solo verificaban una condición adicional. La solución fue mover ambas condiciones al mismo if, eliminando un bloque completo y dejando el código más limpio.

  • Antes: un if externo y otro if interno con una sola comprobación.
  • Después: un único if que combina ambas condiciones.
  • Resultado: menos líneas, misma funcionalidad, lectura inmediata.

Este cambio no afecta el comportamiento, pero sí mejora drásticamente la mantenibilidad. Y aquí viene lo interesante: cuando alguien más lea tu código, entenderá la intención sin tener que rastrear bloques anidados.

¿Cómo reemplazar un for loop con LINQ y foreach en C#?

Los bucles for y foreach son útiles para recorrer colecciones, pero .NET tiene una librería llamada LINQ que extiende las colecciones con métodos para transformar y manipular datos de forma más expresiva [3:30].

En la clase se reemplazó un for que imprimía cada tarea de una lista por un TaskList.ForEach con una lambda expression, equivalente a una arrow function en JavaScript. Así se eliminó la necesidad de acceder a la lista por índice con TaskList[i].

¿Qué es una lambda expression? Es una función anónima y corta que se escribe en línea. En C# se usa con la sintaxis p => acción, donde p representa cada elemento de la colección.

¿Cómo enumerar tareas con un contador dentro del foreach?

Al pasar de for a foreach, pierdes el índice automático. Para recuperarlo, creas una variable, por ejemplo indexTask, y la incrementas dentro de la lambda.

Aquí entra un detalle clave: la diferencia entre post-incremento y pre-incremento.

  • Si inicializas indexTask en cero y usas post-incremento (indexTask++), la primera tarea se imprime como cero.
  • Si quieres que empiece en uno, tienes dos opciones: usar pre-incremento (++indexTask) o inicializar la variable en uno y mantener el post-incremento.

El resultado final es una sola línea que recorre la lista, imprime cada tarea y la numera correctamente. Lo que antes ocupaba varios bloques quedó reducido a una expresión clara.

¿Cómo verificar que el código sigue funcionando tras aplicar KISS?

Después de cada refactor, valida siempre que nada se rompió. En el proyecto se usaron dos comandos básicos de la CLI de .NET [6:40]:

  1. dotnet build para confirmar que el código compila sin errores.
  2. dotnet run para ejecutar la aplicación y probar el flujo.
  3. Agregar una tarea nueva (por ejemplo, task one) y listarla para confirmar la numeración.

Cuando la salida muestra 1. task one, sabes que el cambio fue exitoso y que aplicaste KISS sin alterar el comportamiento.

¿Cuándo no debo simplificar el código? Cuando el problema realmente es complejo. KISS no significa evitar abstracciones necesarias, sino no inventarlas cuando no aportan valor.

La práctica que te recomiendo: revisa tu propio repositorio y busca nested ifs, bucles que podrían usar LINQ o variables que podrías eliminar. Comparte en los comentarios qué refactor hiciste y cómo quedó tu código después.