Wednesday, November 29, 2006

dos chequeos en uno usando bool.TryParse

Me acabo de encontrar un codigo mas o menos asi:

bool b = bool.TryParse(ConfigurationManager.AppSettings["SomeSetting"].ToString(), out b);

Pueden ignorar el hecho de que no estoy checando valores NULL en el appsettings.

A primera vista pense que era un bug, pero luego leyendo la documentacion, escribi un pequeña prueba y algo de investigacion usando Reflector, resulta que hace exactamente lo que necesitaba

bool.TryParse no regresa el valor que resulta de la conversion del string que le pasamos; sino que regresa true o false, indicando si la conversion se realizo exitosamente, el valor de la conversion se regresa en el parametro out (que es la misma variable en este caso). Asi que la unica forma de regresar true es

  • Que la conversion se realize exitosamente
  • Que el valor sea true

Asi que ya no necesito hacer 2 chequeos

if (bool.TryParse(someVariable, out b))

  if (b)...

...De esas pequeñas pero peligrosas lineas de codigo que luego nos muerden...

Monday, November 27, 2006

Impulsando las bitacoras en español

Creo que sería interesante ver como nuestro ranking crece en Google y cualquier buscador de blogs. Para ello es que se creó GoMeme 4.0. Parece además interesante que cada bloggero en el círculo de UBH, se adhiera al proyecto y ayude a que su propio blog sea mas visible a las máquinas de búsqueda, no por el simple link, sino porla múltiple interrelación entre los enlaces que se generan gracias a todos aquellos que entran en el ‘juego’. Fervientemente los invito a continuar y a ayudarnos en el experimento, porque éste nos es un artículo ordinario. Se ha agregado información especial al final. Lea el artículo completamente y trate de seguir las instrucciones para su debida propagación.

La fuente siempre merece el crédito.Por qué no continuamos los enlacen en español?

NOTA: Asegúrese de agregar links reales en el listado de abajo.

Por ahora se estima que existen más de un millon de bitácoras. Pero la mayoria de ellas no son visibles para los robots de búsqueda. Solo algunas “A-List” bitácoras aparecen a la cabeza en los resultados mostrados para un determinado tópico, mientras que la mayoria de las bitácoras ni siquiera son identificados. La razón es que las bitácoras más pequeñas no tienen suficientes enlaces(links) que se dirijan a ellos mismo. Pero este post podria solucionar eso!. Ayudemos a que las bitácoras más pequeñas sean más visibles a las maquinas de búsqueda!

El post aunque esta en Inglés es GoMeme 4.0. Esto es parte de un experimento para ver si nosotros podemos crear un post que ayude a 1000 bitácoras, a obtener posicionamientos mas altos en Google. Hasta ahora hemos tratado tres primeras variaciones. Nuestro primera prueba, GoMeme 1.0, se difundió a cerca de 740 bitácoras en dos y medio dias. Esta nueva version 4.0 es mas corta, mas simple, y encaja mas fácilmente dentro de tu bitácora.

Por qué estamos haciendo esto? Queremos ayudar a que miles de bitácoras obtengan mayor visibilidad en Google y otras máquinas de búsqueda. Cómo funciona? Solo sigue las instrucciones de abajo y republica este post en tu propia bitácora y agrega tu URL al final de la lista mostrada abajo. De la misma manera que este “meme” se propague en forma progresiva desde tu bitácora, asi mismo lo hará tu URL. Mas tarde, cuando tu bitácora sea puesta enlistada en las máquinas de búsqueda, ellas verán los enlaces apuntando hacia tu bitácora desde todo ese flujo de bitácoras que se enlazaron a través de ti, lo cual hará que ubiquen tu bitácora en una posicion superior cuando se muestren los resultados. Todos los que estan en la lista de abajo se beneficiarán en forma similar cuando este “meme” se difunda. Únete!

Instrucciones: Copia y pega este post completamente en un post de tu bitácora. A continuación agrega tu URL al final de la lista, y continúa la cadena!

Lista de Origen

