Showing posts with label C#. Show all posts
Showing posts with label C#. Show all posts

Reference App (C#, XAML y ¿algoritmia?)

Hoy es día de presentarles otra app, en este caso es una que conjunta varias de las cosas que aprendí en MVA ya que se trata de una implementación "completa", es decir la conexión con la base de datos, el servicio web y la aplicación cliente. La idea de la aplicación fue simular una guía de consulta que suelen emplear los competidores en concursos de programación y digo simular puesto que:

  1. es muy poco probable que en una competencia te permitan sacar tu teléfono o tablet.
  2. el contenido de la app es bastante genérico, probablemente sea mejor que tu tengas una guía que hayas hecho tu a tu medida
En fin, la descripciones de las aplicaciones son:

Reference.Data
Ubicadoen el servidor (este proyecto es una librería de clases), el código facilita la conexión a la base de datos alojada en azure, conexión hecha con la ayuda del Entity Framework V 6.1.1

Reference.WebRole
Este proyecto aloja el servicio web al cual se realizan las consultas, es decir, se conecta con Reference.Data.

Reference.Cloud
Es solo un proyecto que envuelve el WebRole y permite que sea publicado como un servicio de la nube de Azure.

Reference.Apps.Shared
Proyecto compartido que contiene todos los rescursos y clases que tienen en común las aplicaciones para Windows y Windows Phone, recursos como estilos, ViewModels y la conexión al servicio web.

Reference.Apps.Windows
El proyecto de la aplicación para Windows 8.1 que contiene código específico de para tablet/pc. Hace uso del paquete de Nuget MVVM Light (solo liberías).

Reference.Apps.WindowsPhone
El proyecto de la aplicación para Windows Phone 8.1 que contiene código específico de para el teléfono. Hace uso del paquete de Nuget MVVM Light (solo liberías).

Reference.Tools.CodeTransformer
Una herramient simple para transofrmar el código para que sea almacenado en la base de datos a algo que el servicio web y las aplicaciones puedan entender.

Otra cosa a resaltar es que todo el código está disponible en CodePlex para su descarga, y las aplicaciones están también en la tienda. Por el momento la app carece de contendio, cosa que espero ir ampliando a la par de mi aprendizaje en el Club de Algoritmia de ESCOM:



¡Saludos!
@fferegrino :)

Aprende ruso


De nuevo en época de vacaciones aproveché el tiempo y me puse a completar cursos en MVA, uno de ellos, llamado Designing Your XAML UI with Blend Jump Start me motivó a crear una aplicación un tanto diferente a las que ya había hecho, y es que esta es visualmente más atractiva.

La aplicación en cuestión se llama Aprende Ruso, y como su nombre lo indica, es una pequeña guía para los que apenas van iniciando en el aprendizaje de esa extraño idioma. La aplicación tiene cosas simples, como las letras, algunos números y frases comunes, la idea es que la iré extendiendo conforme aprenda más de el lenguaje.

Técnicamente la aplicación hace uso de algunos controles para Windows 8.1 y Windows Phone 8.1, además de que ambos proyectos comparten la misma lógica, bajo el concepto de las Universal Apps de Windows, es por ello que al momento de que descargas la app en una de esas dos plataformas tienes automáticamente disponible la descarga para la otra. Por cierto, tengo todo el código fuente en un repositorio de GitHub, por si le quieres echar un ojo, mejorarla o contribuir con el desarrollo.

Usa los enlaces para descargar la app para tu dispositivo:


¡Saludos!
@fferegrino :)

Prácticas de Aplicaciones para comunicaciones de red

Pues ya estoy de vuelta en la escuela, y esta vez de nuevo hay una asignatura que me da la oportuindad de escribir código, me refiero a la Aplicaciones para comunicaciones de red (o Redes II, pa' los cuates). Al profe le gusta que hagamos prácticas y pues se me ocurrió otra vez abrir un repositorio de GitHub para publicarlas ahí, además de colaborar con mi compañera de equipo @FannyEvia.

Hasta ahora llevamos un servidor de FTP y un carrito de compras...  sobra decir que son muuuuy sencillas, pero funcionan para conocer el concepto, de ahí se pueden hacer tan complejos como uno desee. Las prácticas son solicitadas en Java o C, así que será lo principal que se pueden encontrar en el repositorio, sin embargo C# también se merece una mención, así que en la medida de lo posible también procuraré hacerlas en ese lenguaje.

Ya saben, pueden mirar el código y preguntar :)


