<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-5714003148651085737</atom:id><lastBuildDate>Thu, 05 Sep 2024 14:28:50 +0000</lastBuildDate><title>Você com mais usabilidade</title><description>As pessoas mudaram. Você mudou! Nesse mar de informação onde a relevância a nos guia precisamos considerar as capacidades e limitações das pessoas para que possamos tornar o trabalhos delas mais eficaz, eficiente e agradável.&#xa;&#xa;Precisamos entregar tecnologia com usabilidade prática!</description><link>http://apolineosocial.blogspot.com/</link><managingEditor>noreply@blogger.com (Apolineo)</managingEditor><generator>Blogger</generator><openSearch:totalResults>23</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-1622796695636715721</guid><pubDate>Sat, 02 Jun 2012 23:37:00 +0000</pubDate><atom:updated>2012-06-02T16:37:57.881-07:00</atom:updated><title>{ Videocast } Metro . designing great apps</title><description>Com o lançamento do Windows Phone a Microsoft e seu estilo de design Metro começaram a colocar a experiência do usuário como ponto de partida do projeto de uma app imersiva, elegante e refinada.&lt;br /&gt;
&lt;br /&gt;
Enquanto que os aplicativos tradicionais utilizam diversos tipos de elementos visuais que tiram o foco do usuário no conteúdo, no Metro, são removidos para dar lugar a tipografia e deixar o usuário focado no conteúdo.&lt;br /&gt;
&lt;br /&gt;
Os princípios do design Metro são o guia para a construção de apps modernas e empolgantes.&lt;br /&gt;
&lt;br /&gt;
Quer conhecer mais? Assista o videocast da palestra realizada no MspTechDay e no Hackathon de Windows 8.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/MeQHYU&quot;&gt;{ YouTube } Metro . designing great apps&lt;/a&gt;</description><link>http://apolineosocial.blogspot.com/2012/06/videocast-metro-designing-great-apps.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-6139148793739002376</guid><pubDate>Fri, 15 Jul 2011 22:09:00 +0000</pubDate><atom:updated>2011-07-15T15:09:15.627-07:00</atom:updated><title>O que é ergonomia para software?</title><description>Bom, vamos começar pelas origens, a palavra &lt;strong&gt;ERGONOMIA&lt;/strong&gt; vem de duas palavras Gregas: &quot;ergon&quot; que significa &lt;strong&gt;trabalho&lt;/strong&gt; e &quot;nomos&quot; que significa &lt;strong&gt;leis&lt;/strong&gt;. &lt;br /&gt;
&lt;br /&gt;
Atualmente, é usada para descrever a ciência de &quot;conceber uma tarefa que se adapte ao trabalhador, e não forçar o trabalhador a adaptar-se à tarefa&quot;.&lt;br /&gt;
&lt;br /&gt;
A ergonomia tem discutido e comprovado que os aspectos humanos do trabalho devem ser considerados, e a situação de trabalho deve ser modificada em função do homem, o qual, deve ser considerado como um ser que acumulou experiências, desenvolveu crenças, estruturou valores, a partir dos quais define seus padrões de atitude e comportamentos (Medeiros, 1994).&lt;br /&gt;
&lt;br /&gt;
Alguns dos aspectos considerados pela ergonomia são:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Competências:&lt;/strong&gt; um atributo subjetivo sempre relacionadas as atividades a serem desempenhadas, são conjuntos de conhecimentos, de capacidades de ação e de comportamentos estruturados em função de um objetivo e em uma determinada situação (Gilbert, Parlier,1992 in Boterf, 1995);&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Saber-fazer:&lt;/strong&gt; são os conhecimentos procedurais, tal como eles se manifestam na atividade, dquiridos mais pela prática do que pela formação, raramente são verbalizados e dificilmente transmissíveis (Montmollin, 1995);&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Erro Humano:&lt;/strong&gt; o erro muitas vezes é determinado por características do operador (habilidades conhecimentos, experiência), somadas as características da tarefa (objetivos, sistema técnico, ambiente, regras de execução), portanto, a ergonomia analisa estas condições externas ao trabalho e consideram aspectos internos do trabalhador capazes de gerar erros;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trabalho Prescrito x Trabalho Real:&lt;/strong&gt; a ergonomia analisa o conhecimento do trabalho prescrito, das regras fixadas, confrontando com o conhecimento do trabalho realmente desenvolvido de forma a reduzir dificuldades relativas às condições de trabalho ou ao seu melhoramento devido ao fato de considerar apenas o trabalho prescrito e não o trabalho real;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;h4&gt;
MAS, E NA PRÁTICA?&lt;/h4&gt;
&lt;br /&gt;
Alguns exemplos das áreas de atuação da ergonomia no ramo de tecnologia da informação:&lt;br /&gt;
&lt;ul&gt;&lt;br /&gt;
&lt;li&gt;Na concepção de sistemas computadorizados, de modo a que sejam mais fáceis de utilizar e que haja menor probabilidade de ocorrência de erros durante a sua operação;&lt;/li&gt;
&lt;li&gt;Na arquitetura da informação, de modo a que a interpretação e uso de guias, símbolos e interface seja mais fácil e sem ocorrência de erros;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Nesse momento você provavelmente deve estar esperando ver exemplos práticos de sucesso, porém, que tal conhecer coisas que não deram tão certo?&lt;br /&gt;
&lt;br /&gt;
Suponha que um amigo seu te diz que a empresa XYZ S/A está procurando um profissional que se enquadra com o seu perfil, então, você vai até o site deles. Conforme você procura alguma coisa para clicar, veja como o rótulo escolhido para o botão para a seção de empregos pode fazer diferença:&lt;br /&gt;
&lt;br /&gt;
&lt;table style=&quot;width: 450px;&quot;&gt;
    &lt;tr style=&quot;background-color: #c00000; color: White;&quot;&gt;
        &lt;td&gt;&lt;strong&gt;&lt;  ÓBVIO&lt;/strong&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;strong&gt;REQUER RACIOCÍNIO  &gt;&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td style=&quot;vertical-align: top; padding-top: 10px;&quot;&gt;
            Empregos!&lt;br /&gt;
            &lt;span style=&quot;color: #c00000&quot;&gt;Click&lt;/span&gt;
        &lt;/td&gt;
        &lt;td style=&quot;vertical-align: top; padding-top: 10px;&quot;&gt;
            Hmm.&lt;br /&gt;
            &lt;span style=&quot;color: #c00000&quot;&gt;[alguns milisegundos pensando]&lt;/span&gt;
            &lt;br /&gt;
            Empregados.&lt;br /&gt;
            &lt;span style=&quot;color: #c00000&quot;&gt;Click&lt;/span&gt;
        &lt;/td&gt;
        &lt;td style=&quot;padding-top: 10px;&quot;&gt;
            Humm. Talvez seja a área de empregos, mas parece mais que isso.
            &lt;br /&gt;
            Eu clico ou continuo procurando?&lt;br /&gt;
            &lt;span style=&quot;color: #c00000&quot;&gt;Click&lt;/span&gt;
        &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;
            &lt;table&gt;
                &lt;tr&gt;
                    &lt;td&gt;&lt;img src=&quot;http://www.apolineo.com.br/App_Themes/Default/Image/usuario_sistema.png&quot; width=&quot;48px&quot; height=&quot;54px&quot; /&gt;&lt;/td&gt;
                    &lt;td&gt;&lt;img src=&quot;http://www.apolineo.com.br/App_Themes/Default/Image/best_button_label.png&quot; width=&quot;78px&quot; height=&quot;20px&quot; /&gt;&lt;/td&gt;
                &lt;/tr&gt;
            &lt;/table&gt;
        &lt;/td&gt;
        &lt;td&gt;
            &lt;table&gt;
                &lt;tr&gt;
                    &lt;td&gt;&lt;img src=&quot;http://www.apolineo.com.br/App_Themes/Default/Image/usuario_sistema.png&quot; width=&quot;48px&quot; height=&quot;54px&quot; /&gt;&lt;/td&gt;
                    &lt;td&gt;&lt;img src=&quot;http://www.apolineo.com.br/App_Themes/Default/Image/good_button_label.png&quot; width=&quot;123px&quot; height=&quot;20px&quot; /&gt;&lt;/td&gt;
                &lt;/tr&gt;
            &lt;/table&gt;
        &lt;/td&gt;
        &lt;td&gt;
            &lt;table&gt;
                &lt;tr&gt;
                    &lt;td&gt;&lt;img src=&quot;http://www.apolineo.com.br/App_Themes/Default/Image/usuario_sistema.png&quot; width=&quot;48px&quot; height=&quot;54px&quot; /&gt;&lt;/td&gt;
                    &lt;td&gt;&lt;img src=&quot;http://www.apolineo.com.br/App_Themes/Default/Image/bad_button_label.png&quot; width=&quot;103px&quot; height=&quot;20px&quot; /&gt;&lt;/td&gt;
                &lt;/tr&gt;
            &lt;/table&gt;
        &lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
Todos os elementos da interface do sistema pode nos obrigar a parar, porém, a falta ou a má condução das atividades de ARQUITETURA DE INFORMAÇÃO pode nos obrigar a pensar demais.&lt;br /&gt;
&lt;br /&gt;
&lt;table&gt;
    &lt;tr&gt;
        &lt;td&gt;Imagine que você acabou de ser contratado(a) para trabalhar como caixa de um restaurante super movimentado no centro da cidade. Então, no primeiro dia de trabalho você olha aquela fila de pessoas querendo pagar, informa o produto que o cliente está comprando e...&lt;/td&gt;
        &lt;td&gt;&lt;img src=&quot;http://www.apolineo.com.br/App_Themes/Default/Image/bad_ui_design_2.png&quot; width=&quot;267px&quot; height=&quot;175px&quot; /&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;
            &lt;br /&gt;&lt;p&gt;O que está errado? A quantidade. Porque? Como e aonde eu corrijo o problema?
            &lt;p&gt;Sem mencionar o tom agressivo da mensagem expresso pelo “!”, a melhor abordagem é identificar onde está errado e fornecer informações da provável forma de resolver o problema.
        &lt;/td&gt;
        &lt;td&gt;&lt;img src=&quot;http://www.apolineo.com.br/App_Themes/Default/Image/good_ui_design_2.png&quot; width=&quot;268px&quot; height=&quot;175px&quot; /&gt;&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;
&lt;br /&gt;
Uma boa mensagem de erro pode reduzir o impacto do erro humano, facilitar o aprendizado do sistema e garantir a satisfação do usuário em relação ao produto, para isso, basta o ANALISTA DE SISTEMA formar mensagens concisas.&lt;br /&gt;
&lt;br /&gt;
Que tal um outro belo exemplo de um péssimo design?&lt;br /&gt;
&lt;br /&gt;
&lt;img height=&quot;250px&quot; src=&quot;http://www.apolineo.com.br/App_Themes/Default/Image/bad_ui_design_3.png&quot; width=&quot;490px&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Mas nem sempre o design está péssimo a ponto de ter que ser totalmente refeito.&lt;br /&gt;
&lt;br /&gt;
Repare que com algumas mudanças na paleta de cor, alinhamento e letra (tipografia) o design pode ganhar vida nova:&lt;br /&gt;
&lt;br /&gt;
&lt;img height=&quot;245px&quot; src=&quot;http://www.apolineo.com.br/App_Themes/Default/Image/redesign1.png&quot; width=&quot;490px&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img height=&quot;245px&quot; src=&quot;http://www.apolineo.com.br/App_Themes/Default/Image/redesign2.png&quot; width=&quot;490px&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Na concepção de um sistema de computador (windows, móvel, web, etc), a ergonomia é o resultado de um trabalho bem estruturado de DESIGN, ARQUITETURA DE INFORMAÇÃO e PROGRAMAÇÃO.&lt;br /&gt;
&lt;br /&gt;
&lt;img height=&quot;261px&quot; src=&quot;http://www.apolineo.com.br/App_Themes/Default/Image/user_experience_ux.png&quot; width=&quot;490px&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong style=&quot;color: red;&quot;&gt;Qual sua opinião sobre o assunto?&lt;/strong&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;hr align=&quot;left&quot; noshade=&quot;true&quot; size=&quot;1&quot; width=&quot;75%&quot; /&gt;
&lt;br /&gt;
&lt;b&gt;Artigos Recomendados:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/kxdeRh&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Porque Investir em Ergonomia e Usabilidade? &lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/fKLi6Y&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Software para Pessoas do Séc XXI &lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/f7y2PR&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Redes Sociais no Ambiente Corporativo &lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/eIJKUX&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Pensando em ERGONOMIA e USABILIDADE &lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/b5MMme&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Design centrado no usuário&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/gc9g36&quot; target=&quot;_blank&quot;&gt;&lt;img height=&quot;128px&quot; src=&quot;http://www.apolineo.com.br/app_themes/default/image/twitter_follow_me.png&quot; width=&quot;128px&quot; /&gt;&lt;/a&gt;</description><link>http://apolineosocial.blogspot.com/2011/07/o-que-e-ergonomia-para-software.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-5471317008645439926</guid><pubDate>Mon, 23 May 2011 13:35:00 +0000</pubDate><atom:updated>2011-07-15T14:35:44.189-07:00</atom:updated><title>Porque Investir em Ergonomia e Usabilidade?</title><description>&lt;p&gt;Você já viu um bom produto, totalmente funcional, fracassar porque o usuário acha que ele “mais atrapalha do que ajuda”? &lt;/p&gt;
&lt;p&gt;Não, isso não é história de vendedor. Vou dar uma dica. Atualmente, uma franquia de chocolates simplesmente prefere tirar o pedido dos clientes em papel do que usar o sistema do PDV da loja!&lt;/p&gt;
&lt;p&gt;Quando apresentamos o trabalho de ergonomia e usabilidade, nossa equipe comercial ouve de alguns clientes “Não acredito nesse tipo de trabalho. Meu sistema está perfeito!”, e de outros, “Quero investir em usabilidade, mas não sei por onde começar...”.&lt;/p&gt;
&lt;p&gt;Hoje, vamos compartilhar nossa visão para esse tipo de trabalho.&lt;/p&gt;
&lt;h4&gt;Usabilidade x Ergonomia&lt;/h4&gt;
&lt;p&gt;O primeiro passo que damos é deixar claro qual é o campo da ergonomia e qual é o campo da usabilidade.&lt;/p&gt;
&lt;p&gt;A usabilidade ocupa-se da interação do usuário com a interface através de apresentações (painés de informações, dados, controles, comandos e mensagens) e estruturas de diálogo (o que interliga as entradas dos usuários com as apresentações de novos painéis).&lt;/p&gt;
&lt;p&gt;Ou seja, é o casamento entre a inteface do sistema, o usuário que a opera, a tarefa a ser realizada e o ambiente de operação. &lt;/p&gt;
&lt;p&gt;Já a ergonomia trabalha a adaptação de um dispositivo ao seu operador e à tarefa realizada.&lt;/p&gt;
&lt;p&gt;Para se construir interfaces ergonômicas e que proporcionem usabilidade, os profissionais envolvidos utilizam técnicas e conceitos para organizar os diferentes elementos gráficos de forma a facilitar a percepção, o racioncínio, a memorização e a tomada de decisão.&lt;/p&gt;
&lt;h4&gt;O que é problema de Ergonomia?&lt;/h4&gt;
&lt;p&gt;O problema de ergonomia é identificado quando um aspecto da interface está em desacordo com as características dos usuários, por exemplo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aspecto inadequado na interface;&lt;/li&gt;
&lt;li&gt;Recomendação ou critério ergonômico sendo desrespeitado;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Faça um teste você mesmo, olhe para uma interface do seu sistema e pergunte:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Os rótulos dos campos contêm um elemento específico, por exemplo &quot;:&quot;, como convite às entradas de dados?&lt;/li&gt;
&lt;li&gt;Nos agrupamentos de dados , os itens estão organizados espacialmente segundo um critério lógico?&lt;/li&gt;
&lt;li&gt;Os títulos das páginas de menu são explicativos, refletindo a natureza da escolha a ser feita?&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h4&gt;O que é problema de Usabilidade?&lt;/h4&gt;
&lt;p&gt;Já o problema de usabilidade é observado em determinadas circuntâncias, quando uma característica do sistema interativo (problema de ergonomia) compromete a produtividade, a qualidade da tarefa ou (no pior caso) inviabiliza sua realização e é descrito a partir:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Do contexto de operação onde o problema pode ser observado;&lt;/li&gt;
&lt;li&gt;Algum aspecto inadequado na interface (problema de usabilidade);&lt;/li&gt;
&lt;li&gt;Frequência com que o problema/contexto se manifesta;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h4&gt;O que faço? Inspeção de ergonomia ou teste de usabilidade?&lt;/h4&gt;
&lt;p&gt;O teste de usabilidade é um trabalho balisado por um estudo e avaliação que requer um tempo hábil para planejamento, execução e análise (de 2 a 3 semanas, dependendo da quantidade de tarefas a serem avaliadas) e fornece compensadores.&lt;/p&gt;
&lt;p&gt;Para produtos com aspectos ou conceitos inovadores o mais indicado é o teste de usabilidade.&lt;/p&gt;
&lt;p&gt;A inspeção ergonômica fornece uma resposta rápida e precisa (em média 2 semana, dependendo da quantidade de telas), que dependendo da natureza e dos conceitos do produto, pode até suprir testes de usabilidades.&lt;/p&gt;
&lt;p&gt;Mas lembre-se, só é possível realizar inspeções ergonômicas ou testes de usabilidade se o seu sistema está pronto ou se você tem um protótipo funcional do sistema, caso contrário, o designer de interfaces é o investimento mais indicado.&lt;/p&gt;
&lt;h4&gt;Quero melhorar a qualidade do meu sistema, por onde começo?&lt;/h4&gt;
&lt;p&gt;Investir em inspeções de ergonomia é o melhor passo, porque, fornece uma resposta rápida da percepção que os usuários podem ter e permite que você conheça melhor os benefícios desse tipo de trabalho e como explorar o diferencial que trará ao seu produto.&lt;/p&gt;
&lt;p&gt;A Apolineo realiza esse tipo de trabalho.&lt;/p&gt;
&lt;p&gt;Baseado na norma ISO 9241:10, são avaliados 197 itens dispostos em 18 categorias e com pesos de acordo com sua criticidade, onde ao final, é gerado um score da qualidade ergonômica:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;BAIXA:&lt;/b&gt; a interface precisa ser totalmente reformulada;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;REGULAR:&lt;/b&gt; a interface possui muitos problemas críticos, corrija-os;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;BOA:&lt;/b&gt; faça uma revisão dos itens mais críticos;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ÓTIMA:&lt;/b&gt; corrigir pontualmente os itens mais críticos (se houver);&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Conheça nosso portfólio em &lt;a href=&quot;http://bit.ly/lx6EwI&quot;&gt;http://www.apolineo.com.br/portfolio/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Até a próxima!&lt;/p&gt;
&lt;hr align=&quot;LEFT&quot; noshade=&quot;noshade&quot; size=&quot;1&quot; width=&quot;75%&quot; /&gt;&lt;br /&gt;
&lt;b&gt;Artigos Recomendados:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/fKLi6Y&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Software para Pessoas do Séc XXI &lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/f7y2PR&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Redes Sociais no Ambiente Corporativo &lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/eIJKUX&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Pensando em ERGONOMIA e USABILIDADE &lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/b5MMme&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Design centrado no usuário&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/gc9g36&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://www.apolineo.com.br/app_themes/default/image/twitter_follow_me.png&quot; width=&quot;128px&quot; height=&quot;128px&quot;&gt;&lt;/a&gt;</description><link>http://apolineosocial.blogspot.com/2011/05/porque-investir-em-ergonomia-e.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-4937583437538669027</guid><pubDate>Tue, 03 May 2011 03:26:00 +0000</pubDate><atom:updated>2011-05-03T09:48:13.335-07:00</atom:updated><title>Como vai a ergonomia do seu código?</title><description>&lt;p&gt;No mundo RAD (Rapid Application Development) de hoje pouco se discuti sobre a qualidade do código fonte dos nossos softwares.&lt;/p&gt;
&lt;p&gt;E se você fizer uma pesquisa no Google encontrará um conteúdo abordando aspectos da ergonomia do código de forma isolada. Nosso intuito com esse artigo é iniciar uma discussão no intuito de identificar e organizar as qualidades qualidades desejadas e como chegar lá...&lt;/p&gt;
&lt;p&gt;Após algumas reflexões e analogias com a ergonomia de interfaces chegamos em 6 qualidades que devemos trabalhar:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;b&gt;Acoplamento:&lt;/b&gt; diz respeito a qualidade de baixa dependência;&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;Coesão:&lt;/b&gt; diz respeito a qualidade de responsabilidade única;&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;Flexibilidade:&lt;/b&gt; diz respeito a qualidade de extensão e personalização;&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;Legibilidade:&lt;/b&gt; diz respeito ao esforço necessário para compreensão do código;&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;Mensagens de Erros:&lt;/b&gt; diz respeito a qualidade das mensagens de erro;&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;Presteza:&lt;/b&gt; diz respeito a qualidade das informações disponiveis sobre o código para informar e conduzir a utilização do código;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Acoplamento&lt;/h3&gt;
&lt;p&gt;O acoplamento entre classes ou subsistemas é uma medida da interconexão entre as classes ou subsistemas.&lt;/p&gt;
&lt;p&gt;Exemplo de recomendações:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Evitar duplicação de código;&lt;/li&gt;
    &lt;li&gt;Evitar classes muito grandes;&lt;/li&gt;
    &lt;li&gt;Evitar métodos muito longos;&lt;/li&gt;
    &lt;li&gt;Evitar lista de parâmetro muito longas;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;O exemplo abaixo ilustra um módulo de processamento de negócios com acoplamento forte. O primeiro problema é que não podemos reaproveitar a regra de negócio independentemente da estrutura do banco de dados, e segundo, que qualquer alteração na estratégia de acesso a dados , na estrutura de dados ou configuração afetará a lógica de negócio.&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
