Visual Studio Code Analysis

Hola,
A continuación un buen artículo al respecto de esta herramienta de análisis de calidad de código .NET, muy recomendable para dar la puntilla de calidad de vuestro código y ayudaros a identificar problemas de eficiencia, seguridad, estilo de codificación, etc.
Y todo esto integrado en el propio Visual Studio de serie en la versión Professional (se incorporó desde la versión 2012, en la 2010 se requería de una licencia Ultimate).
Artículo
Abrazos.
Miguel.

El valiente programador

Hola,
Me hacía gracia ver este artículo de la web GenBetaDev
https://www.genbetadev.com/paradigmas-de-programacion/codigo-sin-null
La verdad es que alguno he metido de este tipo y siempre te das cuenta que hay millones de opiniones, formas de dar la vuelta y, lo más seguro, alguien que te saque los colores porque aquello de lo que tú siempre has estado convencido resulta que estaba mal planteado o existía una solución mucho mejor.
Enhorabuena al valiente, sigue dándole que así seguimos aprendiendo entre todos.
Abrazos.
Miguel.

El antes y el después de LINQ

Problema: a partir de una lista de objetos de tipo “Coche”, quiero sumar el precio de cada uno de ellos agrupado por marca.
La clase coche tiene la siguiente forma
public class Coche
{
  public int IdCoche { get; set; }
  public string Matricula { get; set; }
  public int IdMarca { get; set; }
  public int NumeroPuertas { get; set; }
  public int Precio { get; set; }
  public Coche(int idCoche, string matricula, int idMarca, int numeroPuertas, int precio)
  {
     this.IdCoche = idCoche;
     this.Matricula = matricula;
     this.IdMarca = idMarca;
     this.NumeroPuertas = numeroPuertas;
     this.Precio = precio;
   }
}
Inicializamos una lista con objetos de la clase  Coche
List<Coche> lista = new List<Coche>();
lista.Add(new Coche(1, “3322-AAA”, 1, 3, 15000));
lista.Add(new Coche(2, “3322-EEE”, 2, 5, 25000));
lista.Add(new Coche(3, “3322-III”, 3, 3, 35000));
lista.Add(new Coche(4, “3322-OOO”, 1, 3, 18000));
lista.Add(new Coche(5, “3322-UUU”, 2, 5, 20000));
lista.Add(new Coche(6, “1111-AAA”, 3, 3, 150000));
lista.Add(new Coche(7, “1111-EEE”, 1, 3, 30000));
lista.Add(new Coche(8, “1111-III”, 1, 5, 28000));
lista.Add(new Coche(9, “1111-OOO”, 3, 5, 16000));
lista.Add(new Coche(10, “1111-UUU”, 1, 5, 9000));
Solución antes de LINQ (una de muchas)
Hashtable hash = new Hashtable();
foreach (Coche c in lista)
{
  if (!hash.ContainsKey(c.IdMarca))
  {
    hash.Add(c.IdMarca, c.Precio);
  }
  else
  {
    hash[c.IdMarca] = (int)hash[c.IdMarca] + c.Precio;
  }
}
IDictionaryEnumerator _enumerator = hash.GetEnumerator();
while (_enumerator.MoveNext())
{
  Console.WriteLine(String.Format(“Marca: {0}, Total Precio: {1}”, _enumerator.Key, _enumerator.Value));
}
Solución después de LINQ
var marcas = from m in lista
             group m by m.IdMarca into g
             select new { IdMarca = g.Key , TotalPorMarca = g.Sum (m => m.Precio) };
foreach (var marca in marcas)
{
  Console.WriteLine(String.Format(“Marca: {0}, Total Precio: {1}”, marca.IdMarca, marca.TotalPorMarca));
}
Resultado
Marca: 1, Total Precio: 100000
Marca: 2, Total Precio: 45000
Marca: 3, Total Precio: 201000
Saludos.

Genéricos

Uso de genéricos.
Ejemplo de Definición de Clase Genérica
public class Recurso<T>
{
T proyecto;
public void ResolverProyecto(T proyecto)
{
//TODO: Incluir código
}
}
Ejemplo de Instanciación
Recurso<granmarron> obj = new Recurso<granmarron>();
Conclusión
Al mal tiempo, buena cara.
Saludos.

¿Cuál es el error?

Por favor, echadle una ojeada a este pequeño artí­culo, me he quedado encantado:
https://desdesarrollodesoftware.blogspot.com/2009/02/cual-es-el-error.html
Un poco más ampliado el sentido del artí­culo anterior, lo podéis encontrar en el artí­culo siguiente:
https://desdesarrollodesoftware.blogspot.com/2009/02/la-respuesta-cual-es-el-error-la.html
Saludos.
Miguel.

Migrando de Escritorio a Web, el Problema de lo "static"

