<?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>Sylverio</title>
	<atom:link href="http://sylverio.com.br/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://sylverio.com.br/blog</link>
	<description>Análise, Arquitetura, Orientação a Objetos, UML, Tecnologias e Programação</description>
	<lastBuildDate>Fri, 11 May 2012 02:35:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Manipulando Application Configuration em C#</title>
		<link>http://sylverio.com.br/blog/2012/05/manipulando-application-configuration-em-c/</link>
		<comments>http://sylverio.com.br/blog/2012/05/manipulando-application-configuration-em-c/#comments</comments>
		<pubDate>Fri, 11 May 2012 02:35:58 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=1115</guid>
		<description><![CDATA[O framework .NET permite o suporte de múltiplos arquivos de configuração XML, este formato permite que editar as configurações por meio programático. As aplicações podem obter essas configurações de duas formas: Machine.config &#8211; que pode ser acessado por todos as &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2012/05/manipulando-application-configuration-em-c/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>O framework .NET permite o suporte de múltiplos arquivos de configuração XML, este formato permite que editar as configurações por meio programático.</p>
<p>As aplicações podem obter essas configurações de duas formas:</p>
<ol>
<li> <strong>Machine.config</strong> &#8211; que pode ser acessado por todos as aplicações .NET. <br /><em>Caminho do arquivo</em>: %Windir%\Microsoft.NET\Framework\v2.0.50727\Config\Machine.config</li>
<li> <strong>application-specific.config</strong> &#8211; pode ser um app.config para desktop application ou web.config para web application.</li>
</ol>
<p>Pelo fato de impactar em todas as aplicação .NET da máquina, o arquivo Machine.config é dificilmente modificado. A melhor solução é a utilização do application-specific.config, com essa alternativa definimos configurações específicas e unicamente para a aplicação que estamos trabalhando.<br />
A seguir apresentarei as principais funcionalidades do pacote <a href="http://msdn.microsoft.com/en-us/library/system.configuration.aspx" target="_blank">System.Configuration</a>.</p>
<p>Uma das utilizações mais simples do arquivo de configuração é o <strong>AppSettings</strong>, nela os dados são gravados na estrutura de chave-valor.</p>
<p><strong>AppSettings</strong> permite gerenciar uma coleção do tipo <em>NameValueCollection</em>.</p>
<h3>Escrevendo Configurações no Application Configuration</h3>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">Configuration config <span style="color: #008000;">=</span> ConfigurationManager<span style="color: #008000;">.</span><span style="color: #0000FF;">OpenExeConfiguration</span><span style="color: #008000;">&#40;</span>ConfigurationUserLevel<span style="color: #008000;">.</span><span style="color: #0000FF;">None</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
config<span style="color: #008000;">.</span><span style="color: #0000FF;">AppSettings</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Settings</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;MyKey&quot;</span>, <span style="color: #666666;">&quot;MyValue&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
config<span style="color: #008000;">.</span><span style="color: #0000FF;">Save</span><span style="color: #008000;">&#40;</span>ConfigurationSaveMode<span style="color: #008000;">.</span><span style="color: #0000FF;">Modified</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Após a execução do código o arquivo de configuração será modificado da seguinte forma para conter a chave-valor conforme abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;">&lt; ?xml <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;utf-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;appsettings<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;add</span> <span style="color: #000066;">key</span>=<span style="color: #ff0000;">&quot;MyKey&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;MyValue&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/appsettings<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p><strong>Dica</strong>: Sempre verifique o arquivo de configuração do executável da aplicação. As alterações não são refletidas no arquivo de configuração do código fonte.</p>
<h3>Lendo configurações do Application Configuration</h3>
<p>Abaixo o arquivo de configuração contem duas chaves (<em>MyKey</em> e <em>Greeting</em>).</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;">&lt; ?xml <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;utf-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;appsettings<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;add</span> <span style="color: #000066;">key</span>=<span style="color: #ff0000;">&quot;MyKey&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;MyValue&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;add</span> <span style="color: #000066;">key</span>=<span style="color: #ff0000;">&quot;Greeting&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;Hello, world!&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/appsettings<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>O código a seguir mostra todas as configurações de chave-valor contido no arquivo de configuração.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i <span style="color: #008000;">&lt;</span> ConfigurationManager<span style="color: #008000;">.</span><span style="color: #0000FF;">AppSettings</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
   Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;{0}: {1}&quot;</span>,
   ConfigurationManager<span style="color: #008000;">.</span><span style="color: #0000FF;">AppSettings</span><span style="color: #008000;">.</span><span style="color: #0000FF;">AllKeys</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>,
   ConfigurationManager<span style="color: #008000;">.</span><span style="color: #0000FF;">AppSettings</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Para acessar uma informação, campo <em>value </em>de uma determinada chave (<em>key</em>), podemos proceder da seguinte forma:</p>
</pre>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>ConfigurationManager<span style="color: #008000;">.</span><span style="color: #0000FF;">AppSettings</span><span style="color: #008000;">&#91;</span><span style="color: #666666;">&quot;Greeting&quot;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<h3>Utilizando Connection Strings</h3>
<p>Para acessar strings de conexão, use a coleção estática <strong>ConfigurationManager.ConnectionStrings</strong>, o retorno dessa propriedade é um <em>ConnectionStringSettingsCollection</em>.<br />
As três propriedades mais utilizadas da classe Connection-StringSettings são:</p>
<ul>
<li><strong>Name</strong> - que define o nome da conexão.</li>
<li><strong>Provider-Name</strong> - que define de tipo da conexão com a base de dados.</li>
<li><strong>ConnectionString</strong> - que define como o cliente se conecta com o servidor.</li>
</ul>
<p>O elemento <em>connectionStrings</em> agrupa as informações de conexão do sistema. Um arquivo de configuração pode contar diversos definições de conexão.</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;connectionstrings<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;add</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;LocalSqlServer&quot;</span> <span style="color: #000066;">connectionString</span>=<span style="color: #ff0000;">&quot;data source=.\SQLEXPRESS; Integrated Security=SSPI; AttachDBFilename=|DataDirectory|aspnetdb.mdf; User Instance=true&quot;</span> <span style="color: #000066;">providerName</span>=<span style="color: #ff0000;">&quot;System.Data.SqlClient&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/connectionstrings<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>O código a seguir mostra todas as strings de conexão contido no arquivo de configuração.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">ConnectionStringSettingsCollection connections <span style="color: #008000;">=</span> ConfigurationManager<span style="color: #008000;">.</span><span style="color: #0000FF;">ConnectionStrings</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>ConnectionStringSettings connection <span style="color: #0600FF; font-weight: bold;">in</span> connections<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
   Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Name: {0}&quot;</span>, connection<span style="color: #008000;">.</span><span style="color: #0000FF;">Name</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
   Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Connection string: {0}&quot;</span>, connection<span style="color: #008000;">.</span><span style="color: #0000FF;">ConnectionString</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
   Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Provider: {0}&quot;</span>, connection<span style="color: #008000;">.</span><span style="color: #0000FF;">ProviderName</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
   Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Source: {0}&quot;</span>, connection<span style="color: #008000;">.</span><span style="color: #0000FF;">ElementInformation</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Source</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Para acessar informações de uma conexão especifica, podemos proceder da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>ConfigurationManager<span style="color: #008000;">.</span><span style="color: #0000FF;">ConnectionStrings</span><span style="color: #008000;">&#91;</span><span style="color: #666666;">&quot;LocalSqlServer&quot;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ConnectionString</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<h3>Lendo configurações do Machine Configuration</h3>
<p>Como mencionsado, dificilmente iremos manipular um Machine.config. Porem caso se faça necessário, o código a seguir cria o objeto Configuration que representa o arquivo Machine.config.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">   Configuration machineSettings <span style="color: #008000;">=</span> ConfigurationManager<span style="color: #008000;">.</span><span style="color: #0000FF;">OpenMachineConfiguration</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
   ProtectedConfigurationSection pcs <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span>ProtectedConfigurationSection<span style="color: #008000;">&#41;</span>machineSettings<span style="color: #008000;">.</span><span style="color: #0000FF;">GetSection</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;configProtectedData&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
   Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>pcs<span style="color: #008000;">.</span><span style="color: #0000FF;">DefaultProvider</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
   Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>pcs<span style="color: #008000;">.</span><span style="color: #0000FF;">Providers</span><span style="color: #008000;">&#91;</span><span style="color: #666666;">&quot;DataProtectionConfigurationProvider&quot;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Parameters</span><span style="color: #008000;">&#91;</span><span style="color: #666666;">&quot;description&quot;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<h3>Seção customizada - Custom Sections</h3>
<p>Definições de configurações de aplicação customizados, podem ser criadas de 2 formas. Implementando inteface <strong>IConfigurationSectionHandler </strong>ou derivando uma classe de <strong>ConfigurationSection</strong>.<br />
A segunda opção é recomentada para versões 2.0 ou anteriores, pore esse motivo vou apresentar somente como realizar a primeira implementação pois se aplica a versões mais recentes do Framework.NET.</p>
<h4>Criando uma seção Customizado utilizando IConfigurationSectionHandler</h4>
<p>Devemos criar uma única classe para a seção customizada na aplicação, essa classe deve implementar a interface <strong>IConfigurationSectionHandler</strong>.<br />
Implementando a interface, devemos criar um construtor vazio e implementar o método Create. Dos três parâmetros requiridos pelo método, normalmente utilizaremos omente o terceiro, um objeto do tipo System.Xml.XmlNode que contem os dados armazenados no arquivo xml contendo os dados da seção customizada.</p>
<p>Demonstração de como estruturar a seção de configuração customizada no arquivo .config.</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;configsections<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;section</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;customSettings&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;ConfigApp.CustomConfigHandler, ConfigApp&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/configsections<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;appsettings<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;add</span> <span style="color: #000066;">key</span>=<span style="color: #ff0000;">&quot;Greeting&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;Hello, world!&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;add</span> <span style="color: #000066;">key</span>=<span style="color: #ff0000;">&quot;Another Key&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;Another value&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/appsettings<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;customsettings<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;lastuser<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Tony<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/lastuser<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;lastnumber<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>32<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/lastnumber<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/customsettings<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
Abaixo o código que permite acessar a seção customizada.</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> MySettings
<span style="color: #008000;">&#123;</span>
   <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> lastUser<span style="color: #008000;">;</span>
   <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">int</span> lastNumber<span style="color: #008000;">;</span>
   <span style="color: #0600FF; font-weight: bold;">public</span> MySettings<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> CustomConfigHandler <span style="color: #008000;">:</span> IConfigurationSectionHandler
<span style="color: #008000;">&#123;</span>
   <span style="color: #0600FF; font-weight: bold;">public</span> CustomConfigHandler<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
   <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">object</span> Create<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">object</span> parent, <span style="color: #6666cc; font-weight: bold;">object</span> configContext, <span style="color: #000000;">System.<span style="color: #0000FF;">Xml</span></span><span style="color: #008000;">.</span><span style="color: #0000FF;">XmlNode</span> section<span style="color: #008000;">&#41;</span>
   <span style="color: #008000;">&#123;</span>
      MySettings settings <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> MySettings<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>				
      settings<span style="color: #008000;">.</span><span style="color: #0000FF;">lastUser</span> <span style="color: #008000;">=</span> section<span style="color: #008000;">.</span><span style="color: #0000FF;">SelectSingleNode</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;lastUser&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">InnerText</span><span style="color: #008000;">;</span>
      settings<span style="color: #008000;">.</span><span style="color: #0000FF;">lastNumber</span> <span style="color: #008000;">=</span> <span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Parse</span><span style="color: #008000;">&#40;</span>section<span style="color: #008000;">.</span><span style="color: #0000FF;">SelectSingleNode</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;lastNumber&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">InnerText</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
      <span style="color: #0600FF; font-weight: bold;">return</span> settings<span style="color: #008000;">;</span>
   <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Program
<span style="color: #008000;">&#123;</span>
   <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> args<span style="color: #008000;">&#41;</span>
   <span style="color: #008000;">&#123;</span>
      MySettings settings <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span>MySettings<span style="color: #008000;">&#41;</span>ConfigurationManager<span style="color: #008000;">.</span><span style="color: #0000FF;">GetSection</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;customSettings&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
      Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>settings<span style="color: #008000;">.</span><span style="color: #0000FF;">lastUser</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
      Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>settings<span style="color: #008000;">.</span><span style="color: #0000FF;">lastNumber</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
   <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Observe no arquivo de configuração a seção <strong>&lt;configsections&gt;</strong>, que declara uma seção customizada e informa se noma na propriedade de <strong>name</strong> e do método que implementa IConfigurationSectionHandler e o nome do assembly na propriedade <strong>type</strong>.<br />
Então, podemos criar uma seção de configuração customizada, com elementos para cada valor personalizado.</p>
<p>O método CustomConfigHandler.<strong>Create</strong> irá ler os valores da sessão customizada e atribuir a uma classe de dados que irá retornar os dados de forma tipada. </p>
<p>A seção <em>&lt;appsettings&gt;</em> está incluído apenas para demonstrar que um arquivo. Config pode conter configurações personalizadas e configurações de aplicativos padrão.</p>
<p>Enjoy <img src='http://sylverio.com.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2012/05/manipulando-application-configuration-em-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Convenção de código</title>
		<link>http://sylverio.com.br/blog/2012/05/convencao-de-codigo/</link>
		<comments>http://sylverio.com.br/blog/2012/05/convencao-de-codigo/#comments</comments>
		<pubDate>Fri, 04 May 2012 18:44:06 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tecnologia]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=1102</guid>
		<description><![CDATA[Pra quem programa em Java ou Android, segue um links muito bom da Oracle sobre de convenção de código (Estilo de programação). Links: Oracle &#8211; Code Conventions Se você esta se perguntando porque utilizar convenção de código, segue um trecho &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2012/05/convencao-de-codigo/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Pra quem programa em Java ou Android, segue um links muito bom da Oracle sobre de convenção de código (<a href="http://sylverio.com.br/blog/2009/06/estilo-de-programacao/">Estilo de programação</a>).</p>
<p>Links: <a href="http://www.oracle.com/technetwork/java/codeconventions-135099.html#367" target="_black"> Oracle &#8211; Code Conventions</a></p>
<p>Se você esta se perguntando porque utilizar convenção de código, segue um trecho traduzido:</p>
<ol>
<li>80% do custo de vida de um componente de software é com manutenção.</li>
<li> Dificilmente um software será mantido por seu autor original.</li>
<li>Convenções de código melhoram a legibilidade do software, permitindo entendimento mais rápido e claramente.</li>
<li>Se enviar o código-fonte como produto, você precisa ter certeza de que esta empacotado e limpo como qualquer outro produto criado.</li>
</ol>
<p>Até mais <img src='http://sylverio.com.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2012/05/convencao-de-codigo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Encode XML com C#</title>
		<link>http://sylverio.com.br/blog/2012/02/encode-xml-com-c/</link>
		<comments>http://sylverio.com.br/blog/2012/02/encode-xml-com-c/#comments</comments>
		<pubDate>Wed, 22 Feb 2012 11:58:15 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Framework.NET]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=1032</guid>
		<description><![CDATA[Em um documento XML, existe alguns caracteres especiais que delimitam os elementos, atributos e valores. Quando a informação contida neles se utiliza desses caracteres especiais, o documento XML é corrompido, pois não consegue mais identificar onde é o começo ou &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2012/02/encode-xml-com-c/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Em um documento XML, existe alguns caracteres especiais que delimitam os elementos, atributos e valores. Quando a informação contida neles se utiliza desses caracteres especiais, o documento XML é corrompido, pois não consegue mais identificar onde é o começo ou fim da informação.</p>
<p><strong>XML Correto</strong></p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;elemento</span> <span style="color: #000066;">atributo</span>=<span style="color: #ff0000;">'Stacem'</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Formula matemática do item<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/elemento<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p><strong>XML corrompido</strong></p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;elemento</span> <span style="color: #000066;">atributo</span>=<span style="color: #ff0000;">'St'</span>acem<span style="color: #ff0000;">'&gt;</span></span>Valor de X &gt; que valor de Y.<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/elemento<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Para resolver esse problema, devesse utilizar em campos de informações (valores dos elementos ou atributos) um <em>&#8220;encode&#8221;</em> para esses caracteres.</p>
<h3>Encode XML</h3>
<p>Basicamente são 5 valores:</p>
<table>
<tr>
<td><strong>&lt;</strong></td>
<td>&amp;lt;</td>
</tr>
<tr>
<td><strong>&gt;</strong></td>
<td>&amp;gt;</td>
</tr>
<tr>
<td><strong>&quot;</strong></td>
<td>&amp;quot;</td>
</tr>
<tr>
<td><strong>&apos;</strong></td>
<td>&amp;apos;</td>
</tr>
<tr>
<td><strong>&amp;</strong></td>
<td>&amp;amp;</td>
</tr>
</table>
<p>No Framework.NET existem alguns caminhos de aplicar o encode XML:</p>
<p><strong>1. string.Replace()</strong><br />
A maneira mais feia, mas que funciona, seria utilizar o famoso string.Replace().<br />
Repetindo a rotina 5 vezes, uma para cada caracter especial.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #6666cc; font-weight: bold;">string</span> text <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Este é um <span style="color: #008080; font-weight: bold;">\&quot;</span>nó<span style="color: #008080; font-weight: bold;">\&quot;</span> XML com caracteres 'especiais' &amp; &lt;&gt; diferente de tudo!!&quot;</span><span style="color: #008000;">;</span>
<span style="color: #6666cc; font-weight: bold;">string</span> encodedXml <span style="color: #008000;">=</span> text<span style="color: #008000;">.</span><span style="color: #0000FF;">Replace</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;&amp;&quot;</span>, <span style="color: #666666;">&quot;&amp;amp;&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Replace</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;&lt; &quot;</span>, <span style="color: #666666;">&quot;&amp;lt;&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Replace</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;&gt;&quot;</span>, <span style="color: #666666;">&quot;&amp;gt;&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Replace</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;<span style="color: #008080; font-weight: bold;">\&quot;</span>&quot;</span>, <span style="color: #666666;">&quot;&amp;quot;&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Replace</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;'&quot;</span>, <span style="color: #666666;">&quot;&amp;apos;&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">// RESULT: Este é um &amp;quot;nó&amp;quot; XML com caracteres &amp;apos;especiais&amp;apos; &amp;amp; &amp;lt;&amp;gt; diferente de tudo!!</span></pre></div></div>

<p><strong>2. System.Web.HttpUtility.HtmlEncode()</strong><br />
É utilizado para codificar textos em HTML, muito utilizado em ASP.NET, porem ele não codifica o apóstrofo e força você utilizar uma referência de pacote Web. Se for uma aplicação desktop, não recomendo sua utilização.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #6666cc; font-weight: bold;">string</span> text <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Este é um <span style="color: #008080; font-weight: bold;">\&quot;</span>nó<span style="color: #008080; font-weight: bold;">\&quot;</span> XML com caracteres 'especiais' &amp; &lt;&gt; diferente de tudo!!&quot;</span><span style="color: #008000;">;</span>
<span style="color: #6666cc; font-weight: bold;">string</span> encodedXml <span style="color: #008000;">=</span> HttpUtility<span style="color: #008000;">.</span><span style="color: #0000FF;">HtmlEncode</span><span style="color: #008000;">&#40;</span>text<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">// RESULT: Este é um &amp;quot;nó&amp;quot; XML com caracteres 'especiais' &amp;amp; &amp;lt;&amp;gt; diferente de tudo!!</span></pre></div></div>

<p><strong>3. System.Security.SecurityElement.Escape()</strong><br />
Outra maneiroa é utilizar o comando Escape() que trata os 5 caracteres especiais.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #6666cc; font-weight: bold;">string</span> text <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Este é um <span style="color: #008080; font-weight: bold;">\&quot;</span>nó<span style="color: #008080; font-weight: bold;">\&quot;</span> XML com caracteres 'especiais' &amp; &lt;&gt; diferente de tudo!!&quot;</span><span style="color: #008000;">;</span>
<span style="color: #6666cc; font-weight: bold;">string</span> encodedXml <span style="color: #008000;">=</span> <span style="color: #000000;">System.<span style="color: #0000FF;">Security</span></span><span style="color: #008000;">.</span><span style="color: #0000FF;">SecurityElement</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Escape</span><span style="color: #008000;">&#40;</span>text<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">// RESULT: Este é um &amp;quot;nó&amp;quot; XML com caracteres &amp;apos;especiais&amp;apos; &amp;amp; &amp;lt;&amp;gt; diferente de tudo!!</span></pre></div></div>

<p>Gosto muito da opção de codificar com System.Security.SecurityElement.Escape(), acredito que seja a forma mais estética com relação ao código.<br />
Não sei quanto a desempenho das formas, mas manipulação de string não é a melhor das escolhas.<br />
E a segunda alem de não abranger todos os caracteres especiais, ainda fica limitada a aplicações web.</p>
<p>Espero ter ajudado <img src='http://sylverio.com.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2012/02/encode-xml-com-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gerenciando Threads</title>
		<link>http://sylverio.com.br/blog/2012/02/gerenciando-threads/</link>
		<comments>http://sylverio.com.br/blog/2012/02/gerenciando-threads/#comments</comments>
		<pubDate>Wed, 15 Feb 2012 01:29:04 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Framework.NET]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=952</guid>
		<description><![CDATA[Talvez o mais difícil de se trabalhar com múltiplas thread seja a o bloqueio de recursos, onde um recurso não pode ser manipulado por diversas threads simultaneamente ou em determinadas situações que se torna necessário inciar, pausar, retornar e abandonar &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2012/02/gerenciando-threads/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Talvez o mais difícil de se trabalhar com múltiplas thread seja a o bloqueio de recursos, onde um recurso não pode ser manipulado por diversas threads simultaneamente ou em determinadas situações que se torna necessário inciar, pausar, retornar e abandonar uma thread manualmente. </p>
<p>O Framework .NET possui o objeto <em>Thread</em> que permite mais flexibilidade e gerenciamento sobre as thread executadas em background do que o objeto <em>ThreadPool</em>.</p>
<p><strong>Thread Priority</strong><br />
Uma das propriedades do objeto Thread á sua prioridade. Após a thread criada, mas antes de iniciar a thread, podemos definir a prioridade da thread com  propriedade <em>Thread.Priority</em> usando o enumerador <em>ThreadPriority</em>.<br />
A Thread priority controla como o sistema operacional irá agendar o tempo para a execução da Thread. Geralmente threads com maior prioridade rodam antes das threads com baixo prioridades, por padrão as threads tem o valor de prioridade definida como Normal.</p>
<p><strong>Thread State</strong><br />
Outra propriedade do objeto é <em>Thread.ThreadState</em> pode ser utilizada para verificar o estado das threads em background.<br />
Os estados possíveis são:</p>
<ul>
<li><strong>Unstarted</strong>: estado inicial da thread (antes de executar o método Thread.Start).</li>
<li><strong>Running</strong>: estado ativo ou executando (após de executar o método Thread.Start).</li>
<li><strong>Stopped</strong>: estado parada.</li>
<li><strong>WaitSleepJoin</strong>: estado esperando outra thread completar.</li>
<li><strong>SuspendRequested</strong>: estado repondendo solicitanção de pausa.</li>
<li><strong>Suspended</strong>: estado suspensa.</li>
<li><strong>AbortRequested</strong>: estado respondendo a solicitanção de abandono.</li>
<li><strong>Aborted</strong>: estado abortado.</li>
</ul>
<h3>Thread com parâmetros e retorno em C#</h3>
<p>Para fornecer parâmetros para uma thread, criamos uma classe com um construtor que recebe um ou mais parâmetros e armazena o dado e a usa para criar o objeto ThreadStart.<br />
Para obter o retorno da Thread, criamos um método que recebe o resultado de retorno como uma parâmetro. Depois criamos um delegate para o método e passamos o delegado e próprio método como parâmetro para a classe.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Threading</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">namespace</span> ManagerThread
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Program
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> args<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            Calculator calculator <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Calculator<span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Multiplicador&quot;</span>, <span style="color: #FF0000;">15</span>, ResultCallback<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            Thread thread <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Thread<span style="color: #008000;">&#40;</span>calculator<span style="color: #008000;">.</span><span style="color: #0000FF;">Execute</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            thread<span style="color: #008000;">.</span><span style="color: #0000FF;">Start</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Main Thread aguarda finalização das threads em background.&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            thread<span style="color: #008000;">.</span><span style="color: #0000FF;">Join</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Thread completada.&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">ReadKey</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> ResultCallback<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> value<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Resultado: {0}&quot;</span>, value<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Calculator
    <span style="color: #008000;">&#123;</span>
        <span style="color: #008080; font-style: italic;">// Delegate que define a assinatura do método de callback (retorno).</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">delegate</span> <span style="color: #6666cc; font-weight: bold;">void</span> ResultDelegate<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> value<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #0600FF; font-weight: bold;">readonly</span> ResultDelegate callback<span style="color: #008000;">;</span>
        <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #0600FF; font-weight: bold;">readonly</span> <span style="color: #6666cc; font-weight: bold;">string</span> message<span style="color: #008000;">;</span>
        <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #0600FF; font-weight: bold;">readonly</span> <span style="color: #6666cc; font-weight: bold;">int</span> value<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> Calculator<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span> message, <span style="color: #6666cc; font-weight: bold;">int</span> value, ResultDelegate callback<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">message</span> <span style="color: #008000;">=</span> message<span style="color: #008000;">;</span>
            <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">value</span> <span style="color: #008000;">=</span> value<span style="color: #008000;">;</span>
            <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">callback</span> <span style="color: #008000;">=</span> callback<span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> Execute<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>message<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>callback <span style="color: #008000;">!=</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                callback<span style="color: #008000;">&#40;</span>value<span style="color: #008000;">*</span><span style="color: #FF0000;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>A thread é executada somente após o comando <em>thread.Start()</em>. O comando <em>thread.Join()</em> força a thread principal a ficar aguardando a finalização da thread em background para seguir o processo. </p>
<p><strong>Observações</strong>:<br />
Threads podem estar em mais de 1 estado ao mesmo tempo.<br />
Os métodos Thread.Suspend e Thread.Resume são utilizados para pausar e retornar a thread principal. Porem estes métos esta depreciados, e podem causar problemas de execuação, utilize o método Thread.Abort().</p>
<p>Enjoy <img src='http://sylverio.com.br/blog/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2012/02/gerenciando-threads/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Browser mais utilizados</title>
		<link>http://sylverio.com.br/blog/2012/02/browser-mais-utilizados/</link>
		<comments>http://sylverio.com.br/blog/2012/02/browser-mais-utilizados/#comments</comments>
		<pubDate>Mon, 06 Feb 2012 11:01:34 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Mercado]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=977</guid>
		<description><![CDATA[Olhando os dados de acesso a meu site nesse fim de semana, vi o relatório de browsers mais utilizados e fiquei curioso para saber como esta no resto do mundo e quis compartilhar com vocês o resultado. No mundo o &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2012/02/browser-mais-utilizados/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Olhando os dados de acesso a meu site nesse fim de semana, vi o relatório de browsers mais utilizados e fiquei curioso para saber como esta no resto do mundo e quis compartilhar com vocês o resultado.</p>
<p>No mundo o IE assume o primeiro lugar com 37%, em segundo o Google Chrome com 27%, em terceiro o Firefox com 24%, o Safari com 6% e os outros com 6%.<br />
<img src="http://sylverio.com.br/blog/image/estatisca_browser_global.png" alt="" style="border:none; padding:2px;" /></p>
<p>No mercado brasileiro o Google Chrome é preferência por 43%, em segundo lugar o IE com 32%, em terceiro o Firefox com 22% e os demais browsers ficam com 3%.<br />
<img src="http://sylverio.com.br/blog/image/estatisca_browser_brasil.png" alt="" style="border:none; padding:2px;" /></p>
<p>Aqui neste site o Google Chrome segue a liderança com 54,47%, o Firefox sobe para segundo com 27,85% e IE cai para terceiro com 14,23%.<br />
<img src="http://sylverio.com.br/blog/image/estatisca_browser_site.png" alt="" style="border:none; padding:2px;" /></p>
<p>Com base nesses dados chego a algumas conclusões:</p>
<ul>
<li>Mesmo com todo esforço da Microsoft, o IE nos próximo meses vai perder a hegemonia no mundo.</li>
<li>O Safari aparentemente começa a crescer, parte por ser mais barato em país outros países (como  USA) e outra parte pelos Ipad, Iphone e afins. Apesar de no Brasil ser muito baixo ainda.</li>
<li>Infelizmente o Firefox esta caindo também. É um excelente browser, mas acho que tem ficado pesado em relação ao Google Chrome, e talvez este seja um dos motivo.</li>
<li>82,32% das pessoas que acessam esse site usam Google Chrome ou Firefox, isso quer dizer que, quase ninguém tem dinheiro para Mac (isso foi uma brincadeira rsrsrs ).</li>
</ul>
<p>Lembre-se: &#8220;As estatísticas não mentem&#8230;&#8221; <img src='http://sylverio.com.br/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2012/02/browser-mais-utilizados/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Threads</title>
		<link>http://sylverio.com.br/blog/2012/02/threads/</link>
		<comments>http://sylverio.com.br/blog/2012/02/threads/#comments</comments>
		<pubDate>Fri, 03 Feb 2012 09:56:41 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tecnologia]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=918</guid>
		<description><![CDATA[Quando executamos tarefas que necessitam um longo tempo de processamento, como imprimir um documento, baixar um arquivo ou gerar um relatório na thread principal da aplicação (single-threaded), a aplicação irá parar de responder para as entradas usuário enquanto a tarefa &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2012/02/threads/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Quando executamos tarefas que necessitam um longo tempo de processamento, como imprimir um documento, baixar um arquivo ou gerar um relatório na thread principal da aplicação (<strong>single-threaded</strong>), a aplicação irá parar de responder para as entradas usuário enquanto a tarefa solicitada não for finalizado por completo. Pois os comandos são executados linha a linha, dessa forma quando alguma linha leva muito tempo para processar uma determinada atividade (exemplo abrir uma página na internet), isso se torna a aplicação indiferente para ações do usuário enquanto um processo é requerido.</p>
<p>Se o computar tem múltiplos processos ou múltiplos núcleos em um único processador, ele pode executar várias threads simultâneas (<strong>multithreaded</strong>), mesmo que ambos exijam tempo de processamento. Dessa forma podemos adquirir um melhor desempenho da aplicação e melhorar a usabilidade do usuário final.</p>
<h3>Definição</h3>
<p>Uma linha (em inglês: Thread) ou encadeamento de execução é uma unidade de execução em um processo. Um simples processo pode ter várias threads, no caso este é referido com multithreaded, e em outras palavras, é uma forma de um processo dividir a si mesmo em duas ou mais tarefas que podem ser executadas concorrentemente.<br />
O suporte à thread é fornecido pelo próprio sistema operativo (SO), no caso da linha de execução ao nível do núcleo KLT (Kernel-Level Thread), ou implementada através de uma biblioteca de uma determinada linguagem, no caso de uma ULT (User-Level Thread).</p>
<h3>Vantagens</h3>
<ol>
<li>Executar diversas tarefas simultaneas.</li>
<li>Permitir que aplicação responda (não trave) a solicitações do usuário quando executar processos com longo tempo de processamento.</li>
<li>Melhor desempenho em computadores com múltiplos processamentos ou núcleos.</li>
</ol>
<h3>Desvantagens</h3>
<ol>
<li>Código de multithreaded é mais complexo.</li>
<li>Maior consumo de memória e processamento, podendo reduzir o desempenho em algumas circunstâncias.</li>
</ol>
<h3>Tipos de Thread</h3>
<p>As threads podem ser de dois tipos:</p>
<ul>
<li><strong>Foreground</strong>: thread da aplicação principal. Enquando estiver ativa a aplicação continua rodando. As thread de background serão finalizadas se a thread de foreground for finalizada.</li>
<li><strong>Background</strong>: Qualquer thread que foi inicializada por outra thread.</li>
</ul>
<h3>Exemplificando</h3>
<p>Uma das formas mais fáceis de programar multithreaded em .NET é utilizando a classe <em>ThreadPool</em>.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">namespace</span> Threading
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Program
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> args<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #008080; font-style: italic;">// Start call multiple times</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Call multiple times.&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            ThreadPool<span style="color: #008000;">.</span><span style="color: #0000FF;">QueueUserWorkItem</span><span style="color: #008000;">&#40;</span>ThreadProc<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            ThreadPool<span style="color: #008000;">.</span><span style="color: #0000FF;">QueueUserWorkItem</span><span style="color: #008000;">&#40;</span>ThreadProc2, <span style="color: #666666;">&quot;Thread 1&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            ThreadPool<span style="color: #008000;">.</span><span style="color: #0000FF;">QueueUserWorkItem</span><span style="color: #008000;">&#40;</span>ThreadProc2, <span style="color: #666666;">&quot;Thread 2&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008080; font-style: italic;">//Execute foreground</span>
            ThreadProc2<span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Thread 2.5&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            ThreadPool<span style="color: #008000;">.</span><span style="color: #0000FF;">QueueUserWorkItem</span><span style="color: #008000;">&#40;</span>ThreadProc2, <span style="color: #666666;">&quot;Thread 3&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            ThreadPool<span style="color: #008000;">.</span><span style="color: #0000FF;">QueueUserWorkItem</span><span style="color: #008000;">&#40;</span>ThreadProc2, <span style="color: #666666;">&quot;Thread 4&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Main thread sleeps.&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            Thread<span style="color: #008000;">.</span><span style="color: #0000FF;">Sleep</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">1000</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;End call multiple times.&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> ThreadProc<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">object</span> state<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Thread without parameters.&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> ThreadProc2<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">object</span> stateInfo<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #6666cc; font-weight: bold;">string</span> state <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#41;</span> stateInfo<span style="color: #008000;">;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Thread: {0}&quot;</span>, state<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Is Background: {0}&quot;</span>, Thread<span style="color: #008000;">.</span><span style="color: #0000FF;">CurrentThread</span><span style="color: #008000;">.</span><span style="color: #0000FF;">IsBackground</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
     <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Para determinar se um thread é foreground ou background podemos utilizar a propriedade <em>Thread.CurrentThread.IsBackground</em>.</p>
<p>Nesse exemplo note que no método <em>ThreadProc</em> temos o <em>object state</em> como parâmetro do método, mas a chamada ao método não utiliza parâmetro.<br />
Obrigatoriamente a assinatura do método esperado por <em>QueueUserWorkItem</em> deve ter um object como parâmetro, porem este é opcional.</p>
<p>Repare que utilizamos o comando Thread.Sleep(1000) para a thread principal aguardar a execução das threads em paralelo. Se comentarmos essa linha threads que estão em execução em background serão abortadas automaticamente.</p>
<p>Para podemos visualizar melhor a melhora de desempenho que podemos obter, criei o seguinte exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">namespace</span> Threading
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Program
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> args<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            List<span style="color: #008000;">&lt;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&gt;</span> urls <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;/</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&gt;&lt;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            urls<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">@&quot;http://sylverio.com.br/blog/2009/08/requisicao-http-com-java-application-parte-1/&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            urls<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">@&quot;http://sylverio.com.br/blog/2009/09/requisicao-http-com-java-application-parte-2/&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Start time foreground: {0}&quot;</span>, DateTime<span style="color: #008000;">.</span><span style="color: #0000FF;">Now</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ToString</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;HH:mm:ss&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span> url <span style="color: #0600FF; font-weight: bold;">in</span> urls<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                GetPage<span style="color: #008000;">&#40;</span>url<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;End time foreground: {0}&quot;</span>, DateTime<span style="color: #008000;">.</span><span style="color: #0000FF;">Now</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ToString</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;HH:mm:ss&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            Thread<span style="color: #008000;">.</span><span style="color: #0000FF;">Sleep</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">20000</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> GetPage<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">object</span> data<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #6666cc; font-weight: bold;">string</span> url <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#41;</span> data<span style="color: #008000;">;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Start time background: {0}&quot;</span>, DateTime<span style="color: #008000;">.</span><span style="color: #0000FF;">Now</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ToString</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;HH:mm:ss&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            WebResponse wr <span style="color: #008000;">=</span> WebRequest<span style="color: #008000;">.</span><span style="color: #0000FF;">Create</span><span style="color: #008000;">&#40;</span>url<span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">GetResponse</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>wr <span style="color: #008000;">!=</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;{0}: {1}&quot;</span>, url, wr<span style="color: #008000;">.</span><span style="color: #0000FF;">Headers</span><span style="color: #008000;">&#91;</span><span style="color: #666666;">&quot;Content-Length&quot;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                wr<span style="color: #008000;">.</span><span style="color: #0000FF;">Close</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
&nbsp;
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;End time background: {0}&quot;</span>, DateTime<span style="color: #008000;">.</span><span style="color: #0000FF;">Now</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ToString</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;HH:mm:ss&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&lt;/</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&gt;</span></pre></div></div>

<p>Resultado:<br />
<img src="http://sylverio.com.br/blog/image/thread-exemple1.png" alt="" style="border:none; padding:2px;" /></p>
<p>Agora vamos realizar a chamada do método GetPage por uma thread:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">namespace</span> Threading
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Program
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> args<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            List<span style="color: #008000;">&lt;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&gt;</span> urls <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;/</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&gt;&lt;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            urls<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">@&quot;http://sylverio.com.br/blog/2009/08/requisicao-http-com-java-application-parte-1/&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            urls<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">@&quot;http://sylverio.com.br/blog/2009/09/requisicao-http-com-java-application-parte-2/&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Start time foreground: {0}&quot;</span>, DateTime<span style="color: #008000;">.</span><span style="color: #0000FF;">Now</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ToString</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;HH:mm:ss&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span> url <span style="color: #0600FF; font-weight: bold;">in</span> urls<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                ThreadPool<span style="color: #008000;">.</span><span style="color: #0000FF;">QueueUserWorkItem</span><span style="color: #008000;">&#40;</span>GetPage, url<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;End time foreground: {0}&quot;</span>, DateTime<span style="color: #008000;">.</span><span style="color: #0000FF;">Now</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ToString</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;HH:mm:ss&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            Thread<span style="color: #008000;">.</span><span style="color: #0000FF;">Sleep</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">20000</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> GetPage<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">object</span> data<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #6666cc; font-weight: bold;">string</span> url <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#41;</span> data<span style="color: #008000;">;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Start time background: {0}&quot;</span>, DateTime<span style="color: #008000;">.</span><span style="color: #0000FF;">Now</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ToString</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;HH:mm:ss&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            WebResponse wr <span style="color: #008000;">=</span> WebRequest<span style="color: #008000;">.</span><span style="color: #0000FF;">Create</span><span style="color: #008000;">&#40;</span>url<span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">GetResponse</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>wr <span style="color: #008000;">!=</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;{0}: {1}&quot;</span>, url, wr<span style="color: #008000;">.</span><span style="color: #0000FF;">Headers</span><span style="color: #008000;">&#91;</span><span style="color: #666666;">&quot;Content-Length&quot;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                wr<span style="color: #008000;">.</span><span style="color: #0000FF;">Close</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
&nbsp;
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;End time background: {0}&quot;</span>, DateTime<span style="color: #008000;">.</span><span style="color: #0000FF;">Now</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ToString</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;HH:mm:ss&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&lt;/</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&gt;</span></pre></div></div>

<p>Resultado:<br />
<img src="http://sylverio.com.br/blog/image/thread-exemple2.png" alt="" style="border:none; padding:2px;" /></p>
<h3>Conclusão</h3>
<p>A utilização de thread é um recurso que pode e deve ser utilizado em diversos momentos dentro do desenvolvimento de software pois melhora drasticamente o desempenho da aplicação. Levamos 18 segundos para realizar a requisição de uma página web, contra 4 segundos do processamento paralelo. Porem deve ser avaliado seus benefícios, pois sua complexidade aumento muito assim como o consumo de recursos da máquina.</p>
<p>Espero ter ajudado <img src='http://sylverio.com.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2012/02/threads/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Polimorfismo</title>
		<link>http://sylverio.com.br/blog/2012/01/polimorfismo/</link>
		<comments>http://sylverio.com.br/blog/2012/01/polimorfismo/#comments</comments>
		<pubDate>Tue, 31 Jan 2012 10:46:43 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Análise]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[O.O.]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=813</guid>
		<description><![CDATA[A meu ver o princípio polimorfismo é um dos principais princípios e conceitos empregados para programação orientação à objetos. É esse conceito possibilitou que diversos desing patterns (padrões de projetos) fossem criados para o desenvolvimento de soluções de problemas de &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2012/01/polimorfismo/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p><img alt="" src="http://www.sylverio.com.br/blog/image/nanofarmacos.png" title="polimorfismo" class="alignleft" style="border:none; padding:2px;" />A meu ver o <strong>princípio polimorfismo</strong> é um dos principais princípios e conceitos empregados para programação orientação à objetos. É esse conceito possibilitou que diversos desing patterns (padrões de projetos) fossem criados para o desenvolvimento de soluções de problemas de arquitetura (<em>diga-se problemas, quebra de princípios de orientação a objetos</em>).</p>
<p>Apesar do desenvolvimento de sorftware ser uma ciência exata, muitos desenvolvedores consideram algumas dessas soluções como <strong>mágicas</strong> devido a sua complexidade. Primeiramente gostaria de salientar que não existe mágica, e sim o <strong>emprego metódico de técnicas e princípios</strong> para o projeto de software que boa parte dessa &#8220;mágica&#8221; pode ser atribuído ao <strong>polimorfismo</strong>.</p>
<h3>O que é Polimorfismo?</h3>
<p><em>&#8220;Um conceito em teoria de tipo, no qual um nome (como uma declaração de variável) pode denotar objetos de muitas subclasses diferentes que são relacionadas por alguma superclasse comum, assim, qualquer objeto denotado por esse nome tem a capacidade de responder a algum conjunto comum de operações de modos diferentes&#8221;</em> (Booch, 2000).<br />
Em outras palavras, possibilita que referências de tipos de classes mais abstratas representem o comportamento das classes concretas que as referenciam, esse comportamento também é conhecido como <a href="http://sylverio.com.br/blog/2009/01/generalizacao-especializacao-heranca/">Generalização-Especialização</a>.</p>
<p><img alt="" src="http://www.sylverio.com.br/blog/image/poliformismo01.png" class="alignright" style="border:none; padding:2px;" /></p>
<p>Polimorfismo é uma solução para um problema comum em ciência da computação: &#8220;<strong>Variação condicional</strong>&#8220;.<br />
Quando um programa é projetado com lógica condicional de estrutura <strong>if-else</strong> ou instrução <strong>case</strong>, quando surgir uma nova variação, ela exigirá uma modificação da lógica desses comandos, freqüentemente em vários lugares. Causando o aumento da complexidade ciclomática e manutenibilidade no sistema e diminuição do reuso de componentes.</p>
<p><strong>Problema:</strong> Como tratar alternativas (variações condicionais) com base no tipo? Como criar componentes de software interconectáveis?</p>
<p><strong>Solução:</strong> Quando alternativas ou comportamentos relacionados variam segundo o tipo (classe), atribua a responsabilidade pelo comportamento aos tipos para os quais o comportamento varia, usando operações polimórficas.</p>
<h3>Exemplificando</h3>
<p>Como caso de estudo, vou criar um simples sistema de exame virtual, onde iram existir 2 tipos de questões, numéricas e textos (descritivas).<br />
Abaixo temos o modelo de domínio de nossa aplicação.<br />
<img alt="" src="http://www.sylverio.com.br/blog/image/avaliacao_virtual_modelo_dominio01.png" style="border:none; padding:2px;" /></p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">namespace</span> Poliformismo
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> abstract <span style="color: #6666cc; font-weight: bold;">class</span> Question
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> Description <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> Answer <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">bool</span> Correct <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> abstract <span style="color: #6666cc; font-weight: bold;">void</span> AssessingAnswer<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Numeric <span style="color: #008000;">:</span> Question
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">int</span> CorrectAnswer <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">override</span> <span style="color: #6666cc; font-weight: bold;">void</span> AssessingAnswer<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #6666cc; font-weight: bold;">int</span> number<span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #6666cc; font-weight: bold;">bool</span> isNumeric <span style="color: #008000;">=</span> <span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">.</span><span style="color: #0000FF;">TryParse</span><span style="color: #008000;">&#40;</span>Answer, <span style="color: #0600FF; font-weight: bold;">out</span> number<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>isNumeric<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                Correct <span style="color: #008000;">=</span> Equals<span style="color: #008000;">&#40;</span>CorrectAnswer, number<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Text <span style="color: #008000;">:</span> Question
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> CorrectAnswer <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">override</span> <span style="color: #6666cc; font-weight: bold;">void</span> AssessingAnswer<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            Correct <span style="color: #008000;">=</span> Equals<span style="color: #008000;">&#40;</span>CorrectAnswer<span style="color: #008000;">.</span><span style="color: #0000FF;">ToUpper</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, Answer<span style="color: #008000;">.</span><span style="color: #0000FF;">ToUpper</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Vamos pensar no seguinte problema, as regras de avaliações de respostas para perguntas em texto se diferem das numéricas.<br />
Seguindo o princípio do polimorfismo, devemos atribuir a responsabilidade de quem deve conhecer as regras aos tipos (no nosso caso  a classe <em>Text</em> e <em>Numeric </em>) utilizando operações polimórficas.<br />
Para isso criamos a classe abstrata <em>Question </em>(Questão) é conceito geral, que pode representa qualquer um dos tipos de suas implementações (numérica ou texto).</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Collections.Generic</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">namespace</span> Poliformismo
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Exam
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> Exam<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            Questions <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span>question<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            Questions<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">new</span> Numeric <span style="color: #008000;">&#123;</span>Description <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Com quantos anos Nostradamos morreu?&quot;</span>, CorrectAnswer <span style="color: #008000;">=</span> <span style="color: #FF0000;">47</span><span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            Questions<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">new</span> Text <span style="color: #008000;">&#123;</span>Description <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Qual a cor do cavalo branco de Napoleão?&quot;</span>, CorrectAnswer <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Branco&quot;</span><span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> List<span style="color: #008000;">&lt;/</span>question<span style="color: #008000;">&gt;&lt;</span>question<span style="color: #008000;">&gt;</span> Questions <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> Name <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">int</span> Result <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> ShowQuestions<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>Question question <span style="color: #0600FF; font-weight: bold;">in</span> Questions<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>question<span style="color: #008000;">.</span><span style="color: #0000FF;">Description</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #6666cc; font-weight: bold;">string</span> answer <span style="color: #008000;">=</span> Console<span style="color: #008000;">.</span><span style="color: #0000FF;">ReadLine</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                question<span style="color: #008000;">.</span><span style="color: #0000FF;">Answer</span> <span style="color: #008000;">=</span> answer<span style="color: #008000;">;</span>
                question<span style="color: #008000;">.</span><span style="color: #0000FF;">AssessingAnswer</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> ShowResult<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Correções da avaliação.&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>Question question <span style="color: #0600FF; font-weight: bold;">in</span> Questions<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;A resposta {0} esta: {1}&quot;</span>, question<span style="color: #008000;">.</span><span style="color: #0000FF;">Answer</span>, <span style="color: #008000;">&#40;</span>question<span style="color: #008000;">.</span><span style="color: #0000FF;">Correct</span> <span style="color: #008000;">?</span> <span style="color: #666666;">&quot;Certa&quot;</span> <span style="color: #008000;">:</span> <span style="color: #666666;">&quot;Errada&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
&nbsp;
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&lt;/</span>question<span style="color: #008000;">&gt;</span></pre></div></div>

<p>Reparem que para a classe <em>Exam</em> a manipulação das questões é transparente, nesse nível de abstratação, não importa se é uma questão do tipo numérica ou textual.<br />
No método <em>ShowQuestions</em> quando o usuário digita a resposta, a classe <em>Exam</em> delega a classe <em>Question</em> a responsabilidade de verificar se a mesma esta correta. Assim cada tipo da operação aplica suas regras para validar a pergunta.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">namespace</span> Poliformismo
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Program
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> args<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            Exam exam <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Exam <span style="color: #008000;">&#123;</span>Name <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Carlos Fernando&quot;</span><span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
            exam<span style="color: #008000;">.</span><span style="color: #0000FF;">ShowQuestions</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            exam<span style="color: #008000;">.</span><span style="color: #0000FF;">ShowResult</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Esse princípio traz diversas vantagens para a arquitetura da aplicação. Além de diminuir a complexidade ciclomática da aplicação porque não utilizamos instruções condicionais (if-else) para tratar as variações condicionais <em>(&#8220;se for questão do tipo texto ou se for questão do tipo numérica&#8221;)</em>. Também auxilia na arquitetura, pois facilita a extensão de novas funcionalidades. Se caso em momento futuro surja a necessidade de criar questões de múltiplas escolhas, não teremos que alterar o exame (<em>Exam</em>), e sim  implementar uma nova classe onde implemente a abstração de questão.<br />
Nesse exemplo, tratamos alternativas com base no tipo, para soluções de componentes de software interconectáveis, será realizado em um próximo post.</p>
<p><strong>Conclusão</strong></p>
<p>Polimorfismo é um princípio fundamental no projeto e desenvolvimento de um sistema, diminui a complexidade ciclomática de uma aplicação e ainda permite que seja facilmente estendido para tratar novas variações.<br />
Esse princípio deve ser muito bem compreendido por desenvolvedores, pois muitos design patterns utilizam seus conceitos para implementações de soluções.</p>
<p><strong>Padrões relacionados:</strong></p>
<ul>
<li>Variações protegidas</li>
<li>Vários padrões de projetos GOF</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2012/01/polimorfismo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Princípio Controlador</title>
		<link>http://sylverio.com.br/blog/2011/08/principio-controlador/</link>
		<comments>http://sylverio.com.br/blog/2011/08/principio-controlador/#comments</comments>
		<pubDate>Fri, 05 Aug 2011 01:58:27 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[O.O.]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=790</guid>
		<description><![CDATA[Problema: Qual é o primeiro objeto, além da camada de UI, que recebe e coordena (&#8220;Controla&#8221;) uma operação no sistema? Solução: Atribua a responsabilidade a uma classe que representa uma das seguintes escolhas: Representa o &#8220;sistema global&#8221;, um &#8220;objeto raiz&#8221;, &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2011/08/principio-controlador/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p><strong>Problema:</strong> Qual é o primeiro objeto, além da camada de UI, que recebe e coordena (<em>&#8220;Controla&#8221;</em>) uma operação no sistema?</p>
<p><strong>Solução:</strong> Atribua a responsabilidade a uma classe que representa uma das seguintes escolhas:</p>
<ul>
<li>Representa o <em>&#8220;sistema global&#8221;</em>, um <em>&#8220;objeto raiz&#8221;</em>, um dispositivo dentro do qual o software está sendo processado, ou um subsistema importante &#8211; essas são todas variantes de um controlador fachada (<em>facade controller</em>)</li>
<li>Representa um cenário de um caso de uso dentro do qual ocorre o evento do sistema, frequentemente denominado TratadoDo&lt;nomedecasodeuso&gt;, CoordenadorDe&lt;nomedecasodeuso&gt; ou SessaoDo&lt;nomedecasodeuso&gt;
<ul>
<li>Use a mesma classe controladora para todos os eventos do sistema do mesmo cenário do caso de uso.</li>
<li>Informalmente, uma sessão é uma instância de convenção com um ator. Sessões podem ser de qualquer tamanho, mas frequentemente são organizadas em casos de uso.</li>
</ul>
</li>
</ul>
<p>Um <strong>controlador</strong> é o primeiro objeto além da camada de UI que é responsável por receber ou tratar uma mensagem de operação do sistema. Esse é um padrão de delegação, de acordo com a premissa que a camada de UI não deve conter a lógica da aplicação, os objetos da camada de UI precisam delegar essa solicitação a outra camada.</p>
<p><strong>Quando e como utilizar!</strong><br />
Os <i>Controladores Fachada</i> são adequados quando não exitem &#8220;demasiados&#8221; eventos de sistema.<br />
Nesse caso pode-se optar por <i>Controladores de Caso de Uso</i> para evitar tonar os controladores fachada sobrecarregado com excesso de responsabilidade, evitando a baixa <a href="http://sylverio.com.br/blog/2011/07/principio-alta-coesao/">coesão</a> e alto <a href="http://sylverio.com.br/blog/2011/06/principio-acoplamento-baixo/">acoplamento</a>.</p>
<p>Em 1967 <a href="http://en.wikipedia.org/wiki/Ivar_Jacobson">Ivar Jacobson</a> desenvolve uma metodologia onde existem os conceitos (opcionais) de <i>classes de fronteira</i>, <i>classes de controle</i> e <i>classes de entidade</i>. Os objetos de fronteiras, são abstrações das interfaces. Os objetos de entidade são objetos do domínio. E os objetos de controles são tratadores de caso de uso.</p>
<p><strong>Conceito X Tecnologia</strong><br />
O Princípio Controlador apresentado difere de controladores de tecnologias como <a href="http://www.asp.net/mvc">ASP.NET MVC</a>, <a href="http://www.asp.net/web-forms">ASP.NET WebForms</a>, <a href="http://www.devmedia.com.br/post-7238-Fundamentos-do-Java-Struts.html">Struts</a> (JAVA) entre outras.<br />
O code behind do WebForms ou são tratadores de eventos do navegador, já os controllers (Action) do MVC são controladores de interação e fluxo de página. Estes deveram obter uma referência para objetos controladores do domínio a fim de obter uma Separação Modelo-Visão.</p>
<p><strong>Vantagens</strong></p>
<ul>
<li>Aumento da possibilidade de reutilização e de interfaces &#8220;plugáveis&#8221; &#8211; essa vantagem garante que logica de aplicação não seja tratada na interface.</li>
<li>Melhora a forma de gerenciamento de sobre o estado do caso de uso &#8211; permite garantir que uma determinada chamada (método) não irá ocorrer até que outra tenha sido executada.</li>
</ul>
<p><strong>Padrões Relacionados</strong></p>
<ul>
<li>Commando</li>
<li>Fachada</li>
<li>Camadas</li>
<li>Invenção Pura</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2011/08/principio-controlador/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Princípio Alta Coesão</title>
		<link>http://sylverio.com.br/blog/2011/07/principio-alta-coesao/</link>
		<comments>http://sylverio.com.br/blog/2011/07/principio-alta-coesao/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 03:52:40 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[O.O.]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=778</guid>
		<description><![CDATA[Coesão em ciência da computação é a relação de quão fortemente relacionadas e objetivas são as responsabilidades de uma classe. Problema: Como manter os objetos bem focados, inteligíveis, gerenciavéis e como efeito colateral apoiar o baixo acoplamento? Solução: Atribuir uma &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2011/07/principio-alta-coesao/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Coesão em <em>ciência da computação</em> é a relação de quão fortemente relacionadas e objetivas são as responsabilidades de uma classe.</p>
<p><strong>Problema:</strong> Como manter os objetos bem focados, inteligíveis, gerenciavéis e como efeito colateral apoiar o <a href="http://sylverio.com.br/blog/2011/06/principio-acoplamento-baixo/">baixo acoplamento</a>?<br />
<strong>Solução:</strong> Atribuir uma responsabilidade de forma que a coesão permaneça alta.</p>
<p>Em outras palavras, são classes de difícil entendimento e manutenção consequentemente de difícil reutilização, executam atividades que deveriam ser delegadas para outros objetos, ou apresentam um nível de abstração alto.</p>
<p>Para exemplificar vou apresentar uma situação fictícia, de um sistema de atendimento de chamados, e esses atendimentos podem esta relacionados a vários clientes.</p>
<p><img src="http://sylverio.com.br/blog/image/sd_exemplo_coesao_pior.png" alt="diagrama de sequência exemplo coesão pior" /></p>
<p>Considere a seguinte situação, o usuário adiciona um cliente ao atendimento. O ControladorAtendimento recebe a mensagem, seguindo o <a href="http://sylverio.com.br/blog/2011/02/principio-criador/">princípio criador</a>, ela detêm os dados iniciais de Cliente e se torna uma boa candidata para criar a instância c do Cliente.<br />
Depois a instância ControladorAtendimento envia uma mensagem AdicionarCliente passando a instância c  Cliente para o Atendimento.</p>
<p>Nesse caso de forma isolado, não há problemas de coesão, porem se o Controlador  continuar a ser responsável pela maioria dos serviços executados pelo gerenciamento de um atendimento ele irá se sobrecarregar de tarefas e perderá sua coesão.</p>
<p>O digrama abaixo apresenta a solução para o problema citado:</p>
<p><img src="http://sylverio.com.br/blog/image/sd_exemplo_coesao_melhor.png" alt="Diagrama de sequência exemplo coesão melhor" /></p>
<p>O ControladorAtendimento delega para o objeto Atendimento a função de criar a instancia de Cliente.<br />
Dessa forma tornamos a classe Atendimento mais coesa, pois suas atividades estão mais encapsuladas.<br />
Se analisarmos melhor, o <a href="http://sylverio.com.br/blog/2011/02/principio-criador/">princípio criador</a> esta sendo mais bem aplicado nesse caso, pois Atendimento “contém” uma lista Cliente e Atendimento usa Cliente de maneira muito próxima, ou seja, são duas condições que a tonam uma candidata a criação instância Cliente muito melhor que ControladorAtendimento.<br />
Outro princípio que podemos identificar que foi aplicado nessa solução foi a diminuição do <a href="http://sylverio.com.br/blog/2011/06/principio-acoplamento-baixo/">acoplamento</a> da classe ControladorAtendimento, pois ela não precisa mais ter conhecimento (ou referência) para do objeto Cliente.</p>
<p>Segundo Grandy Booch, coesão alta existe quando os elementos de um componente &#8220;trabalham juntos para fornecer algum comportamento bem delimitado&#8221;.</p>
<p>Craig Larman define uma classe com coesão alta da como, &#8220;tem um número relativamente pequeno de métodos, com funcionalidade altamente relacionada, e não executa muito trabalho. Se a tarefa for grande, irá colaborar com outros objetos para dividir o esforço&#8221;.</p>
<h2>Graus de Coesão</h2>
<p>1. <em>Coesão Muito Baixa</em> &#8211; Uma classe é a única responsável por muitas coisas em áreas funcionais muito diferentes.<br />
2. <em>Coesão Baixa</em> &#8211; Uma classe é a única responsável por uma tarefa complexa em uma área funcional.<br />
3. <em>Coesão Alta</em> &#8211; Uma classe que tem responsabilidades moderadas em uma área funcional e colabora com outras classes para realizar a tarefa.<br />
4. <em>Coesão Moderada</em> &#8211; Uma classe tem peso leve e responsabilidade exclusivas em algumas áreas logicamente relacionadas ao conceito da classe, mas não umas com as outras.</p>
<h2>Conclusão</h2>
<p>Assim como o Baixo Acoplamento, Coesão Alta é um princípio que devemos ter em mente durante todo o desenvolvimento/projeto de um sistema, pois auxilia a avaliação de alternativas e de tomada de decisão sobre os objetos de software.</p>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2011/07/principio-alta-coesao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Princípio Acoplamento Baixo</title>
		<link>http://sylverio.com.br/blog/2011/06/principio-acoplamento-baixo/</link>
		<comments>http://sylverio.com.br/blog/2011/06/principio-acoplamento-baixo/#comments</comments>
		<pubDate>Thu, 02 Jun 2011 02:29:26 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[O.O.]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=733</guid>
		<description><![CDATA[Acoplamento é uma media de quão fortemente um elemento está conectado a, tem conhecimento de, ou depende de outros elementos. Um objeto com acoplamento baixo (ou fraco) não depende de muitos outros objetos. O nível de acoplamento pode ser analisado &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2011/06/principio-acoplamento-baixo/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p><strong>Acoplamento</strong> é uma media de quão fortemente um elemento está conectado a, tem conhecimento de, ou depende de outros elementos. Um objeto com acoplamento baixo (ou fraco) não depende de muitos outros objetos.<br />
O nível de acoplamento pode ser analisado de vários pontos, desde classes, pacotes e camadas à subsistemas e sistemas.</p>
<p><strong>Problema:</strong> Como apoiar dependência baixa, baixo impacto de modificação e aumentar o reúso?</p>
<p><strong>Solução:</strong> Atribuir responsabilidade de modo que o acoplamento permaneça baixo.</p>
<p>Abaixo segue alguns efeitos na arquitetura que uma classes com acoplamento alto (ou forte) pode causar:</p>
<ul>
<li><strong>Rigidez:</strong> Alteração em uma  classe, obriga a alteração em diversas classes relacionadas, gerando uma cadeia de manutenção, conhecidas como <strong>“efeito dominó”</strong>.</li>
<li><strong>Fragilidade:</strong> Dificuldade de manutenção em um determinado ponto do sistema, pois gera problemas em outro ponto não relacionado, conhecido como <strong>“efeito borboleta-maremoto”</strong>, nomenclatura extraída da Teoria do Caos. Esta teoria defende que o simples bater de asas de uma borboleta em um extremo do mundo, pode causar um tornado no outro extremo.</li>
<li><strong>Imobilidade:</strong> Dificuldade de reutilização por excesso de dependência entre<br />
classes, conhecido como <strong>“efeito banana-gorila”</strong>, pois a dependência é tão grande que solicitar uma banana e é obtido um gorila junto com ela.</li>
</ul>
<p><strong>Formas comum de acoplamento entre classes:</strong> </p>
<ul>
<li>Objeto A tem um atributo do que se refere a instância de um objeto B.</li>
<li>Objeto A chama um serviço de um objeto B.</li>
<li>Objeto A tem um método que referencia uma instância de um objeto B (seja por parâmetro, variável local ou retorno da mensagem).</li>
<li>Objeto A é uma subclasse do objeto B.</li>
<li>Objeto B é uma interface implementada pelo objeto A.</li>
</ul>
<p><em>Dica:</em> O nível de acoplamento em si não deve ser considerado isolado de outros princípios tais como <a href="http://sylverio.com.br/blog/2011/05/principio-especialista-de-informacao/">Especialista de Informação</a> e <a href="http://sylverio.com.br/blog/tag/o-o/">Coesão Alta</a>.</p>
<p><strong>Contra-Indicações</strong><br />
Acoplamento forte a objetos estáveis não é um problema. Exemplo: Pode-se acoplar com segurança a biblioteca Java (java.util, etc) ou .Net (System.Collections, etc) pois são estáveis e amplamente disseminadas.</p>
<p>O acoplamento alto não é um problema, mas passa a ser um problema em classes que estão sujeitas a modificações ou entre objetos de pacotes e/ou camadas diferentes. A idéia principal é minimizar os efeitos de dependência excessivo entre objetos a fim de reduzir os impactos de modificações e permitir o reuso de objetos.<br />
Devemos sempre avaliar o grau de acoplamento entre objetos e quais as conseqüências teremos em nosso sistema ao aumenta-lo.<br />
Objetos genéricos devem sempre ter um nível de acoplamento muito baixo possibilitar reutiliza-lo em diversas partes do sistemas sem grandes impactos de dependência.<br />
Por outro lado, objetos com ausência de acoplamento também não são bem vistos no sistema, pois contradiz a metáfora central da tecnologia de objetos: <span style="text-decoration:underline;"><em>&#8220;um sistema é composto por objetos conectados que se comunicam por mensagens&#8221;</em></span>.</p>
<p><strong>Vantagens:</strong></p>
<ul>
<li>Não é afetado por mudanças em outros computadores.</li>
<li>Simples de entender isoladamente.</li>
<li>É conveniente para reutilização.</li>
</ul>
<p><strong>Padrões Relacionados</strong></p>
<ul>
<li>Variação Protegida</li>
</ul>
<p>Enjoy <img src='http://sylverio.com.br/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2011/06/principio-acoplamento-baixo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