¡Saludos!
@fferegrino :)

Los Windows Runtime Components

Hace tiempo descubrí (en MVA) los Runtime Components, estos funcionan como librerías que nos permiten compartir código de distintos lenguajes dentro de una misma plataforma. Es decir, podemos usar código escrito en Visual Basic dentro de una aplicación hecha con C#, o un caso más extremo, y el que más me "impresionó": usar C++ en una aplicación hecha con Javascript. Y digo dentro de una misma plataforma ya que al contrario de las PCL, en este caso solo pueden funcionar para un solo sistema.

Lo que se genera junto con este tipo de proyectos son los metadatos para hacer nuestro código accesibles desde cualquier otro proyecto que haga referencia a él, de tal manera que si creamos un componente en C# desde C++ lo podamos llamar sin escribir ni una sola línea más de código y con la sintaxis del lenguaje desde el que estemos llamándolo.

En este caso me referiré a Windows 8, sin embargo me parece que también existen para Windows Phone 8. El ejemplo es bastante sencillo se trata de un método para realizar una suma, sin embargo es bastante extendible y muy funcional cuando se sabe como usarlos. Desde luego, tiene sus resticciones, pero siempre hay alguna forma de darles la vuelta o encontrar una mejor manera de hacerlo (¡por algo son restricciones!)

De tal manera que podríamos tener el siguiente código en C++:

Suma.h
#pragma once

namespace BlogPost_Component
{
    public ref class Suma sealed
    {
    public:
  // Propiedades
  int a;
  int b;
  // Métodos
  int Resultado();
  // Constructores
  Suma(int x, int y);

    };
}

Suma.cpp
// Suma.cpp
#include "pch.h"
#include "Suma.h"

using namespace BlogPost_Component;
using namespace Platform;

Suma::Suma(int x, int y)
{
 this->a = x;
 this->b = y;
}

int Suma::Resultado(){
 return a + b;
}

De tal modo que podemos usar la clase desde C# de esta manera:
private void Button_Click(object sender, RoutedEventArgs e)
{
 int n1 = int.Parse(numero1.Text);
 int n2 = int.Parse(numero2.Text);

 var suma = new BlogPost_Component.Suma(n1,n2);

 resultado.Text = suma.Resultado().ToString();
}

En JavaScript así:
function accionBoton(sender) {
 var n1 = parseInt(document.getElementById('numero1').value);
 var n2 = parseInt(document.getElementById('numero2').value);

 var suma = new BlogPost_Component.Suma(n1, n2);

 document.getElementById('resultado').textContent = suma.resultado();
};
Y en Visual Basic así:
Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
 Dim n1 As Integer = Integer.Parse(numero1.Text)
 Dim n2 As Integer = Integer.Parse(numero2.Text)

 Dim suma As New BlogPost_Component.Suma(n1, n2)

 resultado.Text = suma.Resultado().ToString()
End Sub

El código del ejemplo anterior puede ser descargado aquí.

Como hobbie me puse a convertir el proyecto de la Codificación de Huffman a una aplicación para Windows 8 (escrita en JavaScript con el código de la codificación en C++), hasta el momento me he encontrado con algunas dificultades relacionadas con el acceso a archivos desde aplicaciones Metro, como sea, el proyecto está en GitHub.

PD: Lamento mencionarlo hasta ahora, pero solo es posible crear los componentes en C#, C++ y Visual Basic, lo sentimos, JavaScript.

¡Saludos!
@fferegrino :)

Algoritmos probabilistas

