Sunday, October 28, 2007

Más y más novedades

Comenzaré por indicarles los sitios específicos para acceder a todo lo referente con Silverlight 1.0 y 1.1. Descargas, ejemplos, y más recursos para acomodarse en primera fila, y poder aprender una tecnología que muy pronto estaré compitiendo fuertemente con el ya conocido Flash y demás engendros!!
http://www.microsoft.com/silverlight/halo3.aspx
http://weblogs.asp.net/scottgu/
http://silverlight.net/
http://silverlight.net/learn/learnvideos.aspx
Ayuda intellisense para Silverlight aqui:
http://weblogs.asp.net/scottgu/archive/2007/08/01/vs-2008-javascript-intellisense-for-silverlight.aspx
Y si quiere un alfa de Silverlight 1.1 para trabajrlo desde VS.NET
http://silverlight.net/getstarted/

El señor Miguel de Icaza y Su Moonlight, el Silverlight para Linux, mmm.
http://mono-project.com/Moonlight
Yo le sugeriria a los de Mono que primero organicen mejor esta página.

Y esto si para comprar palomitas. Microsoft libera el Service Pack I de Microsoft .NET Micro Framework SDX 2.0, para todo lo referente con Hardware Miniatura, ofreciendo las siguientes características:

  • Integración con VS
  • Librerias y drivers de código manejado
  • Emulador extensible
  • Protecciónde memoria flash
  • Herramienta de gestión de la memoeria flash
  • Herramienta de generación de fuentes

Para mayor información:
http://www.microsoft.com/downloads/details.aspx?FamilyID=32f5df20-6c95-4fe8-a76c-0ed56a839ad2&DisplayLang=en

Friday, October 19, 2007

ListBox Multiselect

Hola de nuevo

Hace unos dias, adicioné un control ListBox a una de mis páginas. El control debería utilizar la propiedad SelectionMode = Multiple, permitiendome seleccionar varias opciones del control.  Para mi sorpresa, cuando intentaba hacer esto, y en mi código detectar las opciones seleccionadas, sencillamente solo me retornaba como seleccionada, la primera opción.
Supongamos que cargo mi control en el primer postback de este modo:

if

(!Page.IsPostBack)
{
  ListBox1.Items.Add(
new ListItem("Rock and Roll","1"));
  ListBox1.Items.Add(
new ListItem("Country","1"));
  ListBox1.Items.Add(
new ListItem("Salsa", "1"));
}

Diganme que notan algo peculiar, porque a mí me tomó medio dia darme cuenta del causante de este problema. Si señores, el código asociado a cada opción es el mismo, ese es el "problema". No es cuestión de fijarle AutoPostback=true al control, como sugieren algunos foros, no es fijar la propiedad SmartNavigation=true en VS.NET 2003, no es la forma de recorrer el control para saber qué opciones están seleccionadas, no señores, deben es evitar que el código se repita, y de este modo el problema desaparace. Por ejemplo cuando tengan esto en un botón que me permita imprimir los items seleccionados, el programa debe funcionar sin ningun problema, y sin mostrar como seleccionada solo la primera opción de su listado.

foreach
(ListItem miItem in ListBox1.Items)
{
  if (miItem.Selected)
    Response.Write(miItem.Text);
}

Dos moralejas, primera hay foros alimentados por personas realmente perversas que terminan confundiendo a sus usuarios y segunda, a mí modo de ver aqui hay o un bug o algo que a mí parecer no debería tener este comportamiento.

Feliz solución!!

Saturday, October 13, 2007

Escribiendo buen código parte I

Hola de nuevo

En esta ocasión quiero comenzar con una serie de ejemplos que muestren cómo se debe escribir buen código en las aplicaciones. Es decir, tener en cuenta los recursos de la máquina en la que se van a ejecutar nuestras aplicaciones, ya que aunque hoy en dia el hardware nos favorece en gran medida nuestras metidas de pata con el software, en cualquier momento nuestras aplicaciones se van a ver seriamente afectadas en rendimiento, y por lo tanto llegar a causar errores o el serio aburrimiento de nuestros usuarios.

Utilizar propiedades en nuestras aplicaciones es mi primer recomendado:

1. No más variables públicas, no más métodos al estilo get y set.
2. Las propiedades son el mejor remedio para la encapsulación, si señores ellas exponen nuestros miembros de datos como parte de una interfaz pública.
3. Las propiedades nos permiten acceder nuestras variables y al mismo tiempo manipular su comportamiento, ya que las propiedades utilizan métodos.
4. Escribiendo propiedades tenemos acceso en un solo punto, para cambiar, o agregar funcionalidad según lo necesitemos. Por ejemplo, si decidimos que nuestro cliente no deberá aceptar nombres en blanco podemos hacer lo siguiente:

public class Customer
{
  private string _name;
  public string Name
  {
    get
    {
      return _name;
    }
    set
    {
      if (( value == null ) ||
        ( value.Length == 0 ))
        throw new ArgumentException( "Name cannot be blank",
          "Name" );
      _name = value;
    }
  }

  // ...
}

Con esto ya no tenemos el problema causado por las variables públicas, donde tendríamos que buscar en cada lugar de nuestro mar de código, donde esa variable se utilizó para hacer algo similar en muchas partes del código.

5. Adicionar manejo de hilos es mucho más sencillo, o si no que lo diga el ejemplo:

public string Name
{
  get
  {
    lock( this )
    {
      return _name;
    }
  }
  set
  {
    lock( this )
    {
      _name = value;
    }
  }
}

6. Ya que técnicamente las propiedades son métodos, estas heredan todas sus características, por ejemplo poder ser virtuales:
public class Customer
{
  private string _name;
  public virtual string Name
  {
    get
    {
      return _name;
    }
    set
    {
      _name = value;
    }
  }

  // remaining implementation omitted
}

Propiedades abstractas, o quiza ser parte de una definición de interfaces:

public interface INameValuePair
{
  object Name
  {
    get;
  }
  object Value
  {
    get;
    set;
  }
}

7. En C# 2.0 podemos establecer diferentes modificadores de acceso para los métodos get y set de nuestras propiedades. Por ejmplo, esto es válido:

// Legal C# 2.0:
public class Customer
{
  private string _name;
  public virtual string Name
  {
    get
    {
      return _name;
    }
    protected set
    {
      _name = value;
    }
  }

  // remaining implementation omitted
}

8. Igualmente el uso de indexadores en las propiedades es permitido, haciendo de esto algo muy poderoso:

public int this [ int index ]
{
  get
  {
    return _theValues [ index ] ;
  }
  set
  {
    _theValues[ index ] = value;
  }
}

// Accessing an indexer:
int val = MyObject[ i ];

9. La legibilidadd del código es una ventaja más, ya que accedemos a nuestros miembros de clases utilizando nombres significativos y fáciles de entender para asignar u obtener la data.
string name = customerOne.Name;
customerOne.Name = "This Company, Inc.";

Esto y otras consideraciones son muy importantes, y nos pueden ahorrar dolores de cabeza más adelante. Les queda de tarea analizar por ejemplo qué ocurre con el MSIL generado para nuestras propiedades. Y finalmente decilres que a nivel de desempeño, entre propiedades y métodos normales que accedan campos públicos, aunque estos últimos pudieran en algun momento dado ser más rápidos, la verdad es que el comportamiento inline de los métodos definidos para las propiedades, hace que el JIT o el compilador justo a tiempo del Framework, ponga a la par en rendimiento las diferentes técnicas. No olviden, los miembros deben ser privados y nuestras propiedades serán los puntos por los cuales accedemos y modificamos la información de dichos miembros.

Feliz buena práctica!!