Paso a describir uno de los tí­picos problemas que suele aparecer a las personas que desarrollan normalmente aplicaciones de escritorio y que entrar a participar en un proyecto en el que se requiere desarrollos web.
En escritorio, es algo muy comíºn el utilizar propiedades estáticas (shared en VB.NET, static en C# y Java) para almacenar información que la aplicación necesita desde que arranca hasta que se cierra, o en algíºn formulario especí­fico donde se esté trabajando de manera desconectada de la base de datos. Por ejemplo, la información del usuario activo, o el listado de facturas que se están presentando en un formulario en concreto. En este ámbito el uso de propiedades estáticas funciona a las mil maravillas ya que la aplicación se ejecuta en el contexto del usuario y hay un íºnico usuario accediendo a la posición de memoria reservada por la propiedad estática.
El problema viene cuando intentamos hacer lo mismo en web, por ejemplo en la capa de presentación web, donde tenemos una página (aspx, php, jsp, jsf…) que muestra las facturas relacionadas a un determinado cliente, facturas que además, tras cada transacción que realizamos contra el formulario, van modificando su información. Si en este ámbito utilizamos una propiedad estática para almacenar las facturas, de igual manera que con la aplicación de escritorio, estamos compartiendo una íºnica instancia de la lista, pero esta vez con una pequeña diferencia, aunque tengamos 1 o 100 usuarios accediendo al formulario, todos están trabajando contra la misma aplicación, por lo que todos están trabajando con la misma lista de facturas. La consecuencia de esto es obvia, ante las modificaciones que realicen cualquiera de los usuarios sobre la lista (al ser la misma para todos), afectará al trabajo del resto de usuarios.
¿Soluciones? Para la web existen otro tipo de soluciones dependiendo del tipo de información a almacenar y del rendimiento que queráis obtener: Sesión, Caché, Viewstate (para aplicaciones ASP.NET), campos Hidden (vale, vale, se está liando mucho la cosa, pero funcionar funciona, aunque le tengas que meter muchas horas), y, por supuesto, guardando en base de datos, que viene siento lo habitual y más recomendable en la mayorí­a de los casos.
Cualquier duda sobre algíºn problema en particular, dejad vuestro caso en los comentarios e intentaremos encontrar la solución más eficiente para vuestro contexto. Por favor, indicad problema y requerimientos de sistema.
Saludos!
Miguel.

Explotando el método "Find" de listas genéricas. Predicados y Delegados.

Recientemente, en uno de los comentarios añadidos al post Mejorando Nuestros DAO y DTO, se ha tratado el uso del método Find en listas genéricas.
Dejo a vuestra disposición dos artí­culos que marcan sendos ejemplos de uso. Resulta una práctica que puede seros interesante en vuestros desarrollos.
Link 1
Link 2
Saludos y gracias a Ignacio por el apunte.
Miguel.

AjaxControlToolkit y WebResource.axd

AjaxControlToolkit es el conjunto de controles web ajax provistos por el propio Microsoft y totalmente compatibles con Visual Studio 2008 y Framework 3.5 de .NET.
Hoy hablaremos brevemente cómo resolver la problemática que nos podemos encontrar si combinamos el uso de dicho Toolkit con la seguridad básica de ASP.NET.
Ante claíºsulas como la descrita en la parte inferior:
<authorization>
<deny users=”*” />
</authorization>
estamos denegando el acceso a cualquiera de los recursos de la aplicación, a todos los usuarios que no cuenten con cierto tipo de autenticación. Cuando hablamos de recursos estamos hablando de recursos de cualquier tipo, entre los cuales estamos incorporando páginas aspx, javascript, imágenes, hojas de estilo, themes…
Para resolver el acceso total a recursos necesarios a nivel de aplicación como por ejemplo hojas de estilo, imágenes y javascript podemos combiar el anterior tag con el siguiente:
<location path=”images”>
<authorization>
<allow users =”*” />
</authorization>
</location>
donde podemos apreciar cómo para todos los usuarios estamos dando acceso a la carpeta donde estamos almacenando las imágenes. Si no hiciéramos esto, las páginas aspx se cargarí­an, pero no podrí­amos ver las imágenes que tuviéramos contenidas.
Algo muy similar pasa cuando utilizamos Ajax Control Toolkit, vamos a necesitar indicar la visibilidad de sus recursos a los usuarios para que puedan ejecutar los controles ajax, tanto la funcionalidad javascript que incorporan como sus imágenes y estilos relacionados. Para ello, no tenemos que dar permisos a una carpeta concreta, si no a un fichero que no es visible en tiempo de diseño, pero que sí­ podremos observar si lanzamos la aplicación. Se trata del archivo WebResource.axd.
Añadiendo el nuevo location
<location path=”WebResource.axd”>
<authorization>
<allow users =”*” />
</authorization>
</location>
conseguiremos nuestro objetivo. Nuestros controles ajax volverán a funcionar correctamente, veremos las imágenes relacionadas a los controles, así­ como sus estilos.
Saludos.
Miguel.