Las últimas prácticas de Análisis de algoritmos ( :'( ), esta vez es otro tipo de algoritmos, aquellos que emplean en azar para resolver el problema que se les asignó. A estos se les llama probabilistas y según la Wikipedia en español, hay de tres tipos; mismos tipos que nos tocó ejemplificar mediante algunos algoritmos conocidos empleando POO (lo cual es un poco difícil para ejemplos tan sencillos), son los siguientes:
Integración de Monte Carlo
Apelando al hecho de que una integral es la sumatoria de la infinidad de resultados de evaluar una función en un intervalo dado, se toman puntos de evaluación aleatorios dentro de ese intervalo dado, se evalúan y se van acumulando para luego realizarles un ajuste matemático, les diría que lo buscaran en Wikipedia, pero este documento me resultó especialmente revelador.

Para el caso de la implementación de POO lo que se consideró fue la creación de dos clases Random y Funcion, la primera para generar números aleatorios y la segunda para evaluar la función.

Aproximación a π
Para este caso se toma un cuarto de círculo de radio = 1, y se lanzan n dardos hacia él de esos n dardos supongamos que m aciertan en él entonces mediante matemágia, podemos encontrar que  π ≈ 4 * m / n

Para (mal) aplicar la POO, existe una clase que hace uso de Random, la clase definida en el ejericio anterior y de otra, llamada Aproximación en la cual se realiza la simulación de los dardos

Comprobación de primalidad (Algoritmo Monte Carlo)
Existe un test de primalidad, inventado por Fermat que nos dice que si tomamos la siguiente frómula a^(n-1) % n para cualquier número a ∈ [1,n-1] y si el resultado de eso es distinto de 1 entonces sabemos que n no es primo. Tomando una gran cantidad de números con valores aleatorios para a ∈ [1,n-1] podríamos asegurar con cierta probabilidad si un número n es primo. Si el test falla, es decir el resultado para cualquiera a es distinto de 1 podemos asegurar que n no es primo.

Resolución del problema de las N reinas (Algoritmo Las Vegas)
El ya conocidísimo problema delas N reinas también se puede resolver mediante probabilidad, es decir, tomamos la columna 1 y colocamos la primera reina, después para la segunda columna tratamos de colocar la siguiente reina en una posición elegida aleatoriamente, si se logró, continuamos con la siguiente columna, y así hasta colocar las N reinas o no poder colocar una, en ese caso falla.
Bastante simple.
Las primeras dos corresponden a la práctica 5, implementada en C++, y la segundas están implementadas en C#, con interfaz gráfica para Windows Phone 8 en XAML. El código, en analizando-algo.

¡Saludos!
@fferegrino :)

"Mapeando" de procedimientos almacenados a clases en C#


Hace rato, mientras no tenía clase me dispuse a escribir un pequeño programita para facilitarme la vida con algo (asquerosamente tedioso) que tenía que hacer. Y es que lo que tenía que hacer hasta parece arcaíco: Se trata de hacer consultas desde una aplicación web a una base de datos mediante procedimientos almacenados, para ello hay que generar una clase asociada al procedimiento para facilitar la persistencia de los datos dentro de la aplicación.

Hay consultas enoooooooooooooooooooooormes, inclusive hay algunas de más de 20 o 30 columnas lo cual representa perder mucho tiempo creando la clase asociada, aunque a decir verdad yo no lo hago por el tiempo, sino por el aburrimiento que representa hacerlo. Acá mi propuesta de solución:

La idea que se me ocurrió fue colocarles una especie de "clave" para conocer el tipo de dato de cada columna así como el nombre que usaría para ella dentro de la aplicación. La clave elegida fue: --|tipo de dato|nombre dentro de la aplicación  dada la facilidad con la que una cadena de ese tipo es fácilmente encontrable usando expresiones regulares, para ello se requiere del siguiente patrón: --\|[a-zA-Z0-9]+\|[a-zA-Z0-9]+. Además en el programa usé una plantilla de texto T4 para generar el código, esas plantillas son útiles para generar código como en esta ocasión, el ejemplo es sencillo y fácil de entender.

Colgué el proyecto completo en GitHub para que todos pudieran descargarlo, yo pienso que le seguiré añadiendo funcionalidad conforme la vaya necesitando (hasta que me aburra de hacer otra cosa :P).

¡Saludos!
@fferegrino :)

Mis apps para Windows/Windows Phone 8

Últimamente he andado muy ocupado (no tanto), haciendo unas cuantas aplicaciones para Windows Phone 8 y Windows 8 esperando ser parte del programa Microsoft Student Partners 2013.  Al momento llevo 6 aplicaciones publicadas entre la Windows Store y la Windows Phone Store. De algunas ya les he contado y de otras no. En fin, son estas:

Cuantos días
¿Alguna vez has querido saber cuantos días faltan para una fecha importante? Ahora lo puedes saber, con Cuantos días para Windows Phone 8 ten siempre a la vista cuantos días faltan para tu cumpleaños, el re-estreno tu serie favorita o cualquier otra cosa.