1. Memes en español
2. Madurando con sentido
3. Cavaju
4. Momentanea
5. Imagenes de un talibano
6. MordorBlog
7. El oso
8. Sin imprenta
9. ALT1040
10. WR276
11. El Ecuador de hoy
12. Juan Javier
13. kevinhurlt
14. metablog
15. Mi mundo
16. Derrames intelectuales
17. Fatima Protesta
18. Erebe
19. Calú
20. Alex Vera
Mas enlaces
21. Bloggus
22. DeVilSoulBlack
23. Solo dehajo ser
24. Cero Cuatro
25. Enfoque de usuario
26. Jesús Nieves Montero
27. Gandika
28. El Catalejo
29. Curioseando
30. El especialista
31. Victor Solano
32. Alvaro Sanchez
33. A veces hace falta
34. Un mundo de ideas
35. Ciberescrituras
36. Cuarenton
37. Not etra be
38. Blogófago
39. Urbe y existencia
40. Blogpocket
41. eCuaderno
42. El ventanuco
43. Opiniones
44. Si puedo
45. El arbol de Diana
46. Desarrollo en la red
47. Sergio Rastafurbi
48. Hipótesis21
49. Con valor
50. My Space
51. Un poco de cada
52. Rufadas
53. La paradoja posible
54. Oabareload
55. Territorio enemigo
56. Hachemuda
57. il Maistro
58. Apocalypsofacto
59. Cladestinidad Pedagógica
60. Methos 189
61. Colombia Hoy
62. Redtales
63. Alambre
64. Domingo 1967
65. Veo y pienso
66.Union de Bloggers Hispanos
67.Celica
68.Netcódigo e Internet
69.AlexSanhz Blog
70.Negocios e Internet en Hispanoamérica
71.Aspirar la cultura
72.Recuerdos Inútiles
73.K-minos
74.…Y otras escusas para conocerte
75.Ursula Zabaleta
76.Anime-Tronic
77.Carballada
78.Magabe
79.El Mar de las Tormentas
80.Poeta Multimedia
81.agaponeo´s
82.Venezuela descubierta
83.Marujeitor
84.De todo un poco de aqui y de allá
85.equinoXio
86.Cartas de Miramar(Original cartas de Cuba)
87.Blog and Roll
88.De la vida y algo más
89.True Blog en Espaniol
90.Globalizado
91.El Útero de Marita
92.El que nace pa martillo
93.El Blog de Paki
94.All Cuzco
95.Moebius
96.Blog-o-Corp
97.Magazín Oscarín
98.Seguridad en línea
99.Semiótica
100.Lino Resende
101.Any way you want it
102.La Maldición de Sisifo
103.Otro día trabajando
104.El geek
105.Area 303
106.El blog de rianvanu
107.Detrás del viento norte
108.14 de Abril
109.En sus narices
110.http://zeitan.blogsome.com/go.php?http://www.lacoctelera.com/tazzie
111.Erotízate
112.Tijuana
113.Miralmundo
114.La nueva historia
115.Que tiro
116.Simplemente un voyeur
117.Chiara
118.Sin nombre fijo
119.Energy Blog
120.Compartiendo
121.Reflexologia Podal
122.Geomujer XXI
123.Laberinto de Pasiones
124.El blog del Cowboy
125.Historias Intimas Subtropicales
126.El Blog de la Bruja
127.Hispanos por la Causa
128.Santuario Atziluth
129.G3nergy
130.12 de septiembre
131.Lamerse el codo
132.Patton en el país del sagrado corazón
133.Apodérate
134.Los 80´s
135.Ejemplos Liberales para gente de Izquierdas
136.Quo vadis?
137.Iveldie, cine independiente y de terror
138.Sin Miedo
139.Mario House
140.Mi rincón favorito
141.Aquellos años dorados
142.Barrio Los Rosales de La Coruña
143.Crónicas de Zeitán
144.El Blog de Percy Reyes™ : Evolucionando [Geeks.ms]

145.Que quieres desarrollar hoy?

146.(Tu URL va aquí! Pero primeramente, por favor copia esta linea y múevela un espacio hacia abajo para que sea usada por la proxima persona)

Thursday, November 09, 2006

Reusando codigo, siguiente nivel

El codigo para este articlo esta escrito en C# (probado en VS2005)

