<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Gabriel Rodriguez Plancarte &#187; Mejores Practicas</title>
	<atom:link href="http://gabrielrodriguez.net/category/mejores-practicas/feed/" rel="self" type="application/rss+xml" />
	<link>http://gabrielrodriguez.net</link>
	<description>Tecnologia, Diseño, Negocios y Desarrollo</description>
	<lastBuildDate>Mon, 29 Mar 2010 07:58:45 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Automapper y un buen articulo de diseño de software</title>
		<link>http://gabrielrodriguez.net/automapper-y-un-buen-articulo-de-diseno-de-software/</link>
		<comments>http://gabrielrodriguez.net/automapper-y-un-buen-articulo-de-diseno-de-software/#comments</comments>
		<pubDate>Sat, 20 Mar 2010 06:36:38 +0000</pubDate>
		<dc:creator>Gabriel</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Arquitectura]]></category>
		<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[Mejores Practicas]]></category>
		<category><![CDATA[AutoMapper]]></category>
		<category><![CDATA[Patrones de Diseño]]></category>

		<guid isPermaLink="false">http://gabrielrodriguez.net/?p=716</guid>
		<description><![CDATA[
La semana pasada descubrí AutoMapper, que es un proyecto de .NET gratis y open-source de Jimmy Bogard.
Un desarrollador de la oficina me preguntó si había una manera integrada en el framework de transformar las clases generadas por LINQ-To-SQL en clases sencillas (DTOs). No creí que lo hubiera&#8230;pero le comenté que seguramente lo podía hacer por [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-728" title="Logo AutoMapper" src="http://gabrielrodriguez.net/wp-content/uploads/2010/03/automapper-logo.png" alt="Logo AutoMapper" width="480" height="49" /></p>
<p>La semana pasada descubrí <a title="AutoMapper" href="http://automapper.codeplex.com/">AutoMapper</a>, que es un proyecto de .NET gratis y open-source de <a title="Jimmy Bogard" href="http://www.lostechies.com/blogs/jimmy_bogard/default.aspx">Jimmy Bogard</a>.</p>
<p>Un desarrollador de la oficina me preguntó si había una manera integrada en el framework de transformar las clases generadas por LINQ-To-SQL en clases sencillas (DTOs). No creí que lo hubiera&#8230;pero le comenté que seguramente lo podía hacer por Reflection. Yo ya habia hecho eso antes, pero supuse que debía haber alguna mejor manera. Después de buscar un poco en StackOverflow.com, alguna de las respuestas linkeaba a AutoMapper y descubrí que era exactamente lo que aquel desarrollador estaba buscando.</p>
<p><strong>AutoMapper </strong>es descrito en su página principal de la siguiente manera:</p>
<p><em>AutoMapper uses a fluent configuration API to define an object-object  mapping strategy.  AutoMapper uses a convention-based matching algorithm  to match up source to destination values.  Currently, AutoMapper is  geared towards model projection scenarios to flatten complex object  models to DTOs and other simple objects, whose design is better suited  for serialization, communication, messaging, or simply an  anti-corruption layer between the domain and application layer.</em></p>
<p>Excelente&#8230;no solo utiliza <a title="Fluent Interfaces" href="http://en.wikipedia.org/wiki/Fluent_interface"><strong>interfaces fluidas</strong></a>, sino que también se basa en <a title="Convention over Configuration" href="http://en.wikipedia.org/wiki/Convention_over_configuration"><strong>Convention Over Configuration</strong></a>. Es decir&#8230;solo tenemos que (y podemos!) configurar las situaciones excepcionales. Las <strong>ventajas </strong>que le veo a utilizar AutoMapper (a pesar de estar incorporando una referencia más a nuestros proyectos) es que es un proyecto público (de open source) y que además tiene a un muy buen desarrollador respaldándolo, que por ser su proyecto, se enfoca en mejorarlo y perfeccionarlo con nuevas funcionalidades, haciéndolo más eficiente, etc. Además, debido a que ya tiene una considerable base de usuarios (3,702 downloads), la mayoría de los bugs que pudiéramos toparnos, ya han sido resueltos.</p>
<p>Un <strong>ejemplo </strong>exagerádamente básico del uso de AutoMapper:</p>
<pre class="brush: csharp;">

public class Class1
 {
   public string FullName { get; set; }
   public int Age { get; set; }
   public char Gender { get; set; }
   public void DoIt()
   {
     Console.WriteLine(&quot;Test&quot;);
   }

   public List&lt;string&gt; Addresses { get; set; }

   public Class1()
   {
     Addresses = new List&lt;string&gt;();
   }
 }

 public class Class2
 {
   public string FullName { get; set; }
   public int Age { get; set; }
   public char Gender { get; set; }
 }

private void Form1_Load(object sender, EventArgs e)
{
   Mapper.CreateMap&lt;Class1, Class2&gt;();

   var c2 = Mapper.Map&lt;Class1, Class2&gt;(c1);
   MessageBox.Show(c2.FullName);
}
</pre>
<p>Ok, de este ejemplo podemos ver:</p>
<ul>
<li>Class1 es poco más compleja que Class2, ya que tiene una List&lt;string&gt; y un método definido (DoIt())</li>
<li>Class2 es una versión simple de Class1, con el objetivo de funcionar como un <a title="Data Transfer Object" href="http://en.wikipedia.org/wiki/Data_transfer_object"><strong>Data Transfer Object</strong></a>.</li>
</ul>
<p>Como pueden ver, con la instrucción:</p>
<pre class="brush: csharp;">
Mapper.CreateMap&lt;Class1, Class2&gt;();
</pre>
<p>estamos indicándole a AutoMapper que la Class1 y Class2 están relacionadas (mappeadas). Y la siguiente línea de código:</p>
<pre class="brush: csharp;">
var c2 = Mapper.Map&lt;Class1, Class2&gt;(c1);&lt;/pre&gt;
</pre>
<p>está creando una instancia de tipo Class2, basada en la instancia de c1 que ya teníamos, inicializada y asignando dinámicamente los valores de dicha instancia (c1) a la nueva instancia c2.</p>
<p>Class1, en este caso, sería un ejemplo de una clase de LINQ-To-SQL, mientras que Class2 sería la clase que queremos usar como DTO.</p>
<p><strong>Esta funcionalidad es sólamente la más básica de AutoMapper (flattening</strong>). También soporta <strong>proyecciones </strong>(utilizar ciertas propiedades o sub-sets de un valor para mapear a otra propiedad), <strong>Listas y Arrays</strong>, etc. Para más información, visisten la <a title="Documentacion de AutoMapper" href="http://automapper.codeplex.com/documentation">documentación de AutoMapper</a>.</p>
<p>Y sobre el buen artículo de diseño&#8230;para mi sorpresa lo encontré 2 dias después de haber descubierto AutoMapper, y el artículo lo escribió Jimmy Bogard.</p>
<p>El artículo se llama originalmente &#8220;<a title="Strengthening your domain: Encapsulated collections" href="http://www.lostechies.com/blogs/jimmy_bogard/archive/2010/03/10/strengthening-your-domain-encapsulated-collections.aspx">Strengthening your domain: Encapsulated collections</a>&#8220;. Jimmy habla de como debemos de diseñar nuestras clases para <strong>no exponer inadvertidamente funcionalidad de más (extra, innecesaria) que podría permitir operaciones no lógicas sobre nuestras entidades</strong>, y enfocarnos en <strong>soportar exclusiva y claramente sólo las operaciones que el dominio de negocio debe permitir sobre las entidades de nuestro proyecto</strong>. El artículo también me hizo pensar que <strong>los accesors son algo que mucha gente no considera</strong> a la hora de exponer sus propiedades. Léanlo y si gustan dejar sus comentarios&#8230;adelante.</p>
]]></content:encoded>
			<wfw:commentRss>http://gabrielrodriguez.net/automapper-y-un-buen-articulo-de-diseno-de-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como medir tiempo de ejecucion de codigo en C# y .NET</title>
		<link>http://gabrielrodriguez.net/como-medir-tiempo-de-ejecucion-de-codigo-en-c-y-net/</link>
		<comments>http://gabrielrodriguez.net/como-medir-tiempo-de-ejecucion-de-codigo-en-c-y-net/#comments</comments>
		<pubDate>Thu, 20 Aug 2009 05:14:04 +0000</pubDate>
		<dc:creator>Gabriel</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Mejores Practicas]]></category>
		<category><![CDATA[Diagnostics]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[StopWatch]]></category>

		<guid isPermaLink="false">http://gabrielrodriguez.net/?p=492</guid>
		<description><![CDATA[Proximamente voy a hacer un comparativo de performance entre Entity Framework y Subsonic, así que se me ocurrió de una vez escribir este post sobre la manera correcta en que se debe medir el tiempo de ejecución de un cierto bloque de código utilizando C# y .NET.
La medición del tiempo se hace usando una instancia [...]]]></description>
			<content:encoded><![CDATA[<p>Proximamente voy a hacer un comparativo de performance entre Entity Framework y Subsonic, así que se me ocurrió de una vez escribir este post sobre la manera correcta en que se debe<strong> medir el tiempo de ejecución de un cierto bloque de código </strong>utilizando C# y .NET.</p>
<p>La medición del tiempo se hace usando una instancia de la clase <strong>StopWatch</strong>, que se encuentra en el namespace de <strong>System.Diagnostics</strong>. La clase <strong>StopWatch </strong>provee un conjunto de métodos y propiedades que pueden ser usados <strong>para medir con alta precisión el tiempo transcurrido entre intervalo</strong>s.</p>
<p>Los <strong>métodos disponibles </strong>sobre esta instancia serían:</p>
<ul>
<li> <strong>Start() </strong>- inicia el contador a partir del último lapso. La cuenta es acumulativa, es decir, si se verifica la propiedad <strong>ElapsedMilliseconds </strong>después de 4 llamadas a los métodos de Start y Stop, <strong>el tiempo desplegado será el acumulado de los 4 intervalos</strong>.</li>
<li><strong>Stop() </strong>- detiene momentaneamente el timer.</li>
<li><strong>Reset() </strong>- reinicia los valores almacenados del timer</li>
</ul>
<p>Las <strong>propiedades </strong>disponibles, que usaríamos para desplegar el tiempo que tomó alguna rutina, serían:</p>
<ul>
<li> <strong>Elapsed </strong>- Regresa una instancia de tipo TimeSpan que determina el tiempo que ha transcurrido desde que se llamó al método Start() por primera vez.</li>
<li><strong>ElapsedMilliseconds &#8211; </strong>Regresa un valor de tipo <strong>long </strong>que indica los milisegundos transcurridos desde la primera vez que se llamó al método Start().</li>
<li><strong>ElapsedTicks </strong>- Regresa un valor de tipo <strong>long</strong>, que indica los Ticks que han pasado desde la primera vez que se llamó al método Start(). <strong>Nota importante</strong> respecto a esta propiedad:<strong> Los ticks de un StopWatch no son iguales a los ticks de un DateTime</strong>.<span> <em>En <strong>DateTime</strong>, cada tick representa un intervalo de 100 nanosegundos. En <strong>StopWatch</strong>, un tick representa un intervalo de tiempo equivalente a 1 segundo dividido entre la propiedad Frequency</em></span><em><span><span> </span></span></em><span><em>del StopWatch. </em><span> </span></span></li>
<li><strong>IsRunning </strong>- determina si el timer está activo y contando Ticks.</li>
</ul>
<p>Las propiedades <strong>IsHighResolution </strong>y <strong>Frequency </strong>no son propias de una instancia StopWatch, sino de la clase StopWatch.</p>
<p><a title="Stopwatch.IsHighResolution Field" href="http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.ishighresolution.aspx"><strong>IsHighResolution</strong></a><strong> </strong>indica si el timer utilizado está basado en un contador de performance de alta resolución. Esto depende del procesador/arquitectura de la computadora en la que está corriendo el código</p>
<p><span><span><strong><a id="ctl00_MTContentSelector1_mainContentContainer_ctl50_ctl00_ctl15" title="Stopwatch.Frequency Field" onclick="javascript:Track('ctl00_MTContentSelector1_mainContentContainer_ctl50_ctl00_contenthere|ctl00_MTContentSelector1_mainContentContainer_ctl50_ctl00_ctl15',this);" href="http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.frequency.aspx">Frequency</a></strong> representa el numero de StopWatch ticks por segundo.</span></span></p>
<p>Ahora, un poco de código de ejemplo:</p>
<pre class="brush: csharp;">

Console.WriteLine(string.Format(&quot;IsHighResolution: {0}&quot;, Stopwatch.IsHighResolution ? &quot;Yes&quot; : &quot;No&quot;));
Console.WriteLine(string.Format(&quot;Frequency: {0}&quot;, Stopwatch.Frequency));
Console.WriteLine(&quot;----------------------&quot;);

var dos = &quot;2&quot;;
var suma = 0;

//Medir int.Parse
var timer = Stopwatch.StartNew();

for (var i = 1; i &lt;= 1000; i++)
{
suma += int.Parse(dos) * i;
}

timer.Stop();
Console.WriteLine(string.Format(&quot;Suma: {0}&quot;, suma));
Console.WriteLine(string.Format(&quot;Elapsed para int.Parse: {0}&quot;, timer.Elapsed));
Console.WriteLine(string.Format(&quot;ElapsedMilliseconds para int.Parse: {0}&quot;, timer.ElapsedMilliseconds));
Console.WriteLine(string.Format(&quot;ElapsedTicks para int.Parse: {0}&quot;, timer.ElapsedTicks));
Console.WriteLine(&quot;----------------------&quot;);

suma = 0;

//Medir Convert.ToInt32()
timer = Stopwatch.StartNew();

for (var i = 1; i &lt;= 1000; i++)
{
suma += Convert.ToInt32(dos) * i;
}

timer.Stop();
Console.WriteLine(string.Format(&quot;Suma: {0}&quot;, suma));
Console.WriteLine(string.Format(&quot;Elapsed para Convert.ToInt32: {0}&quot;, timer.Elapsed));
Console.WriteLine(string.Format(&quot;ElapsedMilliseconds para Convert.ToInt32: {0}&quot;, timer.ElapsedMilliseconds));
Console.WriteLine(string.Format(&quot;ElapsedTicks para Convert.ToInt32: {0}&quot;, timer.ElapsedTicks));
</pre>
<p><span><span>da el siguiente resultado:</span></span></p>
<p><span><span> </span></span></p>
<div id="attachment_498" class="wp-caption aligncenter" style="width: 463px"><img class="size-full wp-image-498" title="Midiendo intervalos de tiempo con la clase StopWatch" src="http://gabrielrodriguez.net/wp-content/uploads/2009/08/stopwatch-measure-code.png" alt="Midiendo intervalos de tiempo con la clase StopWatch" width="453" height="227" /><p class="wp-caption-text">Midiendo intervalos de tiempo con la clase StopWatch</p></div>
<p><span><span>Como se puede apreciar, int.Parse es ligeramente más rapido que Convert.ToInt32().<br />
</span></span></p>
<p><strong>De manera simplemente informativa</strong>&#8230;hay otra manera de medir intervalos de tiempo que mucha gente usa, y NO es correcto ni recomendable. Lo hacen asignando el valor de <strong>DateTime.Now</strong> a una variable de tipo DateTime y luego lo resta al valor de DateTime.Now en el momento que quieren dejar de medir.</p>
<p>Hay todavía otra manera similar al uso de DateTimes, que es usando la propiedad <strong>Environment.TickCount</strong>.Esto es incorrecto por tres razones:</p>
<p>1. Si existe una clase especializada para hacer esto en el framework, digase StopWatch, hay que usarla.<br />
2. <strong>Environment.TickCount es <a title="Signedness - Wikipedia" href="http://en.wikipedia.org/wiki/Signedness">signed</a></strong><a title="Signedness - Wikipedia" href="http://en.wikipedia.org/wiki/Signedness"> </a>(puede representar valores negativos también) lo cual implica que después de 25 dias, se va a entrar al rango negativo y se tendría que eliminar el bit del símbolo para poder hacer calculos correctos. Después de 50 dias, se llenarían todos los bits de la variable y la cuenta se reiniciaría. <a title="Environment.TickCount vs DateTime.Now - StackOverflow.com" href="http://stackoverflow.com/questions/243351/environment-tickcount-vs-datetime-now">Ver discusión en StackOverflow.com donde se menciona esto</a>.<br />
3. En palabras del mismo <strong>Scott Hanselman</strong>, y mencionado en el mismo link de la razon #2: <em>As an unrelated aside, if you DO use DateTime for Date-related math calculations, always use DateTime.UtcNow as DateTime.Now is susceptible to Daylight Savings Time&#8230;your calculations could be off by a hour, or worse, negative numbers.</em></p>
<p>Es decir, es muy facil que a la gente se le olvide que si va a cronometrar de esta manera, usar DateTimes para medir intervalos puede ser susceptible a los conocidos &#8220;horarios de verano&#8221;, que desfazan por temporadas el reloj por +- 1 hora.<em> </em><strong>Cualquiera de las dos alternativas a StopWatch</strong> (DateTime o Environment.Ticks)<strong> es relativamente riesgosa para ser útil.</strong><em><br />
</em></p>
<p>Links de Referencia:</p>
<p><a title="Stopwatch Class" href="http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx">Clase StopWatch @ MSDN</a></p>
]]></content:encoded>
			<wfw:commentRss>http://gabrielrodriguez.net/como-medir-tiempo-de-ejecucion-de-codigo-en-c-y-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
