He tenido la ocasión de impartir clases de C entre jóvenes desarrolladores, y me he dado cuenta de que ciertos errores se repiten en casi cada uno de ellos. Se trata principalmente de errores que, una vez te percatas, no los vuelves a cometer porque son fáciles de recordar. Sin embargo, sin un desarrollador no es consciente de ellos, puede causar muchos problemas en la eficiencia de la aplicación y en la calidad del software desarrollador. Es por eso que me he decidido a compilar los 7 errores más frecuentes de los programadores de C.
Concatenar cadenas en lugar de utilizar StringBuilder
La concatenación de cadenas funciona de tal manera que cada vez que se agrega algo a una cadena, se está asignando una nueva dirección en la memoria. La cadena anterior se copia en una nueva ubicación con la parte que acabas de agregar. Esto es ineficiente. Hay que recordar que existe StringBuilder, que mantiene la misma posición en la memoria sin realizar la operación de copia. Gracias a los strings añadidos por medio de StringBuilder el proceso es mucho más eficiente, sobre todo en caso de que tengas cientos de operaciones de agregación.
//INCORRECTO List values = new List(){"Esto ","es ","Esparta ","!"}; string outputValue = string.Empty; foreach (var value in values) { outputValue += value; }
//CORRECTO StringBuilder outputValueBuilder = new StringBuilder(); foreach (var value in values) { outputValueBuilder.Append(value); }
LINQ – Where con First en lugar de FirstOrDefault
Muchos programadores encuentran cierto conjunto de elementos por medio de 'Where' y luego vuelven a la primera ocurrencia. Esto es inadecuado, debido a que el método 'First' también puede aplicar la condición 'Where'. Nunca debe darse por sentado que el valor siempre se va a encontrar. Si se utiliza "First" cuando no se encuentra el valor, se produce un error. Por lo tanto, es mejor utilizar FirstOrDefault. Al utilizar FirstOrDefault, si no se ha encontrado ningún valor, se devolverá el valor por defecto de este tipo y no se lanzará ninguna excepción.
//INCORRECTO List numbers = new List(){1,4,5,9,11,15,20,21,25,34,55}; return numbers.Where(x => Fibonacci.IsInFibonacciSequence(x)).First();
//PARCIALMENTE CORRECTO return numbers.First(x => Fibonacci.IsInFibonacciSequence(x));
//CORRECTO return numbers.FirstOrDefault(x => Fibonacci.IsInFibonacciSequence(x));
Casting por medio de (T) en lugar de as (T) cuando posiblemente no es casteable
Es muy común que los desarrolladores de software utilicen el casting (T), en lugar de as (T). Y por lo general, no tiene ninguna influencia negativa porque los objetos casteados son siempre casteables. Sin embargo, si hay incluso una ligera probabilidad de que un objeto pueda ser no casteable, se debe utilizar el casting as (T).
//INCORRECTO var woman = (Woman)person;
//CORRECTO var woman = person as Woman;
No utilizar mapeadores para reescribir propiedades
Hay una gran cantidad de mapeadores de C # muy potentes (por ejemplo AutoMapper). Si unas pocas líneas de código simplemente se conectan propiedades reescritas, es sin duda lugar para un mapeador. Incluso si algunas propiedades no se copian directamente, sino que se lleva a cabo alguna lógica adicional, utilizar un mapeador sigue siendo una buena opción
Relanzar excepciones incorrectas
Los programadores de C# suelen olvidar que cuando lanzan una excepción utilizando throw ex pierden el seguimiento. Es entonces cuando se hace más difícil el depurar una aplicación y lograr los mensajes de log adecuados. Cuando simplemente usando throw no se pierden datos y toda la excepción, junto con el seguimiento, puede ser recuperada fácilmente.
//INCORRECTO try { //some code that can throw exception [...] } catch (Exception ex) { //some exception logic [...] throw ex; }
//CORRECTO try { //some code that can throw exception [...] } catch (Exception ex) { //some exception logic [...] throw; }
Usar foreach en vez de for para cualquier cosa
Recuerda que si deseas iterar a través de todo lo que no sea una colección (por ejemplo, un array), utilizar el bucle for es mucho más eficiente que el uso del bucle 'foreach'
Recuperar o guardar datos en base de datos en más de 1 de llamada
Este es un error muy común, especialmente entre los desarrolladores junior y especialmente cuando utilizas un ORM como Entity Framework o NHibernate. Cada llamada a la DB consume una cierta cantidad de tiempo, por eso es crucial disminuir la cantidad de llamadas a la DB tanto como sea posible. Hay muchas maneras de hacer esto, solo debes informarte.
Fuente: goyello.com