C0NV3R7
Un sencillo convertidor entre sistemas numéricos. Convierte de los sistemas binario, octal, decimal y hexadecimal.
De esta ya les había hablado.



RecetApprio(La obra maestra)
Un recetario hecho para ti, que no tienes ganas ni dinero para cocinar algo "gourmet". Recetas simples y sencillas, elaboradas por un experto en la materia de alimentar personas de forma deliciosa, rápida y barata.
En esta conté con la colaboración en el diseño de Julio Montaño, al cual agradezco mucho :). Además aprovecha de los servicios en la nube de Windows Azure.


BombFlipper
Diviértete con este juego que combina el buscaminas y el sudoku para entretenerte como no tienes idea, ejercita tu cerebro tratando de llegar al nivel más alto que puedas y cuando estés ahí comparte tu récord con tus amigos.


El Agente
Diviértete ayudando a este despistado agente a recuperar los papeles que el viento se llevó, pero cuidado, hay algunos papeles que quizá no desee recuperar.


Ojalá puedan descargarlas y valorarlas, así mismo si estás interesado en el desarrollo de alguna de ellas mándame un correo y con gusto vemos cómo hacerle.

¡Saludos!
@fferegrino :)

Invertir una cadena [C#]

Durante la plática de reclutamiento para Microsoft que hubo hace unos días en la ESCOM hicieron una prueba a los asistentes, la prueba consistía en escribir el código de dos funciones:
Una capaz de invertir una cadena, es decir, pasar de "this is a string" a "gnirts a si siht"
Otra muy similar pero solo debía invertir las palabras, pasando de "this is a string" a "siht si gnirts"
Basándonos en un prototipo de función más o menos así:
char* reverse(const char* str)

El lenguaje a usar era cualquiera con el que te sintieras cómodo, C#, C, Java... en fin. La idea era que usaras la menor cantidad de herramientas provistas por el framework o por el lenguaje que escogiste (¡no se valía el .Reverse()!), es decir que todo lo hicieras "artesanalmente". Eso si, no recuerdo muy bien cuanto tiempo dieron para escribir.

Por suerte yo me había encontrado con un problema similar unos días antes, así que creo que no me fue tan mal en esta. Mi solución la propuse en dos lenguajes, C para la primera y (por cuestiones de tiempo) C# para la segunda. Ahora vengo acá a colocar mis soluciones un poco más pensadas y totalmente funcionales escritas en C#:

using System;
using System.Linq;
using System.Text;

namespace ReverseStringsMsft
{
    class Program
    {
        static void Main(string[] args)
        {
            string s = "this  is  a string";
            string res = Reverse(s);
            string resWord = ReverseWords(s);
            Console.WriteLine(s);
            Console.WriteLine(res);
            Console.WriteLine(resWord);
            Console.Read();
        }

        /// <summary>
        /// Invierte una cadena
        /// </summary>
        /// <param name="str">La cadena que será invertida</param>
        /// <returns>Una nueva instancia de String</returns>
        public static string Reverse(string str)
        {
            if (str == null)
                return null;
   // Convertir a un arreglo
            char[] cr = str.ToArray();
   // Llamamos a la funcion para toda la cadena
            Reverse(cr, 0, cr.Length - 1);
            return new string(cr);
        }

        /// <summary>
        /// Invierte las subcadenas (separadas por espacios) contenidas dentro de una cadena
        /// </summary>
        /// <param name="str">La cadena que será invertida</param>
        /// <returns>Una nueva instancia de String</returns>
        public static string ReverseWords(string str)
        {
            if (str == null)
                return null;
   // Convertir a un arreglo
            char[] cr = str.ToArray();
            int wordStart = 0;
            int end;
   // Recorremos la cadena para encontrar espacios
            for (int i = 0; i < cr.Length; i++)
            {
                char c = cr[i];
    // Por cada espacio o cada vez que lleguemos al final de la cadena
    // llamaremos a la funcion especialmente para la ubicacion de 
    // la palabra encontrada
                if (c == ' ' || i == cr.Length - 1)
                {
                    end = i - 1;
                    Reverse(cr, wordStart, end);
                    wordStart = i + 1;
                }
            }
            return new string(cr);
        }

        /// <summary>
        /// Cambia de posición los caracteres desde <paramref name="start"/> a
  /// <paramref name="end"/> hasta que todos estén invertidos
        /// </summary>
        /// <param name="str">El arreglo a ser invertido</param>
        /// <param name="start">Inicio</param>
        /// <param name="end">Final</param>
        private static void Reverse(char[] str, int start, int end)
        {
            for (; start < end; start++, end--)
            {
    // Cambiamos uno a uno los caracteres desde la posicion
    // inicial hasta la final, y aumentamos las variables para irlos 
    // intercambiando como deseamos
                char aux = str[start];
                str[start] = str[end];
                str[end] = aux;
            }
        }

    }
}


¡Saludos!
@fferegrino :)