public class BusinessLogicClass&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public void DoSomething()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int threshold = int.Parse(ConfigurationManager.AppSettings[&quot;threshold&quot;]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string connectionString = ConfigurationManager.AppSettings[&quot;connectionString&quot;];&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string sql = @&quot;select * from things size &gt; &quot; + threshold;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;using (SqlConnection connection = new SqlConnection(connectionString))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;connection.Open();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SqlCommand command = new SqlCommand(sql, connection);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;using (SqlDataReader reader = command.ExecuteReader())&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (reader.Read())&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string name = reader[&quot;Name&quot;].ToString();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string destination = reader[&quot;destination&quot;].ToString();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// do some business logic in here&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;doSomeBusinessLogic(name, destination, connection);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}
&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;Coesão&lt;/h3&gt;
&lt;p&gt;A coesão é a medida que indica se uma classe tem uma função bem definida no sistema.&lt;/p&gt;
&lt;p&gt;Um sistema composto por classes e subsistemas coesos é semelhante a um grupo de discussão online bem projetado. Cada área do grupo online é estritamente concentrada em um tópico específico, para que seja fácil acompanhar a discussão e, se você estiver procurando um diálogo sobre determinado assunto, precise visitar apenas uma sala.&lt;/p&gt;
&lt;p&gt;Exemplos de recomendações:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Utilize o principio de separação de conceitos dividindo as funcionalidades da aplicação e minimizando pontos de interação;&lt;/li&gt;
    &lt;li&gt;Utilize o principio Least Knowledge (LoD) para evitar que um objeto não conheça os detalhes internos de implementação de outro;&lt;/li&gt;
    &lt;li&gt;Utilize o principio Tell, Don’t Ask e evite que seus objetos façam perguntas a um objeto sobre seu estado interno, tome algumas decisões sobre esse estado, e então, diga ao objeto o que fazer;&lt;/li&gt;
    &lt;li&gt;Pratique a Lei de Deméter e faça com que a classe fale somente com seus “amigos” mais próximos;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;code&quot;&gt;
public class Purchase&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;private readonly double _subTotal;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public Purchase(double subTotal)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_subTotal = subTotal;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public double Total&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double discount = _subTotal &gt; 10000 ? .10 : 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return _subTotal * (1 - discount);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Account&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;private double _balance;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public void Deduct(Purchase purchase, PurchaseMessenger messenger)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (purchase.Total &lt; _balance)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_balance -= purchase.Total;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;messenger.RejectPurchase(purchase, this);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class ClassThatObeysTellDontAsk&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public void MakePurchase(Purchase purchase, Account account)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PurchaseMessenger messenger = new PurchaseMessenger();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;account.Deduct(purchase, messenger);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}
&lt;/div&gt;
&lt;p&gt;Saiba mais através do artigo Padrões na prática: coesão e acomplamento&lt;/p&gt;
&lt;h3&gt;Flexibilidade&lt;/h3&gt;
&lt;p&gt;A flexibilidade do código é a qualidade que promove a reusabilidade e a facilidade de manutenção (reparo de erro e evolução) para responder de forma rápida e confiável as mudanças exigidas pelo dinâmismo do business das empresas.&lt;/p&gt;
&lt;p&gt;Exemplos de Recomendações:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Padronizar a criação de objetos;&lt;/li&gt;
    &lt;li&gt;Isolar a complexidade de criação de objetos compostos;&lt;/li&gt;
    &lt;li&gt;Fornecer meios de extender o comportamento das classes;&lt;/li&gt;
    &lt;li&gt;Fornecer meios de mudar o comportamento das classes;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No exemplo abaixo, temos uma API para importação de dados externos ao sistema através de um conector. Nela isolamos e padronizamos a criação de conectores e fornecemos um meio de extendê-los e ou mudar sua estratégia de leitura das informações externas sem impacto no código.&lt;/p&gt;
&lt;a href=&quot;http://www.apolineo.com.br/app_themes/default/image/Flexibility_Project_Class_Model.png&quot; title=&quot;Clique para ver a imagem em tamanho real.&quot; target=&quot;_blank&quot;&gt;&lt;div style=&quot;background-image: url(&#39;http://www.apolineo.com.br/app_themes/default/image/Flexibility_Project_Class_Model_mini.png&#39;); width: 490px; height: 310px;&quot;&gt;&lt;/div&gt;&lt;/a&gt;
&lt;p&gt;Você pode fazer o download do projeto &lt;span style=&quot;color: Red;&quot;&gt;&lt;a href=&quot;http://bit.ly/mawgv2&quot; title=&quot;Clique para fazer download do projeto de exemplo.&quot;&gt;clicando aqui.&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Legibilidade&lt;/h3&gt;
&lt;p&gt;A performance e a qualidade na evolução do código leva em conta as características cognitivas e perceptivas dos usuários. &lt;/p&gt;
&lt;p&gt;Uma boa legibilidade facilita a leitura do código, a identificação de defeitos, reduz a curva de aprendizado da equipe, promove o reuso e reduz o gap de idioma com a área de negócio.&lt;/p&gt;
&lt;p&gt;Exemplos de recomendações:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Usar nomes claros e explicativos para funções (verbos) e variáveis (substantivos);&lt;/li&gt;
    &lt;li&gt;Fazer com que o código reflita suas intenções e decisões;&lt;/li&gt;
    &lt;li&gt;Trabalhar a lêxia do código de forma a refletir uma frase natural;&lt;/li&gt;
    &lt;li&gt;Utilizar o padrão Pascal Case para nomes de namespaces, classes, métodos, propriedades, eventos e delegates;&lt;/li&gt;
    &lt;li&gt;Utilizar o padrão Camel Case para nomes de variáveis;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Um recurso muito útil introduzido na versão 3.0 do Microsoft .Net Framework é o Extension Method, o qual, podemos adicionar comportamento (método) a um determinado tipo sem a necessidade de alterar o código original ou criar tipos derivados.&lt;/p&gt;
&lt;p&gt;Vejamos um exemplo:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
if (sale.IsValid() &amp;&amp; sale.SaleDetailsList.HasAllItemsValid())&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;if(Stock.EvaluateProductsAvailability(sale))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;using (var trans = new DataTransaction())&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sale.Insert();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stock.UpdateStock(sale.GetProductsSold());&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sale.SaleDetailsList.Insert();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Invoice.Generate(sale);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Carrier.PlanDeliver(sale);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;trans.Complete();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}
&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;Mensagens de Erros&lt;/h3&gt;
&lt;p&gt;A qualidade das mensagens favorece o aprendizado do sistema, indicando ao usuário a razão ou a natureza do erro cometido, o que ele fez de errado, o que ele deveria ter feito e o que ele deve fazer.&lt;/p&gt;
&lt;p&gt;Exemplos de recomendações:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Construir mensagem no idioma do usuário;&lt;/li&gt;
    &lt;li&gt;Utilizar mensagens de erro tão breves quanto possível;&lt;/li&gt;
    &lt;li&gt;Fornecer mensagens de erro orientadas a tarefas;&lt;/li&gt;
    &lt;li&gt;Utilizar termos tão específicos quanto possível para as mensagens de erros;&lt;/li&gt;
    &lt;li&gt;Adotar um vocabulário neutro, não personalizado, não repreensivo nas mensagens de erro;&lt;/li&gt;
    &lt;li&gt;Evitar o humor;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vamos avaliar isso em um exemplo.&lt;/p&gt;
&lt;p&gt;Ao invés de frases com estrutura negativo-negativo, como &lt;span style=&quot;font-style: italic&quot;&gt;“A idade mínima não pode ser menor que 18 anos”&lt;/span&gt;, procure utilizar linguagem positiva e indicar os valores esperados, &lt;span style=&quot;font-style: italic&quot;&gt;“A idade deve ser maior ou igual a 18 anos”&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Forneça na mensagem de erro todas as informações necessárias à compreensão e solução do problema.&lt;/p&gt;
&lt;p&gt;Ao invés de &lt;span style=&quot;font-style: italic&quot;&gt;“Desconto superior ao máximo permitido (G527)”&lt;/span&gt;, procure alternativas como &lt;span style=&quot;font-style: italic&quot;&gt;“O valor de desconto (R$50,00) é superior ao máximo permitido para essa transação (R$7,50). Por favor, tente novamente com valor adequado ou solicite aprovação da supervisão”&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Curiosidade: &lt;span style=&quot;color: Red;&quot;&gt;&lt;a href=&quot;http://bit.ly/ldPZpF&quot; title=&quot;Ler o artigo 10 principais, diferentes mensagens de erro da compuatação.&quot; target=&quot;_blank&quot;&gt;10 principais, diferentes e engreçadas mensagens de erro da computação&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Presteza&lt;/h3&gt;
&lt;p&gt;Uma boa presteza facilita o aprendizado do usuário em como usar uma classe/método/serviço e diminui a ocorrência de erros.&lt;/p&gt;
&lt;p&gt;Exemplos de Recomendações:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Documentar a responsabilidade da classe;&lt;/li&gt;
    &lt;li&gt;Documentar o que seus métodos fazem;&lt;/li&gt;
    &lt;li&gt;Documentar para que serve o parâmetro de um método/serviço, o valor padrão e os valores esperados;&lt;/li&gt;
    &lt;li&gt;Fornecer um cenário de uso da classe/método/serviço;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vamos avaliar isso em um exemplo.&lt;/p&gt;
&lt;p&gt;Você já usou uma classe de alguém que não se preocupou em escrever aquele cabeçalho do método, ou pior, que escreveu coisas que não ajudam em nada?&lt;/p&gt;
&lt;a href=&quot;http://www.apolineo.com.br/app_themes/default/image/Presteza_Exemple_1.png&quot; title=&quot;Clique para ver a imagem em tamanho real.&quot; target=&quot;_blank&quot;&gt;&lt;div style=&quot;background-image: url(&#39;http://www.apolineo.com.br/app_themes/default/image/Presteza_Exemple_1_mini.png&#39;); width: 490px; height: 37px;&quot;&gt;&lt;/div&gt;&lt;/a&gt;
&lt;p&gt;Vendo o exemplo acima você deve estar se perguntando: O que a classe XnMSteadyDetector faz? O que o parâmetro “CooldownFrames” controla e qual o range valores válidos? E o parametro “DetectionDuration”? Controla o tempo em segundos, millisegundos, ou outro? Qual é o valor padrão? E o “MaximumAllowedVelocity”?&lt;/p&gt;
&lt;p&gt;Alguém pode argumentar “Isso está na documentação”. Perfeito! É o mínimo que tem que ser feito, senão, seria quase impossível usar a classe.&lt;/p&gt;
&lt;p&gt;Mas no mundo .Net, onde há o Microsoft Visual Studio, você deveria ir além!&lt;/p&gt;
&lt;p&gt;Deveria fornecer informações de forma integrada com o ambiente de desenvolvimento de forma a facilitar a vida da pessoa que está utilizando sua classe/método/serviço.&lt;/p&gt;
&lt;p&gt;E isso é simples. Basta:&lt;/p&gt;
&lt;a href=&quot;http://www.apolineo.com.br/app_themes/default/image/Presteza_Exemple_2.png&quot; title=&quot;Clique para ver a imagem em tamanho real.&quot; target=&quot;_blank&quot;&gt;&lt;div style=&quot;background-image: url(&#39;http://www.apolineo.com.br/app_themes/default/image/Presteza_Exemple_2_mini.png&#39;); width: 490px; height: 358px;&quot;&gt;&lt;/div&gt;&lt;/a&gt;
&lt;p&gt;Para produzir esse resultado:&lt;/p&gt;
&lt;a href=&quot;http://www.apolineo.com.br/app_themes/default/image/Presteza_Exemple_3.png&quot; title=&quot;Clique para ver a imagem em tamanho real.&quot; target=&quot;_blank&quot;&gt;&lt;div style=&quot;background-image: url(&#39;http://www.apolineo.com.br/app_themes/default/image/Presteza_Exemple_3_mini.png&#39;); width: 490px; height: 147px;&quot;&gt;&lt;/div&gt;&lt;/a&gt;
&lt;p&gt;Fique a vontade para compartilhar suas experiências, visões, sugestões e críticas.&lt;/p&gt;
&lt;p&gt;Até a próxima!&lt;/p&gt;
&lt;hr align=&quot;left&quot; noshade=&quot;noshade&quot; size=&quot;1&quot; width=&quot;75%&quot; /&gt;
&lt;p&gt;&lt;b&gt;Artigos Recomendados:&lt;/b&gt;&lt;/p&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/ellvqc&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Event-based Asynchronous Pattern (EAP). O futuro padrão para as interfaces das aplicações?&lt;/a&gt;&lt;br /&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/fKLi6Y&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Software para Pessoas do Séc XXI&lt;/a&gt;&lt;br /&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/hGgIGF&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Prepare-se para o C# 5 – Parte 2&lt;/a&gt;&lt;br /&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/dSsTJZ&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Prepare-se para o C# 5 – Parte 1&lt;/a&gt;&lt;br /&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/f7vrT8&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Reflection de Alta de Performance&lt;/a&gt;&lt;br /&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/hwHLBq&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Extension Methods = Manutenibilidade&lt;/a&gt;
&lt;p&gt;&lt;a href=&quot;http://bit.ly/gc9g36&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://www.apolineo.com.br/app_themes/default/image/twitter_follow_me.png&quot; width=&quot;128px&quot; height=&quot;128px&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;style&gt;
    .code
    {
     font-family: Courier;
     font-size: 12px;
     color: #000000;
     padding: 10px 10px 10px 10px;
     width: 96%;
     border: 1px dotted gray;
    }
&lt;/style&gt;</description><link>http://apolineosocial.blogspot.com/2011/05/como-vai-ergonomia-do-seu-codigo.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-6729560042957401473</guid><pubDate>Wed, 20 Apr 2011 20:43:00 +0000</pubDate><atom:updated>2011-05-23T06:21:46.421-07:00</atom:updated><title>Event-based Asynchronous Pattern (EAP). O futuro padrão para as interfaces das aplicações?</title><description>&lt;p&gt;Sabe quando seu aplicativo vai realizar uma tarefa demorada e ele “para de responder” enquanto não termina de processar? Esse é o cenário de grande parte dos aplicativos atualmente.&lt;/p&gt;
&lt;p&gt;Com a versão 2.0 do Microsoft .Net Framework foi introduzido um pattern endereçado a esse tipo de cenário chamado Event-based Asynchronous Pattern (EAP), oferecendo as vantagens de uma aplicação multithreaded e &quot;escondendo&quot; a complexidade inerente a esse tipo de design.&lt;/p&gt;
&lt;p&gt;Com ele, você pode:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Executar tarefas demoradas, como downloads e operações de banco de dados, em &quot;background&quot;, sem congelar sua aplicação;&lt;/li&gt;
    &lt;li&gt;Executar operações simultaneamente e receber notificações quando cada uma for concluída;&lt;/li&gt;
    &lt;li&gt;Aguardar que recursos fiquem disponíveis sem congelar sua aplicação;&lt;/li&gt;
    &lt;li&gt;Comunicar-se com as operações assíncronas pendentes usando o modelo de eventos;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A efeito de exemplo e aprendizado, o cenário que vamos trabalhar é a leitura de arquivos texto para importação de dados no sistema.&lt;/p&gt;