Hace algunos dias (mientras andaba de vacaciones) lei un articulo en latindevelopers: Ordenando objetos con IComparer; el cual me recordo un error muy comun que cometen muchos programadores: usar sentencias condicionales dentro de (no muy obvios) ciclos (por ejemplo en callbacks o eventos paint) lo cual resulta en un tipo de (no muy obvio) codigo duplicado.

En Delphi encontramos este error muy comunmente en el desarrollo de componentes, especificamente en el evento Paint donde usan sentencias "if" para decidir que font usar, colores, etc. y lo que es peor, muchas veces crean una instancia (de las clases que se necesitan) en cada iteracion; por supuesto, todos esos objetos no cambian, a menos que cambies una propiedad del componente!!, por lo cual esos objetos deberian ser "cacheados" (cached) y mantenerlos en variables donde simplemente se puedan reusar; asi es, reusar codigo no significa solamente re-usar clases, o partir el codigo en metodos mas pequeños para hacerlos reusables, cachear objetos puede ser una forma de reusar codigo ya que nos evita sentencias condicionales y las reemplaza con llamadas directas al codigo que requerimos.

Vamos a ver el codigo del ejemplo original, especificamente la clase PersonComparer, esta tiene un constructor que toma un parametro SortField y lo guarda en un campo que se usa despues en el metodo Compare

public PersonComparer(SortField sortField) {
this.sortField = sortField;
}
public int Compare(object x, object y) {
if (!((x is Person) & (y is Person))) {
throw new
ArgumentException("Los objetos deben ser de tipo Person.");
}

switch (sortField) {
case SortField.Name:
return
Comparer.DefaultInvariant.Compare(
((Person)x).Name, ((Person)y).Name);

case SortField.LastName:
return
Comparer.DefaultInvariant.Compare(
((Person)x).LastName, ((Person)y).LastName);

case SortField.Age:
return
((Person)x).Age - ((Person)y).Age;

default:
throw new
ArgumentException("Tipo de ordenamiento desconocido.");
}
}

Talvez no es tan facil verlo aqui porque el ejemplo no usa genericos, vamos a ver que podemos hacer usando genericos (si hay un tipo TimeZone2 en el .NET framework, porque no puedo yo escribir una clase PersonCompare2? =oP)

    public class PersonComparer2<T> : System.Collections.Generic.IComparer<T> where T:Person {
delegate int ComparerDelegate(T x, T y);
ComparerDelegate comparerDelegate;

Ahora tenemos la declaracion de un delegado, una variable de ese tipo, y eliminamos la variable del tipo SortField, vamos a ver el constructor:

public PersonComparer2(SortField sortField) {
switch (sortField) {
case SortField.Name:
comparerDelegate = delegate(T x, T y) {
return x.Name.CompareTo(y.Name);
};
break;
case SortField.LastName:
comparerDelegate = delegate(T x, T y) {
return x.LastName.CompareTo(y.LastName);
};
break;
case SortField.Age:
comparerDelegate = delegate(T x, T y) {
return x.Age - y.Age;
};
break;
default:
throw new
ArgumentException("Tipo de ordenamiento desconocido");
}
}

En vez de cachear la variable SortField, aqui estoy cacheando el metodo que se ejecutara cuando la comparacion se lleve a cabo; finalmente, vamos a ver el metodo Compare:

public int Compare(T x, T y) {
return comparerDelegate(x, y);
}

Puedes ver el beneficio? (si quieres ve una pagina arriba para que veas el codigo original) la decision de que metodo usar para la comparacion se ejecuta solo una vez (en el constructor), y ya despues podemos usarlo directamente, en vez de hacer la misma pregunta una y otra vez en cada iteracion.


Cada vez que veas una sentencia condicional dentro de un ciclo o un metodo que se ejecute en algun tipo de loop (como eventos Paint, callback, etc) considera usar esta tecnica, te ayudara a construir codigo mucho mas estructurado y mas rapido, tambien considera usar arreglos o diccionarios de metodos para reemplazar tus sentencias condicionales.


El concepto aplica a programacion en general, pero la implementacion puede variar (bastante) de un lenguage a otro, la idea principal es cachear objetos / metodos de alguna manera que no tengas que repetir sentencias condicionales para crear objetos o decidir que bloque de codigo ejecutar.


El codigo completo (junto con el codigo original) lo puedes encontrar aqui, como siempre, juega con el, aprende de el, y mejoralo