Monday, November 23, 2009

Ahorrando líneas de código en los operadores lógicos (PROGRAMACION)

Un ejemplo clásico de cómo incluimos muchas líneas de código de más es cuando hacemos uso de los operadores lógicos. Muchas veces nos olvidamos de los operadores lógicos ternarios y de que una expresión de comparación nos puede ahorrar una sentencia condicional IF completa.

Les detallo a continuación el ejemplo, que ubicaremos en un contexto.

Supongamos el ejemplo más sencillo: cuando tenemos una lista de opciones y en dependencia de la elegida queremos realizar varias acciones pero por lo general la más común es visualizar/ocultar determinada información.

Pudiéramos reflejar esto con el siguiente control agregado a un formulario web en asp.net.

<asp:DropDownList ID="sampleDropDownList" runat="server" AutoPostBack="true" OnSelectedIndexChanged="sampleDropDownList_OnSelectedIndexChanged">
    <asp:ListItem Text="Option 1" Value="0" Selected="True" />
    <asp:ListItem Text="Option 2" Value="1" />
</asp:DropDownList>
<br />
<br />
<asp:Label ID="option1Label" runat="server" Text="Option 1 Visible" Visible="true" />
<asp:Label ID="option2Label" runat="server" Text="Option 2 Visible" Visible="false" />

Como se puede observar tenemos dos simple opciones y un evento que manipularemos cuando el usuario las seleccione.

Y es aquí donde vemos líneas de código excesivas para algo tan simple.

protected void sampleDropDownList_OnSelectedIndexChanged(object sender, EventArgs e)
{
    if (sampleDropDownList.SelectedValue == "0")
    {
 option1Label.Visible = true;
 option2Label.Visible = false;
    }
    else
    {
 option1Label.Visible = false;
 option2Label.Visible = true;
    }
}

o también

protected void sampleDropDownList_OnSelectedIndexChanged(object sender, EventArgs e)
{
    switch(sampleDropDownList.SelectedValue)
    {
 case "0":
     option1Label.Visible = true;
     option2Label.Visible = false;
     break;
 case "1":
     option1Label.Visible = false;
     option2Label.Visible = true;
     break;
    }
}

Estas dos variantes, una mejor que la otra, adolecen del mismo problema: demasiadas líneas de código, al menos para mi gusto.

Podemos sustituirlo con estas sentencias, mucho más simples:

protected void sampleDropDownList_OnSelectedIndexChanged(object sender, EventArgs e)
{
    option1Label.Visible = sampleDropDownList.SelectedValue == "0";
    option2Label.Visible = sampleDropDownList.SelectedValue != "0";
}

Solo un par de líneas de código! Habrá quien quiera filosofar sobre si es más eficiente una sola comparación que varias, pero no entrare es este tema. Lo que sí es muy claro que la acción de visibilidad para cada "Label" queda en solamente una línea de código, no en varias. Este código es mucho más fácil de mantener y evita que por descuido actualicemos la visibilidad en una sola parte del IF: en la verdadera o la falsa.

Este es un caso que enfrentamos a diario y a veces el subconsciente y la prisa nos traicionan por nuestra forma natural de pensar de forma condicional.

Índice de la sección PROGRAMACION: http://deisbel.blogspot.com/2009/11/programacion-nueva-seccion.html

Artículo recomendado: ¿De dónde saca el dinero Google?