Manual de Clean Code
Manual de Clean Code
Guía para implementar código fuente siguiendo estándares oficiales, como Microsoft o SOLID,
en los desarrollos de C# de las app´s de cualquier empresa.
Objetivo
El equipo IT de empresa comparte código fuente entre sus diferentes miembros. El objetivo del
presente documento es proporcionar guías para unificar la implementación del mismo en las
diferentes app´s de La empresa y así mejorar la vida diaria de los desarrolladores en el
mantenimiento del código fuente: resolución de bug´s, evolutivos, mejoras, etc… .
Introducción
Clean Code significa código limpio, código legible, código claro que se entiende, que es fácil de
leer y de interpretar, es un código que es fácil de extender y/o adaptarse a cambios.
Nace como repuesta a las malas costumbres en un sector presionado por preocupaciones
financieras sobre la responsabilidad del desarrollador, consiguiendo que en el sector sea
habitual desarrollar código que “funciona” antes que desarrollar código que funciona y que
además sea limpio, legible, extensible y bien estructurado. En definitiva, un código que puede
ser interpretado por humanos fácilmente y no solo por el compilador: “todo el mundo puede
implementar código que sepa leer un computador, pero no todo el mundo puede implementar
código que pueda leer un humano”.
Cuantas veces se ha oído “lo hago así porque no tengo tiempo”, se puede pensar que es como
decir “no hago bien mi trabajo porque no tengo tiempo, así que lo hago mal para tenerlo antes”.
Al final todo esto son herramientas y definiciones para ser un buen profesional del desarrollo de
software pero hay que saber aplicarlo con lógica y sentido común.
La belleza del código debe verse como herramienta, no como objetivo. No podemos
eternizarnos en corregir un bug urgente cuando seguramente no sea el mejor escenario para
andarse con sutilezas. Hay que ser inteligentes, existen momentos puntuales en los cuales una
chapuza (momentánea) puede solucionar un problema gordo y ahorrar mucho dinero a la
empresa (la cual nos paga). Cada solución tiene su contexto y es nuestra labor saber elegir la
mejor solución a realizar según las circunstancias.
El código limpio (clean code) no es algo recomendado o deseable, es algo vital para las
compañías y los programadores. La razón es que cada vez que alguien escribe código
enmarañado y sin pruebas unitarias (código no limpio), otros tantos programadores pierden
mucho tiempo intentando comprenderlo, invierten esfuerzo y crece el desánimo. Incluso el
propio creador de un código no limpio si lo lee a los seis meses será incapaz de comprenderlo y
por tanto de evolucionarlo.
1
Existe la regla del Boy Scout “Hay que dejar el código mejor de cómo lo encontraste”. Esto va en
la línea de la mejora continua y de la imposibilidad de hacerlo perfecto a la primera.
En la fase de refactorización es donde realmente aplicamos todos los aspectos vistos de código
limpio: aumentar cohesión, dividir clases, modularizar aspectos, elegir nombres adecuados… Es
imposible hacer un código limpio a la primera, así que es necesario refactorizar después de que
el código funcione, y es necesario hacerlo antes de pasar a la siguiente tarea.
Probablemente, el mayor enemigo del código limpio es el código duplicado. El código duplicado
hace que nuestro código sea más difícil de mantener y comprender, además de generar posibles
inconsistencias. Hay que evitar el código duplicado siempre. Para ello, dependiendo del caso
concreto, la refactorización, la abstracción o el uso de patrones de diseño de diseño pueden ser
nuestros mejores aliados.
Utiliza método o funciones, encapsulamiento de código con una sola responsabilidad. Puedes
hacer parametrizable. Pon un nombre descriptivo a esa función con el cual, con tan solo leer su
nombre, se sabe lo que va a hacer.
Las funciones, métodos o clases deben hacer lo que (razonablemente) se espera de ellas. Es
decir, una función o una clase debe tener, en función de su nombre, un comportamiento obvio
para cualquier programador, sin que este tenga la necesidad de sumergirse en su código....
ExcelUtil: se entiende que es una clase con métodos para trabajar con el formato de
ficheros Excel; ejemplos: dar un xlsx a partir de una tabla, devolver una tabla a partir
de un xlsx, transformar un xlsx a csv, etc…
ZipUtil: se entiende que es una clase con métodos para trabajar con el formato de
ficheros Zip; comprimir un zip, extraer un zip, etc..
2
El principio de Responsabilidad Única (la S de los principios SOLID), hace referencia al diseño de
nuestras clases. Dice que: «una clase debe tener una y solo una razón para cambiar». Debe tener
una única responsabilidad, solo debe hacer una cosa (la que indica su propio nombre).
El desarrollador a lo largo de su vida profesional lee más código que el que escribe. Por ello
debemos poner especial interés en escribir correctamente. Un buen nombre da mucha más
información que cualquier otra cosa, debemos elegirlo bien, sabiamente y no decidirlo a la
ligera.
Todos los nombres (métodos, clases, etc…) deben ser intencionados, claros y descriptivos.
Los nombres cuanto más cortos mejor, siempre que sean explícitos y claros.
Funciones
Deben ser reducidas y con nombre descriptivos. Solo deben hacer una cosa.
Intentar evitar los parámetros de salida (out o ref): son confusos, mejor funciones que retornen
valor.
Funciones sin efectos secundarios, que hagan lo que dice su nombre y nada más oculto.
Comentarios
3
Los comentarios solo están justificados cuando no somos capaces de expresarnos con el código.
En general, basta con escribir y encapsular en una función que se llame como lo que hay en el
comentario.
Comentarios incorrectos:
Formato
Indentar el código.
Clases
El tamaño debe ser reducido y debe tener una única responsabilidad: la que indica su nombre.
El código muerto, bien que no se ejecuta nunca o bien que está comentado directamente, se
elimina: existe source control. Esto también aplica a variables/propiedades sin usar. Incluyendo
using´s sin usar o dll´s del proyecto.
Sustituir números mágicos por constantes con nombres correctos, también aplica a string´s.
4
Sintaxis
- Nomenclatura CamelCase:
Incorrectos:
String name
Int32 index
Boolean isSaved
Correctos:
string name
int index
boolean isSaved
- Se debe usar el tipo implícito var solo si en la parte derecha de la asignación queda claro
el tipo:
Incorrectos:
Correctos:
- El nombre de los archivos de código fuente debe coincidir con la clase. Y debe
haber uno por cada clase/interfaz/enum. No es lógico/sano meter en un fichero
todo el proyecto (cajón de sastre).
// Archivo Task.cs
5
public partial class Task
Incorrectos:
UserGroup usrGrp
Correctos:
UserGroup userGroup
Incorrectos:
Correctos:
- Para referenciar a las diferentes instancias de la clase dentro de ella misma usamos
this, base si está en la herencia.
- Los using´s dentro del namespace. Y borrar de ellos las partes innecesarias.
- Usar siempre que se pueda la cláusula using antes que close y/o dispose.
6
var fullName = $"{name} {firstName} {lastName}";
Incorrectos:
bool ok;
public bool Validate()
bool car;
Correctos:
bool isOk;
public bool IsValidate()
bool hasCar;
Incorrectos:
Correctos:
if!(string.IsNullOrEmpty (field03))
Incorrecto:
if (field03 != "" && field03 != null)
{
this.D_Concepto_impuesto =
field03.Trim().ToUpper();
}
else
{
this.D_Concepto_impuesto = "";
}
Correcto:
this.D_Concepto_impuesto = string.IsNullOrEmpty(field03)
? field03.Trim().ToUpper()
: string.Empty;
7
Arquitectura
Consiste en separar la interfaz gráfica (ui), la capa de negocio (bll) y la capa de acceso a datos
(dal). Las aplicaciones de La empresa por lo general deben usar esta arquitectura.
Cada capa está dividida según su funcionalidad y cuando se quiere modificar el sistema basta
con cambiar un objeto o conjunto de objetos de una capa. Esto se llama modularidad.
Independencia. No es lógico/sano meter en un proyecto todo la app (cajón de sastre)
Es más fácil la detección de errores y por tanto su resolución. Es más fácil los cambios.