C0NV3R7, convertidor entre bases numéricas


Esta vez vengo a contarles que el otro día mientras divagaba mi mente en la clase de Fundamentos de diseño digital se me ocurrió una "idea" para una app. Y es que digo "idea" porque no es nada nuevo, en clase estábamos viendo los distintos sistemas numéricos y la conversión entre ellos. Y pues de eso se trata la app: de un conversor numérico entre bases, pones un número y en seguida consigues su equivalente en octal, binario, decimal y hexadecimal.

En realidad el código es más que sencillo. La gran novedad es que en esta traté de emplear a fondo el patron de diseño MVVM, dejando toda la lógica de la aplicación en un ensamblado aparte, que usé para las plataformas Windows 8 y Windows Phone 8. En realidad la aplicación es tan sencilla que la interfaz usada en una es igual a la otra.

Pongo el link a las aplicaciones en la Windows Store y en la Windows Phone Store


Además del código del que salieron ambas aplicaciones:

C0NV3R7.rar

PD: Todo lo que he aprendido sobre Windows Phone fue gracias a estos vídeos hechos por Rodrigo Díaz Concha. Chéquenlos, están muy buenos.

¡Saludos!
@fferegrino :)

BombFlipper - Windows 8

Sé que tengo rato programando para Windows 8 y la verdad es que es divertido. Durante unos de esos arranques se me ocurrió hacer una versión de un minijuego incluído dentro de otro juego, el no tan famoso Voltorb Flip. No todo fue miel sobre hojuelas, puesto que sería mi primera aplicación hecha desde cero. 

La más dura decisión fue sobre qué tecnología escoger, dura decisión entre C# y XAML o HTML y JavaScript. De C# conozco mucho más que de JS, pero de HTML sé mucho más que de XAML Sinceramante para la interfaz prefería usar la magia de HTML con el poder de CSS, debido a la experiencia que tengo usándolo (además de que la otra opción era completamente desconocida para mi). Sin embargo, para la parte de la lógica solo pensaba en usar C# debido a la cantidad de cálculos necesarios para implementar el juego.

Al final me decidí por C# y su acompañante, porque se me hizo la opción más sólida y por que representaba un reto aprender sobre el desarrollo de interfaces, y es que, aunque el producto final no es de lo más pulcro considero que fue un buen aprendizaje.

Aún queda mucho por hacer, más que anda en la interfaz de usuario porque ni a mi me resulta muy amigable, los invito a descargar el juego en la liga que está más abajo. Si lo prueban les pudo que me comenten aquí o al correo su opinión y sugerencias.



¡Saludos!
@fferegrino :)

El problema del agente viajero y los algoritmos genéticos


Algoritmos genéticos
De las clases aprendí que los algoritmos genéticos son métodos de búsqueda y optimización inspirados en la evolución y en la base genética que esta implica. Para el uso de un algoritmo se genera un conjunto de soluciones posibles (nombraremos a cada una de estas soluciones "individuos") a nuestro problema (llamada población), esta población es mutada y recombinada mediante acciones aleatorias, como sucede en la evolución, además son sometidos a una evaluación para decidir cuales son los más aptos y separarlos del resto, que será descartado. En fin.


Llegó momento de entregar el proyecto final de la unidad de aprendizaje Genetic Algorithms, y como proyecto final elegí el clásico problema del agente viajero (Traveling Salesman Problem, TSP), y digo clásico porque en verdad resulta ser de los más usados para ejemplificar una de las muchas aplicaciones de este tipo de algoritmos.

