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

<channel>
	<title>Sylverio &#187; Análise</title>
	<atom:link href="http://sylverio.com.br/blog/category/analise/feed/" rel="self" type="application/rss+xml" />
	<link>http://sylverio.com.br/blog</link>
	<description>Análise, Arquitetura, Orientação a Objetos, UML, Tecnologias e Programação</description>
	<lastBuildDate>Mon, 06 Feb 2012 11:01:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Polimorfismo</title>
		<link>http://sylverio.com.br/blog/2012/01/polimorfismo/</link>
		<comments>http://sylverio.com.br/blog/2012/01/polimorfismo/#comments</comments>
		<pubDate>Tue, 31 Jan 2012 10:46:43 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Análise]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[O.O.]]></category>

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

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

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

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

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

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

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

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=152</guid>
		<description><![CDATA[O modelo de domínio é um dos passos mais importantes na análise OO, por decompor um domínio em conceitos. Podemos definir o modelo de domínio em uma ilustração de classes conceituais (ou objetos de domínio). Em outras palavras, ele é &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2009/06/modelo-de-dominio/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>O modelo de domínio é um dos passos mais importantes na análise OO, por decompor um domínio em conceitos.<br />
Podemos definir o modelo de domínio em uma ilustração de classes conceituais (ou objetos de domínio).<br />
Em outras palavras, ele é uma perspectiva conceitual de objetos em uma situação real do mundo. Ele nos auxilia na compreenção dos termos e conceitos, bem como seus relacionamentos.<br />
O escopo do modelo de domínio é limitado pelos cenários descritos no caso de uso.</p>
<p>Um modelo de domínio não mostra artefatos ou classes de software. Note que modelo de domínio é diferente de camada de domínio, esta segunda representa uma camada de software com regras de negócio abaixo da camada de UI (UserInterface ou Apresentação).<br />
O modelo de domínio não é um modelo de dados. Pode existir classes no modelo que não tenham atributos.</p>
<p><strong>O que é Classe Conceitual</strong><br />
De modo informal, é uma idéia, coisa ou objeto. Mas formalmente uma classe conceitual pode ser considerada em termos do seu símbolo, da sua intensão e da sua extensão.</p>
<ul>
<li><em>Símbolo</em> &#8211; palavra ou imagem que representa uma classe conceitual.</li>
<li><em>Intensão</em> &#8211; a definição de uma classe conceitual.</li>
<li><em>Extensão </em>- conjunto de exemplos aos quais a classe conceitual se aplica.</li>
</ul>
<p><strong>Exemplo:</strong><br />
Em um evento de transação de Emitir Nota Fiscal, podemos denomina-la como símbolo &#8220;Emitir NF&#8221;. A intensão de Emitir NF é &#8220;registrar de uma transferência de propriedade sobre um bem ou uma atividade comercial&#8221;. E a sua extensão são todas as &#8220;Notas Fiscais Emitidas&#8221; existentes no universo.</p>
<p><strong>Referências</strong></p>
<p>LARMAN, Craig. Utilizando UML e padrões: uma introdução à análise e ao projeto orientados a objetos e ao Processo Unificado. Bookman, 2007.</p>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2009/06/modelo-de-dominio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como escrever um Caso de Uso</title>
		<link>http://sylverio.com.br/blog/2009/05/como-escrever-um-caso-de-uso/</link>
		<comments>http://sylverio.com.br/blog/2009/05/como-escrever-um-caso-de-uso/#comments</comments>
		<pubDate>Sat, 16 May 2009 17:29:43 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Análise]]></category>
		<category><![CDATA[Caso de Uso]]></category>
		<category><![CDATA[Requisitos]]></category>
		<category><![CDATA[RUP]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=147</guid>
		<description><![CDATA[Por não existir um padrão de como escrever um caso de uso e incentivado pelo PU (Processo Unificado) que possibilita utilizarmos somente o que for necessário. O Caso de Uso acabou tendo diversos formatos do que deve constar em seu &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2009/05/como-escrever-um-caso-de-uso/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Por não existir um padrão de como escrever um caso de uso e incentivado pelo PU (Processo Unificado) que possibilita utilizarmos somente o que for necessário. O Caso de Uso acabou tendo diversos formatos do que deve constar em seu conteúdo. </p>
<p>Para se aprofundar mais sobre esse assunto recomendo a leitura do livro <em>&#8220;Writing Effective Use Case &#8211; Cockburn, Alistair&#8221;</em>.</p>
<p>Dentro os diversos modelos de Caso de Uso, podemos dizer que os principais tópicos que temos que escrever são:</p>
<p><strong>Fluxo principal:</strong></p>
<ul>
<li>Não contém nenhuma condição ou desvio;</li>
<li>Típico caminho que satisfaz os objetivos dos interessados.</li>
</ul>
<p><strong>Pré-condição:</strong></p>
<ul>
<li> Condições que antecedem o caso de uso e devem ser informados ao leitor;</li>
<li>São sempre assumidas como verdadeiras;</li>
<li>Descreve um estado do sistema.</li>
</ul>
<p><strong>Pós-condição:</strong></p>
<ul>
<li> O que deve ser verdade ao termino do caso de uso bem sucedido ou estado final do caso de uso.</li>
</ul>
<p><strong>Fluxo alternativo ou extensões:</strong></p>
<ul>
<li>Descreve as condições e exceções que o fluxo principal podem tomar;</li>
<li>Relação de 1 pra N com o fluxo principal;</li>
<li>Descreve condições como algo que poder ser detectado pelo sistema ou pelo autor;</li>
<li>Quando o fluxo for grande, pode ser expressado como outro caso de uso.</li>
</ul>
<p><strong>Diretrizes:</strong></p>
<ul>
<li> Utilizar estilo essencial de redação, onde é expresso a intenção do usuário e as responsabilidades do sistema;</li>
<li>Deixe de fora a interface do usuário;</li>
<li>Focar nos objetivos dos atores, pois os casos de uso devem descreve-los.</li>
</ul>
<p><em>Exemplo</em>: O cliente (ator) tem a intenção de adicionar produtos ao carrinho e depois compra-los.<br />
<em>Caso de Uso</em>: Adicionar ao carrinho, Comprar o produto.</p>
<ul>
<li> Iniciar os nomes de caso de uso sempre com um verbo;</li>
<li>Operações do tipo CRUD (Create, Restore, Update, Delete), crie um único caso de uso denominado gerenciar .</li>
</ul>
<p><em>Exemplo</em>: Gerenciar usuários</p>
<ul>
<li> Observações: Alguns autores utilizam o verbo manter ao invés de gerenciar para operações CRUD.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2009/05/como-escrever-um-caso-de-uso/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>O que é requisitos de Software</title>
		<link>http://sylverio.com.br/blog/2009/05/requisitos-de-software/</link>
		<comments>http://sylverio.com.br/blog/2009/05/requisitos-de-software/#comments</comments>
		<pubDate>Tue, 05 May 2009 03:36:36 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Análise]]></category>
		<category><![CDATA[Requisitos]]></category>
		<category><![CDATA[RUP]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=100</guid>
		<description><![CDATA[O que são Requisitos? É o mapeamento das propriedades que um software deve ter para atender um problema em especial. Ele deve descrever os entendimento dos objetivos dos usuários e traduzir esses objetivos em funcionalidades do sistema. Definições: Condição ou &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2009/05/requisitos-de-software/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p><strong>O que são Requisitos?</strong></p>
<p>É o mapeamento das propriedades que um software deve ter para atender um problema em especial.</p>
<p>Ele deve descrever os entendimento dos objetivos dos usuários e traduzir esses objetivos em funcionalidades do sistema.</p>
<p><strong>Definições:</strong></p>
<ul>
<li>Condição ou capacidade necessária para o usuário resolver um problema ou atingir um objetivo.</li>
<li>Condições ou capacidade que deve ser atingida ou possuída por um sistema ou componente de sistema para satisfazer um contrato, padrão, especificação, ou outro documento de formalidade.</li>
<li>Representação documentada de uma condição ou capacidade.</li>
</ul>
<p><strong>Objetivos dos Requisitos:</strong></p>
<ul>
<li>Estabelecer e manter concordância com os clientes e outros envolvidos sobre o que o sistema deve fazer.</li>
<li>Oferecer aos desenvolvedores do sistema uma compreensão melhor dos requisitos do sistema.</li>
<li>Definir fronteiras do sistema (ou delimitar o sistema).</li>
<li>Fornecer uma base para estimar o custo e o tempo de desenvolvimento do sistema.</li>
<li>Definir uma interface de usuário para o sistema, focando nas necessidades e metas dos usuários.</li>
</ul>
<p><strong>Tipos de Requisitos:</strong></p>
<p><strong><em>Funcionais:</em></strong> Definem a funcionalidade do software, função que o sistema deve realizar para tender os objetivos do usuário.<br />
<em>Definem <strong>O QUE</strong> o sistema deve fazer, sem a preocupação de <strong>COMO</strong> fazer</em>.</p>
<p><strong><em>Não funcionais:</em></strong> Definem as qualidades do software.</p>
<p><strong>Classificação dos requisitos FURPS+</strong></p>
<p>É um sistema para a classificação de requisitos, que auxilia o analista a identificar a qual propósito as informações obtidas (objetivos do usuário e caracteristica do software) se destinam.</p>
<p><em>Funcionalidade (Functionality):</em></p>
<ul>
<li>Representa todo o aspecto funcional do sistema.</li>
</ul>
<p><em>Usabilidade (Usability):</em></p>
<ul>
<li>Tempo de treinamento para um usuário se tornar produtivo.</li>
<li>Tempo de duração desejado para determinada operação no sistema.</li>
<li>Ajuda on-line, documentação do usuário e material de treinamento.</li>
</ul>
<p><em>Confiabilidade (Reliability):</em></p>
<ul>
<li>Disponibilidade.</li>
<li>Tempo de correção &#8211; tempo permitido para indisponibilidade quando ocorre uma falha.</li>
<li>Precisão.</li>
<li>Número máximo de defeitos (bugs/KLOC &#8211; mil linhas de código).</li>
<li>Categorias de bugs &#8211; bugs devem ser categorizados por nível de impacto.</li>
</ul>
<p><em>Performace ou Desempenho (Performance):</em></p>
<ul>
<li>Tempo de resposta para uma transação.</li>
<li>Troughput (ex: transações por segundos).</li>
<li>Capacidade (ex: transações concorrentes).</li>
<li>Operação Parcial (Situação do sistema aceitável quando estiver prejudicado de alguma forma).</li>
<li>Uso de rescursos: memória, espaço em disco, comunicação, etc.</li>
</ul>
<p><em>Suportabilidade (Supportability):</em></p>
<ul>
<li>Padrão de codificação.</li>
<li>Convesão de nomenclatura.</li>
<li>Bibliotecas de classes.</li>
<li>Utilitários de manutenção.</li>
</ul>
<p><em>+ (Plus): </em></p>
<ul>
<li>Outros(Design, implementação, interface, físicos).</li>
</ul>
<p><strong>Prorização de Requisitos:</strong></p>
<p><em>Essencial:</em> sistema não entra em funcionamento.</p>
<p><em>Importante:</em> não impedem o funcionamento do sistema.</p>
<p><em>Desejável:</em> não impedem a entrada em funcioanemto do sistema sem a sua implementação.</p>
<p><strong>Como escrever os requisitos:</strong></p>
<p>O PU (Processo Unificado) define alguns modelos de documentos e processos que auxiliam o analista (e todo a equipe de desenvolvimento) a identificar e escrever requsitos.</p>
<p>Dentre os diversos tipos de documentos a serem escritos, podemos citar:</p>
<ul>
<li>Documento de Visão</li>
<li>Documento de <a href="http://sylverio.com.br/blog/?p=94">Caso de Uso</a></li>
<li>Especificação Suplementar</li>
<li>Glossário</li>
</ul>
<p>Até mais <img src='http://sylverio.com.br/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2009/05/requisitos-de-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Caso de Uso</title>
		<link>http://sylverio.com.br/blog/2009/04/caso-de-uso/</link>
		<comments>http://sylverio.com.br/blog/2009/04/caso-de-uso/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 03:48:36 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Análise]]></category>
		<category><![CDATA[Caso de Uso]]></category>
		<category><![CDATA[RUP]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=94</guid>
		<description><![CDATA[O que é um Caso de Uso? Caso de uso é &#8220;uma seqüência de ações executadas por um sistema que gera um resultado de valor observável para um determinado agente&#8221; (RUP &#8211; Rational Unified Process). Em outras palavras caso de &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2009/04/caso-de-uso/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p><strong>O que é um Caso de Uso?</strong></p>
<p>Caso de uso é &#8220;<em>uma seqüência de ações executadas por um sistema que gera um resultado de valor observável para um determinado agente</em>&#8221; (RUP &#8211; Rational Unified Process).</p>
<p>Em outras palavras caso de uso é uma narrativa em texto, utilizada para descobrir e registrar requisitos. É uma coleção de cenários relacionados de sucesso e fracasso, que descreve um ator utilizando o sistema para atingir um objetivo.</p>
<p><em>&#8220;Note que <strong>casos de uso não são diagramas, são textos.</strong> Enfocar os diagramas de caso de uso UML, de valor secundário, em vez do importante texto do caso de uso, é um erro comum para novatos&#8221;</em>. Craig Larman.</p>
<p>Casos de uso são requisitos funcionais (descrevendo funções do sistema e seu ambiente), sendo um dos principais meios para obtenção de captura de comportamentos do sistema. Ele serve como um contrato estabelecido entre o cliente e os desenvolvedores. É uma das principais fontes de informações atividades de análise, design e teste.</p>
<p>Por <em>enfatizar nos objetivos e perspectivas do usuário</em>, o Caso de Uso possibilita uma redução (ou extinção) das listas de detalhes de características usadas antigamente, e foca nas funcionalidades que aplicam estas características, tornando mais fácil sua leitura e entendimento.</p>
<p>Um dos pontos mais difíceis é aprender como determinar em que nível de detalhe os casos de uso devem &#8220;começar e terminar&#8221;. Onde as características terminam e os casos de uso começam, e onde os casos de uso terminam e o design começa? Os casos de uso ou os requisitos do software devem estabelecer &#8220;o que&#8221; o sistema executa, mas não &#8220;como&#8221; ele executa.</p>
<p><strong>Definições</strong></p>
<p><strong><em>Ator</em></strong>: é qualquer coisa que apresente algum comportamento, pode ser por exemplo uma pessoa, um caixa, um computador, outro sistema.</p>
<p><strong><em>Tipos de ator</em></strong>: </p>
<ul>
<li><em>Principal</em>: satisfaz os objetivos do usuário por meio de serviços no sistema.</li>
<li><em>Suporte</em>: fornece um serviço para o sistema.</li>
<li><em>Bastidor</em>: tem interesse no caso de uso, mas não como um ator principal ou bastidor. Por exemplo, um orgão governamental responsável por impostos.</li>
</ul>
<p><strong><em>Cenários</em></strong>: é uma sequência específica de ações e interações entre atores e o sistema.</p>
<p>Segue um link para o blog de <a href="http://www.antoniopassos.pro.br/blog/?tag=caso-de-uso" target="_blanck">Antonio Passos</a>, onde ele em alguns posts aborda conceitos de casos de usos e suas realizações sendo um ótimo complemento para o assunto abordado.</p>
<p><strong>Referências</strong></p>
<p>LARMAN, Craig. Utilizando UML e padrões: uma introdução à análise e ao projeto orientados a objetos e ao Processo Unificado. Bookman, 2007.</p>
<p>RUP 2002.05.00 (Portugues)</p>
<p>Até o próximo <img src='http://sylverio.com.br/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2009/04/caso-de-uso/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