&lt;p&gt;Começamos a implementação do pattern criando as classes de argumento dos eventos que criaremos para nos comunicarmos com o chamador. Essas classes devem herdar do AsyncCompletedEventArgs ou ProgressChangedEventArgs (no caso de informação referente ao progresso da execução).&lt;/p&gt;
&lt;p&gt;No nosso caso, a classe padrão (ProgressChangedEventArgs) é suficiente para notificarmos o progresso da leitura e mapeamento dos dados do arquivo. Então, o argumento para a notificação da finalização do processamento ficará:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
public class MapCompletedEventArgs : AsyncCompletedEventArgs&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public IEnumerable&amp;lt;Customer&amp;gt; CustomersList { get; private set; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public MapCompletedEventArgs(IEnumerable&amp;lt;Customer&amp;gt; customersList,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Exception error, bool isCancelled, object userState)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;: base(error, isCancelled, userState)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.CustomersList = customersList;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}
&lt;/div&gt;
&lt;p&gt;O próximo passo é criar os handles (delegates) para as operações de avisar o progresso e quando o processamento estiver terminado:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
public delegate void MapProgressChangedEventHandler(ProgressChangedEventArgs e);&lt;br /&gt;
public delegate void MapCompletedEventHandler(MapCompletedEventArgs e);
&lt;/div&gt;
&lt;p&gt;Agora, criaremos os respectivos eventos para informar o progresso e quando a execução estiver concluída:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
public event MapProgressChangedEventHandler MapProgressChanged;&lt;br /&gt;
public event MapCompletedEventHandler MapCompleted;
&lt;/div&gt;
&lt;p&gt;Para garantir o uso da thread correta na execução dos eventos precisamos criar callbacks para serem executados via AsyncOperation:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
private SendOrPostCallback onProgressReportDelegate;&lt;br /&gt;
private SendOrPostCallback onCompletedDelegate;
&lt;/div&gt;
&lt;p&gt;A última variável que precisamos é um dicionário para controlar as múltiplas requisições:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
private HybridDictionary userStateToLifetime = new HybridDictionary();
&lt;/div&gt;
&lt;p&gt;No construtor da classe inicializamos os callbacks:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
public CustomerMapper()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;onProgressReportDelegate = new SendOrPostCallback(ReportMapProgress);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;onCompletedDelegate = new SendOrPostCallback(ContentFileMappingCompleted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
private void ContentFileMappingCompleted(object operationState)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;OnMapCompleted(operationState as MapCompletedEventArgs);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
private void OnMapCompleted(MapCompletedEventArgs e)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;if (MapCompleted != null)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MapCompleted(e);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
private void ReportMapProgress(object state)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;OnMapProgressChanged(state as ProgressChangedEventArgs);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
private void OnMapProgressChanged(ProgressChangedEventArgs e)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;if (MapProgressChanged != null)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MapProgressChanged(e);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}
&lt;/div&gt;
&lt;p&gt;E finalmente chegamos aos métodos de mapeamento assíncrono do arquivo, o qual, criamos uma operação assíncrona através da classe AsyncOperationManager:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
public IAsyncResult MapAsync(string filePath)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;var asyncOp = AsyncOperationManager.CreateOperation(filePath);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lock (userStateToLifetime.SyncRoot)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!userStateToLifetime.Contains(filePath))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;userStateToLifetime[filePath] = asyncOp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;var action = new Action&amp;lt;string, AsyncOperation&amp;gt;(MapFileWorker);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;return action.BeginInvoke(filePath, asyncOp, null, null);&lt;br /&gt;
}
&lt;/div&gt;
&lt;p&gt;Disponiblizaremos um método para ser utilizado caso o usuário queira cancelar a operação a qualquer momento:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
public void CancelReadAsync(string filePath)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;var asyncOp = userStateToLifetime[filePath] as AsyncOperation;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;if (asyncOp != null)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lock (userStateToLifetime.SyncRoot)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;userStateToLifetime.Remove(filePath);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}
&lt;/div&gt;
&lt;p&gt;No método que realiza o processamento da requisição precisamos garantir que o evento referente a finalização do processamento seja executado em caso de sucesso, cancelamento ou falha. E para executarmos o evento utilizamos o método &lt;b&gt;PostOperationComplete&lt;/b&gt; da operação assíncrona que criamos:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
private void MapFileWorker(string filePath, AsyncOperation asyncOp)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Exception error = null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;IEnumerable&amp;lt;Customer&amp;gt;customersList = null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;if (!TaskCanceled(asyncOp.UserSuppliedState))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;customersList = MapFileLogic(filePath, asyncOp);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch (Exception ex)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error = ex;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;if (!TaskCanceled(asyncOp.UserSuppliedState))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lock (userStateToLifetime.SyncRoot)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;userStateToLifetime.Remove(asyncOp.UserSuppliedState);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;var arg = new MapCompletedEventArgs(customersList, error,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TaskCanceled(asyncOp.UserSuppliedState), asyncOp.UserSuppliedState);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;asyncOp.PostOperationCompleted(onCompletedDelegate, arg);&lt;br /&gt;
}
&lt;/div&gt;
&lt;p&gt;Para o evento de acompanhamento do progresso usamos o método &lt;b&gt;Post&lt;/b&gt; da operação assíncrona:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
var arg = new ProgressChangedEventArgs(progressPercentage, asyncOp.UserSuppliedState);&lt;br /&gt;
asyncOp.Post(this.onProgressReportDelegate, arg);
&lt;/div&gt;
&lt;p&gt;Ao final, a classe que utilizará o método assíncrono ficará assim:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
var mapper = new CustomerMapper();&lt;br /&gt;
mapper.MapCompleted += new CustomerMapper.MapCompletedEventHandler(mapper_MapCompleted);&lt;br /&gt;
mapper.MapProgressChanged += new CustomerMapper.MapProgressChangedEventHandler(mapper_MapProgressChanged);&lt;br /&gt;
mapper.MapAsync(Environment.CurrentDirectory + @&quot;\CustomerTextFile1.txt&quot;);
&lt;/div&gt;
&lt;p&gt;E talvez você esteja se pergutando “Legal, e por que eu deveria me importar com isso?”.&lt;/p&gt;
&lt;p&gt;Essa é uma tendência de programação que ganhou força com o Silverlight e parece ser o padrão para se programar no Windows Phone 7.&lt;/p&gt;
&lt;p&gt;Será que esse pattern se tornará padrão para programação de aplicações no futuro?&lt;/p&gt;
&lt;p&gt;Você já usou esse padrão?&lt;/p&gt;
&lt;p&gt;Até a próxima!&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: Red;&quot;&gt;DOWNLOAD EXEMPLO:&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;http://bit.ly/fca61J&quot;&gt;EAP.TEXTFILEMAPPER.RAR&lt;/a&gt;&lt;/p&gt;
&lt;hr align=&quot;left&quot; noshade=&quot;noshade&quot; size=&quot;1&quot; width=&quot;75%&quot; /&gt;
&lt;p&gt;&lt;b&gt;Artigos Recomendados:&lt;/b&gt;&lt;/p&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/fKLi6Y&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Software para Pessoas do Séc XXI&lt;/a&gt;&lt;br /&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/hGgIGF&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Prepare-se para o C# 5 – Parte 2&lt;/a&gt;&lt;br /&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/dSsTJZ&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Prepare-se para o C# 5 – Parte 1&lt;/a&gt;&lt;br /&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/f7vrT8&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Reflection de Alta de Performance&lt;/a&gt;&lt;br /&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/hwHLBq&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Extension Methods = Manutenibilidade&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href=&quot;http://bit.ly/gc9g36&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://www.apolineo.com.br/app_themes/default/image/twitter_follow_me.png&quot; width=&quot;128px&quot; height=&quot;128px&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;style&gt;
    .code
    {
     font-family: Courier;
     font-size: 12px;
     color: #000000;
     padding: 10px 10px 10px 10px;
     width: 96%;
     border: 1px dotted gray;
    }