TSP
El problema, más o menos, enuncia que: Un agente viajero tiene que visitar n ciudades sin pasar por la misma ciudad más que una vez, así mismo desea recorrer las ciudades trasladandose lo menos posible entre ellas, esto quiere decir que desea encontrar la ruta más corta para pasar por todas y cada una de ellas solamente una vez.

El problema es sencillo y se puede resolver con un algoritmo genético simple, basta con que se emplee técnicas permutativas (evitando así que se de una solución en la que se repitan ciudades para una ruta).

Solución
Para llegar a la solución de este problema escribí una pequeña aplicación en C#, en donde se emplea un algoritmo genético para llegar al resultado. 

Para la cruza se emplea el método de Cruza Cíclica, la mutación se realiza intercambiando dos genes seleccionados aleatoriamente y en la selección se elige a la mitad de individuos con mejores soluciones.

Código
Ahora sí, lo más interesante, además de lo ya mencionado dentro de la aplicación se usa la API de gráficos. Me da la impresión de que por ahí puede haber un poco de desperdicio de memoria pero pues ¡meh!
Traté de comentar el código todo lo que pude a manera de que quede claro así que espero les sirva y cualquier comentario y/o aclaración por correo, Twitter o en la sección de comentarios.

Encuéntralo en GitHub: Traveling Salesman Problem - C#

¡Saludos!
@fferegrino :)

Envío de correos "desde la base de datos" con .NET

Seguro hay otras maneras de hacerlo, pero cuando tienes que hacerlo rápido no hay muchas opciones, hablo de enviar correos periódicamente desde datos tomados de la base de datos.

Forma de uso
La solución que aquí propongo es de cierta manera "dinámica", ya que podemos usar este programita para enviar tantos correos como deseemos, lo único que necesitamos hacer es enviarle como parámetro el stored procedure del cual consultará los datos, el procedimiento le deberá devolver estas tres columnas al programa:

  • DESTINATARIOS: Una columna que contiene los correos a los cuales será enviado el mensaje. Los correos deberán ir separados por un ;.
  • ASUNTO: Contiene el asunto con el que será enviado el correo.
  • MENSAJE: El mensaje que contendrá el correo, puede ser HTML (recomiendo sea básico).



Como mencioné al principio de todo: probablemente haya mejores maneras de hacerlo ya que de esta manera dejamos toda la carga a la BD ya que es ella quien tendría que formar el mensaje, el dinamismo del que hablo radica en que nosotros podemos, con la ayuda del stored procedure sacar cualquier información que necesitemos de la base.

La forma de usar el programa es la siguiente:
$ SendMails storedProcedure
La mejor parte es que gracias a las tareas de Windows podemos programar el programa para que se ejecute periódicamente, tantas veces como deseamos y con un procedimiento distinto para enviar correos distintos cada ocasión.

Para configurarlo necesitamos poner nuestra cadena de conexión en el archivo app.config, así como los parámetros para enviar el correo, como el host, usuario, puerto...
<configuration>
  <appSettings>

    <add key="mailHost" value="smtp.gmail.com"/>
    <add key="mailUser" value="ejemplo@gmail.com"/>
    <add key="port" value="587"/>
    <add key="ssl" value="true"/>
    <add key="user" value="ejemplo@gmail.com"/>
    <add key="password" value="random*Pass"/>

  </appSettings>
  <connectionStrings>
    <add name="CON" connectionString="Data Source=localhost\SQL;Initial Catalog=DB;User ID=US;Password=PSWD" 
        providerName="System.Data.SqlClient"/>
  </connectionStrings>
</configuration>

SendMailsApp (Se incluyen las librerías de Microsoft Practices necesarias para que el programa funcione).

¿Tienes alma de desarrollador?

Si necesitas algo más especializado te dejo el código la solución del programa hecho en C# y con Visual Studio  para que lo modifiques a tu gusto.

Cualquier duda o comentario siempre es bienvenido :)

SendMailsSource (Se necesitan algunas librerías de Microsoft Practices incluídas en el enlace de arriba).

¡Saludos!
@fferegrino :)

La importancia de programar con estilo


Y al decir "programar con estilo" no me refiero a que estén todo el tiempo con los meñiques levantados, o sólo hacerlo las tardes a las 5 p.m.