&lt;/style&gt;</description><link>http://apolineosocial.blogspot.com/2011/04/event-based-asynchronous-pattern-eap-o.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-6204985280573598389</guid><pubDate>Wed, 13 Apr 2011 01:49:00 +0000</pubDate><atom:updated>2011-05-23T06:27:07.191-07:00</atom:updated><title>Software para Pessoas do Séc XXI</title><description>&lt;p&gt;Antigamente quando você dizia “Chefe, chefe, estou com uma grande idéia”, ele te dizia, “Calma. Respira fundo que passa.”&lt;/p&gt;
&lt;div style=&quot;background-image: url(&#39;http://www.apolineo.com.br/App_Themes/Default/Image/new_user_experience.png&#39;); width: 490px; height: 106px;&quot;&gt;&lt;/div&gt;
&lt;p&gt;Hoje, as necessidades mudaram. As pessoas estão se despedindo dos seus chefes e apenas em 2011 foram 163.679 formalizações de empreendedores individuais segundo o Sebrae.&lt;/p&gt;
&lt;p&gt;Antes, ao comprar uma televisão você virava um consumidor, agora, ao comprar qualquer eletrônico você se torna um produtor. Já percebeu quanto material é produzido por pessoas como você em eventos, festas, desastres, etc? Somos mais rápido que a imprensa!&lt;/p&gt;
&lt;p&gt;O tempo virou o bem social coletivo. Relevância, a palavra chave nesse mar de informação. E co-criação a saída de uma vida moderna sem significado. Você conhece o Camiseteria? Ou o Electrolux Design Lab? Talvez o Fiat Mio? Provavelmente o Nespresso? Mas com certeza o Wikipedia!&lt;/p&gt;
&lt;div style=&quot;background-image: url(&#39;http://www.apolineo.com.br/App_Themes/Default/Image/co_criacao_projetos.png&#39;); border: 1px solid black; width: 490px; height: 106px;&quot;&gt;&lt;/div&gt;
&lt;p&gt;As pessoas mudaram. Você mudou! Só que as empresas ainda criam software como na época do “Departamento de Processamento de Dados”? rs&lt;/p&gt;
&lt;p style=&quot;padding: 0px 20px 0px 20px; color: red;&quot;&gt;&quot;Empresas que compreendem a importância de aproveitar o poder dos comportamentos colectivos para impulsionar mudanças positivas nos negócios serão bem-sucedidas.&quot; – Gartner&lt;/p&gt;
&lt;p&gt;Em projetos de softwares modernos além da arquitetura do software, da estrutura de dados, da distribuição e da sergurança precisamos considerar as capacidades e limitações dos usuários, de forma a tornar o trabalho deles mais eficaz, eficiente e agradável.&lt;/p&gt;
&lt;p&gt;Para isso, primeiramente sua metologia deve promover o envolvimento do usuário no projeto.&lt;/p&gt;
&lt;p&gt;Como o usuário é a pessoa que mais conhece sobre o contexto do seu trabalho, sem desconsiderar o risco de perda de tempo e recursos em função da variabilidade e subjetividade que caracterizam as atividades com usuários, devemos desenvolver técnicas para planejar, organizar e executar o envolvimento adequado, que pode ser:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Informativo:&lt;/b&gt; o usuário é visto como fonte de informação que são extraídas através de técnicas de entrevistas, questionários ou observação;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Consultivo:&lt;/b&gt; o projetista, valendo-se ou não das informações coletadas, elabora soluções de projeto e pede que o usuário as verifique e emita uma opinião;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Participativo:&lt;/b&gt; quando a corporação transfere ao usuário o poder sobre as decisões de projeto e requer alto engajamento (que deve vir desde a alta gerência);&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Durante a especificação do sistema e o desenvolvimento do protótipo você deve trabalhar os 5 fatores da experiência do usuário:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Utilidade:&lt;/b&gt; percepção do usuário quanto a funcionalidade lhe agregar algum valor dentro do seu contexto;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Usabilidade:&lt;/b&gt; diz respeito à eficácia, eficiência e satisfação do usuário na realização de seus objetivos com o sistema;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Disponibilidade:&lt;/b&gt; refere-se aos elementos da interface que fornecem feedback sobre o estado do sistema, mecanismos que evitem perda de informação, etc;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Estética:&lt;/b&gt; refere-se ao apelo visual da aplicação, à sua atratividade para o usuário;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Processo off-line:&lt;/b&gt; complementa a experiência do usuário, como a confiança no nome da empresa, a segurança dos dados, suporte, treinamento, campanha de marketing, entre outros;&lt;/li&gt;&lt;/ul&gt;
&lt;div style=&quot;background-image: url(&#39;http://www.apolineo.com.br/App_Themes/Default/Image/hierarquia_ergonomia_hedonomia_hancock.png&#39;); width: 490px; height: 150px;&quot;&gt;&lt;/div&gt;
&lt;p&gt;O IPhone é um exemplo de produto criado com esse tipo de abordagem.&lt;/p&gt;
&lt;p&gt;O que achou? Deixe seus comentários.&lt;/p&gt;
&lt;p&gt;Até o próximo!&lt;/p&gt;
&lt;br /&gt;&lt;hr align=&quot;LEFT&quot; noshade=&quot;noshade&quot; size=&quot;1&quot; width=&quot;75%&quot; /&gt;&lt;br /&gt;
&lt;b&gt;Artigos Recomendados:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/f7y2PR&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Redes Sociais no Ambiente Corporativo &lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/eIJKUX&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Pensando em ERGONOMIA e USABILIDADE &lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/b5MMme&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Design centrado no usuário&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/gc9g36&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://www.apolineo.com.br/app_themes/default/image/twitter_follow_me.png&quot; width=&quot;128px&quot; height=&quot;128px&quot;&gt;&lt;/a&gt;</description><link>http://apolineosocial.blogspot.com/2011/04/software-para-pessoas-do-sec-xxi.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-6349307090290549701</guid><pubDate>Wed, 30 Mar 2011 15:04:00 +0000</pubDate><atom:updated>2011-04-12T18:31:05.935-07:00</atom:updated><title>Redes Sociais no Ambiente Corporativo</title><description>&lt;p&gt;Quando você leu o título o que lhe veio a cabeça? Twitter? Facebook?&lt;/p&gt;
&lt;p&gt;Hum, se sua resposta for sim, sinto em lhe dizer, mas você está confundindo MÍDIA SOCIAL com REDE SOCIAL.&lt;/p&gt;
&lt;p&gt;“Qualquer pessoa ficaria chateado, qualquer um de nós ficaria abatido, desmotivado, mas não Joseph Klimber” e você também não precisa.&lt;/p&gt;
&lt;p&gt;Então, o que é uma rede social?&lt;/p&gt;
&lt;p&gt;Rede social é uma estrutura composta por pessoas conectadas que compartilham valores e objetivos comuns. Isso quer dizer que o grupo que se reúne todos os domingos para jogar bola, as pessoas que participam do Campus Party ou o grupo de voluntários da GRAAC são todos redes sociais (só que em diferentes níveis).&lt;/p&gt;
&lt;div style=&quot;background-image: url(&#39;http://www.apolineo.com.br/App_Themes/Default/Image/exemplo_redes_sociais.png&#39;); width: 490px; height: 92px;&quot;&gt;&lt;/div&gt;
&lt;p&gt;Com a aparição de novas tecnologias como a internet a interação entre as pessoas cresce com rapidamente. Então, com a criação de mídias sociais como o Youtube, o Twitter ou Facebook essa velocidade aumentou ainda mais. São milhões de pessoas colaborando, compartilhando, co-criando, presentes em todos os lugares e em busca de um mundo melhor.&lt;/p&gt;
&lt;p style=&quot;text-align: center; padding: 0px 20px 0px 15px; color: #e5571d;&quot;&gt;“Empresas que compreendem a importância de aproveitar o poder dos comportamentos colectivos para impulsionar mudanças positivas nos negócios serão bem-sucedidas.” – Gartner&lt;/p&gt;
&lt;p&gt;E porque na minha empresa não é assim?&lt;/p&gt;
&lt;p&gt;Quando dentro de uma empresa buscamos  conhecimento para atingirmos uma meta, realizar um trabalho, só que a máquina da empresa, a obrigação, a rotina, seus processos não permitem troca de conhecimento, e esse ambiente inadequado, inibe a interação das pessoas.&lt;/p&gt;
&lt;p&gt;Ninguém interage se não vê essa troca.&lt;/p&gt;
&lt;div style=&quot;background-image: url(&#39;http://www.apolineo.com.br/App_Themes/Default/Image/rede_social_conexao_confianca.png&#39;); width: 490px; height: 97px;&quot; &gt;&lt;/div&gt;
&lt;p&gt;Para estabelecer relações precisam ser criadas &lt;b&gt;conexões&lt;/b&gt;, as quais podem gerar ou não relações de &lt;b&gt;confiança&lt;/b&gt;, onde geralmente, a &lt;b&gt;troca de conhecimento&lt;/b&gt; pessoal começa a acontecer.&lt;/p&gt;
&lt;p&gt;Talvez você já tenha experimentado isso de alguma forma. Você já conversou sua vida pessoal com algum colega do trabalho que você não confia? Mas já deve ter considerado o comentário de um desconhecido sobre um produto que você queria comprar.&lt;/p&gt;
&lt;p&gt;Uma vez que as pessoas começam a trocar informações pessoais elas se viciam nisso e esse caminho evolui para o ambiente profissional.&lt;/p&gt;
&lt;p&gt;Nessas conexões haverá pessoas com diversos perfis e nosso trabalho será identificar o perfil de cada um e incentivá-las. Os principais perfis são os &lt;b&gt;CRIADORES&lt;/b&gt; (aquelas que geram conteúdo para outras pessoas), &lt;b&gt;CRÍTICOS&lt;/b&gt; (aquelas que opinião sobre os conteúdos gerados), &lt;b&gt;PARTICIPANTES&lt;/b&gt; (aquelas que participam comentando ou interagindo com o conteúdo gerado) e os &lt;b&gt;ESPECTADORES&lt;/b&gt; (aquelas que apenas acompanham esses conteúdos).&lt;/p&gt;
&lt;p&gt;Você deve estar se indagando, isso é bonito, mas sem controle vai virar uma bagunça!&lt;/p&gt;
&lt;p&gt;O “controle” muda para moderação, bom senso, política de boa conduta. E isso a própria rede é capaz de “controlar” se as pessoas críticas entenderem a política da rede. Alias, VOCÊ DEVERIA SER UMA DESSAS PESSOAS COM PERFIL CRÍTICO!&lt;/p&gt;
&lt;div style=&quot;background-image: url(&#39;http://www.apolineo.com.br/App_Themes/Default/Image/co_criacao_colaboracao.png&#39;); width: 490px; height: 106px;&quot; &gt;&lt;/div&gt;
&lt;p&gt;Estamos na era da Economia da Colaboração. As pessoas agora interagem para a &lt;b&gt;CO-CRIAÇÃO&lt;/b&gt; do conhecimento em busca de um mundo melhor. Então, permita de alguma forma que seu cliente ou colaborador faça parte do processo criativo e produtivo do projeto.&lt;/p&gt;
&lt;p&gt;E porque as pessoas dedicam seu precioso tempo na co-criação de um produto?&lt;/p&gt;
&lt;p style=&quot;padding-left: 15px;&quot;&gt;1. Fazer parte de algo maior&lt;br /&gt;
2. Mostrar que fazem parte daquilo&lt;br /&gt;
3. Pura diversão&lt;br /&gt;
4. Oportunidade de colaborar&lt;br /&gt;
5. Recompesa financeira&lt;/p&gt;
&lt;p&gt;Já está acontecendo. É real! Não conhece a &lt;a href=&quot;http://bit.ly/gwda6K&quot; title=&quot;Clique aqui para ver o site.&quot; target=&quot;_blank&quot;&gt;CAMISETERIA&lt;/a&gt;, o &lt;a href=&quot;http://bit.ly/eLL2bo&quot; title=&quot;Clique aqui para ver o site.&quot; target=&quot;_blank&quot;&gt;NESPRESSO&lt;/a&gt;, o &lt;a href=&quot;http://bit.ly/heAFHd&quot; title=&quot;Clique aqui para ver o site.&quot; target=&quot;_blank&quot;&gt;FIAT MIO&lt;/a&gt;, o &lt;a href=&quot;http://bit.ly/dQbuLy&quot; title=&quot;Clique aqui para ver o site.&quot; target=&quot;_blank&quot;&gt;DESIGN LAB ELECTROLUX&lt;/a&gt; ou ainda o &lt;a href=&quot;http://bit.ly/e3PiL4&quot; title=&quot;Clique aqui para ver o site.&quot; target=&quot;_blank&quot;&gt;WIKIPEDIA&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Contudo, nada disso faz sentido se não aprendermos, não compartilharmos, não inovarmos, não criticarmos, não participarmos. E para isso, são necessárias estratégias, capacitação, metodologias específicas e projetos.&lt;/p&gt;
&lt;p&gt;Como é o ambiente na sua empresa? É colaborativo? Participativo? As pessoas se sentem confortáveis em expressarem suas opiniões? Torcem o nariz quando houvem falar de rede social? E qual sua opinião sobre o assunto?&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a style=&quot;color: Red;&quot; href=&quot;http://on.fb.me/hybxJE&quot; title=&quot;Ir para a dicussão no Facebook.&quot;&gt;PARTICIPE DA DISCUSSÃO NO FACEBOOK!&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;&lt;hr align=&quot;LEFT&quot; noshade=&quot;noshade&quot; size=&quot;1&quot; width=&quot;75%&quot; /&gt;&lt;br /&gt;
&lt;b&gt;Artigos Recomendados:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/eIJKUX&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Pensando em ERGONOMIA e USABILIDADE &lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/b5MMme&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Design centrado no usuário&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/gc9g36&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://www.apolineo.com.br/app_themes/default/image/twitter_follow_me.png&quot; width=&quot;128px&quot; height=&quot;128px&quot;&gt;&lt;/a&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><link>http://apolineosocial.blogspot.com/2011/03/redes-sociais-no-ambiente-corporativo.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-7964121727975574221</guid><pubDate>Tue, 29 Mar 2011 21:31:00 +0000</pubDate><atom:updated>2011-04-20T13:23:27.109-07:00</atom:updated><title>Prepare-se para o C# 5 – Parte 2</title><description>&lt;p&gt;Demorou mais chegou... rs&lt;/p&gt;
&lt;p&gt;No último artigo mostramos que a expressão &lt;b&gt;document = await Fetchasync(urls [i])&lt;/b&gt; do C# 5.0 era realizada assim:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
state = State.AfterFetch;&lt;br /&gt;
fetchThingy = FetchAsync(urls[i]);&lt;br /&gt;
if (fetchThingy.SetContinuation(archiveDocuments))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;return;&lt;br /&gt;
AfterFetch: ;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;document = fetchThingy.GetValue();
&lt;/div&gt;
&lt;p&gt;Nesse modelo, um método assíncrono retorna um &lt;b&gt;Task&amp;lt;T&amp;gt;&lt;/b&gt;, e por hora, vamos assumir que o &lt;b&gt;FetchAsync&lt;/b&gt; também retorne um &lt;b&gt;Task&amp;lt;Document&amp;gt;&lt;/b&gt;. Então, o código atual será realizado assim:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
fetchAwaiter = FetchAsync(urls[i]).GetAwaiter();&lt;br /&gt;
state = State.AfterFetch;&lt;br /&gt;
if (fetchAwaiter.BeginAwait(archiveDocuments))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;return;&lt;br /&gt;
AfterFetch: ;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;document = fetchAwaiter.EndAwait();
&lt;/div&gt;
&lt;p&gt;A chamada a &lt;b&gt;FetchAsync&lt;/b&gt; cria e retorna um &lt;b&gt;Task&amp;lt;Document&amp;gt;&lt;/b&gt;. Ao chamar este método ele imediatamente retorna um &lt;b&gt;Task&amp;lt;Document&amp;gt;&lt;/b&gt; que de alguma forma busca o documento desejado de forma assíncrona. Para fazer alguma coisa quando ele estiver completo buscamos na tarefa por um &lt;b&gt;Awaiter&lt;/b&gt;, e ele fornece 2 métodos: &lt;b&gt;BeginAwait&lt;/b&gt;, assina a continuação para a tarefa (executado após a finalizada a tarefa) e o &lt;b&gt;EndAwait&lt;/b&gt;, que extrai o resultado da tarefa finalizada.&lt;/p&gt;
&lt;p&gt;Como esses métodos são implementados na &lt;b&gt;Task&lt;/b&gt; (para métodos void) ou &lt;b&gt;Task&amp;lt;T&amp;gt;&lt;/b&gt; (para métodos que retornem valor) como fica os métodos que não retornam &lt;b&gt;Task&lt;/b&gt; ou &lt;b&gt;Task&amp;lt;T&amp;gt;&lt;/b&gt;?&lt;/p&gt;
&lt;p&gt;Nesse caso é utilizado a mesma estratégia do LINQ, ou seja, se tivermos:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
From c in customers where c.City == &amp;quot;London&amp;quot;
&lt;/div&gt;
&lt;p&gt;Isso é traduzido para:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
Customers.Where(c =&gt; c.City == &amp;quot;London&amp;quot;)
&lt;/div&gt;
&lt;p&gt;E uma resolução de overload tenta encontrar o melhor método &amp;quot;Where&amp;quot; checando se a implementação de &amp;quot;Customers&amp;quot; implementa tal método, caso contrário, busca por métodos de extensão.&lt;/p&gt; 
&lt;p&gt;Com o padrão &lt;b&gt;GetAwaiter/BeginAwait/EndAwait&lt;/b&gt; é a mesma coisa, é feita a resolução de overload na transformação da expressão, verificado o método ou a extensão adequeada.&lt;/p&gt;
&lt;p&gt;O insight é que assincronia não requer paralelismo, mas o paralelismo exige assincronia, e muitas das ferramentas úteis para o paralelismo podem ser usadas para assincronia sem paralelismo.&lt;/p&gt;
&lt;p&gt;Por isso o uso do &lt;b&gt;Task&lt;/b&gt;, ele não possui paralelismo inerente e podemos representar unidades de trabalho pendentes que pode ser paralelizada e não requer multithreading, além de, já possui mecanismos de cancelamento entre outras características úteis da TPL (Task Parallel Library).&lt;/p&gt;
&lt;p&gt;Voltando ao exemplo da busca de documentos, ele foi deliberadamente planejado para demostrar o pulo do gato, o CPS (Continuation Passing Style), para controlar até mesmo orquestrações simples de 2 tarefas assíncronas de métodos void.&lt;/p&gt;
&lt;p&gt;Então, vamos falar um pouco sobre composição de métodos assíncronos.&lt;/p&gt;
&lt;p&gt;Suponha que o método ArchiveDocuments retornasse o número total de bytes arquivados:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
long ArchiveDocuments(List&amp;lt;Url&amp;gt; urls)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;long count = 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;for(int i = 0; i &lt; urls.Count; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var document = Fetch(urls[i]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count += document.Length;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Archive(document);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;return count;&lt;br /&gt;
}
&lt;/div&gt;
&lt;p&gt;Agora, vamos reescrevê-lo de forma assíncrona usando um CPS:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
void ArchiveDocumentsAsync(List&amp;lt;Url&amp;gt; urls, Action&amp;lt;long&amp;gt; continuation)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;// de alguma forma executa a busca de forma assíncrona,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;// depois invoca sua continuação&lt;br /&gt;
}
&lt;/div&gt;
&lt;p&gt;Dessa forma, o chamador do ArchiveDocumentsAsync precisaria ser escrito em um CPS de modo que a continuidade possa ser passada. E se o retorno fosse um resultado? Então, seria uma confusão.&lt;/p&gt;
&lt;p&gt;No modelo &lt;b&gt;TAP&lt;/b&gt; (Task Asynchrony Pattern, nome provisório para essa feature de composição de métodos assíncronos), ao invés disso, diriamos que o tipo que representa o trabalho assíncrono e retorna um valor é um &lt;b&gt;Task&amp;lt;T&amp;gt;&lt;/b&gt;. Em C# 5, você poderia simplesmente escrever:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
async Task&amp;lt;long&amp;gt; ArchiveDocumentsAsync(List&amp;lt;Url&amp;gt; urls)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;long count = 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Task archive = null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;for(int i = 0; i &lt; urls.Count; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var document = await FetchAsync(urls[i]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count += document.Length;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (archive != null)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;await archive;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;archive = ArchiveAsync(document);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;return count;&lt;br /&gt;
}
&lt;/div&gt;
&lt;p&gt;E o compilador se encarregará de reescrever e gerar algo como:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
Task&amp;lt;long&amp;gt; ArchiveDocuments(List&amp;lt;Url&amp;gt; urls)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span&gt;var taskBuilder = AsyncMethodBuilder&amp;lt;long&amp;gt;.Create();&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;State state = State.Start;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;TaskAwaiter&amp;lt;Document&amp;gt; fetchAwaiter = null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;TaskAwaiter archiveAwaiter = null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;int i;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;long count = 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Task archive = null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Document document;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Action archiveDocuments = () =&gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch(state)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case State.Start:        goto Start;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case State.AfterFetch:   goto AfterFetch;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case State.AfterArchive: goto AfterArchive;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Start: &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(i = 0; i &lt; urls.Count; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fetchAwaiter = FetchAsync(urls[i]).GetAwaiter();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;state = State.AfterFetch;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (fetchAwaiter.BeginAwait(archiveDocuments))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AfterFetch:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;document = fetchAwaiter.EndAwait();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count += document.Length;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (archive != null)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;archiveAwaiter = archive.GetAwaiter();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;state = State.AfterArchive;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (archiveAwaiter.BeginAwait(archiveDocuments))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AfterArchive:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;archiveAwaiter.EndAwait();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;archive = ArchiveAsync(document); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;taskBuilder.SetResult(count);&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;archiveDocuments(); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span&gt;return taskBuilder.Task;&lt;/span&gt;&lt;br /&gt;
}
&lt;/div&gt;
&lt;p&gt;Vamos fazer um teste de mesa aqui para clarear as coisas.&lt;/p&gt;
&lt;p&gt;O que acontece quando a lista está vazia? Nós criamos um contrutor de tarefas, um delegate que retorna void e invocamos ele de forma assíncrona. Ele inicializa a variável ”count” com 0, executa a label start, pula o loop, diz para o helper “você tem um resultado” e retorna. Finaliza o delegate. O taskbuilder é solicitado para uma tarefa, e uma vez que ele sabe que a tarefa foi concluida, retorna a tarefa concluida que simplesmente representa o número 0.&lt;/p&gt;
&lt;p&gt;E caso existam vários documentos de arquivos? Novamente criamos um taskbuilder e um delegate que serão invocados assíncronamente. No primeiro loop começamos uma busca assíncrona, assinamos o delegate como sua continuação e retornamos do delegate. O taskbuilder contrói uma tarefa que representa “estou trabalhando de forma assíncrona no corpo do ArchiveDocumentsAsync” e retorna essa tarefa. Ao ser concluída, invoca sua continuação e o delegate inicia de novo “do ponto onde ele parou” graças a máquina de estado. Tudo continua exatamente como antes, porém, direferente da versão void, o &lt;b&gt;Task&amp;lt;long&amp;gt;&lt;/b&gt; retornado para o &lt;b&gt;ArchiveDocumentsAsync&lt;/b&gt; sinaliza que finalizou (invocando sua continuação) e o delegate diz ao task builder para definir o resultado.&lt;/p&gt;
&lt;p style=&quot;margin-left: 10px;&quot;&gt;&lt;b style=&quot;color:Blue;&quot;&gt;NOTA:&lt;/b&gt;Tal qual o LINQ, o &lt;b&gt;TAP&lt;/b&gt; pode ser extensível por qualquer tipo que tenha um &lt;b&gt;GetAwaiter&lt;/b&gt;, que retorne um tipo que tenha &lt;b&gt;BeginAwait&lt;/b&gt;, &lt;b&gt;EndAwait&lt;/b&gt; e assim por diante, para que possa ser usado nas expressões “await”. Contudo, métodos marcados para serem assíncronos devem retornar &lt;b&gt;void&lt;/b&gt;, &lt;b&gt;Task&lt;/b&gt; ou &lt;b&gt;Task&amp;lt;T&amp;gt;&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;Existem situações onde sintaxe com tokens como “where” do LINQ são mais naturais e outras onde são a sintaxe “fluent” .Where(c =&gt; ...), no &lt;b&gt;TAP&lt;/b&gt; haverá métodos com nomes como &lt;b&gt;WhenAll&lt;/b&gt; ou &lt;b&gt;WhenAny&lt;/b&gt; para compor e orquestrar tarefas assíncronas:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
List&amp;lt;List&amp;lt;Url&amp;gt;&amp;gt; groupsOfUrls = whatever;&lt;br /&gt;
Task&amp;lt;long[]&amp;gt; allResults = Task.WhenAll(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;from urls in groupsOfUrls &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select ArchiveDocumentsAsync(urls));&lt;br /&gt;
long[] results = await allResults;
&lt;/div&gt;
&lt;p&gt;O que isto faz? Bem, o ArchiveDocumentsAsync retorna um &lt;b&gt;Task&amp;lt;long&amp;gt;&lt;/b&gt;, então a query retorna um IEnumerable&amp;lt;Task&amp;lt;long&amp;gt;&amp;gt;. &lt;b&gt;WhenAll&lt;/b&gt; pega a sequência de tarefas e produz uma nova tarefa, que de forma assíncrona aguarda cada um deles, preenche um array com o resultado e invoca sua continuação com o resultado quanto ele estiver disponível.&lt;/p&gt;
&lt;p&gt;Da mesma forma o &lt;b&gt;WhenAny&lt;/b&gt; pega uma sequência de tarefas e cria uma tarefa que invoca sua continuação com o primeiro resultado quando qualquer uma das tarefas estiverem finalizadas.&lt;/p&gt;
&lt;p&gt;Existirão outras combinações de tarefas e helpers relacionados. Veja mais exemplos no &lt;b&gt;CTP&lt;/b&gt; e repare que como não é possível modificar um &lt;b&gt;Task&lt;/b&gt; existente os combinadores foram provisóriamente adicionados na classe &lt;b&gt;TaskEx&lt;/b&gt;,mas, serão movidos para o &lt;b&gt;Task&lt;/b&gt; até a versão final.&lt;/p&gt;
&lt;p&gt;Até a próxima!&lt;/p&gt;
&lt;hr align=&quot;left&quot; noshade=&quot;noshade&quot; size=&quot;1&quot; width=&quot;75%&quot; /&gt;
&lt;p&gt;&lt;b&gt;Artigos Recomendados:&lt;/b&gt;&lt;/p&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/dSsTJZ&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Prepare-se para o C# 5 – Parte 1 &lt;/a&gt;&lt;br /&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/f7vrT8&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Reflection de Alta de Performance&lt;/a&gt;&lt;br /&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/hwHLBq&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Extension Methods = Manutenibilidade&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href=&quot;http://bit.ly/gc9g36&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://www.apolineo.com.br/app_themes/default/image/twitter_follow_me.png&quot; width=&quot;128px&quot; height=&quot;128px&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;style&gt;
    .code
    {
     font-family: Courier;
     font-size: 12px;
     color: #000000;
     padding: 10px 10px 10px 10px;
     width: 90%;
     border: 1px dotted gray;
    }
    
    .code span
    {
        background-color: Yellow;
    }
&lt;/style&gt;</description><link>http://apolineosocial.blogspot.com/2011/03/prepare-se-para-o-c-5-parte-2.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-8173501957301444204</guid><pubDate>Tue, 15 Feb 2011 00:54:00 +0000</pubDate><atom:updated>2011-03-30T07:30:02.030-07:00</atom:updated><title>Nós temos Arquiteto de Software! E arquitetura?</title><description>O termo arquiteto de software está virando uma commodity dentro das software houses desse meu Brasil.&lt;br /&gt;
&lt;br /&gt;
Esse papel tão importante se apresenta como um diferencial nos serviços prestados aos olhos do cliente e um imenso custo aos olhos da empresa, que sem hesitar, desprezam a idéia de encarar de forma correta o processo de desenvolvimento de software.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Mas, afinal, o que é arquitetura de software?&lt;/h4&gt;&lt;br /&gt;
Bom, a arquitetura de software trata o interesse de 3 visões:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Usuário:&lt;/b&gt; como os usuários usarão o sistema?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Negócio:&lt;/b&gt; como manter a aplicação flexível e gerenciável?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Sistema:&lt;/b&gt; quais os requisitos de performance, internacionalização, segurança e configuração? Quais tendências  impactam no design agora ou após a distribuição da aplicação?&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
O processo de definir estruturas de solução fornece e avalia alternativas de projeto atuando na organização geral de controle, definindo a atribuição de funcionalidade a componentes de projeto, buscando extrair alto desempenho e escalabilidade, sem esquecer claro, de atender requisitos técnicos e operacionais.&lt;br /&gt;
&lt;br /&gt;
O arquiteto de software é o profissional que:&lt;br /&gt;
&lt;br /&gt;
&lt;div id=&quot;theArchitect&quot;&gt;&lt;ul&gt;&lt;li&gt;Possui grande compreensão (arriscamos a incluir também “ou facilidade de compreensão”) do negócio e das tecnologias pertinentes para trabalhar na modelagem da solução;&lt;/li&gt;
&lt;li&gt;Possui entendimento dos apectos técnicos para o desenvolvimento de sistemas para trabalhar na análise de viabilidade;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Conhece bem as técnicas de levantamento, modelagem e desenvolvimento para trabalhar em provas de conceito, simulações e experimentos;&lt;/li&gt;
&lt;li&gt;Entende as estratégias de negócio da instituição onde atua para analisar tendências tecnológicas;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h4&gt;O que é um software bem arquitetado?&lt;/h4&gt;&lt;br /&gt;
Alguns podem dizer que  &lt;span style=&quot;color: red;&quot;&gt;é aquele que faz o que o(s) usuário(s) quer(em)&lt;/span&gt;. Mas, para avaliarmos se um software está bem projetado temos que identificar os atributos que desejaríamos encontrar nele.&lt;br /&gt;
&lt;br /&gt;
O software bem arquitetado fornece:&lt;br /&gt;
&lt;br /&gt;
&lt;image src=&quot;http://www.apolineo.com.br/app_themes/default/image/atributo_qualidade_software.png&quot; width=&quot;490px&quot; height=&quot;218px&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;E como construímos um software bem arquitetado?&lt;/h4&gt;&lt;br /&gt;
Nosso trabalho começa junto da etapa de levantamento de requisitos buscando identificar:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Peculiaridades de comportamento;&lt;/li&gt;
&lt;li&gt;Informações do domínio da aplicação;&lt;/li&gt;
&lt;li&gt;Restrições sobre a operação;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
A lista abaixo pode ser utilizada como um check-list inicial do que levantar de requisito não-funcional:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Usabilidade&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Facilidade de aprender&lt;/li&gt;
&lt;li&gt;Facilidade de usar&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Manutenção&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Reparo&lt;/li&gt;
&lt;li&gt;Evolução&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Confiabilidade&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Disponibilidade&lt;/li&gt;
&lt;li&gt;Taxa de falhas&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Desempenho&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Tempo&lt;/li&gt;
&lt;li&gt;Espaço&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Reusabilidade&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Da aplicação&lt;/li&gt;
&lt;li&gt;Dos subsistemas&lt;/li&gt;
&lt;li&gt;Dos objetos&lt;/li&gt;
&lt;li&gt;Dos módulos&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Portabilidade&lt;/li&gt;
&lt;li&gt;Segurança&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Disponibilidade&lt;/li&gt;
&lt;li&gt;Integridade&lt;/li&gt;
&lt;li&gt;Confidencialidade&lt;/li&gt;
&lt;li&gt;Operacional&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
E os complementando estão os atributos do projeto que guiam a concepção de solução para que o produto final satisfaça aos requisitos identificados. Esses atributos são:&lt;br /&gt;
&lt;br /&gt;
&lt;image src=&quot;http://www.apolineo.com.br/app_themes/default/image/atributos_projeto_software.png&quot; width=&quot;490px&quot; height=&quot;308px&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Em uma arquitetura podemos identificar os componentes (subsistemas), conectores, mecanismos de interação, topologia e restrições semânticas (por exemplo, a camada de interface só pode acessar dados através da camada de negócios).&lt;br /&gt;
&lt;br /&gt;
O estilo arquitetural, ou o conjunto de padrões, fornecem um conjunto de requisitos não-funcionais e atributos de projeto que permitem distinguir uma arquitetura de outra e prever as características desejadas no sistema.&lt;br /&gt;
&lt;br /&gt;
Os estilos de arquiteturas mais comuns são:&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;:: CAMADAS&lt;/h4&gt;&lt;div id=&quot;tiers&quot;&gt;&lt;p&gt;Estruturar o sistema num conjunto de camadas onde cada uma agrupa um conjunto de tarefas num determinado nível de abstração.&lt;br /&gt;
&lt;/p&gt;&lt;span class=&quot;green&quot;&gt;vantagem&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;flexibilidade&lt;/li&gt;
&lt;/ul&gt;&lt;span class=&quot;red&quot;&gt;desvantagem&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;alto grau de dependência&lt;/li&gt;
&lt;li&gt;performance&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h4&gt;:: OBJETOS&lt;/h4&gt;&lt;div id=&quot;objects&quot;&gt;&lt;p&gt;Permite a organização do programa em tipos de dados abstratos, que interagem através de troca de mensagens, podem ser modificados, reutilizados, distribuídos e executados sequencialmente ou em paralelo.&lt;br /&gt;
&lt;/p&gt;&lt;span class=&quot;green&quot;&gt;vantagem&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;manutenibilidade&lt;/li&gt;
&lt;li&gt;performance&lt;/li&gt;
&lt;/ul&gt;&lt;span class=&quot;red&quot;&gt;desvantagem&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;acoplamento&lt;/li&gt;
&lt;li&gt;reuso&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Atualmente, a combinação de estilos, por exemplo, camadas e objetos, guiam o desenvolvimento de software. A imagem abaixo ilustra a recomendação da Microsoft para a criação de sistemas de informação:&lt;br /&gt;
&lt;br /&gt;
&lt;img src=&quot;http://www.apolineo.com.br/app_themes/default/image/microsoft_architecture_guide2.png&quot; width=&quot;490px&quot; height=&quot;508px&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Os atributos que guiam o Microsoft Architecture Guide 2.0 são:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Separação de conceitos:&lt;/b&gt; divida as funcionalidades da aplicação (alta coesão) e minimizar pontos de interação (baixo acoplamento);&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Responsabiliade única:&lt;/b&gt; cada componente deve ser responsável por apenas uma funcionalidade;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DRY (Don’t Repeat Yourself):&lt;/b&gt; específique suas intenções em apenas um lugar;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;YAGNI (You Ain’t Gonna Neet It):&lt;/b&gt; projete apenas o necessário;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LoD (Least Knowledge):&lt;/b&gt; um componente ou objeto não deveria conhecer os detalhes internos de implementação&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Esperamos que esses conceitos acadêmicos com uma visão prática possam ajudá-lo a vencer os desafios do dia-a-dia.&lt;br /&gt;
&lt;br /&gt;
Na próxima falaremos sobre Arquiteturas de Domínios Específicos (DSSA) e Arquiteturas de Interface com o Usuário. &lt;br /&gt;
&lt;br /&gt;
Até a próxima!&lt;br /&gt;
&lt;br /&gt;
&lt;hr align=&quot;LEFT&quot; noshade=&quot;noshade&quot; size=&quot;1&quot; width=&quot;75%&quot; /&gt;&lt;br /&gt;
&lt;b&gt;Artigos Recomendados:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/eIJKUX&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Pensando em ERGONOMIA e USABILIDADE &lt;/a&gt;&lt;br /&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/f7vrT8&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Reflection de Alta de Performance&lt;/a&gt;&lt;br /&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/gDJSAv&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Boas práticas para gerência de requisitos, de acordo com os modelos MPS.BR e CMMI &lt;/a&gt;&lt;br /&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/hwHLBq&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Extension Methods = Manutenibilidade&lt;/a&gt;&lt;br /&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/i9bi6W&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; Alinhamento Estratégico de TI – Parte 1&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/gc9g36&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://www.apolineo.com.br/app_themes/default/image/twitter_follow_me.png&quot; width=&quot;128px&quot; height=&quot;128px&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;style&gt;
#theArchitect
{
background-image: url(&#39;http://www.apolineo.com.br/app_themes/default/image/o_arquiteto.png&#39;);
background-repeat: no-repeat;
min-height: 170px;
padding-left: 120px;
}
#objects
{
background-image: url(&#39;http://www.apolineo.com.br/app_themes/default/image/objects_model.png&#39;);
background-repeat: no-repeat;
min-height: 266px;
padding-left: 225px;
}
#objects p
{
text-align: center;
}
#tiers
{
background-image: url(&#39;http://www.apolineo.com.br/app_themes/default/image/tiers_model.png&#39;);
background-repeat: no-repeat;
min-height: 266px;
padding-left: 225px;
}
#tiers p
{
text-align: center;
}
.red
{
color: red;
}
.green
{
color: green;
}
.relatedLink
{
 font-size: 12px;
 margin-left: 5px;
}
&lt;/style&gt;</description><link>http://apolineosocial.blogspot.com/2011/02/nos-temos-arquiteto-de-software-e.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-8185185098116378636</guid><pubDate>Tue, 25 Jan 2011 12:58:00 +0000</pubDate><atom:updated>2011-03-29T14:35:03.877-07:00</atom:updated><title>Prepare-se para o C# 5 – Parte 1</title><description>É fantástico trabalhar com uma plataforma que evolua junto com a complexidade que enfrentamos em nosso dia-a-dia.&lt;br /&gt;
&lt;br /&gt;
Olhando a evolução da linguagem vemos que paramos (ao menos deveriamos ter parado) de escrever certos tipos de código. Por exemplo, com a adição do &lt;b&gt;iterator blocks&lt;/b&gt; e do anonymous methods no C# 2.0, o compilador pode armazenar a continuação de “o que vem depois” e encapsular em uma classe os métodos que acessam varíaveis locais.&lt;br /&gt;
&lt;br /&gt;
Com o &lt;b&gt;LINQ&lt;/b&gt; e o &lt;b&gt;query comprehensions&lt;/b&gt; (C# 3.0) fica a cargo do compilador construir o modelo de objetos correto para construir as chamadas, árvores de expressão e simplifica muito a escrita de código que ordena, filtra, associa, agrupa e sumariza dados.&lt;br /&gt;
&lt;br /&gt;
Hoje em dia vivemos a integração de sistemas. Desenvolvemos aplicativos .NET para rodar dentro de uma rede social em Python. Nossos aplicativos precisam tanto interoperar com sistemas legados quanto sistemas SAP. E para simplificar isso foi criado o &lt;b&gt;dynamic type&lt;/b&gt; (C# 4.0), onde fica a cargo do compilador descobrir como gerar o código em tempo de compilação que faça a análise do Dynamic Language Runtime em tempo de execução.&lt;br /&gt;
&lt;br /&gt;
Também estamos utilizando muito algoritmos de programação assíncronos. E a tendência, com sistemas baseados em nuvem, é popularizar esse tipo de algoritmo.&lt;br /&gt;
&lt;br /&gt;
Com o C# 5.0 você será capaz de pegar esse código síncrono:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;void ArchiveDocuments(List&lt;url&gt; urls)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;for(int i = 0; i &amp;lt; urls.Count; ++i) &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Archive(Fetch(urls[i])); &lt;br /&gt;
}&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
E implementando o &lt;b&gt;FetchAsync&lt;/b&gt; e &lt;b&gt;ArchiveAsync&lt;/b&gt; transformá-lo em:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;&lt;b&gt;async&lt;/b&gt; void ArchiveDocuments(List&lt;url&gt; urls)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;b&gt;Task&lt;/b&gt; archive = null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;for(int i = 0; i &amp;lt; urls.Count; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var document = &lt;b&gt;await&lt;/b&gt; FetchAsync(urls[i]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (archive != null) &lt;b&gt;await&lt;/b&gt; archive;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;archive = ArchiveAsync(document);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}&lt;br /&gt;
&lt;/url&gt;&lt;/div&gt;&lt;br /&gt;
O compilador do C# 5.0 irá gerar o código da máquina de estado, os lambdas, as continuações e checar se a tarefa foi concluída para você. Show!&lt;br /&gt;
&lt;br /&gt;
Esses recursos foram apresentados no último PDC pelo Anders Hejlsberg e atualmente está sendo desenvolvido o CTP do protótipo do compilador do C# 5.0.&lt;br /&gt;
&lt;br /&gt;
Se você se animou com a notícia e quer saber mais visite &lt;a href=&quot;http://bit.ly/haHHnV&quot; target=&quot;_blank&quot;&gt;Asynchronous Programming for C#&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;a style=&quot;color: red;&quot; href=&quot;http://bit.ly/hGgIGF&quot;&gt;QUE TAL LER A PARTE 2?&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;hr align=&quot;LEFT&quot; noshade=&quot;noshade&quot; size=&quot;1&quot; width=&quot;75%&quot; /&gt;&lt;br /&gt;
&lt;b&gt;Veja também:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/f7vrT8&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp;Reflection de Alta de Performance&lt;/a&gt;&lt;br /&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/fy9s0S&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp;Dynamic CRUD no .NET 4.0&lt;/a&gt;&lt;br /&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/hWLlmE&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp;Programação Dinâmica no C# 4.0&lt;/a&gt;&lt;br /&gt;
&lt;a class=&quot;relatedLink&quot; href=&quot;http://bit.ly/hwHLBq&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp;Extension Methods = Manutenibilidade&lt;/a&gt;
&lt;p&gt;&lt;a href=&quot;http://bit.ly/gc9g36&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://www.apolineo.com.br/app_themes/default/image/twitter_follow_me.png&quot; width=&quot;128px&quot; height=&quot;128px&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;style&gt;
.code
{
 font-family: Courier;
 font-size: 12px;
 color: #000000;
 padding: 10px 10px 10px 10px;
 width: 90%;
 border: 1px dotted gray;
}
.code b
{
 color: blue;
}

h4
{
 color: #f36e20;
}
.relatedLink
{
 font-size: 12px;
 margin-left: 5px;
}
&lt;/style&gt;</description><link>http://apolineosocial.blogspot.com/2011/01/prepare-se-para-o-c-5-parte-1.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-2474047566942280425</guid><pubDate>Thu, 06 Jan 2011 13:28:00 +0000</pubDate><atom:updated>2011-03-30T07:34:55.688-07:00</atom:updated><title>Pensando em ERGONOMIA e USABILIDADE</title><description>Você já leu um livro onde as páginas não estejam numeradas, sem índice ou resumo? Ou ainda, se sentiu p@#! da vida por procurar uma rua que não tenha placa indicando o nome?&lt;br /&gt;
&lt;br /&gt;
A ergonomia e a usabilidade são constituídos de pequenos detalhes que são notados apenas quando não estão presentes, e estes detalhes ou qualidades, fazem com que os usuários se sintam confiantes e satisfeitos por atingirem seus objetos com menos esforços, em menos tempo e com menos erros.&lt;br /&gt;
&lt;br /&gt;
Programas de software (e até mesmo bibliotecas de código - API) e suas interfaces são ferramentas cognitivas, capazes de modelar representações, abstrair dados e produzir informações, facilitando a percepção, o raciocínio, a memorização e a tomada de decisão para cada tipo de usuário, inteligência, estilo cognitivo e personalidade.&lt;br /&gt;
&lt;br /&gt;
A engenharia de usabilidade surge como resposta a necessidade de desenvolver programas de software interativo com usabilidade.&lt;br /&gt;
&lt;br /&gt;
Enquanto a engenharia de software se preocupa com o núcleo funcional, a estrutura de dados, os algoritmos, os recursos computacionais, a engenharia de usabilidade se preocupa com a lógica de funcionamento, apresentações, estruturas de diálogos e lógica de operação.&lt;br /&gt;
&lt;br /&gt;
Para desenvolvermos uma interface agradável, intuitiva, eficiente e fácil de operar temos que projetar a:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Condução:&lt;/b&gt; a inteface deve aconselhar, orientar, informar e conduzir o usuário na interação com o sistema;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Carga de Trabalho:&lt;/b&gt; elementos da interface que têm papel importante na redução da carga cognitiva e perceptiva do usuário e no aumento da eficiência do diálogo;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Adaptabilidade:&lt;/b&gt; a interface fornece diversas maneiras de realizar uma tarefa, deixando ao usuário a liberdade de escolher e dominar uma delas no curso de aprendizado;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Gestão de Erros:&lt;/b&gt; mecanismos que permitem evitar ou reduzir a ocorrência de erros e que favoreçam sua correção caracteriza a interface segura;&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Durante toda etapa de desenvolvimento das interfaces deverão avaliadas a ergonomia e a usabilidade da solução proposta buscando identificar:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Barreiras:&lt;/b&gt; o usuário esbarra sucessivas vezes e não aprende a transpor sem ajuda externa um aspecto da interface fazendo com que ele desista de utilizar a função do sistema temporária ou definitivamente;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Obstáculos:&lt;/b&gt; o usuário esbarra algumas vezes, mas aprende a transpor um aspecto da interface, porém, perde desempenho nas próximas realizações da tarefa;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Ruídos:&lt;/b&gt; aspecto da interface que mesmo não sendo barreira ou obstáculo causa uma diminuição de seu desempenho na tarefa.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
O aspecto não determinístico do projeto de interfaces sugere que o ciclo de desenvolvimento seja essencialmente evolutivo, iterativo e centrado no usuário (ver &lt;a href=&quot;http://bit.ly/b5MMme&quot; target=&quot;_blank&quot;&gt;DESIGN CENTRADO NO USUÁRIO&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
A figura abaixo ilustra esse ciclo:&lt;br /&gt;
&lt;br /&gt;
&lt;img height=&quot;385px&quot; src=&quot;http://www.apolineo.com.br/App_Themes/Default/Image/CicloProjetoInterface_Usabilidade.png&quot; width=&quot;530px&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Os projetistas devem identificar e definir com cuidado os requisitos de usabilidade e, durante o desenvolvimento, certificar-se de que são corretos, assegurar que o protótipo esteja indo na direção correta e que satisfaz tais requisitos antes de ser liberada para implementação ou para o mercado.&lt;br /&gt;
&lt;br /&gt;
Essas abordagens e métodos são iniciativas recentes e efetivas para o desenvolvimento da engenharia de usabilidade e certamente o ajudará nos desafios diários.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;padding: 0px 10px 0px 10px; text-align: center; border: 1px dashed gray;&quot;&gt;&lt;a href=&quot;http://bit.ly/fStDHY&quot; target=&quot;_blank&quot;&gt;MOSTRE A TODOS OS CONCEITOS APRENDIDOS PARTICIPANDO DO QUIZZ “PENSANDO EM ERGONOMIA E USABILIDADE”.&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;span style=&quot;color:Red&quot;&gt;&lt;br /&gt;
Gostou? Siga-nos e compartilhe suas experiências e opiniões deixando seu comentário.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Posts Relacionados&lt;/h4&gt;&lt;a href=&quot;http://bit.ly/b5MMme&quot;&gt;Design centrado no usuário&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><link>http://apolineosocial.blogspot.com/2011/01/pensando-em-ergonomia-e-usabilidade.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-5430897752176027525</guid><pubDate>Mon, 15 Nov 2010 18:36:00 +0000</pubDate><atom:updated>2010-11-15T10:36:34.425-08:00</atom:updated><title>Design centrado no usuário</title><description>Atualmente o design tem recebido uma atenção especial, visto que, além de ser o conjunto que é percebido pelo usuário, ele também pode significar redução de custos de treinamentos e manuais.&lt;br /&gt;
&lt;br /&gt;
Pesquisando na internet sobre o assunto encontramos uma video aula de um curso de iPhone da Stanford sobre &lt;b&gt;&lt;a href=&quot;http://bit.ly/dq8SSs&quot; target=&quot;_blank&quot;&gt;&quot;How to Build an iPhone App that Doesn’t Suck! (In 10 Easy Steps)&quot;&lt;/a&gt;&lt;/b&gt; do Steve Marmon (&lt;a href=&quot;http://bit.ly/caH0wn&quot; target=&quot;_blank&quot;&gt;@marmon&lt;/a&gt;). Ele menciona 10 passos para se desenvolver aplicativos que não sejam “um lixo”. Porém, estes passos podem ser aplicados para quase qualquer projeto. Os passos comentados, estão a seguir:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;1. Decida o que construir (Decide what to build)&lt;/h4&gt;Muitas vezes pensamos em uma solução levando em conta apenas necessidades secundárias, ou seja, aquelas que nos guiam a atender desejos e não o real problema que estamos nos propondo a resolver. Dessa forma, corremos o risco de não solucionar nenhum problema, ou ainda, de desenvolvermos uma solução ineficaz.&lt;br /&gt;
&lt;br /&gt;
Para não cair nessa armadilha, procure enteder qual problema estamos nos propondo a resolver, pra quem estamos projetando e os tenhamos em mente ao desenvolver a solução. Focar em um grupo específico aumenta a chance de sucesso, pois o feedback desses usuários será de útil para melhorarmos o produto e conquistarmos os clientes.&lt;br /&gt;
&lt;br /&gt;
Se o seu software for um produto interno, envolva os usuários finais (ou pessoas chave que representem e entendam as necessidades desses usuários), agora, caso seja um produto para o mercado, ou seja, você não tem como envolver o usuário, procure fazer pesquisas (faixa etária, classe social, nível de escolaridade, etc) para identificar bem as necessidades e guiar o desenvolvimento da interface do produto.&lt;br /&gt;
&lt;br /&gt;
Conheça as &lt;a href=&quot;http://slidesha.re/dhGgHi&quot; target=&quot;_blank&quot;&gt;personas&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;2. Visite a app store (Visit the app store)&lt;/h4&gt;No mundo globalizado um produto inovador pode ser a composição de idéias brilhantes de produtos similares ou não, portanto, observe como aplicativos similares resolveram problemas que você está se propondo a resolver.&lt;br /&gt;
&lt;br /&gt;
Eles já devem ter tido feedback de usuários e alterado o produto em função disso, e você, estará &quot;recebendo&quot; estes feedbacks gratuitamente.&lt;br /&gt;
&lt;br /&gt;
Se existirem concorrentes, faça um benckmarking e compare as vantes e desvantagens em relação ao seu produto. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;3. Explore as possibilidades de soluções (Explore possible solutions)&lt;/h4&gt;A primeira solução não é a única e tampouco a melhor!&lt;br /&gt;
&lt;br /&gt;
Trabalhe com as limitações e aproveite os padrões para conseguir, com mais algumas tentativas, encontrar a solução ideal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;4. Rabisque (Sketch)&lt;/h4&gt;Para ter uma boa idéia, tenha várias, procure designs alternativos para o mesmo problema, faça várias propostas de solução!&lt;br /&gt;
&lt;br /&gt;
Com 10 propostas, por exemplo, sua chance de ter algo realmente bom é muito maior. É assim que a Apple funciona. É assim que a IDEO funciona.&lt;br /&gt;
&lt;br /&gt;
Rabisque e comunique suas idéias.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;5. Construa um protótipo de papel (Build a paper prototype)&lt;/h4&gt;Um vício de longa data da área de desenvolvimento de softare e sair para a programação ou o design sem antes criar um protótipo, e quando ele é feito, a única preocupação é com relação aos campos que tem que ter.&lt;br /&gt;
&lt;br /&gt;
Hoje há mais itens a ser levado em consideração, e aproveite que nesta fase, o custo de alteração é muito baixo. Pense, quanto tempo você gasta para alterar uma página no protótipo? E para reprogramar uma tela? Apresente o protótipo para pessoas chaves, analise suas reações, colha feedbacks e veja se o caminho que você está tomando é o correto.&lt;br /&gt;
&lt;br /&gt;
&quot;Fail early to succeed sooner&quot;. &lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;6. Abra o omnigraffle (Fire up omnigraffle)&lt;/h4&gt;Aqui ele fala do &lt;a href=&quot;http://bit.ly/dmy7Bq&quot; target=&quot;_blank&quot;&gt;omnigraffe&lt;/a&gt; para o caso específico do iPhone, porém, a mensagem é para que use uma ferramenta que permita criar um protótipo (&lt;a href=&quot;http://bit.ly/9dLF5i&quot; targer=&quot;_blank&quot;&gt;Sketchflow&lt;/a&gt;?). Este protótipo será esteticamente parecido com a versão final, mas sem precisar gastar tempo programando.&lt;br /&gt;
&lt;br /&gt;
A idéia é a mesma da etapa anterior, permitir alterações sem elevar o custo.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;7. Faça tudo denovo (Do it all again)&lt;/h4&gt;Já ouviu a frase &quot;A melhor época de começar uma faculdade é quando se termina&quot;? Isso quer dizer que, quando terminamos os estudos é que descobrimos o que precisavamos aprender.&lt;br /&gt;
&lt;br /&gt;
Sendo assim, como todo design centrado no usuário, a parte mais importante do processo é iterar. Veja onde está com problemas, volte, questione se a solução dada é a melhor para aquele caso e pense em várias alternativas de correção para o problema encontrado.&lt;br /&gt;
&lt;br /&gt;
Prototipe antes de alterar, teste e siga assim até que o produto esteja estável.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;8. Agora você pode programar (Okay, you can code finally)&lt;/h4&gt;Agora pode partir para a programação do seu produto.&lt;br /&gt;
&lt;br /&gt;
Use padrões de design e programação como MVC, que possibilitem alterações futuras sem muito trabalho, desvinculando o código da parte visual/apresentação.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;9. Abra seu aplicativo para beta testers (Beta test your app)&lt;/h4&gt;Utilize os testes para levantar os bugs que passaram desapercebidos pelos testes em protótipos e pelos programadores, como bugs relativos à satisfação dos usuários.&lt;br /&gt;
&lt;br /&gt;
Um exemplo, no iPhone, pode ser a rolagem da tela estar muito &quot;lerda&quot;. Os programadores vão achar que a tela está excelente, porque está rolando, porém os usuários, após algum tempo de uso, se sentirão incomodados com isso. &lt;br /&gt;
&lt;br /&gt;
O &lt;a href=&quot;http://bit.ly/9loTPT&quot; target=&quot;_blank&quot;&gt;Tweetie&lt;/a&gt; foi o primeiro app de twitter a conseguir uma rolagem rápida, e teve grande destaque por conta disso.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;10. Lance (Release)&lt;/h4&gt;Se você fez tudo direito, este será um momento feliz e de boas noites de sono, senão, prepare-se para os problemas que virão (e-mails de bugs, reclamações, comentários negativos sobre o aplicativo, etc.).&lt;br /&gt;
&lt;br /&gt;
Bem vindo ao mundo moderno do design!&lt;br /&gt;
&lt;br /&gt;
Compartilhe suas idéias conosco e até a próxima!&lt;br /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><link>http://apolineosocial.blogspot.com/2010/11/design-centrado-no-usuario.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-808355152484472423</guid><pubDate>Tue, 09 Nov 2010 21:26:00 +0000</pubDate><atom:updated>2011-03-12T03:20:27.374-08:00</atom:updated><title>Reflection de Alta de Performance</title><description>Pesquisando no Google vemos alguns bons artigos explicando que Reflection é lento. Está certo, alguns métodos do Reflection, como GetXXX (do MethodInfo, PropertyInfo, FieldInfo, etc.), são cerca de 100 vezes mais lento que acessar diretamente uma propriedade ou executar um método.&lt;br /&gt;
&lt;br /&gt;
O quanto o Reflection  é lento?&lt;br /&gt;
&lt;br /&gt;
Vamos criar um pequeno exemplo para analisarmos a performance do Reflection. Esse exemplo terá uma classe simples que contém apenas 1 método:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;namespace&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; CustomNamespace&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;{&amp;nbsp; &lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;interface&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;ICustom&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; CallMe(&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; x);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;CustomClass&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;ICustom&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; CallMe(&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; x)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = x + 10;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; line-height: 115%;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;
Simples, não? Bom, vamos criar uma classe para consumir e checar a performance em situações de extress. Vamos criar objetos do tipo CustomClass em um loop e executar o método CallMe com valores randomicos de duas formas: 1. Sem Reflection, 2. Com Reflection&lt;br /&gt;
&lt;br /&gt;
Para o teste com Reflection, vamos criar uma classe (ReflectionCalculator) com alguns métodos:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;public&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; &lt;span style=&quot;color: blue;&quot;&gt;partial&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;ReflectionCalculator&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;private&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Type&lt;/span&gt; dummyType;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;public&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Type&lt;/span&gt; DummyType&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;get&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 70.8pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;dummyType = dummyType ?? &lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 141.6pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;CurrentAssembly.GetType(&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;CustomNamespace.CustomClass&quot;&lt;/span&gt;, &lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 141.6pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;true&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;, &lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 141.6pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;true&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; dummyType;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;private&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MethodInfo&lt;/span&gt; method;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;public&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MethodInfo&lt;/span&gt; Method&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;get&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 70.8pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;this&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;.method = &lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;.method ?? &lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 106.2pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;this&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;.DummyType.GetMethod(&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;CallMe&quot;&lt;/span&gt;, &lt;span style=&quot;color: #2b91af;&quot;&gt;BindingFlags&lt;/span&gt;.Instance |&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 106.2pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2b91af; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;BindingFlags&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;.Public, &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;, &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Type&lt;/span&gt;[] { &lt;span style=&quot;color: blue;&quot;&gt;typeof&lt;/span&gt;(&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt;) }, &lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 106.2pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;null&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 70.8pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;return&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; &lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;.method;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;private&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt; dummyObject;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;public&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt; DummyObject&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;get&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 70.8pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;if&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; (&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;.dummyObject == &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 70.8pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 106.2pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;dummyObject = &lt;span style=&quot;color: #2b91af;&quot;&gt;Activator&lt;/span&gt;.CreateInstance(&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;.DummyType);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 70.8pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 70.8pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;return&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; dummyObject;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;public&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; ReflectionBasedCall(&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; value)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;this&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;.Method.Invoke(&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;.DummyObject, &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt;[] { value });&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;public&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; NormalCall(&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; value)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;this&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;.MyClass = &lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;.MyClass ?? &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;CustomClass&lt;/span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt; text-indent: 35.4pt;&quot;&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;.MyClass.CallMe(20);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;
Então, se olhar para as duas chamadas ReflectionBasedCall e NormalCall verá que ambos fazem a mesma coisa. A abordagem de reflexão deve primeiro obter um Type usando Assembly.GetType (que evetualmente vasculha toda a hierarquia do objeto inteiro) e depois o GetMethod no tipo encontrado. Portanto quanto maior o tamanho do Assembly mais lento será. Por fim, usamos o Activator.CreateInstance para criar a instância do objeto. &lt;br /&gt;
&lt;br /&gt;
Agora, e se executassemos os métodos 1.000.000 de vezes usando esse código e imprimissemos o tempo em segundos, ele irá se parecer com:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;static&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Main(&lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt;[] args)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;var&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; watcher = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; System.Diagnostics.&lt;span style=&quot;color: #2b91af;&quot;&gt;Stopwatch&lt;/span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;var&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; calculator = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;ReflectionCalculator&lt;/span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;watcher.Start();&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;for&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; (&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; i = 0; i &amp;lt; 1000000; i++)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;calculator.NormalCall(i);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;watcher.Stop();&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2b91af; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;Console&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;.WriteLine(&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;Time Elapsed for Normal call : {0}&quot;&lt;/span&gt;, &lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 70.8pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;watcher.Elapsed.TotalSeconds);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;watcher.Reset();&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;watcher.Start();&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;for&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; (&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; i = 0; i &amp;lt; 1000000; i++)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;calculator.ReflectionBasedCall(i);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;watcher.Stop();&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2b91af; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;Console&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;.WriteLine(&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;Time Elapsed for Reflection call : {0}&quot;&lt;/span&gt;, &lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;watcher.Elapsed.TotalSeconds);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2b91af; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;Console&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;.ReadLine();&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;
Abaixo, a saída da execução:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-image: url(&amp;quot;http://www.apolineo.com.br/App_Themes/Default/Image/performance1.png&amp;quot;); border: 1px dotted gray; height: 191px; width: 533px;&quot;&gt;&lt;/div&gt;&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3&gt;Reflection + Lambda Expression = Dynamic Delegates&lt;/h3&gt;&lt;br /&gt;
Na versão 3.0 do Microsoft .Net Framework, juntamente com o Linq, foi introduzido o Lambda Expression, que é uma função anonima que pode conter expressões e funções e pode ser usada para criar Delegates ou tipos de árvores de expressão.&lt;br /&gt;
&lt;br /&gt;
Criar delegates em runtime é atualmente a melhor maneira de fazer o código Reflection ser executado muito rápido. A idéia básica é criar delegates de cada MethodInfo que precisamos executar e eventualmente fazer cache dele em memória. &lt;br /&gt;
&lt;br /&gt;
Para isso, precisamos construir um Action&amp;lt;&amp;gt; (no caso de método VOID) ou Func&amp;lt;&amp;gt; (no caso de método que retorne algo) para cada método:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;public&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; &lt;span style=&quot;color: blue;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Action&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt;, T&amp;gt; CallMethod&lt;t&gt;(&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MethodInfo&lt;/span&gt; methodInfo)&lt;/t&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;if&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; (!methodInfo.IsPublic) &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;var&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; returnParameter = &lt;span style=&quot;color: #2b91af;&quot;&gt;Expression&lt;/span&gt;.Parameter(&lt;span style=&quot;color: blue;&quot;&gt;typeof&lt;/span&gt;(&lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt;), &lt;span style=&quot;color: #a31515;&quot;&gt;&quot;method&quot;&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;var&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; valueArgument = &lt;span style=&quot;color: #2b91af;&quot;&gt;Expression&lt;/span&gt;.Parameter(&lt;span style=&quot;color: blue;&quot;&gt;typeof&lt;/span&gt;(T), &lt;span style=&quot;color: #a31515;&quot;&gt;&quot;argument&quot;&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;var&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; setterCall = &lt;span style=&quot;color: #2b91af;&quot;&gt;Expression&lt;/span&gt;.Call(&lt;span style=&quot;color: #2b91af;&quot;&gt;Expression&lt;/span&gt;.ConvertChecked(returnParameter, &lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 106.2pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;methodInfo.DeclaringType),&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; methodInfo,&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;Expression&lt;/span&gt;.Convert(valueArgument, &lt;span style=&quot;color: blue;&quot;&gt;typeof&lt;/span&gt;(T)));&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;return&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Expression&lt;/span&gt;.Lambda&amp;lt;&lt;span style=&quot;color: #2b91af;&quot;&gt;Action&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt;, T&amp;gt;&amp;gt;(setterCall, returnParameter, &lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 70.8pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;valueArgument).Compile();&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
A expressão lambda acima cria um delegate do tipo Action&lt;object, t=&quot;&quot;&gt; onde “object” representa a instância da classe no qual executaremos o método e “T” representa o tipo do argumento do método.  O código acima cria uma expressão:&amp;nbsp;&lt;/object,&gt;&lt;br /&gt;
&lt;object, t=&quot;&quot;&gt;&lt;/object,&gt;&lt;br /&gt;
&lt;h4&gt;(x, y) = return x.[method](y)&lt;/h4&gt;&lt;br /&gt;
Com isso, podemos guardar na memória a referência construída dinamicamente:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;private&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MethodInfo&lt;/span&gt; methodInfo;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;public&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MethodInfo&lt;/span&gt; CachedMethodInfo&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;get&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;this&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;.methodInfo = &lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;.methodInfo ?? &lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;.GetMethodInfo();&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;return&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; &lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;.methodInfo;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;private&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MethodInfo&lt;/span&gt; GetMethodInfo()&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2b91af; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;Type&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; myClass = &lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;.CurrentAssembly.GetType(&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;CustomNamespace.CustomClass&quot;&lt;/span&gt;, &lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;true&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;, &lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;true&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;return&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; myClass.GetMethod(&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;CallMe&quot;&lt;/span&gt;, &lt;span style=&quot;color: #2b91af;&quot;&gt;BindingFlags&lt;/span&gt;.Instance | &lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2b91af; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;BindingFlags&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;.Public, &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;, &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Type&lt;/span&gt;[] { &lt;span style=&quot;color: blue;&quot;&gt;typeof&lt;/span&gt;(&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt;) }, &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;private&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Action&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt;, &lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt;&amp;gt; _methodcallDelegate = &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;public&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Action&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt;, &lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt;&amp;gt; MethodCallDelegate&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;get&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;this&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;._methodcallDelegate = &lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;._methodcallDelegate ?? &lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 70.8pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;this&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;.CachedMethodInfo.CallMethod&amp;lt;&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt;&amp;gt;();&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin: 0cm 0cm 0.0001pt 35.4pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;return&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt; &lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;._methodcallDelegate;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;
Vamos executar o código de teste mais uma vez para ver o quão eficiente é essa técnica:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-image: url(&amp;quot;http://www.apolineo.com.br/App_Themes/Default/Image/performance2.png&amp;quot;); border: 1px dotted gray; height: 203px; width: 557px;&quot;&gt;&lt;/div&gt;&lt;br /&gt;
Veja que a diferença em relação a uma abordagem hard-coded caiu drasticamente expandindo as possibilidades de criação de algoritmos genéricos e de alta performance.&lt;br /&gt;
&lt;br /&gt;
Você tem dicas e truques? Compartilhe! Envie para &lt;a href=&quot;mailto:social@apolineo.com.br&quot;&gt;social@apolineo.com.br&lt;/a&gt; que colocaremos no blog.&lt;br /&gt;
&lt;br /&gt;
Fique a vontade também de enviar suas sugestões e críticas.&lt;br /&gt;
&lt;br /&gt;
Download: &lt;a href=&quot;http://www.apolineo.com.br/download/ReflectionTest.rar&quot;&gt;Código Fonte&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Até a próxima!&lt;br /&gt;
&lt;style&gt;
.code
{
 font-family: Courier;
 font-size: 12px;
 color: #000000;
 padding: 10px 10px 10px 10px;
 width: 95%;
 border: 1px dotted gray;
}
&lt;/style&gt;</description><link>http://apolineosocial.blogspot.com/2010/11/reflaction-de-alta-de-performance.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-7099623268459944310</guid><pubDate>Mon, 04 Oct 2010 01:18:00 +0000</pubDate><atom:updated>2010-10-04T08:50:36.644-07:00</atom:updated><title>Boas práticas para gerência de requisitos, de acordo com os modelos MPS.BR e CMMI</title><description>A atividade de gerência de requisitos tem por objetivo mapear os requisitos identificados na fase inicial de um projeto e rastreá-los até os artefatos finais, permitindo a validação da consistência entre os mesmos e as requisições originalmente vindas dos solicitantes, conforme definido pelo modelo CMMI [SEI, 2006].&lt;br /&gt;
&lt;br /&gt;
No entanto, [SOMMERVILLE, 2007] ressalta o fato de que os requisitos de sistema mudam constantemente, em virtude do amadurecimento na compreensão das pessoas  envolvidas acerca do que desejam que o software faça ou ainda de modificações no hardware, software ou ambiente organizacional do sistema.&lt;br /&gt;
&lt;br /&gt;
Deste modo, um controle efetivo dos requisitos vindos do usuário e de suas mudanças, assume papel maior que simplesmente atender a especificação de uma área de processo e sim de garantir a adequação do produto final ao seu meio externo.&lt;br /&gt;
&lt;br /&gt;
A gerência de requisitos representa assim, a figura de ligação entre as áreas de planejamento de projeto, solução técnica e gerência de configuração. Um reflexo disso é o fato de que este é um dos processos que não aceitam qualquer exclusão no modelo MPS.BR [SOFTEX, 2008].&lt;br /&gt;
&lt;br /&gt;
Sendo fundamental a ambos os modelos de referência, esta área de processo recebe enfoques semelhantes em cada um deles. Porém ambos apresentam apenas listas de necessidades que devem ser atendidas e não uma proposta de artefatos para sua realização.&lt;br /&gt;
&lt;br /&gt;
Deste modo, empresas que tenham interesse em melhorar seus processos precisam buscar referências externas a respeito de como proceder, gerando margem para implementações custosas e pouco eficientes daquilo que deveria ser uma otimização de processos.&lt;br /&gt;
&lt;br /&gt;
Este artigo tem por objetivo apresentar uma contextualização entre o processo de gerência de requisitos e as necessidades impostas pelos modelos CMMI e MPS.BR, definindo um conjunto mínimo de artefatos para cumprimento das mesmas, que possam ser utilizados por empresas de pequeno ou médio porte.&lt;br /&gt;
&lt;br /&gt;
São descartadas neste artigo as necessidades referentes à área de processo de definição de requisitos – formalizada em [SEI, 2006] - uma vez que a mesma não é o&lt;br /&gt;
foco deste estudo.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;&lt;b&gt;Modelos de Referência&lt;/b&gt;&lt;/h3&gt;&lt;br /&gt;
Dentre os diversos modelos propostos ao redor do mundo, foram selecionados os modelos de referência CMMI e MPS.BR, sendo o primeiro selecionado por sua aceitação mundial e representatividade de mercado, enquanto o segundo representa um movimento que propõe uma aproximação ao cenário das empresas brasileiras.&lt;br /&gt;
&lt;br /&gt;
O modelo de referência para melhoria de software brasileiro (MR-MPS) indica ainda uma equivalência [SOFTEX, 2008] entre seus processos e as áreas de processo definidas no modelo CMMI, conforme ilustra a abaixo.&lt;br /&gt;
&lt;br /&gt;
&lt;img src=&quot;http://www.apolineo.com.br/App_Themes/Default/Image/modelo_mpsbr_cmmi.png&quot; width=&quot;400px&quot; height=&quot;300px&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;CMMI e a Gerência de Requisitos&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Dentro do modelo CMMI, a gerência de requisitos é uma área de processo componente do Nível 2 de Maturidade, conhecido como “Gerenciado”. Neste nível, os processos da empresa devem ser executados dentro de um padrão e por pessoas habilitadas, de acordo com controles definidos [SEI, 2006].&lt;br /&gt;
&lt;br /&gt;
A gerência de requisitos tem aqui o papel de garantir que todos os artefatos produzidos sejam coesos com a necessidade do cliente, por meio da identificação dos requisitos que originaram cada implementação. É vista também como ponto de partida para o planejamento de atividades e entregas, uma vez que a área de gerência de configuração pode definir seus pacotes em virtude de agrupamentos de requisitos.&lt;br /&gt;
&lt;br /&gt;
Outro aspecto relevante é a possibilidade de rastrear o impacto na solução de falhas no software ou nas solicitações de mudanças vindas dos usuários.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;MPS.BR e a Gerência de Requisitos&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Diferentemente do CMMI, dentro do modelo MPS.BR, o processo de gerência de requisitos é visto como parte do nível mais baixo de maturidade possível, o Nível G, conhecido como “Parcialmente Gerenciado” [SOFTEX, 2007].&lt;br /&gt;
&lt;br /&gt;
Este enfoque coloca um maior destaque nas tarefas que deste processo, colocando-o num papel de ligação entre artefatos e requisitos, objetivando que a rastreabilidade com relação às necessidades originalmente mapeadas seja mantida. Trata-se então de uma diferença sutil, que demanda atenção extra às tarefas que o&lt;br /&gt;
compõe.&lt;br /&gt;
&lt;br /&gt;
Com relação à avaliação de impacto em solicitações de mudanças ou correções de falhas, a definição é similar ao proposto pelo CMMI.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;&lt;b&gt;A Questão da Rastreabilidade&lt;/b&gt;&lt;/h3&gt;&lt;br /&gt;
Uma das exigências comuns ao nível G do MPS.BR e ao nível 2 do CMMI é a rastreabilidade entre um requisito e todos os artefatos envolvidos na implementação&lt;br /&gt;
decorrente dele, conforme apresentado em [SEI, 2006] e [SOFTEX, 2007].&lt;br /&gt;
&lt;br /&gt;
Esta prática permite uma maior efetividade na gerência de configuração, que visa justamente garantir que cada versão do software permita isolar uma versão compatível dos componentes envolvidos em sua realização, chamada baseline. Realizar&lt;br /&gt;
esta tarefa sem uma referência sólida a quais telas ou componentes são afetados por&lt;br /&gt;
determinado requisito, dificultaria a tarefa de isolar a versão, inviabilizando a geração de baselines.&lt;br /&gt;
&lt;br /&gt;
No entanto, este rastreio se complica quando consideramos que um requisito pode ser atendido por uma tela inteira ou por uma simples caixa de texto. [MEDEIROS, 2006]&lt;br /&gt;
&lt;br /&gt;
Levando em conta que um documento de caso de uso pode ser utilizado para refletir uma tela ou um único método, desde que este seja suficientemente relevante, tem-se uma opção se solução: mapear casos de uso versus requisitos funcionais.&lt;br /&gt;
&lt;br /&gt;
Por meio desta prática é possível identificar no detalhe os artefatos que serão afetados cada vez que uma mudança é realizada em um caso de uso específico, bem como prover uma análise de impacto mais eficaz antes de planejar uma tarefa.&lt;br /&gt;
&lt;br /&gt;
A elaboração de uma planilha descrevendo esta relação, em conjunto à existência de um documento padronizado para a elicitação de requisitos, onde seja possível não apenas mapear as necessidades, mas também a interdependência entre requisitos (sejam&lt;br /&gt;
eles funcionais ou não) permite atender a todas as necessidades especificadas pelos modelos CMMI e MPS.BR, conforme descrito em seus documentos de referência.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;&lt;b&gt;Artefatos para a Gerência de Requisitos&lt;/b&gt;&lt;/h3&gt;&lt;br /&gt;
Levando em conta os aspectos discutidos anteriormente, propõe-se que a gerência de requisitos seja atendida por meio da adoção de artefatos que reflitam tarefas consideradas padrão de mercado, no que diz às atividades realizadas pelos envolvidos&lt;br /&gt;
em sua realização.&lt;br /&gt;
&lt;br /&gt;
Os documentos propostos são: Documento de Visão, Matriz de Rastreabilidade e Documento de Especificação de Caso de Uso, compatíveis com o Rational Unified Process [RATIONAL, 2009], processo de engenharia de software que se baseia na definição de disciplinas para atribuição de tarefas e responsabilidades no desenvolvimento do software.&lt;br /&gt;
&lt;br /&gt;
Visando atender os modelos de referência observados, é necessário que os artefatos possuam sessões específicas para mapeamento das relações de dependência com os diversos requisitos elicitados, conforme definido. Cada um destes artefatos acompanha todo o ciclo de vida do desenvolvimento do software, permeando suas diferentes fases. A seguir, cada um deles será observado em mais detalhes, bem como a relação entre artefatos, usos e fases do ciclo de vida.&lt;br /&gt;
&lt;br /&gt;
Por meio deles, as cinco práticas específicas exigidas pelo CMMI são totalmente atendidas, bem como os cinco resultados esperados propostos melo MPS.BR.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;&lt;b&gt;Documento de Visão&lt;/b&gt;&lt;/h3&gt;&lt;br /&gt;
Um documento relacionando as necessidades do usuário, seu entendimento por parte do analista de requisitos e o conjunto de requisitos (funcionais ou não) propostos para atender cada uma das necessidades mapeadas. Este documento é validado pelos usuários e pode ser utilizado para definição do escopo inicial do projeto.&lt;br /&gt;
&lt;br /&gt;
Fases do Ciclo de Desenvolvimento em que é empregado e atividades realizadas:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Pré-Venda: Análise do Problema, Definição de Requisitos de Negócio e Requisitos de Usuário, Definição de Requisitos Funcionais e Requisitos Não Funcionais;&lt;/li&gt;
&lt;li&gt;Análise e Design: Relação entre: Requisitos de Usuário e Requisitos de Negócio, Requisitos de Negócio e Requisitos Não Funcionais, Requisitos de Usuário e Requisitos Funcionais.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Práticas Específicas do CMMI atendidas [SEI, 2006]:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;SP 1.1. Obter um entendimento dos requisitos;&lt;/li&gt;
&lt;li&gt;SP 1.2. Obter aprovação dos requisitos.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Resultados Esperados do MPS.BR atendidos [SOFTEX, 2007]:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;GRE 1. O entendimento dos requisitos é obtido junto aos fornecedores de requisitos;&lt;/li&gt;
&lt;li&gt;GRE 2. Os requisitos de software são aprovados utilizando critérios&lt;br /&gt;
objetivos.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h3&gt;&lt;b&gt;Matriz de Rastreabilidade&lt;/b&gt;&lt;/h3&gt;&lt;br /&gt;
Documento responsável por estabelecer uma relação bidirecional entre os requisitos originais e os componentes do produto final (software). Caso um requisito não possua nenhum caso de uso equivalente mapeado na planilha, uma inconsistência de projeto é efetivamente localizada.&lt;br /&gt;
&lt;br /&gt;
Fases do Ciclo de Desenvolvimento em que é empregado e atividades realizadas:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Análise e Design: Relação entre Casos de Uso e Requisitos Funcionais;&lt;/li&gt;
&lt;li&gt;Validação e Homologação: Possibilita o Rastreio e comparação entre uma implementação e a necessidade que a originou.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Práticas Específicas do CMMI atendidas [SEI, 2006]:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;SP 1.3. Gerenciar as mudanças de requisitos;&lt;/li&gt;
&lt;li&gt;SP 1.4. Manter rastreabilidade bidirecional entre os requisitos;&lt;/li&gt;
&lt;li&gt;SP 1.5. Identificar inconsistências entre projeto e requisitos.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Resultados Esperados do MPS.BR atendidos [SOFTEX, 2007]:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;GRE 3. A rastreabilidade bidirecional entre os requisitos e os produtos de trabalho é estabelecida e mantida;&lt;/li&gt;
&lt;li&gt;GRE 4. Revisões em planos e produtos de trabalho do projeto são realizadas visando identificar e corrigir inconsistências em relação aos requisitos;&lt;/li&gt;
&lt;li&gt;GRE 5. Mudanças nos requisitos são gerenciadas ao longo do projeto.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h3&gt;&lt;b&gt;Documento de Especificação de Caso de Uso&lt;/b&gt;&lt;/h3&gt;&lt;br /&gt;
Além do tradicional Diagrama de Casos de Uso, cabe elaborar um documento detalhando cada caso de uso, de acordo com sua especificidade [MEDEIROS, 2006]. Neste documento é realizada a especificação da implementação que será realizada pelos desenvolvedores, já com o foco nos artefatos que serão produzidos.&lt;br /&gt;
&lt;br /&gt;
Embora esteja muito mais relacionado à área de processo de definição de requisitos do que à gerência propriamente dita, sua realização é essencial à construção da Matriz de Rastreabilidade, que vincula os casos de uso a seus requisitos.&lt;br /&gt;
&lt;br /&gt;
Fases do Ciclo de Desenvolvimento em que é empregado e atividades realizadas:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Análise de Design: Detalha a solução para uma necessidade traduzida em requisito funcional e permite a validação da solução proposta pelo Analista de Requisitos ou de Negócio.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Práticas Específicas do CMMI atendidas [SEI, 2006]:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;SP 1.4. Manter rastreabilidade bidirecional entre os requisitos.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Resultados Esperados do MPS.BR atendidos [SOFTEX, 2007]:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;GRE 3. A rastreabilidade bidirecional entre os requisitos e os produtos de trabalho é estabelecida e mantida.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h3&gt;&lt;b&gt;Conclusão&lt;/b&gt;&lt;/h3&gt;&lt;br /&gt;
Por meio da utilização de três artefatos de confecção relativamente simples – Documento de Visão, Matriz de Rastreabilidade e Documento de Especificação de Caso de Uso - é possível atender a todas as exigências estabelecidas à área de processo de Gerência de Requisitos, de acordo com os modelos de referência analisados.&lt;br /&gt;
&lt;br /&gt;
Porém, o nível de interdependência entre os documentos evidencia a necessidade de um processo eficiente para a definição dos requisitos, uma vez que uma falha nesta atividade resultará em um conjunto inconsistente de requisitos no documento de visão, refletidos em casos de uso que não traduzem a real expectativa do cliente.&lt;br /&gt;
&lt;br /&gt;
Estes casos de uso e requisitos serão relacionados na matriz de rastreabilidade e futuramente, quando forem recebidas solicitações de mudanças em determinados pontos do sistema, a tarefa de localizar o ponto de origem do problema e os demais casos de uso relacionados a este mesmo requisito terá sua complexidade incrementada.&lt;br /&gt;
&lt;br /&gt;
Outra questão que se torna evidente é a margem de falha humana, pois ao discutir a elaboração dos referidos artefatos sem a proposta de um pacote especializado de ferramentas surge a possibilidade de que determinado campo não seja preenchido, mesmo que de forma não intencional. Deste modo, cabe a cada empresa avaliar a relação entre custo e benefício da adoção de meios automatizados para a construção e relacionamento dos documentos.&lt;br /&gt;
&lt;br /&gt;
É interessante ressaltar também que o modelo MPS.BR prega compatibilidade com o CMMI e, no que diz respeito à gerência de requisitos, seus resultados esperados correspondem diretamente às práticas específicas impostas pelo modelo norteamericano, de modo que os artefatos propostos poderiam ser elaborados considerando apenas o CMMI como critério de satisfação.&lt;br /&gt;
&lt;br /&gt;
No anexo você encontra modelos de documentos ilustrando os conceitos abordados: &lt;a href=&quot;http://www.apolineo.com.br/download/Gerencia_Requisitos_slides.pdf&quot; target=&quot;_blank&quot;&gt;Gerencia_Requisitos_slides.pdf&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Referências Bibliográficas&lt;/b&gt;&lt;br /&gt;
[SEI, 2006] CMMI Product Team. CMMI for Developmment, Version 1.2. Pittsburg, EUA: Carnegie Mellon University – Software Egineering Institute, 2006.&lt;br /&gt;
&lt;br /&gt;
[SOMMERVILLE, 2007] Sommerville, Ian. Engenharia de Software, 8ª Edição. São Paulo: Pearson Addison Wesley, 2007.&lt;br /&gt;
&lt;br /&gt;
[SOFTEX, 2008] FAQ Implementação MR-MPS - Dúvidas sobre o Guia Geral e Guia de Implementação. &lt;a href=&quot;http://www.softex.br/mpsBr/_faq/faqImplementacao.asp&quot; target=&quot;_blank&quot;&gt;http://www.softex.br/mpsBr/_faq/faqImplementacao.asp&lt;/a&gt;.&lt;br /&gt;
Recuperado em 01/12/2008.&lt;br /&gt;
&lt;br /&gt;
[SOFTEX, 2007] Associação para Promoção da Excelência do Software Brasileiro - SOFTEX. MPS.BR – Guia Geral, Versão 1.2, junho 2007.&lt;br /&gt;
&lt;br /&gt;
[MEDEIROS, 2006] Medeiros, Ernani Sales de. Desenvolvimento de Software com&lt;br /&gt;
UML 2.0: definitivo. São Paulo: Pearson Makron Books, 2006. &lt;br /&gt;
&lt;br /&gt;
[RATIONAL, 2009] Technical resources and best practices for the Rational® software&lt;br /&gt;
platform. &lt;a href=&quot;http://www.ibm.com/developerworks/rational&quot; target=&quot;_blank&quot;&gt;http://www.ibm.com/developerworks/rational&lt;/a&gt;. Recuperado em 03/02/2009.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;border: dotted 1px black; width: 95%; padding: 10px 10px 10px 10px; margin: 25px;&quot;&gt;&lt;b&gt;Autor&lt;/b&gt;: Ângelo Amaral&lt;br /&gt;
&lt;b&gt;Sobre&lt;/b&gt;: Pós-graduado em Engenharia de Software pelo ITA com especialização em modelos de construção de aplicações comerciais utilizando motores de regras de negócio, possui experiência na implantação de scrum e coordenação de projetos e sistemas de varejo.&lt;br /&gt;
&lt;b&gt;Contato&lt;/b&gt;: &lt;a href=&quot;mailto:angelo.amaral@gmail.com&quot;&gt;angelo.amaral@gmail.com&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;</description><link>http://apolineosocial.blogspot.com/2010/10/boas-praticas-para-gerencia-de.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-147442119890786947</guid><pubDate>Thu, 09 Sep 2010 01:10:00 +0000</pubDate><atom:updated>2011-03-12T03:21:12.057-08:00</atom:updated><title>Dynamic CRUD no .NET 4.0</title><description>No último artigo fizemos um overview sobre programação dinâmica e as possibilidades que ela oferece, e terminamos, com uma idéia sobre um CRUD a partir do banco. Hoje veremos como isso poderia ser feito.&lt;br /&gt;
&lt;br /&gt;
A idéia é usarmos o DLR (Dynamic Language Runtime) para que nosso código compilado ignore a estrutura estática dos tipos que podem ser detectados na compilação, ou seja, ter a verificação de tipos somente no momento da execução. Dessa forma, vamos até o momento de dados, obtemos o schema da tabela que desejamos e criamos a estrutura de um objeto correspondente a ela. Depois disso, montamos a rotina para inserção de registros na base (na tabela ao qual a entidade se refere) e criamos na entidade o método que executa esse rotina.&lt;br /&gt;
&lt;br /&gt;
Para que tudo isso seja possível precisamos conhecer o intermediario de toda essa “mágica”, portanto, lhes apresento o “ExpandoObject”.&lt;br /&gt;
&lt;br /&gt;
A classe ExpandoObject pertence ao namespace System.Dynamic e é definida no assembly System.Core e representa um objeto cujos membros podem ser dinamicamente adicionados e removidos em tempo de execução.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;public sealed class &lt;/span&gt;&lt;span class=&quot;type&quot;&gt;ExpandoObject&lt;/span&gt; :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;type&quot;&gt;IDynamicMetaObjectProvider&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;type&quot;&gt;IDictionary&lt;/span&gt;&amp;lt;&lt;span class=&quot;keyword&quot;&gt;string&lt;/span&gt;, &lt;span class=&quot;keyword&quot;&gt;object&lt;/span&gt;&amp;gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;type&quot;&gt;ICollection&lt;/span&gt;&amp;lt;&lt;span class=&quot;type&quot;&gt;KeyValuePair&lt;/span&gt;&amp;lt;&lt;span class=&quot;keyword&quot;&gt;string&lt;/span&gt;, &lt;span class=&quot;keyword&quot;&gt;object&lt;/span&gt;&amp;gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;type&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span class=&quot;type&quot;&gt;KeyValuePair&lt;/span&gt;&amp;lt;&lt;span class=&quot;keyword&quot;&gt;string&lt;/span&gt;, &lt;span class=&quot;keyword&quot;&gt;object&lt;/span&gt;&amp;gt;&amp;gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;type&quot;&gt;IEnumerable&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;type&quot;&gt;INotifyPropertyChanged&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Na verdade, é a interface “IDynamicMetaObjectProvider” quem permite que um objeto seja compartilhado no DLR (Dynamic Language Runtime) por programas escritos de acordo com o modelo de interoperabilidade DLR, ou seja, apenas os objetos que implementam essa interface podem ser compartilhados em linguagens dinâmicas do .NET.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Dynamic CRUD&lt;/h3&gt;&lt;br /&gt;
A idéia aqui é criarmos um objeto contendo todas as propriedades da tabela e os métodos do CRUD (do Inglês Create, Read, Update e Delete), porém, por questões de simplicidade, nosso exemplo focará apenas na inserção de dados (Create).&lt;br /&gt;
&lt;br /&gt;
A figura abaixo representa a estrutura que criaremos:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-image: url(&#39;http://www.apolineo.com.br/App_Themes/Default/Image/DynamicCRUD.png&#39;); width: 527px; height:379px; border: 1px dotted gray;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
O grande astro dessa solução é classe “Entity”, que é a responsável por criar uma instância e adicionar as propriedades (de acordo com as colunas do banco) e o método de inclusão de dados. &lt;br /&gt;
&lt;br /&gt;
O primeiro passo é criar uma instância de “ExpandoObject”, da mesma forma que qualquer outro objeto .NET, exceto pelo fato de que a variável para armazenar a instância é do tipo “dynamic”.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;dynamic&lt;/span&gt; entity = &lt;span class=&quot;keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;type&quot;&gt;ExpandoObject&lt;/span&gt;();&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Após buscarmos o schema da tabela na base de dados vamos adicionar as propriedades, e para isso, você apenas atribui a ela um novo valor, por exemplo:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;entity.ExpandoEntityName = name;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Porém, não sabemos o nome das propriedades, afinal, os recuperamos a partir do schema da tabela, como fica?&lt;br /&gt;
&lt;br /&gt;
Lembra que o “ExpandoObject” implementa a interface “IDictionary&lt;string, object&gt;”? Então, é a parte “string” ou “key” é o nome da propriedade ou método, e a parte “object” ou “valor”, é  valor da propriedade ou o delegate do método. Sendo assim, convertemos nosso “ExpandoObject” para “IDictionary&lt;string, object&gt;” e através de um loop criamos todas as propriedades:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;var&lt;/span&gt; e = (entity &lt;span class=&quot;keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;type&quot;&gt;IDictionary&lt;/span&gt;&amp;lt;&lt;span class=&quot;keyword&quot;&gt;string&lt;/span&gt;, &lt;span class=&quot;keyword&quot;&gt;object&lt;/span&gt;&amp;gt;);&lt;br /&gt;
&lt;span class=&quot;keyword&quot;&gt;foreach&lt;/span&gt; (&lt;span class=&quot;keyword&quot;&gt;var&lt;/span&gt; property &lt;span class=&quot;&quot;&gt;in&lt;/span&gt; propertyList)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e[property.Name] = &lt;span class=&quot;String&quot;&gt;&quot;&quot;&lt;/span&gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
O mesmo serve para a criação do método de inserção:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;entity.Insert = &lt;span class=&quot;keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;type&quot;&gt;Action&lt;/span&gt;(() =&gt; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;type&quot;&gt;SqlClientPlugin&lt;/span&gt;.Insert(tableName, entity, propertyList);&lt;br /&gt;
});&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
O uso dessa estrutura nos permitiria criar um código assim:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;var&lt;/span&gt; company = &lt;span class=&quot;type&quot;&gt;Entity&lt;/span&gt;.NewEntity(&lt;span class=&quot;String&quot;&gt;&quot;Teste&quot;&lt;/span&gt;);&lt;br /&gt;
&lt;br /&gt;
company.Name = &lt;span class=&quot;String&quot;&gt;&quot;Apolineo Serviços de Informática Ltda.&quot;&lt;/span&gt;;&lt;br /&gt;
company.WebSite = &lt;span class=&quot;String&quot;&gt;&quot;http://www.apolineo.com.br&quot;&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
company.Insert();&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Bom, isso é só uma possibilidade de uso de programação dinâmica e esperamos que sirva de estopim para outras grandes idéias de uso.&lt;br /&gt;
&lt;br /&gt;
O código de exemplo pode ser obtido no link abaixo:&lt;br /&gt;
&lt;a style=&quot;text-decoration: underline;&quot; href=&quot;http://www.apolineo.com.br/download/ExpandoObjetoTestBLOG.rar&quot; target=&quot;_blank&quot;&gt;ExpandoObjetoTestSolution.rar&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Até a próxima!&lt;br /&gt;
&lt;br /&gt;
&lt;style&gt;
.code
{
 font-family: Courier;
 font-size: 12px;
 color: #000000;
 padding: 10px 10px 10px 10px;
 width: 95%;
 border: 1px dotted gray;
}
         
.keyword
{
 color: #0000ff;
}
         
.type
{
 color: #55b8e5;
}

.String
{
 color: #a31515;
}
&lt;/style&gt;</description><link>http://apolineosocial.blogspot.com/2010/09/dynamic-crud-no-net-40.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-5353487467962265623</guid><pubDate>Mon, 16 Aug 2010 11:38:00 +0000</pubDate><atom:updated>2010-08-16T04:38:14.872-07:00</atom:updated><title>Programação Dinâmica no C# 4.0</title><description>A programação com a plataforma Microsoft .NET Framework se baseia na programação com tipos de dados estáticos, ou seja, toda expressão é de um tipo conhecido no momento da compilação e possíveis erros são conhecidos com antecedência.&lt;br /&gt;
&lt;br /&gt;
Ao usar reflexão você pode resolver dependências de tipo em tempo de execução e habilitar seu código para funcionar baseado em uma interface sem ter que saber o tipo concreto, e essa técnica, usada desde a versão 1.0 do .NET Framework, foi amplamente utilizada para criar estruturas  IoC (Inverse of Control – Insersão de Controle). Porém, apesar da flexibilidade, a interface do objeto de destino é fixa e imutável, ou seja, sempre existe uma interface conhecida por trás de qualquer chamada realizada através da reflexão.&lt;br /&gt;
&lt;br /&gt;
O .NET Framework 4.0 tráz novos recursos que lhe permitirão ir além dos tipos estáticos. A tipificação dinâmica atrasa qualquer verificação de tipo até o momento da execução, ou seja, ignora a estrutura estática dos tipos no momento da compilação. &lt;br /&gt;
&lt;br /&gt;
Com objetos dynamic, é possível definir a interface do objeto de maneira programática e ter a clareza formal de objetos estáticos e a flexibilidade dos tipos dinâmicos.&lt;br /&gt;
&lt;br /&gt;
Com essa técnica é possível implementar um CRUD a partir do schema do banco de dados, criar um ponto de acesso centralizado para atender solicitações de requisições de interfaces com o usuário e fazer o tratamento necessário (navegação, integrar com serviços de negócios, etc) através de uma string (ASP.NET MVC? AJAX?), estruturar em objetos um XML, enfim, as possibilidades são muitas e a criatividade é o limite.&lt;br /&gt;
&lt;br /&gt;
No próximo artigo apresentarei falaremos de objetos Expando e mostrei a idéia do CRUD a partir do schema do banco.&lt;br /&gt;
&lt;br /&gt;
Até mais!</description><link>http://apolineosocial.blogspot.com/2010/08/programacao-dinamica-no-c-40.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-6368791962807071744</guid><pubDate>Wed, 14 Jul 2010 18:40:00 +0000</pubDate><atom:updated>2010-07-14T11:40:41.123-07:00</atom:updated><title>Extension Methods = Manutenibilidade</title><description>Com a versão 3.0 do .Net Framework tivemos, dentre outros recursos, a introdução do Extension Method, que é uma técnica para adicionar comportamento (método) a um determinado tipo sem a necessidade de alterar o código original ou criar tipos derivados.&lt;br /&gt;
&lt;br /&gt;
Uma boa estratégia de uso de métodos de extensão contribui para um a manutenibilidade, que é um aspecto da qualidade de software que se refere ao esforço necessário para diagnosticar deficiências ou causas de falhas, ou localizar as partes a serem modificadas para corrigir os problemas ou à facilidade de modificação ou adaptação, ao esforço necessário para realizar alterações ou para adequar o produto a eventuais mudanças de ambiente operacional.&lt;br /&gt;
&lt;br /&gt;
Imagine um método, em uma classe de negócio, que realiza o a venda de um produto e da baixa no estoque:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;font-family: Courier New; font-size: 12px; width: 90%; border: dashed 1px gray; padding: 10px 10px 10px 10px;&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;if&lt;/font&gt; (IsValid(sale) &amp;&amp; AllItemsAreValids(sale.SaleDetailsList))&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;var&lt;/font&gt; products = VerifyProductStockAvailability(sale);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;using&lt;/font&gt; (&lt;font color=&quot;#0000ff&quot;&gt;var&lt;/font&gt; trans = &lt;font color=&quot;#0000ff&quot;&gt;new&lt;/font&gt; &lt;font color=&quot;#55b8e5&quot;&gt;DataTransaction&lt;/font&gt;())&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;var&lt;/font&gt; daoSale = &lt;font color=&quot;#0000ff&quot;&gt;new&lt;/font&gt; &lt;font color=&quot;#55b8e5&quot;&gt;DAOSale&lt;/font&gt;();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;var&lt;/font&gt; daoProduct = &lt;font color=&quot;#0000ff&quot;&gt;new&lt;/font&gt; &lt;font color=&quot;#55b8e5&quot;&gt;DAOProduct&lt;/font&gt;();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;daoSale.Insert(sale);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;for&lt;/font&gt; (&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt; i = 0; i &amp;lt; sale.SaleDetailsList.Count; i++)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;daoSale.InsertDetail(sale.SaleDetailsList[i]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;for&lt;/font&gt; (&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt; i = 0; i &amp;lt; products.Count; i++)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;daoProduct.UpdateStock(products[i]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;trans.Complete();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Refatorando o código, aplicando métodos de extensão e buscando uma melhor lêxia do código, podemos chegar em resultados como:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;font-family: Courier New; font-size: 12px; width: 90%; border: dashed 1px gray; padding: 10px 10px 10px 10px;&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;if&lt;/font&gt; (sale.IsValid() &amp;&amp; sale.SaleDetailsList.HasAllItemsValid())&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;var&lt;/font&gt; products = VerifyProductStockAvailability(sale);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;using&lt;/font&gt; (&lt;font color=&quot;#0000ff&quot;&gt;var&lt;/font&gt; trans = &lt;font color=&quot;#0000ff&quot;&gt;new&lt;/font&gt; &lt;font color=&quot;#55b8e5&quot;&gt;DataTransaction&lt;/font&gt;())&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sale.Insert();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;products.UpdateStock();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sale.SaleDetailsList.Insert();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;trans.Complete();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Muitos podem argumentar que a diferença é pouca, o código é legível e de boa manutenibilidade das duas formas, eu concordo, porém, na segunda ele é muito mais fácil e rápido para ler e entender, além de que, com o uso dos métodos de extensão introduzimos um nível a mais de abstração.&lt;br /&gt;
&lt;br /&gt;
Um recurso simples, porém, poderoso!&lt;br /&gt;
&lt;br /&gt;
Como você o utiliza em seus projetos? Deixe seu comentário.&lt;br /&gt;
&lt;br /&gt;
Até a próxima!</description><link>http://apolineosocial.blogspot.com/2010/07/extension-methods-manutenibilidade.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-37462046705534221</guid><pubDate>Mon, 12 Jul 2010 20:22:00 +0000</pubDate><atom:updated>2010-07-12T13:22:49.542-07:00</atom:updated><title>Validação, Verificação e Testes de Software</title><description>Qualidade não é um diferencial de mercado para as empresas conseguirem vender mais e lucrar mais, hoje, é um pré-requisito que devem conquistar para conseguir colocar seus produtos no mercado global.&lt;br /&gt;
&lt;br /&gt;
Para obter qualidade, devemos, por exemplo, estar em conformidade com requisitos de clientes, antecipar-se e satisfazer os desejos dos clientes, ou ainda, escrever tudo o que se deve fazer e fazer tudo o que foi escrito.&lt;br /&gt;
&lt;br /&gt;
E o que leva a falta de qualidade? A inabilidade de um software em cumprir a especificação de requisitos operacionais de sua responsabilidade, ou a habilidade de produzir efeitos indesejados são chamados de FALHAS (FAIL) e são a manifestação física (ERROR) de um DEFEITO (FAULT – imperfeição ou anomalia existente no código-fonte de um programa), o que a produtos pouco confiaveis, ou seja, de baixa qualidade.&lt;br /&gt;
&lt;br /&gt;
O teste de software é um conjunto de atividades que pode ser planejada antecipadamente e realizada sistematicamente, ou seja, consiste num estudo das fases do software (desde a análise até a entrega do produto). Existem dois tipos de atividade: A verificação, que faz com que o software funcione corretamente de acordo com especificações; e a validação, que se refere ao conjunto de atividades que garantem ao software construído funcionar de maneira razoável de acordo com as exigências do cliente.&lt;br /&gt;
&lt;br /&gt;
A figura abaixo ilustra quando testar, como testar e o que testar:&lt;br /&gt;
&lt;br /&gt;
&lt;img src=&quot;http://www.apolineo.com.br/App_Themes/Default/Image/tipos_de_teste.png&quot; width=&quot;510px&quot; height=&quot;339px&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Esperamos que esse tipo de informação lhe seja útil no momento de avaliar como garantir ou melhorar a qualidade dos software feitos.&lt;br /&gt;
&lt;br /&gt;
Até a próxima!</description><link>http://apolineosocial.blogspot.com/2010/07/validacao-verificacao-e-testes-de.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-3189827252934372636</guid><pubDate>Fri, 25 Jun 2010 19:39:00 +0000</pubDate><atom:updated>2010-06-25T12:39:22.783-07:00</atom:updated><title>Alinhamento Estratégico de TI – Parte 3</title><description>Nessa série de artigos buscamos avaliar como as empresas de tecnologia de organizam para competir e obter sucesso nesse acirrado mercado, além de, fazer uma análise para guiar a estratégia de competitividade.&lt;br /&gt;
&lt;br /&gt;
Numa análise horizontal da área de software temos que:&lt;br /&gt;
&lt;br /&gt;
&lt;img src=&quot;http://www.apolineo.com.br/App_Themes/Default/Image/ModeloProcessoDesenvolvimentoSoftware.png&quot; width=&quot;506px&quot; height=&quot;281px&quot; /&gt;&lt;br /&gt;
 &lt;br /&gt;
Dessa forma, vamos abordar nosso útimo modelo de processo de desenvolvimento de software, o modelo orientado a produtos.&lt;br /&gt;
&lt;br /&gt;
Esse tipo de modelo possui como característica o desenvolvimento e suporte de produtos de software (software pacote, ferramenta de desenvolvimento, componentes e produtos complexos) e tem na programação (design patterns), no design (arquitetura) e nos testes de sistema suas atividades principais, além de, foco de qualidade no produto.&lt;br /&gt;
&lt;br /&gt;
Com isso, o gerenciamento do projeto deve se concentrar na duração do projeto (seu maior risco) e na qualidade do produto. O modelo ISSO 9126 deve ser o referencial para esse tipo de empresa.&lt;br /&gt;
&lt;br /&gt;
E não precisamos nem dizer que inovações no produto é o fator chave para o sucesso.&lt;br /&gt;
&lt;br /&gt;
Esperamos que essas informações sejam utéis a você tanto quanto tem sido para nós.&lt;br /&gt;
&lt;br /&gt;
Agradecimentos especiais ao André Leme Fleury por essa brilhante análise.&lt;br /&gt;
&lt;br /&gt;
Até a próxima!</description><link>http://apolineosocial.blogspot.com/2010/06/alinhamento-estrategico-de-ti-parte-3.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-2717887964835757645</guid><pubDate>Tue, 22 Jun 2010 02:19:00 +0000</pubDate><atom:updated>2010-06-21T19:19:12.251-07:00</atom:updated><title>Alinhamento Estratégico de TI – Parte 2</title><description>No artigo anterior apresentamos alguns fatores que empresas que projetam, desenvolvem ou implementam sistemas de software específicos (customizados), ou seja, orientados a clientes deveriam considerar para se diferenciar.&lt;br /&gt;
&lt;br /&gt;
Hoje abordaremos o modelo de processo de desenvolvimento de software para empresas que possuem uma quantidade razoável de clientes e customizações de produtos.&lt;br /&gt;
&lt;br /&gt;
Esse tipo de empresa tem como caracterísca serviços relacionados com customização, treinamento ou operação de software e tem como principais atividades a programação e a modelagem de sistemas. Seu foco é em pesquisa e desenvolvimento de um portfólio de serviços, que basicamente é composto por:&lt;br /&gt;
&lt;br /&gt;
• Customização (fábrica de software)&lt;br /&gt;
• Implantação&lt;br /&gt;
• Treinamento&lt;br /&gt;
• Outsourcing&lt;br /&gt;
&lt;br /&gt;
Para esse tipo de empresa, orientada a serviços, o fator chave para o sucesso é a gestão do projeto de acordo com as especificações contratuais e seu maior risco é o custo e a duração do projeto. Portanto, um foco de qualidade baseado em projeto e fundamentado no PMBok são muito importantes para o sucesso comercial da empresa.&lt;br /&gt;
&lt;br /&gt;
Seu business é serviço? Think ahead!&lt;br /&gt;
&lt;br /&gt;
No próxima, e último, falaremos sobre empresas de produtos.&lt;br /&gt;
&lt;br /&gt;
Até mais!</description><link>http://apolineosocial.blogspot.com/2010/06/alinhamento-estrategico-de-ti-parte-2.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-4726489655069902989</guid><pubDate>Thu, 10 Jun 2010 01:06:00 +0000</pubDate><atom:updated>2010-06-09T18:06:01.183-07:00</atom:updated><title>Alinhamento Estratégico de TI – Parte 1</title><description>A atividade principal da sua empresa é tecnologia? Como ela se organiza para competir no mercado?&lt;br /&gt;
&lt;br /&gt;
Investir em metodologia, arquitetura, gestão, treinamento, etc, são importantes para todas as empresas, porém, dependendo do posicionamento de mercado da sua empresa alguns pontos são mais importantes que outros.&lt;br /&gt;
&lt;br /&gt;
Hoje, vamos discutir sobre empresas que projetam, desenvolvem, implementam sistemas de software específicos (customizados), ou seja, orientadas a clientes.&lt;br /&gt;
&lt;br /&gt;
Por que orientadas a cliente? Porque, os produtos/serviços são sistemas de acordo com especificações do cliente e o fator chave para o sucesso é atender e superar as expectativas do cliente. Com isso, o principal ponto da gestão do projeto é gerenciar as expectativas do cliente e as mudanças nos requisitos do projeto (o principal risco).&lt;br /&gt;
&lt;br /&gt;
Esse tipo de empresa deveria ter como estratégia competitiva a excelência operacional através de um processo de produção otimizado (por exemplo, baseado no CMMI), pois quanto mais otimizado o processo, maior a previsibilidade e produtividade da produção de um produto customizado.&lt;br /&gt;
&lt;br /&gt;
Sua empresa se enquandra nesse perfil?&lt;br /&gt;
&lt;br /&gt;
Na próxima falaremos sobre empresas de serviços.&lt;br /&gt;
&lt;br /&gt;
Até mais!</description><link>http://apolineosocial.blogspot.com/2010/06/alinhamento-estrategico-de-ti-parte-1.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-5498672343994615164</guid><pubDate>Fri, 04 Jun 2010 20:54:00 +0000</pubDate><atom:updated>2010-06-07T12:07:45.540-07:00</atom:updated><title>Pare. Identifique o Problema. Avalie Como Usar a Tecnologia Para Resolver.</title><description>A cerca de 8 anos acompanhamos a evolução da plataforma .NET da Microsoft, e em especial, a linguaguem C#. Isso claro, sem falar da UML, da Orientação a Objetos e Padrões de Projeto.&lt;br /&gt;
&lt;br /&gt;
Tivemos oportunidades de colocar em prática muitos dos conceitos para que pudessemos sair de situações comerciais desfavoráveis. Por exemplo, imagine só, você se apresenta como referência na tecnologia, vende uma consultoria de estabilização de um pequeno sistema de B2B, e sem olhar o produto, estima em 1 mês, afinal, um sistema pequeno (22 telas de cadastro, 4 telas de média complexidade e 1 muito complexa) não deve ser tão dificil de estabilizar, certo?&lt;br /&gt;
&lt;br /&gt;
Porém, conforme se passaram os dias, o que se viu foi que o sistema estava tão ruim que, certamente, 1 mês seria pouco.  E logo se passaram quase 2 semanas.&lt;br /&gt;
&lt;br /&gt;
Então, resolvemos analisar o sistema e a situação, e olhando o sistema funcionar vimos que todas as telas seguiam um padrão para as operações básicas (inclusão, alteração, pesquisa e exclusão), logo surgiu a luz, vamos implementar um conjunto de classes base que fizesse todo o CRUD, uma tela base que implementasse toda a lógica de utilização dessas classes, e então, alteramos a herança das telas e alteramos apenas para passar os dados específicos de cada item (lembrando que tudo isso foi em 2005 com .Net 1.1).&lt;br /&gt;
&lt;br /&gt;
Levamos pouco mais de 1 dia para desenvolver e estabilizar as classes base, e mais outro dia, para alterar todas as telas. Pronto! O sistema estava estável e ganhamos 4 dias por conta da solução técnica.&lt;br /&gt;
&lt;br /&gt;
E com um pouco de refatoração nesse conjunto de classes, pudemos aproveitá-las em outro projeto, o qual, em apenas 1 mês, fizemos o levantamento, a documentação, o desenvolvimento, a homologação e a implementação de um sistema de controle de ações de marketing com distribuidores (12 telas de cadastro, 2 telas de negócio e 3 relatórios).&lt;br /&gt;
&lt;br /&gt;
A evolução desse trabalho é o lob Framework. Avalie o uso nos seus projetos e pare de investir tempo e dinheiro para criar e testar a infra-estrutura da aplicação.&lt;br /&gt;
&lt;br /&gt;
Versão Trial em &lt;a href=&quot;http://ww.apolineo.com.br/products.aspx&quot;&gt;http://ww.apolineo.com.br/products.aspx&lt;/a&gt;</description><link>http://apolineosocial.blogspot.com/2010/06/pare-identifique-o-problema-avalie-como.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5714003148651085737.post-374628790923708402</guid><pubDate>Sat, 29 May 2010 00:51:00 +0000</pubDate><atom:updated>2010-05-28T19:14:10.841-07:00</atom:updated><title>TI... o desafio nosso de cada dia</title><description>É com muita satisfação que damos ínicio a um novo desafio em nossa empresa.&lt;br /&gt;
&lt;br /&gt;
Através desse espaço esperamos compartilhar idéias e experiências, sejam boas ou ruins, dos projetos que estivermos envolvidos. Com isso, esperamos criar um ambiente de debate virtual que leve a debates presenciais e uma troca de experiências ricas para todos da comunidade de soluções baseadas em software.&lt;br /&gt;
&lt;br /&gt;
Nos da Apolineo acreditamos que o sucesso está na utilização prática dos conceitos teóricos que circundam nossa área de estudo, porém, vemos no dia-a-dia, que muitas empresas partem para estratégias do rambo  (aquela onde o melhor programador/desenvolvedor resolvedor de problemas luta contra tudo e contra todos para manter o software funcionando). Mas sabemos também que há outras empresas, exceções de mercado, que possuem uma política voltada ao ser humano, pois afinal, são eles que fazem a empresa, não são?&lt;br /&gt;
&lt;br /&gt;
O pior disso tudo é que não conseguimos evoluir como profissionais e acabamos tendo que dedicar muito tempo do nosso lazer em estudos para nos mantermos competitivos no mercado.&lt;br /&gt;
&lt;br /&gt;
Você sofre desses problemas?</description><link>http://apolineosocial.blogspot.com/2010/05/nova-marca.html</link><author>noreply@blogger.com (Apolineo)</author><thr:total>0</thr:total></item></channel></rss>