Programar con estilo es hacer nuestros programas legibles, lo más documentados que podamos y siguiendo las convenciones que algunas comunidades de programadores suelen adoptar para que nuestro código sea "universal".

Si bien dicen que cada programador tiene su forma de hacer lo suyo (en lo cual creo que tienen razón), esto a veces se convierte en un problema cuando de optimizar, corregir o ampliar el código se trata. En el mejor de los casos recordaremos por completo lo que la variable asdflkj significa en nuestro código, pero imagínate que ya no recuerdas y tienes que andarle buscando por todos lados lo que realmente quisiste hacer. O PEOR AÚN: Imagínate que lo que tu desarrollaste hace tiempo ahora es responsabilidad de alguien más, ¡pobre de él!

"Pues mientras funcione", aplica, sí. Hay veces en las que es necesaria hacer una corrección rápida (bomberazo, le dicen), pero al final del día no olvides regresar y hacerlo de la manera correcta. Créeme te facilitarás la vida a ti y probablemente a tus colegas.

Creo que el problema viene desde las escuelas, por lo general al momento de entregar nuestros proyectos, tareas, prácticas, etc. nos conformamos con el "pues, funciona", esto debido a que pocas veces se trabaja varias veces sobre la misma cosa. Son entregas únicas y es por eso que prestamos muy poca atención a la manera en las que las hacemos. El ideal sería que al inicio del curso definiéramos sobre qué vamos a estar trabajando (una especie de proyecto a largo plazo) para forzarnos a darle mantenimiento al código, a mejorarlo  y por tanto hacer las cosas bien.

Ayudará bastante si en un momento dado entramos al mundo laboral en el cual sí se desarrolla constantemente sobre un mismo programa, el cual debería estar bien documentado y entendible para que pueda ser trabajado por varias manos, manos a las cuales les resulte sencillo manipularlo y no se pierda tiempo en preguntarle al de al lado "¿y esto qué hace?" o quedarnos rascando la cabeza un buen rato preguntándonos "¿para qué usé esto?".

Para nuestra fortuna existen algunas guías de estilo que nos muestran algunas de las convenciones acordadas, las cuales podemos no aceptar por completo desde el inicio sí es importante tenerlas en cuenta. Claro que uno puede inventar sus propias normas, lo importante es respetarlas siempre.

Amigo programador, te dejo unas guías de estilo que me encontré por ahí (cofcofintercofcofnetcof), recuerda que seguro hay alguna para tu lenguaje favorito.


Guía 1 C++Guía 2 C++Guía 3 C++Guía 1 C#Guía 2 C#Guía 1 JavaGuía 2 JavaGuía 1 PHPGuía 2 PHPGuía Phyton.

¡Saludos!

@fferegrino :)

Asignar trigger a un UpdatePanel en tiempo de ejecución (C#, ASP)

Supongamos que tenemos el siguiente escenario:
<asp:GridView ID="GridView1" runat="server">
 <Columns>
  <asp:TemplateField HeaderText="Botón">
   <ItemTemplate>
    <asp:ImageButton ID="ImageButton2" runat="server" />
   </ItemTemplate>

El botón ImageButton2 es inaccesible directamente dado que está contenido en un GridView, entonces no lo podríamos añadir como trigger para un UpdatePanel en el código como normalmente se haría:

<asp:AsyncPostBackTrigger ControlID="ImageButton2" EventName="Click" />
Entonces, lo que haremos será añadirlo dinámicamente en tiempo de ejecución.

 Nos valemos del evento OnLoad del control. Para que al momento de cargarse, se asigne como trigger al UpdatePanel en cuestión.

De tal manera el código quedaría así:

ASP:
<asp:GridView ID="GridView1" runat="server">
 <Columns>
  <asp:TemplateField HeaderText="Botón">
   <ItemTemplate>
    <asp:ImageButton ID="ImageButton2" runat="server" OnLoad="ImageButton2_Load" />
   </ItemTemplate>
Y C#:
protected void ImageButton2_Load(object sender, EventArgs e)
{
    ImageButton boton = (ImageButton)sender;
    UpdatePanel1.Triggers.Add(new AsyncPostBackTrigger { ControlID = boton.UniqueID, EventName = "Click" });
}

¡Listo! ahora nuestro ImageButton2 ha quedado registrado como trigger asíncrono para actualizar el UpdatePanel1

¡Saludos!
@fferegrino :)