tag:blogger.com,1999:blog-21080887874043970362024-03-20T15:37:31.946-07:00Projetos Orientados a ObjetoMaikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.comBlogger22125tag:blogger.com,1999:blog-2108088787404397036.post-21306483445741467672008-06-21T15:50:00.001-07:002008-06-21T15:58:11.783-07:00XP - Extreme Programming<p><span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0); font-family: arial;">Aula 31</span><br /></p><p><br /><span style="font-family: arial;">Extreme Programming (XP) é uma metodologia de desenvolvimento de software, nascida nos Estados Unidos ao final da década de 90. Vem fazendo sucesso em diversos países, por ajudar a criar sistemas de melhor qualidade, que são produzidos em menos tempo e de forma mais econômica que o habitual. Tais objetivos são alcançados através de um pequeno conjunto de valores, princípios e práticas, que diferem substancialmente da forma tradicional de se desenvolver software.</span></p><p><br /><span style="font-family: arial;">Esta metodologia prega que: </span></p><ul style="font-family: arial;"><li>Indivíduos e interações entre eles são mais que processos e ferramentas;</li><li>Software em funcionamento é mais que documentação abrangente;</li><li>Colaboração com o cliente mais que negociação de contratos; ·</li><li> Responder a mudanças mais que seguir um plano.<br /></li></ul><span style="font-family: arial;">Os valores da programação extrema se baseiam em:</span><br /><p style="font-family: arial;"><span style="font-weight: bold; font-style: italic;">Comunicação:</span> Para que os desenvolvedores compreendam o que o cliente deseja e este último entenda os desafios técnicos que precisam ser vencidos, é preciso que haja comunicação entre as partes.<br /></p><p style="font-family: arial;"><span style="font-weight: bold; font-style: italic;">Coragem:</span> Costuma-se dizer que a única constante em um projeto de software é a mudança. Clientes mudam de idéia com freqüência, mesmo quando fecham contratos nos quais, teoricamente, assumem o compromisso de não alterar o que está na especificação. Eles mudam porque aprendem durante o projeto e descobrem problemas mais prioritários a serem solucionados ou formas mais apropriadas de resolvê-los. Embora isso seja natural, gera uma preocupação para a equipe de desenvolvimento que, de tempos em tempos, precisa alterar partes do sistema que já estavam prontas, correndo o risco de se quebrar o que já vinha funcionando. È preciso coragem para enfrentar esses tipos de situações.<br /></p><p style="font-family: arial;"><span style="font-weight: bold; font-style: italic;">Feedback: </span>Normalmente, quanto mais cedo descobrimos um problema, menos prejuízos ele pode causar e maiores são as chances de resolvê-lo de forma barata. Por isso, projetos XP estabelecem formas de encurtar ao máximo a defasagem de tempo entre o momento em que uma ação é executada e o seu resultado é observado. Assim, por exemplo, desenvolvedores procuram entregar novas funcionalidades no menor prazo possível, para que o cliente compreenda rapidamente as conseqüências daquilo que pediu. Os clientes, por sua vez, procuram se manter próximos dos desenvolvedores para prover informações precisas sobre qualquer dúvida que eles tenham ao longo do desenvolvimento.<br /></p><p style="font-family: arial;"><span style="font-weight: bold; font-style: italic;">Respeito:</span> Respeito é um valor que dá sustentação a todos os demais. Membros de uma equipe só irão se preocupar em comunicar-se melhor, por exemplo, se se importarem uns com os outros. Respeito é o mais básico de todos os valores. Se ele não existir em um projeto, não há nada que possa salvá-lo. Saber ouvir, saber compreender e respeitar o ponto de vista do outro é essencial para que um projeto de software seja bem sucedido.<br /></p><p style="font-family: arial;"><span style="font-weight: bold; font-style: italic;">Simplicidade: </span>O XP utiliza o conceito de simplicidade em inúmeros aspectos do projeto para assegurar que a equipe se concentre em fazer, primeiro, apenas aquilo que é claramente necessário e evite fazer o que poderia vir a ser necessário, mas ainda não se provou essencial.</p>Maikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.com0tag:blogger.com,1999:blog-2108088787404397036.post-51116725001044599032008-06-21T15:47:00.000-07:002008-06-21T15:56:09.082-07:00Padrões GRASP - parte II (Variações Protegidas)<p><span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0); font-family: arial;">Aula 30</span><br /></p><p style="font-family: arial;"><br /><span style="font-family: arial;">Como projetar objetos, subsistemas e sistemas de modo que as variações ou a instabilidade nesses elementos não tenha um impacto indesejável sobre outros elementos?</span><br /><span style="font-family: arial;">A VP é um princípio básico na motivação da maioria dos mecanismos e padrões na programação e no projeto para fornecer flexibilidade e proteção contra variações.</span><br /><span style="font-family: arial;">O encapsulamento de dados, das interfaces, e o polimorfismo são mecanismos básicos para se obter a VP. As técnicas de linguagens baseada em regras, interpretadores de regra, projetos reflexivos e de metadados, máquinas virtuais, etc, são mecanismos mais avançados para se obter a VP.</span></p><p style="font-family: arial;"><br />A seguir veremos alguns desses mecanismos e suas descrições de acordo o livro Utilizando UML e Padrões de Craig Larman:</p><p style="font-family: arial;"><br /><span style="font-weight: bold;">Projeto dirigido por dados (data-driven designs): </span>Os projetos dirigidos por dados englobam uma ampla família de técnicas que incluem códigos de leitura, valores, caminhos de arquivo de classe, nomes de classe, etc, de uma fonte externa para mudar o comportamento ou parametrizar um sistema de alguma maneiram, em tempo de execução.<br /></p><p style="font-family: arial;"><span style="font-weight: bold;">Pesquisa de serviço:</span> inclui técnicas como uso de serviços de atribuição de nomes ou negociantes para obter o serviço (o Jini do Java ou o UDDI para serviços web). Os clientes são protegidos contra variações na localização de serviços, usando a interface estável do serviço de pesquisa.<br /></p><p style="font-family: arial;"><span style="font-weight: bold;">Projetos dirigidos pelo interpretador:</span> os projetos dirigidos pelo interpretador incluem interpretadores de regra que executam regras lidas de uma fonte externa, interpretadores de script ou linguagem que lêem e executam programas, máquinas virtuais, mecanismos de rede neural que executam redes, mecanismos de lógica, etc. Esta estratégia permite mudar ou parametrizar o comportamento de um sistema por meio de expressões lógicas externas.<br /></p><p style="font-family: arial;"><span style="font-weight: bold;">Projetos reflexivos ou de nível meta:</span> O sistema é protegido contra o impacto de variações de lógica ou externas do código, por meio de algoritmos reflexivos que utilizam introspecção e serviços de metalinguagem.<br /></p><p><span style="font-family: arial;"><span style="font-weight: bold;">Acesso uniforme: </span>Algumas linguagens dão suporte a uma construção sintática de modo que os acessos a um método e a um campo de sejam expressos da mesma maneira.</span></p><p><br /></p><p style="font-weight: bold; font-family: arial;">Referências:</p><p><br /></p><p style="font-family: arial; font-style: italic;">Larmam, Craig</p><p><span style="font-family: arial; font-style: italic;">Utilizando UML e Padrões: uma introdução à análise e ao projeto orientados a objetos e ao processo unificado - 2.ed - Porto Alegre:Bookmam, 2004.</span><br /></p>Maikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.com1tag:blogger.com,1999:blog-2108088787404397036.post-47172266453998041382008-06-21T11:50:00.000-07:002008-06-21T14:53:18.278-07:00Padrões GRASP - parte II (Invenção Pura e Indireção)<p><span style="font-family: arial; font-weight: bold; font-style: italic; color: rgb(255, 0, 0);">Aulas 28 e 29</span><br /></p><p><br /><span style="font-family: arial;">Sabemos que os princípios de ouro para um bom projeto OO é o baixo acoplamento e a alta coesão, mas e se em algum caso a aplicação de um padrão violar um desses princípios? </span></p><p style="font-family: arial;">Utilizaremos um exemplo dado no livro Utilizando UML e padrões de Craig Larman. No exemplo ele diz “Às vezes, os projetos orientados a objetos são caracterizados por implementarem como classes de software as representações dos conceitos do domínio do problema no mundo real para diminuir o hiato de representação (aqui ele usa o termo “hiato” para se referir às lacunas, espaço, o vago deixado quando se quer representar algo do mundo real no mundo virtual), por exemplo, uma classe Venda e uma classe Cliente. </p><p style="font-family: arial;">Entretanto, existem muitas situações em que atribuir responsabilidades apenas às classes de software da camada do domínio leva a problemas em termos de coesão ou acoplamento inadequados ou a um baixo potencial de reutilização. </p><p style="font-family: arial;">Suponha, por exemplo, que seja necessário suporte para salvar as instâncias de Venda em um banco de dados relacional. Segundo o padrão Especialista, atribuir responsabilidade à própria classe Venda seria justificável, pois venda tem os dados que precisam ser salvos. Entretanto, considere as implicações a seguir:<br /></p><p style="font-family: arial;">A tarefa exige um número relativamente grande de operações de suporte relacionadas ao banco de dados, nenhuma delas voltada ao conceito de venda, de modo que a classe Venda se torna não-coesa.<br />A classe Venda precisa estar acoplada à interface do banco de dados relacional, de modo que seu acoplamento aumenta.<br /></p><p style="font-family: arial;">Salvar objetos em um banco de dados relacional é uma tarefa muito geral, para a qual muitas classes precisam de suporte. Colocar essas responsabilidades na classe Venda sugere que vai haver uma reutilização inadequada ou muita duplicação em outras classes que fazem a mesma coisa.<br />Entenderam agora como a aplicação do padrão especialista levou a um alto acoplamento e uma baixa coesão? Mas nesse caso, o que fazer se não podemos deixar de aplicar o padrão especialista?<br /></p><p style="font-family: arial;">A resposta é o título desta postagem, o padrão Invenção Pura. Uma solução razoável para o problema acima é criar uma classe que seja responsável unicamente por salvar objetos em algum tipo de meio de armazenamento persistente, como um banco de dados relacional. Esta classe é uma Invenção Pura, uma criação da imaginação, e serve para tirar o acoplamento da classe Venda com o banco de dados.<br /></p><p style="font-family: arial;"><span style="font-size:130%;"><span style="font-weight: bold;">Indireção</span></span><br /></p><p style="font-family: arial;">O objetivo deste padrão é muito parecido com o que estudamos acima, o padrão Invenção pura. Craig Larman cita em seu livro “Utilizando UML e padrões” que o objetivo do padrão indireção é “atribuir responsabilidade a um objeto intermediário para ser o mediador entre outros componentes ou serviços, para que eles não sejam diretamente acoplados. O intermediário cria uma indireção entre os outros componentes.<br /></p><p style="font-family: arial;">Geralmente, o padrão indireção e o Invenção Pura andam juntos, e o problema para o qual são a solução, geralmente é o mesmo, o alto acoplamento. Ao se aplicar um dos dois, não há a necessidade de aplicar o outro, a não ser que haja um certo choque de padrões, como foi explicado no exemplo anterior.</p>Maikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.com0tag:blogger.com,1999:blog-2108088787404397036.post-22567517511322843612008-06-21T11:49:00.000-07:002008-06-21T14:51:37.984-07:00Padrões GRASP - parte II (Polimorfismo)<span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);font-family:arial;" >Aulas 26 e 27</span><br /><p><br /><br /><span style="font-family:arial;">Na área científica definimos polimorfismo como sendo uma propriedade que possui certas substâncias com a capacidade de se apresentarem sob muitas formas, sem mudarem de natureza, ou seja, de tipo.</span> <span style="font-family:arial;">Em que esse pequeno parágrafo tem a ver com o design pattern polimorfismo? Segundo os autores do livro Core Java, Cornell & Horstmann, polimorfismo é a capacidade de um objeto decidir qual método aplicará a si mesmo, dependendo de onde se encontra na hierarquia de herança. </span></p><p style="font-family: arial;">Complementando a idéia dos autores, podemos dizer em outras palavras que polimorfismo é a capacidade de um objeto de se transformar em outros objetos, dependendo do contexto onde está sendo aplicado, sem mudar o seu tipo, isso ocorre através dos métodos que são herdados de uma superclasse.<br /></p><p style="font-family: arial;">O questionamento que leva ao uso do polimorfismo é: como criar componentes de softwares conectáveis com base no tipo? Supomos que temos uma classe que faz três diferentes tipos de ações, imagine que uma outra classe sempre disparasse chamadas a essa classe, solicitando a execução de uma dessas ações, ou seja, quando chega a mensagem, teríamos sempre que testar qual seria o tipo de ação a ser executada, e só então executá-la.<br />If tipoação 1<br />...<br />Else<br />If tipoação 2<br />...<br />O design pattern polimorfimo prega que nunca teste o tipo de um objeto nem use condições lógicas no código para executar alternativas com base no tipo. Por que? Respondo com outra pergunta. E se o tipo mudar?<br />Com base no exemplo dado pelo Wikipedia vamos considerar a seguinte classe escrita em Java:</p><p style="font-family: arial;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-CYC_0-EP1K0xpo0LhkFbJYwNiAmJgJ16-va_HpuTm25TcVWQTdY8FrC8Q3ylvOk75-Sexu9GlxsPiXtgp3QZcwD4_3xiRntdZF-CAtjyzAGqN5Ht9bF1L067cRKKD8KkzyUF6gWlIuQ/s1600-h/imagem3.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-CYC_0-EP1K0xpo0LhkFbJYwNiAmJgJ16-va_HpuTm25TcVWQTdY8FrC8Q3ylvOk75-Sexu9GlxsPiXtgp3QZcwD4_3xiRntdZF-CAtjyzAGqN5Ht9bF1L067cRKKD8KkzyUF6gWlIuQ/s400/imagem3.JPG" alt="" id="BLOGGER_PHOTO_ID_5214454944653980658" border="0" /></a></p><p style="font-family: arial;">Esta é uma classe abstrata que representa qualquer operação matemática. Existem várias operações matemáticas, com isso não podemos ficar testando uma por uma. Note que, mesmo que a natureza do cálculo mude, a semântica do método calcular não muda, ou seja, ele sempre calculará o resultado da operação matemática que está sendo trabalhada.<br /></p><p style="font-family: arial;">Veremos duas subclasses que implementam duas dessas operações matemáticas</p><p style="font-family: arial;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgveweVFuRQ5lnkMGFbc9rHHB7hXqjUtVevs3PHpN10pTiK7waFe6fPn1fLX59YX5xhlFrCDAsmebgyjFXZyXEVhzlDR3n4EARu-Xvq_Qt2H-WPorwRCyBJ9NSZc7pkAd5RNH2wBytYovE/s1600-h/imagem4.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgveweVFuRQ5lnkMGFbc9rHHB7hXqjUtVevs3PHpN10pTiK7waFe6fPn1fLX59YX5xhlFrCDAsmebgyjFXZyXEVhzlDR3n4EARu-Xvq_Qt2H-WPorwRCyBJ9NSZc7pkAd5RNH2wBytYovE/s400/imagem4.JPG" alt="" id="BLOGGER_PHOTO_ID_5214455333809738930" border="0" /></a></p><p><span style="font-family:arial;">O seguinte trecho de código demonstra o uso do polimorfismo:</span></p><p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEill7Zq7Dzg_ln37cf9JmrqnCe_lE_E1Q1tXAiV58_SyV4MP1G4W5RbsXsXwRAlK2jP7tGiMx3fV8iEY6wLDdmLlB1F36HB8h-FTeOBSsN87tIy7ZHChUKhbXoMNO6R5mp83yJsD2gjbCI/s1600-h/imagem5.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 391px; height: 155px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEill7Zq7Dzg_ln37cf9JmrqnCe_lE_E1Q1tXAiV58_SyV4MP1G4W5RbsXsXwRAlK2jP7tGiMx3fV8iEY6wLDdmLlB1F36HB8h-FTeOBSsN87tIy7ZHChUKhbXoMNO6R5mp83yJsD2gjbCI/s400/imagem5.JPG" alt="" id="BLOGGER_PHOTO_ID_5214455622597059458" border="0" /></a></p><p><span style="font-family:arial;">Embora o método calcular tenha sido chamado duas vezes em mostrarCalculo, o comportamento apresentado variou de acordo com a classe ao qual ele representava no momento.</span></p><p><br /><a href="http://www.mail-archive.com/java-list@soujava.org.br/msg09906.html">http://www.mail-archive.com/java-list@soujava.org.br/msg09906.html</a><br /><a href="http://www.tecnoclasta.com/2007/12/18/aula-11-classes-interfaces-e-polimorfismo/">http://www.tecnoclasta.com/2007/12/18/aula-11-classes-interfaces-e-polimorfismo/</a><br /><a href="http://pt.wikipedia.org/wiki/Polimorfismo">http://pt.wikipedia.org/wiki/Polimorfismo</a><a href="http://www.dca.fee.unicamp.br/cursos/PooJava/polimorf/index.html">http://www.dca.fee.unicamp.br/cursos/PooJava/polimorf/index.html</a></p>Maikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.com0tag:blogger.com,1999:blog-2108088787404397036.post-29713694803296829472008-06-21T11:46:00.000-07:002008-06-21T14:55:44.186-07:00Padrões GOF (Padrão MVC<p style="font-family: arial;"><span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);">Aulas 24 e 25</span><br /><br />MVC significa Model-View-Controller, traduzindo seria, Modelo-Vista-Controlador, para entendermos um pouco sobre um dos mais importantes padrões de projeto, vamos a um exemplo básico:<br />Imagine que você tenha um sistema de RH e três clientes:<br />· Um por comodidade só quer acessá-lo pela web;<br />· Outro por questão de segurança só quer acessar por desktop através de uma rede local;<br />· E um outro, mais moderno, só quer se conectar ao sistema através de um celular;</p><p style="font-family: arial;"><br />Haverá a necessidade de desenvolver 3 interfaces diferentes para cada usuário, um para cada tipo. Já as outras duas camadas, não necessariamente teriam que ser modificadas, tornando assim uma aplicação potencialmente reutilizável. A idéia principal do padrão MVC é isolar a aplicação em camadas distintas, basicamente, a camada de acesso a dados, a camada de apresentação, e a camada de negócios, que respectivamente são o Modelo, o Vista e o Controlador.<br /></p><p style="font-family: arial; font-weight: bold; font-style: italic;">O modelo</p><p style="font-family: arial;"><br />O modelo é a parte do componente que encapsula os dados da aplicação. Na maioria das vezes vai fornecer rotinas para administrar e manipular dados. De modo geral, a técnica de acesso aos dados deve ser encapsulada no modelo. Desta forma, se uma aplicação for transferida de um sistema que usa um tipo de banco de dados para um sistema que usa outro, o único elemento que precisa ser alterado será o modelo - a vista e o controlador não precisam ser modificados.<br /></p><p style="font-family: arial; font-weight: bold; font-style: italic;">A vista</p><p style="font-family: arial;"><br />A vista é a parte do componente usada para transformar e preparar os dados do modelo para que possam ser apresentados de alguma forma. O controlador retira os dados do modelo e os entrega para a vista. Esta, por sua vez, alimenta templates com estes dados para que possam ser apresentados ao usuário. A vista não modifica os dados de nenhuma forma, apenas os apresenta.<br /></p><p style="font-family: arial;"><span style="font-weight: bold; font-style: italic;">O controlador</span></p><p style="font-family: arial;"><br />O controlador é responsável pelas respostas às ações dos usuários. No caso de uma aplicação web, uma ação de usuário (geralmente) é a solicitação de uma página. O controlador vai determinar qual solicitação foi feita e vai responder de acordo fazendo com que o modelo manipule os dados necessários para depois passá-los para a vista para que possam ser mostrados.<br />Segundo o Wikipédia, um framework é uma estrutura de suporte definida em que um outro projeto de software pode ser organizado e desenvolvido. Pode incluir programas de suporte, bibliotecas de código, linguagens de <a title="Script" href="http://pt.wikipedia.org/wiki/Script">script</a> e outros softwares para ajudar a desenvolver e juntar diferentes componentes de um projeto de software.<br />Existem diversos frameworks que abrangem o padrão mvc, mas a maioria deles é voltada para aplicações web, a seguir serão apresentados alguns com os respectivos links direcionando para um material mais aprofundado sobre os mesmos, para quem deseja aprofundar.<br /><br />ZEND FRAMEWORK<br />Zend Framework é um <a title="Framework" href="http://pt.wikipedia.org/wiki/Framework">framework</a> de <a title="Código aberto" href="http://pt.wikipedia.org/wiki/C%C3%B3digo_aberto">código aberto</a> que provê recursos para o desenvolvimento de aplicações e serviços <a title="WEB" href="http://pt.wikipedia.org/wiki/WEB">WEB</a> usando a <a title="Linguagem de programação" href="http://pt.wikipedia.org/wiki/Linguagem_de_programa%C3%A7%C3%A3o">linguagem de programação</a> <a title="PHP" href="http://pt.wikipedia.org/wiki/PHP">PHP</a>. Propõe-se a oferecer uma biblioteca de recursos de grande poder, fornecendo soluções modernas, robustas e seguras para o desenvolvedor. Inclui, também, diversos componentes de integração com APIs de serviços, como Flickr, Amazon e Delicious, entre outros.<br />TUTORIAL SOBRE O ZEND FRAMEWORK<br /><a href="http://akrabat.com/wp-content/uploads/iniciando-com-zend-framework_130.pdf">http://akrabat.com/wp-content/uploads/iniciando-com-zend-framework_130.pdf</a><br /><br />WEBWORK<br />O <a href="http://webwork.dev.java.net/">WebWork </a>é um framework java que trabalha com MVC de nível 2. Ele desenvolve o papel de controlar, isto é, ele é o responsável por fazer o direcionamento de acordo com cada requisição. Nele está configurado qual ação (Action) deve ser chamada em cada caso.<br />FÓRUM SOBRE O WEBWORK CONTENDO UM PEQUENO TUTORIAL<br /><a href="http://www.javafree.org/javabb/viewtopic.jbb?t=8798">http://www.javafree.org/javabb/viewtopic.jbb?t=8798</a><br /><br />ASP.NET MVC FRAMEWORK<br />Framework da microsoft baseado no padrão MVC para linguagem asp.net. É necessário utilizar o visual studio, ferramenta também da microsoft para desenvolvimento de software.<br />TUTORIAL SOBRE O ASP.NET MVC FRAMEWORK<br /><a href="http://msdn.microsoft.com/pt-br/magazine/cc337884.aspx">http://msdn.microsoft.com/pt-br/magazine/cc337884.aspx</a><br /><br /><br />JAVA SERVER FACES<br />O Java Server Faces é um framework MVC para o desenvolvimento de <a title="Aplicações Web" href="http://pt.wikipedia.org/wiki/Aplica%C3%A7%C3%B5es_Web">aplicações Web</a>, que permite o desenvolvimento de aplicações para a internet tal como fazíamos com <a title="Delphi" href="http://pt.wikipedia.org/wiki/Delphi">Delphi</a> ou <a title="Visual Basic" href="http://pt.wikipedia.org/wiki/Visual_Basic">Visual Basic</a>, ou seja, arrastanto e soltando os componentes na tela (<a title="JSP" href="http://pt.wikipedia.org/wiki/JSP">JSP</a>), definindo propriedades dos mesmos.<br />TUTORIAL SOBRE O JAVA SERVER FACES<br /><a href="http://www.guj.com.br/content/articles/jsf/jsf.pdf">http://www.guj.com.br/content/articles/jsf/jsf.pdf</a><br /><br /><br />REFERÊNCIAS<br /><a href="http://pt.wikipedia.org/wiki/Apache_Struts">http://pt.wikipedia.org/wiki/Apache_Struts</a><br /><a href="http://www.linhadecodigo.com.br/Artigo.aspx?id=1602">http://www.linhadecodigo.com.br/Artigo.aspx?id=1602</a><br /><a href="http://www.javafree.org/javabb/viewtopic.jbb?t=8798">http://www.javafree.org/javabb/viewtopic.jbb?t=8798</a><br /><a href="http://www.javafree.org/wiki/WebWork">http://www.javafree.org/wiki/WebWork</a><br /><a href="http://akrabat.com/wp-content/uploads/iniciando-com-zend-framework_130.pdf">http://akrabat.com/wp-content/uploads/iniciando-com-zend-framework_130.pdf</a><br /><a href="http://pt.wikipedia.org/wiki/Zend_Framework">http://pt.wikipedia.org/wiki/Zend_Framework</a><br /><a href="http://www.javafree.org/javabb/viewtopic.jbb?t=853237">http://www.javafree.org/javabb/viewtopic.jbb?t=853237</a><br /><a href="http://msdn.microsoft.com/pt-br/magazine/cc337884.aspx">http://msdn.microsoft.com/pt-br/magazine/cc337884.aspx</a><br /><a href="https://saloon.inf.ufrgs.br/twiki-data/Disciplinas/CMP167/TF07RuthianoMunaretti/SlidesWebWork.pdf">https://saloon.inf.ufrgs.br/twiki-data/Disciplinas/CMP167/TF07RuthianoMunaretti/SlidesWebWork.pdf</a><br /><a href="http://www.marcelomx.com/2007/04/26/desenvolvendo-no-padrao-mvc-com-zend-framework/">http://www.marcelomx.com/2007/04/26/desenvolvendo-no-padrao-mvc-com-zend-framework/</a><br /><a href="http://www.numaboa.com/informatica/tutos/joomla/885-mvc">http://www.numaboa.com/informatica/tutos/joomla/885-mvc</a><br /><a href="http://www.guj.com.br/content/articles/jsf/jsf.pdf">http://www.guj.com.br/content/articles/jsf/jsf.pdf</a><br /><a href="http://www.javafree.org/javabb/viewtopic.jbb?t=11749">http://www.javafree.org/javabb/viewtopic.jbb?t=11749</a></p>Maikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.com0tag:blogger.com,1999:blog-2108088787404397036.post-80106778530985356882008-06-21T11:41:00.000-07:002008-06-21T14:56:50.834-07:00Padrões GOF (Padrão Command)<span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0); font-family: arial;">Aulas 22 e 23</span><br /><div style="font-family: arial;"><br />O objetivo do padrão command é encapsular uma requisição como um objeto permitindo que os clientes parametrizem diferentes requisições, filas ou fazer o registro de log de requisições e dar suporte operações que podem ser desfeitas.<br />Pra quem não está familiarizado com a maioria dos termos utilizados em java, ou nas linguagens orientada a objeto, vamos procurar entender da maneira mais simples. Encapsulamento para muitos se resume aos métodos get e set, que dá a idéia de proteger um objeto para que ele não seja acessado por qualquer um.<br />Mas a idéia transmitida pelo padrão command nada tem a ver com encapsulamento como proteção aos dados, mas sim com uma maneira de parametrizar as solicitações dos objetos de forma que estes não fiquem acoplados.<br />Um exemplo real do uso do padrão command pode ser visto na implementação de uma aplicação cliente/servidor onde geralmente temos o componente Menu que é composto de vários itens. Cada item do menu eqüivale uma operação, como salvar um arquivo, ler arquivo, apagar arquivo, selecionar a paleta de cores e etc.. Quando selecionamos um item do menu uma operação deve ser realizada. Esta operação pode ser encapsulada em um objeto, assim reduziremos o acoplamento entre o objeto menu e o objeto que executa a operação.<br />Quatro são os participantes na implementação do padrão command:<br />· Command: Classe abstrata ou interface para execuçãode uma operação.Deve implementar o método abstrato chamado execute.<br />· CommandAction: Classe concreta que implementa o método execute, ela deve ser uma subclasse se Command for uma classe abstrata, se Command for uma interface então ela deve realizar essa interface.<br />· Invoker: Objeto que faz uma requisição ao Command para que execute uma operação.<br />· Receiver: Objeto responsável por executar uma operação.<br />Abaixo seguem os diagramas de classe e de seqüência que explicam mais detalhadamente essa seqüência de mensagens.</div><br /><p style="font-family: arial;"><img id="BLOGGER_PHOTO_ID_5214407282884566098" style="margin: 0px auto 10px; display: block; text-align: center;" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5dPxtZbG48EBP-5O3WNZRW5uaVRo6Qn3wfsBW8Hijm6hz81WJdzRHay0yXvrQE13qVKZ0wOV7TUIeLwBocKj3NmjJNpVOc6L5aHHf3gUMjuQIZvqpk3QYFPugHryu0ExRl9Slg_Jt3YM/s400/11.bmp" border="0" width="254" height="156" />Em tempo de execução o objeto Invoker chama o método execute() do objeto Command que delega ao método action() do objeto receiver que executará a operação.</p><br /><p style="font-family: arial;"><img id="BLOGGER_PHOTO_ID_5214407577544409890" style="margin: 0px auto 10px; display: block; width: 214px; height: 159px; text-align: center;" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOrOuMkhBzZJsQyt1mA9kj-jCxc6mGl0ofyh7j37rd3zPdz6YuE-bSL5vKBrbTxdmeMCuFihqvZ1RaiMkreIegRhpq4V-j8IatSDEdyhICop0QcbsyncJOQeEZeoUmStzvKnw_-1dYAj0/s400/12.JPG" border="0" width="170" height="80" /><br /></p><span style="font-family: arial;">Link: </span><a style="font-family: arial;" href="http://tramos.railsplayground.net/assets/2008/5/17/Padrao_20Projeto_20Command.pdf">http://tramos.railsplayground.net/assets/2008/5/17/Padrao_20Projeto_20Command.pdf</a><br /><a style="font-family: arial;" href="http://pt.wikipedia.org/wiki/Command">http://pt.wikipedia.org/wiki/Command</a><br /><span style="font-family: arial;">http://www.dsc.ufcg.edu.br/~jacques/cursos/map/html/pat/command.htm</span><br /><div style="font-family: arial;"></div><br /><br /><div></div>Maikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.com0tag:blogger.com,1999:blog-2108088787404397036.post-5171262235115508772008-05-12T06:30:00.000-07:002008-05-12T06:43:11.178-07:00Padrões GOF (Padrão Oberver)<span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);font-family:arial;" >Aulas 20 e 21<br /><br /></span> <p class="MsoNormal" style="text-align: justify; text-indent: 63pt; color: rgb(102, 102, 102);"><span style=";font-family:Arial;" >Em um sistema orientado a objeto, o foco principal é a comunicação entre os objetos, e os padrões que já estudamos anteriormente tratam bem dessa questão, e não é diferente com o que vamos ver a seguir.<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 63pt; color: rgb(102, 102, 102);"><span style=";font-family:Arial;" >Geralmente, um objeto coleta informação de outro chamando seu método, no entanto, quando um objeto muda, os objetos clientes não têm como saber se aquele objeto mudou e assim o cliente pode deixar de utilizá-lo. O padrão Observer permite que objetos interessados (clientes), sejam avisados da mudança de estado ou evento ocorrendo em outro objeto. A intenção é definir uma dependência um-para-muitos, assim, quando um objeto mudar de estado, todos os seus dependentes sejam notificados e atualizados automaticamente.<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 63pt; color: rgb(102, 102, 102);"><span style=";font-family:Arial;" >Em java.swing o objeto que está sendo observado (aquele que pode mudar) é chamado de “Source”, e o objeto que observa (o objeto que está interessado, o cliente), é chamado de “Listener”.<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 63pt; color: rgb(102, 102, 102);"><span style=";font-family:Arial;" >Existem muitas controvérsias quanto ao uso deste padrão, principalmente entre as soluções dadas pelo GOF, baseada em java swing e as soluções apresentadas por autores que seguem a implementação em java, <st1:personname productid="em especial Bill Venners" st="on"><st1:personname productid="em especial Bill" st="on">em especial Bill</st1:personname> Venners</st1:personname>,<span style=""> </span>portanto, vale analisarmos as soluções da cada um para entendermos, no link a seguir, encontra-se um exemplo que segue o paradigma de Bill Venners, e no diagrama uml encontra-se as definições do GOF, onde o observer é o objeto que observa, e subject, aquele que é observado. <o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 63pt; color: rgb(102, 102, 102);"><span style="font-family:Arial;">Em Java, um objeto (o Source/Subject ) envia informação para outro objeto (o Listener/Observer) pela chamada de um método do Listener/Observer. Mas, para que isso seja possível:<o:p></o:p></span></p> <ul style="color: rgb(102, 102, 102);" type="disc"><ul type="circle"><li class="MsoNormal" style=""><span style="font-family:Arial;">O Source/Subject deve ter uma referência ao Listener/Observer.<o:p></o:p></span></li><li class="MsoNormal" style=""><span style="font-family:Arial;">O tipo desta referência deve ser uma classe ou interface que declare ou herde o método a chamar<o:p></o:p></span></li></ul></ul> <p class="MsoNormal" style="text-indent: 63pt; color: rgb(102, 102, 102);"><span style="font-family:Arial;">Fazer com que o tipo da referência seja a classe (concreta) do Listener/Observer não funciona bem, porque:<o:p></o:p></span></p> <ul style="color: rgb(102, 102, 102);" type="disc"><ul type="circle"><li class="MsoNormal" style=""><span style="font-family:Arial;">O número e tipos dos Listeners/Observer não é conhecido em tempo de compilação<o:p></o:p></span></li><li class="MsoNormal" style=""><span style="font-family:Arial;">Os vários listeners/Observers poderão não fazer parte de uma mesma hierarquia de objetos<o:p></o:p></span></li><li class="MsoNormal" style=""><span style="font-family:Arial;">Não queremos criar um acoplamento forte entre Source/Subject e Listeners/Observers.<o:p></o:p></span></li></ul></ul> <p class="MsoNormal" style="text-indent: 63pt; color: rgb(102, 102, 102);"><span style="font-family:Arial;">A solução vai se basear primordialmente em <em><span style="font-family:Arial;">interfaces</span></em> para resolver o problema<o:p></o:p></span></p> <ul style="color: rgb(102, 102, 102);" type="disc"><ul type="circle"><li class="MsoNormal" style="color:black;"><span style="color: rgb(102, 102, 102);font-family:Arial;" >Aliás, este é um <em><span style="font-family:Arial;">excelente </span></em>exemplo do poder de interfaces para prover polimorfismo envolvendo classes não relacionadas por herança (de implementação)</span><span style="font-family:Arial;"><o:p></o:p></span></li></ul></ul> <p class="MsoNormal" style="text-indent: 63pt;"><span style="font-family:Arial;"><span style="color: rgb(102, 102, 102);">A seguir temos um diagrama UML que demonstra a utilização de interfaces para servir como referência ao Source/Subject, ao invés da sua classe concreta.</span><span style="color:black;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="text-indent: 63pt;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpEvycL9U66SugjGy3TUsFYuCXytk-py2DBP8MlUR5XUCl8ifUYL0SrYTmp8xVrVCOsnqwA9mIiC4pio031PEa99kPGXrdtsMfIEhXBppgSOap3Y_LkAdqIJH4Rbp28cnYzd7ruAA8ohI/s1600-h/Padr%C3%A3oObserver.PNG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpEvycL9U66SugjGy3TUsFYuCXytk-py2DBP8MlUR5XUCl8ifUYL0SrYTmp8xVrVCOsnqwA9mIiC4pio031PEa99kPGXrdtsMfIEhXBppgSOap3Y_LkAdqIJH4Rbp28cnYzd7ruAA8ohI/s400/Padr%C3%A3oObserver.PNG" alt="" id="BLOGGER_PHOTO_ID_5199484119838901826" border="0" /></a></p> <div style="text-align: center;"><span style="font-weight: bold;font-family:arial;" >REFERÊNCIAS<br /><br /></span></div><br /><a style="font-family: arial; font-weight: bold;" href="http://www.dsc.ufcg.edu.br/%7Ejacques/cursos/map/html/arqu/observer.htm">UFCG, Artigo, Padrão Observer segundo Bill Venners</a>Maikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.com0tag:blogger.com,1999:blog-2108088787404397036.post-74356015629066309802008-04-30T08:14:00.000-07:002008-04-30T08:56:58.272-07:00Padrões GOF (Padrão Singleton)<span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);font-family:arial;" >Aulas 18 e 19<br /><br /></span> <p class="MsoNormal" style="text-align: justify; text-indent: 63pt; color: rgb(102, 102, 102);"><span style="font-family:Arial;">Quando falamos em java, vem logo a idéia de objetos que são criados a partir de instâncias de classes e de reutilizar essas classes para que sejam criados outros objetos quando não mais for necessários aqueles que estas classes criavam. Pois bem, podemos criar vários objetos a partir de instâncias de uma mesma classe, mas o que vamos ver nesse padrão, é totalmente ao contrário, ou seja, o padrão singleton, sugere que apenas uma instância da classe seja criada e garante que mais ninguém crie outra instância, mas em que casos precisaremos usar apenas uma instância de uma classe? Como disse Metsker em seu livro Padrões de Projeto em java, <span style=""> </span>“é mais fácil explicar como garantir que uma classe só tenha uma instância do que explicar por que nós podemos desejar essa restrição”, mas vamos tentar dar um exemplo para que não fique muito vaga essa idéia do singleton. Em uma aplicação que necessite de um <i style="">log de dados</i> (termo utilizado para descrever o processo de <a href="http://pt.wikipedia.org/wiki/Registro" title="Registro"><span style="text-decoration: none;">registro</span></a> de eventos relevantes num <a href="http://pt.wikipedia.org/wiki/Sistema_computacional" title="Sistema computacional"><span style="text-decoration: none;">sistema computacional</span></a>), pode-se implementar uma classe com o padrão singleton, desta forma existe apenas um objeto responsável pelo log em toda a aplicação que é acessível unicamente através da classe singleton.<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 63pt; color: rgb(102, 102, 102);"><span style="font-family:Arial;">Segundo Metsker, dispomos de várias maneiras para criar um singleton, todavia, o importante é garantir que outros desenvolvedores não criem novas instâncias da classe que queremos limitar, portanto, vamos à solução:<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 63pt;"><span style="font-family:Arial;"><span style="color: rgb(102, 102, 102);">É de conhecimento comum que, para criar uma instância de uma classe, devemos chamar o seu construtor, normalmente, esses construtores são públicos, m</span><span style="color:black;"><span style="color: rgb(102, 102, 102);">uitos desenvolvedores desconhecem, mas é possível criar um construtor privado, assim, a classe só pode ser instanciada dentro de algum dos seus próprios métodos.</span><o:p></o:p></span></span></p> <a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7IB6p2UW72X8j2edOuPlG7qv-rhlOrLr0JdwhUzOBR5up3wpUng0ukksUFwS5WvWBaMgRE1KxsvJ53hU9gmsbLthRPYCksFwNdPSqCTkc4FdhKJMHR9RgJWyGZhDrP00Xbpe6mZHT5Ho/s1600-h/singleton1.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7IB6p2UW72X8j2edOuPlG7qv-rhlOrLr0JdwhUzOBR5up3wpUng0ukksUFwS5WvWBaMgRE1KxsvJ53hU9gmsbLthRPYCksFwNdPSqCTkc4FdhKJMHR9RgJWyGZhDrP00Xbpe6mZHT5Ho/s400/singleton1.JPG" alt="" id="BLOGGER_PHOTO_ID_5195067309674769202" border="0" /></a><a style="color: rgb(102, 102, 102);" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3JJIvP7Kofw-kmsq5Ano10t_XJRKchVcvrhJc2t4p5HFhS8dSuLVv3eWy9-hUSJsaQvhuhP5-JY6_Pw-JmqBhoh3LdrxymSc7CVUEdHQQ_FxP7HNfeoI3ZVmjY3O0yw4I_UpYRhU7yX0/s1600-h/singleton1.JPG"></a> <p class="MsoNormal" style="text-align: justify; text-indent: 63pt;"><span style=";font-family:Arial;color:black;" ><span style="color: rgb(102, 102, 102);">Criada a classe com o método privado, agora temos que criar uma variável que armazene a instância dessa classe.</span><o:p></o:p></span></p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYDI22eTqeUmehipGixGzi0RbpcTALJlJinFeX0BYd8sbgZgQLNClnCUQufl5ALpChS2ia_wXqzoThZrHBuVdvD4H8UAJDb2slDtA8fFiPsh5ZXRCAJet0LaMv5Clw-aMCBHPLT6qHZIM/s1600-h/singleton2.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYDI22eTqeUmehipGixGzi0RbpcTALJlJinFeX0BYd8sbgZgQLNClnCUQufl5ALpChS2ia_wXqzoThZrHBuVdvD4H8UAJDb2slDtA8fFiPsh5ZXRCAJet0LaMv5Clw-aMCBHPLT6qHZIM/s400/singleton2.JPG" alt="" id="BLOGGER_PHOTO_ID_5195067429933853506" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoFfjUAzeAbDb2BIn24_W3361avJL30n9HmRKMhKzahKTLT0keDKSV7ioT6SoQw__9vqpzU7rfTQFrU2FbfiXPu8NygVIbWtCad_cH7vJQoqUqy6PsKtSVNxZDHVrwrRiVAW_poe33A9E/s1600-h/singleton2.JPG"></a> <p class="MsoNormal" style="text-align: justify; text-indent: 63pt;"><span style=";font-family:Arial;color:black;" ><span style="color: rgb(102, 102, 102);">Talvez você esteja se perguntando porque utilizar variável estática, simplesmente porque uma variável estática não perde o seu valor cada vez que ela for instanciada, assim, se a classe singleton for instanciada, o valor da instância permanecerá na variável e quando alguém tentar instanciá-la novamente, um método implementado para essa finalidade retornará aquele valor que já havia nela quando foi instanciada pela primeira vez (essa é a funcionalidade principal de um singleton).</span><o:p></o:p></span></p><p class="MsoNormal" style="text-align: justify; text-indent: 63pt;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWojVtFmytVdtt9z8dqNFun5hCgeMZvHbf3f6S7AW9m4I5aufCXiaA2WqtdM2mJ_o0elUnRcz6JJSbp5DO8_hDyncIdUns7x6vzM30Fk4itHKAJdOYSCiwS1DL2jY6OP76EC3TQS2M4D0/s1600-h/singleton3.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWojVtFmytVdtt9z8dqNFun5hCgeMZvHbf3f6S7AW9m4I5aufCXiaA2WqtdM2mJ_o0elUnRcz6JJSbp5DO8_hDyncIdUns7x6vzM30Fk4itHKAJdOYSCiwS1DL2jY6OP76EC3TQS2M4D0/s400/singleton3.JPG" alt="" id="BLOGGER_PHOTO_ID_5195067588847643474" border="0" /></a></p><p class="MsoNormal" style="text-align: justify; text-indent: 63pt; color: rgb(102, 102, 102);"><span style=";font-family:Arial;font-size:100%;" >Assim, com o código acima, ao instanciarmos os objetos m1 e m2, será retornado o mesmo valor para os dois.</span></p><p class="MsoNormal" style="text-align: justify; text-indent: 63pt;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYyJidR6JjtVpUoFMOIq9XAvPVQLfKqR4Nwk4K5nQTHWRQqT95nHAueI5LmB76nQ17roBE4GMgj9xXe552aPD9otoi-cDkMf9JoXrgIWlxMc_BfdAPctA5zmPw3u8O1ephUejgUh4Maqk/s1600-h/singleton4.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYyJidR6JjtVpUoFMOIq9XAvPVQLfKqR4Nwk4K5nQTHWRQqT95nHAueI5LmB76nQ17roBE4GMgj9xXe552aPD9otoi-cDkMf9JoXrgIWlxMc_BfdAPctA5zmPw3u8O1ephUejgUh4Maqk/s400/singleton4.JPG" alt="" id="BLOGGER_PHOTO_ID_5195067747761433442" border="0" /></a></p><p class="MsoNormal" style="text-align: justify; text-indent: 63pt; color: rgb(102, 102, 102);"><span style=";font-family:Arial;font-size:100%;" >Mas ainda há um pequeno problema quanto a esse código. Em ambientes multi-threaded, pode ocorrer de duas threads tentarem instanciar o objeto ao mesmo tempo, nesse caso, haverá um problema, provavelmente as duas conseguirão instanciar e serão criados dois objetos, o que fere a mecânica do singleton, uma solução para este problema seria utilizar o atributo syncronized no método getInstance(), este atributo garante a sincronização das threads que tentam instanciar a classe singleton, em outras palavras, garante que outra thread não possa acessar a classe até que a thread que a acessou pela primeira vez tenha terminado de fazê-lo.</span></p><p class="MsoNormal" style="text-align: justify; text-indent: 63pt;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWVJotfrKtg4B3TdZ7KpAy6NRZyyLPreKiXsP7A5RZ-ywZo9WX3Gt5PQ_cgvFhUrzic_wziIc0_dqqzwQag3D5OfTJ10VteeeUZmm_pLeOaBnc18w-iheUDSfEI0YriHXrLXdsTUYbRu4/s1600-h/singleton5.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWVJotfrKtg4B3TdZ7KpAy6NRZyyLPreKiXsP7A5RZ-ywZo9WX3Gt5PQ_cgvFhUrzic_wziIc0_dqqzwQag3D5OfTJ10VteeeUZmm_pLeOaBnc18w-iheUDSfEI0YriHXrLXdsTUYbRu4/s400/singleton5.JPG" alt="" id="BLOGGER_PHOTO_ID_5195067868020517746" border="0" /></a></p><p class="MsoNormal" style="text-align: justify; text-indent: 63pt; color: rgb(102, 102, 102);"><span style=";font-family:Arial;font-size:100%;" >O singleton é um dos padrões que não devem ser utilizados frequentemente, pois o uso abusivo de singletons leva a soluções onde a dependência entre objetos é muito forte, além do que, uma situação em que realmente é necessária apenas uma instância de uma classe é difícil.</span></p><p class="MsoNormal" style="text-align: justify; text-indent: 63pt;"><span style="font-size:100%;"><br /></span></p><p class="MsoNormal" style="text-align: center; text-indent: 63pt;"><span style=";font-family:Arial;font-size:12;color:black;" ><span style="font-weight: bold;font-size:100%;" >REFERÊNCIAS</span><br /></span></p><br /><a style="font-family: arial;" href="http://wmagician.wordpress.com/2008/01/02/padrao-singleton-em-java/">WMagician, Artigo, Padrão Singleton em Java</a><br /><br /><a style="font-family: arial;" href="http://www.macoratti.net/net_psgt.htm">Macoratti, José Carlos Macoratti, Artigo, O Padrão Singleton </a><br /><br /><a style="font-family: arial;" href="http://www.itmnetworks.com.br/suporte/manuais/php/language.variables.scope.html">Manual do PHP, Escopo de variáveis </a><br /><br /><a style="font-family: arial;" href="http://www.submarino.com.br/books_productdetails.asp?Query=ProductPage&ProdTypeId=1&ProdId=251853&ST=SR">Metsker, Steven John Metsker, Padrões de Projeto em Java </a>Maikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.com0tag:blogger.com,1999:blog-2108088787404397036.post-32632996077831116942008-04-21T19:30:00.000-07:002008-04-28T07:28:48.543-07:00Padrões GOF (Padrão Adapter)<span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);font-family:arial;" >Aula 17<br /><br /></span> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:Humanist521BT-Italic;"><span style="font-family:arial;">Como vamos utilizar a classificação de Metsker para nossos estudos sobre os padrões GOF, nesta postagem apresentaremos o padrão Adapter.</span> <o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:Arial;">O principal objetivo do <em><span style="font-family:Arial;">Adapter</span></em> é facilitar a conversão da <em><span style="font-family:Arial;">interface</span></em> de uma classe para outra interface mais interessante para o cliente, fazendo com que várias classes possam trabalhar em conjunto independentemente das <em><span style="font-family:Arial;">interfaces</span></em> originais. O Adapter é utilizado quando uma classe já existente e sua interface não combinam com a esperada pelo cliente ou se deseja-se criar uma classe reutilizável que coopera <span style=""> </span>com classes não relacionadas ou não previstas, ou seja, classes q não necessariamente tenham interfaces compatíveis, entre outras utilizações.<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:Arial;">O padrão Adapter tem finalidade estrutural e abrange tanto escopo de classe quanto de objeto, por isso existe o adaptador de classe e o adaptador de objetos, o primeiro é utilizado quando o alvo é uma interface, consequentemente usa herança múltipla, o segundo é utilizado quando o alvo é uma classe e faz uso da agregação.<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:Arial;">Imagine que utilizamos uma classe utilitária de um framework especializado em métodos para programadores iniciantes, nesta classe existe um método que será depreciado no futuro (sem utilização), ou seja, digamos que novas versões da classe sejam lançadas e o método tenha sido retirado definitivamente, como poderemos utilizar a nova versão da classe em nossa aplicação que utiliza a versão antiga do método? Se apenas substituirmos a classe, será disparado um erro afirmando que está sendo feita uma chamada que não existe.</span></p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"> </p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:Arial;">È aí que entra o padrão adapter, com duas formas para resolver esse problema:<o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 54pt; text-align: justify; text-indent: 45pt;"><span style="font-family:Arial;">1. Criamos uma classe intermediária que servirá como interface entre as chamadas de código cliente e o código da classe, essa nova classe trabalhará basicamente como um filtro entre essas chamadas, o que caracteriza um adaptador de objetos, utilizando agregação.<o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 54pt; text-align: justify; text-indent: 45pt;"><span style="font-family:Arial;">2. Criamos uma classe que herdará da antiga e sobrescrevemos ou recriamos o método chamado, caracterizando dessa forma um adaptador de classes, utilizando herança.<o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 54pt; text-align: justify; text-indent: 45pt;"><span style="font-family:Arial;">A escolha da forma de implementação do adapter é uma decisão do arquiteto de software e dependerá do contexto da aplicação.</span><span style=";font-family:Arial;font-size:100%;" >Utilizaremos aqui a 1ª opção.</span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:Arial;">Vamos ao exemplo prático:<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:Arial;">Imagine que você esteja aprendendo java e já sabe alguns padrões de projeto, então você é um programador iniciante, teremos então a classe INICIANTE.<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijfESYXBhWUcQSruGgrATmYwez7fPbbVAaHjtOIe-yahbFaSTQpBEgJo9Bvg69KOtVtwIW_8UO-zbI6kICXTMTJ0ia015-CFosh5xpkjG_hgoqlZ-aNWPemPcsNAIR26I3xfhmvs3fjtM/s1600-h/Iniciante.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijfESYXBhWUcQSruGgrATmYwez7fPbbVAaHjtOIe-yahbFaSTQpBEgJo9Bvg69KOtVtwIW_8UO-zbI6kICXTMTJ0ia015-CFosh5xpkjG_hgoqlZ-aNWPemPcsNAIR26I3xfhmvs3fjtM/s400/Iniciante.JPG" alt="" id="BLOGGER_PHOTO_ID_5191895671143378706" border="0" /></a><span style=";font-family:Arial;font-size:12;" ></span></p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style=";font-family:Arial;font-size:100%;" >Esta classe utiliza dois métodos, SlaverJava() que representa apenas os conhecimentos que você tem sobre java e Padrões() que representa os conhecimentos que você tem sobre Padrões.</span></p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"> </p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:Arial;">Suponhamos que daqui um tempo você adquira mais conhecimentos em java, então o método SlaverJava() não terá utilização, além da necessidade de implementar um novo método na classe. Como mencionado anteriormente, se apenas substituirmos a classe, será disparado um erro ao ser feita qualquer chamada para os métodos dessa classe.<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:Arial;">A solução seria criar uma nova classe adaptadora contendo uma chamada para uma outra classe que contém o novo método, servindo como interface entre as chamadas de código cliente para os métodos da classe Iniciante, implementando essas chamadas na nova classe.<o:p></o:p></span></p><span style=";font-family:Arial;font-size:100%;" ></span><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:Arial;">Criamos então uma nova classe chamada programadorMédio, que seria a nova versão da classe Iniciante, se essa classe apenas herdasse da classe iniciante e reescrevesse esse novos métodos, não seria caracterizado a utilização do padrão adapter e sim uma simples herança. Sendo assim, vamos implementar a classe programadorMedio como uma interface<span style=""> </span>contendo apenas o novo método que irá substituir o SlaverJava. <o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjISMub-P5vGIykCg7UZNInI1zkTqg9SfXKIVngXdYbzstBQ0XPNLZTMPfGOP6THVg9soZ_Df9jTHxfJW9SrxTkF095-CRhjdHNJs0m5leTs6JkgWw_e4OsBKUBWZ7F1j61r6HOKy7qxHM/s1600-h/metodoconversor.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjISMub-P5vGIykCg7UZNInI1zkTqg9SfXKIVngXdYbzstBQ0XPNLZTMPfGOP6THVg9soZ_Df9jTHxfJW9SrxTkF095-CRhjdHNJs0m5leTs6JkgWw_e4OsBKUBWZ7F1j61r6HOKy7qxHM/s400/metodoconversor.JPG" alt="" id="BLOGGER_PHOTO_ID_5194300305825114786" border="0" /></a><span style=";font-family:Arial;font-size:12;" ></span></p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style=";font-family:Arial;font-size:100%;" >Criamos então a classe adaptadora, chamada IntermediarioAdapter que herda da classe Iniciante, reescreve o novo método e implementa na classe programadorMedio.</span></p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhwAo-FSKZbuDcT2-jFt4nd0LCtADigIHbZGDxZ9wvJUI0juzbwlkFJVlprfP5bIm0-63QXVF_GWxUsugENCgGmVSA7Jel76Al9E8OqnNhDNljUgn7v1wGaVWcE4b22oLkOAPdl5mn9E8/s1600-h/adaptador.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhwAo-FSKZbuDcT2-jFt4nd0LCtADigIHbZGDxZ9wvJUI0juzbwlkFJVlprfP5bIm0-63QXVF_GWxUsugENCgGmVSA7Jel76Al9E8OqnNhDNljUgn7v1wGaVWcE4b22oLkOAPdl5mn9E8/s400/adaptador.JPG" alt="" id="BLOGGER_PHOTO_ID_5194301564250532530" border="0" /></a><br /><span style=";font-family:Arial;font-size:12;" ></span></p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style=";font-family:Arial;font-size:100%;" >Com isso finalizamos o padrão adapter, um exemplo bem simples mas que explica bem o conceito principal deste padrão.</span></p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-size:100%;"><br /></span></p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style=";font-family:Arial;font-size:12;" ></span><br /><span style="font-family:Arial;"><o:p></o:p></span></p><p class="MsoNormal" style="text-align: justify; font-style: italic; font-weight: bold;font-family:arial;"><span style="font-size:85%;"><a href="http://www.arquivoweb.net/arquivo.php?id=6139146">Download do aplicativo no Netbeans</a></span></p><br /><div style="text-align: center;"><span style="font-weight: bold;font-family:arial;" >REFERÊNCIAS<br /><br /></span></div><p class="MsoNormal" style="text-align: justify; font-style: italic; font-weight: bold;font-family:arial;"><span style="font-size:85%;"><a href="http://www.pg.cefetpr.br/coinf/simone/patterns/adapter.php">CEFET-PARANÁ, Padrões de Projeto, ARTIGO</a></span></p><p class="MsoNormal" style="text-align: justify; font-style: italic; font-weight: bold;font-family:arial;"><span style="font-size:85%;"><a href="http://imasters.uol.com.br/artigo/7995/php/padroes_de_projeto_-_adapter/imprimir/">Èrico Almeida, IMASTERS fórum, Padrões de Projeto-Adapter</a></span></p><p style="font-weight: bold;"><span style="font-size:85%;"><a class="MsoNormal" style="text-align: justify; font-family: arial;"> Steven John Metsker, Design Patterns Java Workbook.Addison-Wesley, 2002</a></span></p>Maikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.com3tag:blogger.com,1999:blog-2108088787404397036.post-61067624244792614632008-04-21T08:48:00.000-07:002008-04-21T21:34:40.724-07:00Introdução a Padrões GOF<span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);font-family:arial;" >Aula 16<br /><br /></span> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:Arial;">Nos artigos anteriores vimos alguns dos padrões GRASP, suas finalidades, alguns exemplos de aplicação e com isso, conhecemos a importância desses padrões para um projeto de software de qualidade.<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:Arial;">Nas próximas postagens, veremos alguns dos padrões GOF, mas antes, um breve resumo dos criadores dos padrões GRASP e GOF:<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:Arial;">Como já sabemos, o conceito de padrões foi criado pelo arquiteto Christopher Alexander (<cite><span style="font-style: normal;font-family:Arial;" >Christopher Alexander. </span></cite><cite><span style="font-family:Arial;">A Pattern Language</span></cite><cite><span style="font-style: normal;font-family:Arial;" >. Estados Unidos da América: </span></cite><cite><span style="font-family:Arial;">Oxford University Press</span></cite><cite><span style="font-style: normal;font-family:Arial;" >, 1977), a partir dos conceitos criados por Alexander, os programadores Kent Beck e Ward Cunningham, propuseram os primeiros padrões para a área de ciência da computação, mas foi com o lançamento do livro Design Patterns, Elements of Reusable Object-Oriented Sofware</span></cite><span style="text-decoration: underline;"><span style="font-style: italic;"></span></span>, cujos autores são </span><span style="font-family:Arial;"><a href="http://pt.wikipedia.org/wiki/Erich_Gamma" title="Erich Gamma"><span style="text-decoration: none; color: rgb(0, 0, 0);">Erich Gamma</span></a>, <a href="http://pt.wikipedia.org/wiki/Richard_Helm" title="Richard Helm"><span style="text-decoration: none; color: rgb(0, 0, 0);">Richard Helm</span></a>, <a href="http://pt.wikipedia.org/wiki/Ralph_Johnson" title="Ralph Johnson"><span style="text-decoration: none; color: rgb(0, 0, 0);">Ralph Johnson</span></a> e <a href="http://pt.wikipedia.org/wiki/John_Vlissides" title="John Vlissides"><span style="text-decoration: none; color: rgb(0, 0, 0);">John Vlissides</span></a></span>, <span style="font-family:Arial;">conhecidos como a "Gangue dos Quatro" (<i style="">Gang of Four ou </i><b style="">GOF</b>), que o movimento ao redor de padrões de projeto ganhou popularidade.</span> <span style="font-family:Arial;">Posteriormente, vários outros livros do estilo foram publicados, como <i>Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development</i>, que introduziu um conjunto de padrões conhecidos como <b>GRASP</b> (<i>General Responsibility Assignment Software Patterns</i>).<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:Arial;">Nos artigos publicados, conhecemos os padrões GRASP, mas como visto no parágrafo anterior, o primeiro conjunto de padrões a surgir foram os padrões GOF. Existem várias formas de classificar os padrões GOF, por exemplo, em GAMMA(2000), são apresentados 23 padrões classificados em 3 categorias: Criacional, Estrutural e Comportamental, já em METSKER(2004), são apresentados diversos padrões, os quais são classificados em Interfaces, Responsabilidades, Construções, Operações e Extensões.</span></p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"> </p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:Arial;">Abaixo temos uma ilustração dessas classificações:</span></p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5igQUyYo8hZ6jrOukhDNw1tYEQ3ohFeAcz9HMYhzRc5-XD63PdogS4l5oCQoH7jwlAHdZfvc-gGjsMSC1GAlileAtW9GnwCLPitd0Sem60IrMCR6wkkpxKD3InFQ9UptI3xMxgTj7MzQ/s1600-h/imagem.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 404px; height: 299px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5igQUyYo8hZ6jrOukhDNw1tYEQ3ohFeAcz9HMYhzRc5-XD63PdogS4l5oCQoH7jwlAHdZfvc-gGjsMSC1GAlileAtW9GnwCLPitd0Sem60IrMCR6wkkpxKD3InFQ9UptI3xMxgTj7MzQ/s400/imagem.JPG" alt="" id="BLOGGER_PHOTO_ID_5191728015708426386" border="0" /></a><br /><span style="font-family:Arial;"><o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzeGG7mlySojgMPGkh58bgbus4rfXwgdMP0CgV2qjyudAdYiSHM5juXxz3yucWBxD3E6ZJQOa1ZSNJdpyWrQPYvJoiJwDMCOVTsZp7Y3mu-mugegmfr2-DljN3hBWD_IeJTd4MPrKWyaU/s1600-h/imagem1.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzeGG7mlySojgMPGkh58bgbus4rfXwgdMP0CgV2qjyudAdYiSHM5juXxz3yucWBxD3E6ZJQOa1ZSNJdpyWrQPYvJoiJwDMCOVTsZp7Y3mu-mugegmfr2-DljN3hBWD_IeJTd4MPrKWyaU/s400/imagem1.JPG" alt="" id="BLOGGER_PHOTO_ID_5191728170327249058" border="0" /></a> </p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:Arial;">Não entraremos em detalhes sobre todos esses padrões, mas ao longo das próximas postagens, veremos os mais importantes, bem como suas caracterizações e aplicações. Por hora vamos descrever alguns dos problemas mais comuns em um projeto OO, e como esses padrões podem ajudar a resolvê-los.<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 72pt;"><b style=""><i style=""><span style="font-family:Arial;">Problema I:</span></i></b><span style="font-family:Arial;"> <span style="font-style: italic;">Como descobrir e quais os objetos mais apropriados?</span><o:p></o:p><span style="font-style: italic;"><br />Design patterns ajudam a identificar as abstrações menos óbvias e objetos que podem representá-las.</span><o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 72pt; font-style: italic;"><b style=""><i style=""><span style="font-family:Arial;">Problema II:</span></i></b><span style="font-family:Arial;"> Qual a granularidade ideal para um sistema?<o:p></o:p><br />Design patterns oferecem várias soluções como por exemplo: <span style="color:black;">Façade descreve como representar subsistemas inteiros como um único objeto, Flyweight descreve como suportar grandes quantidades de objetos nas menores granularidades, Abstract Factory, Builder, Visitor e Command limitam a responsabilidade de objetos.</span></span></p><p class="MsoNormal" style="text-align: justify; text-indent: 72pt; font-style: italic;"> </p><p class="MsoNormal" style="text-align: justify; text-indent: 72pt;"><b style=""><i><span style=";font-family:Arial;color:black;" >Problema III:</span></i></b><span style=";font-family:Arial;color:black;" ><span style="font-style: italic;">Como especificar interfaces?</span><o:p></o:p></span><span style="font-style: italic;font-family:arial;" ><br />Design patterns ajudam a definir interfaces ao identificar seus elementos-chave e tipos de dados que são passados</span><span style="font-style: italic;font-family:arial;" >.</span><o:p></o:p></p><span style="color:black;"></span> <p class="MsoNormal" style="text-align: justify; text-indent: 72pt;"><b style=""><i><span style=";font-family:Arial;color:black;" >Problema IV:</span></i></b><span style="font-family:Humanist521BT-Italic;"> <span style="font-family: arial; font-style: italic;">Como especificar implementações?</span><o:p></o:p><br /><span style="font-style: italic;font-family:arial;" >Design patterns oferecem formas de instanciar classes concretas em outras partes do sistema.</span></span></p><p class="MsoNormal" style="text-align: justify; text-indent: 72pt;"> </p><p class="MsoNormal" style="text-align: justify; text-indent: 72pt;"> </p><p class="MsoNormal" style="text-align: justify; text-indent: 72pt;"><b style="font-family: arial;"><i>Problema V:</i></b><span style="font-family:Humanist521BT-Italic;"><span style="font-style: italic;font-family:arial;" > </span><span style="font-style: italic;font-family:arial;" >Como fazer o reuso funcionar?</span><span style="font-style: italic;font-family:arial;" ><br />Design patterns usam delegação para tornar a composição tão poderosa para reuso quando a herança.</span></span></p><p class="MsoNormal" style="text-align: justify; text-indent: 72pt;"> </p><p class="MsoNormal" style="text-align: justify; text-indent: 72pt; font-family: arial; font-style: italic;"><span style="font-size:100%;"><b face="arial">Problema VI:</b></span><span style=";font-family:arial;font-size:100%;" > como distinguir estruturas estáticas (compile-time) e dinâmicas (run-time)?</span><br />Vários design patterns capturam a distinção entre estruturas run-time e compile-time.</p><p class="MsoNormal" face="arial" style="text-align: justify; text-indent: 72pt;"> </p> <p class="MsoNormal" face="arial" style="text-align: justify; text-indent: 72pt;"> </p><p class="MsoNormal" style="text-align: justify; text-indent: 72pt; font-style: italic; font-family: arial;"><b style="font-family: arial;">Problema VII:</b><span style="font-family:Humanist521BT-Italic;"><span style="font-family:arial;"> como antecipar mudanças?</span><o:p></o:p></span><br />Padrões promovem desacoplamento e permitem que algum aspecto da estrutura do sistema varie independentemente de outros aspectos.</p><p class="MsoNormal" style="text-align: justify; text-indent: 72pt; font-style: italic; font-family: arial;"> </p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"> </p><p class="MsoNormal" face="arial" style="text-align: justify; text-indent: 72pt;"> </p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family: Humanist521BT-Italic;"><span style="font-family: arial;">Em meio a uma certa quantidade de padrões, os mais inexperientes podem ficar um pouco perdidos na hora de escolher qual padrão utilizar em determinada situação, aqui vai algumas dicas de como selecionar esses padrões.</span><o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; font-family: arial;"><span style="color: red;">1. </span><span style="color: black;">Considere como os padrões solucionam os problemas de projeto<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; font-family: arial;"><span style="color: red;">2. </span><span style="color: black;">Analise seu problema e compare com o objetivo de cada padrão<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; font-family: arial;"><span style="color: red;">3. </span><span style="color: black;">Veja como os padrões envolvidos se relacionam entre si<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; font-family: arial;"><span style="color: red;">4. </span><span style="color: black;">Estude padrões de propósito ou intenção similar (veja formas de classificação)<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; font-family: arial;"><span style="color: red;">5. </span><span style="color: black;">Examine causas comuns que podem forçar o redesign do seu sistema<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; font-family: arial;"><span style="color: red;">6. </span><span style="color: black;">Considere o que deve variar no seu design<o:p></o:p></span></p> <br /><br /><br /><div style="text-align: center;"><span style="font-weight: bold; font-style: italic;font-family:arial;" >REFERÊNCIAS:</span><br /></div><br /><br /><p class="MsoNormal" style="text-align: justify; font-family: arial;"><a href="http://www.md.utfpr.edu.br/martins/hp_martins_arquivos/Padroes/J930_01%20-%20Introducao.pdf">UNIVERSIDADE TECNOLÓGICA DO PARANÁ, Introdução a Padrões de Projeto</a></p><br /><p class="MsoNormal" style="text-align: justify; font-family: arial;"><a href="http://www.ulbra-to.br/ensino/43020/artigos/relatorios2004-2/Arquivos/RicardoIshibashi_Estagio.pdf">RICARDO ISHIBASHI MOREIRA DE ALMEIDA, Utilização de padrões de projeto no desevolvimento de aplicações web com PHP 5</a></p><br /><p class="MsoNormal" style="text-align: justify; font-family: arial;"><a href="http://pt.wikipedia.org/wiki/Padr%C3%B5es_de_projeto_de_software#cite_note-0">WIKIPÉDIA, Padrões de projeto de software</a></p>Maikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.com0tag:blogger.com,1999:blog-2108088787404397036.post-76990389202076668902008-04-01T19:46:00.000-07:002008-04-01T19:48:23.677-07:00Padrão controlador<span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);">aula 15</span> <span style="font-style: italic; color: rgb(255, 0, 0);">(breve resumo, sujeito a modificações)<br /><br /><br /></span> <p class="MsoNormal" style="text-align: justify; text-indent: 63pt;"><span style="font-family:Arial;">Um evento de entrada de um sistema é um evento gerado por um ator externo. Ele está associado com operações do sistema, operações do sistema em resposta a eventos do sistema, da mesma forma que os métodos e as mensagens estão relacionados. O padrão responsável por tratar os eventos do sistema é chamado de padrão controlador.<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 63pt;"><span style="font-family:Arial;">Por exemplo, qualquer usuário de um sistema que pressione algum botão, como por exemplo o botão fechar de algum programa, ele está disparando um evento do sistema que indica que o programa está sendo encerrado.<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 63pt;"><span style="font-family:Arial;">A primeira categoria de controlador é um controlador fachada (facade) que representa todo o sistema, o dispositivo ou o subsistema. A idéia é escolher uma classe cujo nome sugira uma cobertura, ou fachada, sobre as outras camadas da aplicação e que seja o ponto principal para as chamadas provenientes de interface com usuário para as camadas abaixo. Os controladores fachada são adequados quando não existem muitos eventos de sistema, ou quando não é possível, para a interface de usuário, redirecionar mensagens de eventos de sistema para controladores alternativos.<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 63pt;"><span style="font-family:Arial;">Quando o controlador fachada começa a levar o projeto a ficar com baixa coesão e alto acoplamento, o que ocorre quando o controlador começa a ficar “inchado”, com excesso de responsabilidades, é ideal utilizar um controlador para cada caso de uso do sistema. Um controlador de caso de uso é uma boa escolha quando existem muitos eventos de sistema com diferentes processos, ele fatora o seu tratamento em classes separadas administráveis e também fornece uma base para conhecer o estado do cenário do processo em andamento.<o:p></o:p></span></p>Maikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.com1tag:blogger.com,1999:blog-2108088787404397036.post-88328199031022827032008-04-01T08:07:00.000-07:002008-04-01T08:14:20.807-07:00Padrão Alta Coesão<span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);">Aula 14<br /><br /><br /></span> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:Arial;">Veremos agora um padrão que muito se parece com o estudado anteriormente, com a diferença que este mede o quão estão relacionadas as responsabilidades de uma classe enquanto que o outro foca a medida do quanto um elemento está conectado, tem conhecimento ou depende de outros elementos. O resultado é praticamente o mesmo, tanto que ao se aplicar um deles,<span style=""> </span>consequentemente estará aplicando o outro, são raros os casos em que isso não acontece.<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:Arial;">Ao estudarmos o padrão baixa coesão, surge um pouco dos conceitos que também já estudamos nas primeiras postagens, por exemplo:<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:Arial;">Uma classe com baixa coesão faz muitas coisas não relacionadas ou executa muitas tarefas. Uma classe que executa muitas tarefas não possui a aplicação do padrão especialista, pois, não há delegação de responsabilidades, bem como tarefas que não são adequadas a ela. Classes com múltiplas responsabilidades ou com alta granularidade estão propensas a ter uma alta coesão.<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:Arial;">Assim como o baixo acoplamento, a alta coesão é um dos princípios que devem ser levados em consideração ao se construir um projeto.<o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:Arial;">Da mesma maneira que o baixo acoplamento, a alta coesão também é dividida em tipos:<o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 96pt; text-align: justify; text-indent: -18pt;"><!--[if !supportLists]--><span style="font-weight: bold; font-style: italic;font-family:Wingdings;" ><span style="">Ø<span style=";font-family:";font-size:7;" > </span></span></span><!--[endif]--><span style="font-family:Arial;"><span style="font-weight: bold; font-style: italic;">Coesão coincidental: </span>o pior tipo de coesão, há nenhuma ou pouca relação construtiva entre os elementos de um módulo, em outras palavras é uma classe inchada, com um punhado de métodos, todos executando tarefas diferentes, sem nenhuma relação com a classe que os implementa.<o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 96pt; text-align: justify; text-indent: -18pt;"><!--[if !supportLists]--><span style="font-weight: bold; font-style: italic;font-family:Wingdings;" ><span style="">Ø<span style=";font-family:";font-size:7;" > </span></span></span><!--[endif]--><span style="font-family:Arial;"><span style="font-weight: bold; font-style: italic;">Coesão lógica:</span> melhor do que a coincidental mas não menos pior<span style=""> </span>em um projeto, semelhante ao acoplamento de controle, onde um módulo faz um conjunto de funções relacionadas e uma das quais é escolhida através de um parâmetro para controlá-lo.<o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 96pt; text-align: justify; text-indent: -18pt;"><!--[if !supportLists]--><span style="font-style: italic; font-weight: bold;font-family:Wingdings;" ><span style="">Ø<span style=";font-family:";font-size:7;" > </span></span></span><!--[endif]--><span style="font-family:Arial;"><span style="font-style: italic; font-weight: bold;">Coesão temporal:</span> os elementos estão agrupados no mesmo módulo simplesmente porque são processados no mesmo intervalo de tempo, semelhante aos arquivos .ini do windows xp, ao iniciar o xp esses arquivos são carregados para iniciar serviços ou aplicativos.<o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 96pt; text-align: justify; text-indent: -18pt;"><!--[if !supportLists]--><span style="font-style: italic; font-weight: bold;font-family:Wingdings;" ><span style="">Ø<span style=";font-family:";font-size:7;" > </span></span></span><!--[endif]--><span style="font-family:Arial;"><span style="font-style: italic; font-weight: bold;">Coesão procedural: </span>o módulo só tem sentido sobre a aplicação associada, sem ela, há dificuldade em entendê-lo, basicamente é a coesão relacionada aos procedimentos executados pelos elementos do módulo.<o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 96pt; text-align: justify; text-indent: -18pt;"><!--[if !supportLists]--><span style="font-style: italic; font-weight: bold;font-family:Wingdings;" ><span style="">Ø<span style=";font-family:";font-size:7;" > </span></span></span><!--[endif]--><span style="font-family:Arial;"><span style="font-style: italic; font-weight: bold;">Coesão de comunicação: </span>um módulo tem coesão de comunicação se os seus elementos usam a mesma entrada ou a mesma saída.<o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 96pt; text-align: justify; text-indent: -18pt;"><!--[if !supportLists]--><span style="font-style: italic; font-weight: bold;font-family:Wingdings;" ><span style="">Ø<span style=";font-family:";font-size:7;" > </span></span></span><!--[endif]--><span style="font-family:Arial;"><span style="font-style: italic; font-weight: bold;">Coesão seqüencial:</span> a saída de um elemento é a entrada de outro e a solução é decompor em módulos menores, isso nós já vimos em tópicos passados, chamado também de acoplamento de dados.<o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 96pt; text-align: justify; text-indent: -18pt;"><!--[if !supportLists]--><span style="font-style: italic; font-weight: bold;font-family:Wingdings;" ><span style="">Ø<span style=";font-family:";font-size:7;" > </span></span></span><!--[endif]--><span style="font-family:Arial;"><span style="font-style: italic; font-weight: bold;">Coesão funcional:</span> Um módulo funcionalmente coeso contém todos os elementos e apenas aqueles necessários para realizar uma única tarefa bem definida. <o:p></o:p></span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 135pt;"><!--[if !supportLists]--><span style=";font-family:";" ><span style="">o<span style=";font-family:";font-size:7;" > </span></span></span><!--[endif]--><span style="font-family:Arial;"><span style="font-style: italic;">Exemplos:</span><o:p></o:p><br />- calcular raiz quadrada;<o:p></o:p><br />- ler registo;<o:p></o:p><br />- determinar salário líquido de um empregado;<o:p></o:p><br />- calcular o ponto de impacto de um míssil.<o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 96.6pt; text-align: justify;"><span style="font-family:Arial;">Um módulo não será funcionalmente coeso se, para descrever sua função for necessário um, ou mais, dos seguintes items:</span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 135pt;"><span style="font-family:Arial;"><br />- Frase composta;<o:p></o:p><br />- Mais do que uma frase;<o:p></o:p><br />- Palavras que indiciam uma ligação temporal;<o:p></o:p><br />- Falta de um objectivo específico simples;<o:p></o:p><br />- Verbo ambíguo.<o:p></o:p></span></p>Maikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.com0tag:blogger.com,1999:blog-2108088787404397036.post-1144168967807167622008-03-24T07:26:00.000-07:002008-03-24T07:41:09.288-07:00Padrão Baixo Acoplamento<span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);">Aulas 12 e 13<br /><br /><br /></span><span style="font-weight: bold; color: rgb(153, 153, 153);"><span style="color: rgb(0, 0, 0);font-family:arial;" ><span style="font-family:arial;">Acoplamento de Controle</span></span></span><span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);font-family:arial;" ><span style="font-style: italic;"><span style="font-weight: bold;"><br /><br /></span></span></span></span> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Anteriormente discutimos o acoplamento de dados, o menos pior dos acoplamentos, foi explicado que a melhor solução para diminuir este tipo de acoplamento é o uso de interface, aliás, para diminuição de todos os tipos de acoplamento o melhor caminho é o uso de interface. No acoplamento de dados, como o próprio nome já diz é aquele em que um objeto conhece muito os dados de outro, no próximo tipo que iremos discutir, chamado acoplamento de controle, não existe este conhecimento, mas sim, um certo controle de um certo objeto sobre o outro, explicando melhor:</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Objeto A manda uma mensagem a objeto B;</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Objeto B usa um parâmetro da mensagem para decidir o que fazer;</p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;"><br /></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Exemplo:</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Considere a classe Circuito como objeto A e classe Lâmpada como o objeto B:</p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNdKMldtXDuF18TPt05GCx1ImkbPEKLBWcMCz9VD19UqreorL9TATmojxq_PIwX3wzcsWI1GR_tkpHAv9u7pkH5H6lSfMLlyHJyYf0WWyHSWZd1BL-cPcmrf6pgl_kWrZsgBKOgi2OFMA/s1600-h/classe1.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNdKMldtXDuF18TPt05GCx1ImkbPEKLBWcMCz9VD19UqreorL9TATmojxq_PIwX3wzcsWI1GR_tkpHAv9u7pkH5H6lSfMLlyHJyYf0WWyHSWZd1BL-cPcmrf6pgl_kWrZsgBKOgi2OFMA/s320/classe1.JPG" alt="" id="BLOGGER_PHOTO_ID_5181315397148618978" border="0" /></a></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">O objeto circuito instancia a classe lâmpada, e passa os parâmetros desligada, ligada e piscando, a classe lâmpada então atribui um valor a cada parâmetro e executa a o procedimento para conhecer o estado da lâmpada.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5hNW00U9O0dXZ3erJFCftAE9PqtsrbTSrTEHkHFmlJCUrY95e-FQ9lUOWMDVvrKuHzZBycGTttXn4vb7cVUkbYvDJebxuuIrDM6hkVyv5DgX-IrCZ6NdltAufiyP3uhCsTv_te3BSjWw/s1600-h/classe2.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5hNW00U9O0dXZ3erJFCftAE9PqtsrbTSrTEHkHFmlJCUrY95e-FQ9lUOWMDVvrKuHzZBycGTttXn4vb7cVUkbYvDJebxuuIrDM6hkVyv5DgX-IrCZ6NdltAufiyP3uhCsTv_te3BSjWw/s320/classe2.JPG" alt="" id="BLOGGER_PHOTO_ID_5181315607602016498" border="0" /></a></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Problema: em termos mais diretos, quem comanda o interruptor? Claro que a classe circuito, mas qual o problema nisso? Afinal, alguém tem que fazer isso. O problema não é alguém fazer, mas a forma como é feito, se ao invés da classe circuito mandar uma mensagem passando um parâmetro para desligar a lâmpada, somente passasse uma mensagem para desligá-la e a classe responsável executasse o procedimento, da maneira que lhe fosse convincente, seria muito mais prudente, afinal as duas não precisariam andar sempre de mãos dadas, característica do alto acoplamento.</p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoMS5aeJHDKKbBYY1QNfUjeigBHZnL6SCUC1FciBo-xsF0hZwD7gBUTR-VticgxgR9b9p-1D3RN9li0-BOh6KO5c7nTlVDRwFjulQZ8MbT9pZAErU0lXEd5Z-zYEciCl86ID_BxxuEiqI/s1600-h/classe3.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoMS5aeJHDKKbBYY1QNfUjeigBHZnL6SCUC1FciBo-xsF0hZwD7gBUTR-VticgxgR9b9p-1D3RN9li0-BOh6KO5c7nTlVDRwFjulQZ8MbT9pZAErU0lXEd5Z-zYEciCl86ID_BxxuEiqI/s320/classe3.JPG" alt="" id="BLOGGER_PHOTO_ID_5181315891069858050" border="0" /></a></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Como no exemplo acima, a classe circuito cria um novo objeto de lâmpada e ao invés de passar parâmetros, cria métodos para passar mensagens.</p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4HyrqUUc_jwykn45kvBsWBz2qvZphK6nK_UbnOg61GCQklhzfW5OISha-ugHet4FpezABDI1nq-sbX5t3aGU3JFxnSiqqP3Wk6uCskaARRUHlogkt4M_UZT3a4s7oJW3ogvTlKOYIx_Y/s1600-h/classe4.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4HyrqUUc_jwykn45kvBsWBz2qvZphK6nK_UbnOg61GCQklhzfW5OISha-ugHet4FpezABDI1nq-sbX5t3aGU3JFxnSiqqP3Wk6uCskaARRUHlogkt4M_UZT3a4s7oJW3ogvTlKOYIx_Y/s320/classe4.JPG" alt="" id="BLOGGER_PHOTO_ID_5181316170242732306" border="0" /></a></p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;"> </p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">A classe lâmpada, anteriormente não tinha métodos, apenas as comparações de if e else, mas utilizando um princípio para diminuir o acoplamento em casos de acoplamento de controle, decompomos a operação em múltiplas operações, ou seja, o método “public void setLampada(int valor)” do primeiro exemplo de lâmpada, em diversos métodos, como visto no segundo exemplo.</p><br /><span style="font-weight: bold; color: rgb(0, 0, 0);font-family:arial;" >Acoplamento de Dados Globais</span><span style="font-weight: bold;"><br /><br /></span> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">O terceiro tipo de acoplamento é o de dados globais, este tipo de acoplamento ocorre da seguinte maneira:</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Dois ou mais objetos compartilham estruturas de dados globais, estes tipos de dados podem ser enxergados por todas as classes do sistema, pois como o próprio nome já diz é global.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Uma chamada de método pode mudar um valor global e o código não deixa isso aparente. </p><br /><span style="font-weight: bold;"><span style="color: rgb(0, 0, 0);font-family:arial;" >Acoplamento de Dados Internos</span><br /><br /></span> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">O quarto e último tipo de acoplamento, e o pior de todos é o acoplamento de dados internos, ocorre quando um objeto consegue alterar os dados locais de outro objeto, exemplo, uma variável de classe pública ou protected em java.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Solução: sempre utilizar encapsulamento, ou seja, variáveis private e métodos get e set.</p>Maikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.com0tag:blogger.com,1999:blog-2108088787404397036.post-87677176144634559432008-03-21T12:48:00.000-07:002008-03-24T07:40:29.633-07:00Padrão Baixo Acoplamento<span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);">Aula 11<br /><br /><br /></span><span style="font-weight: bold; color: rgb(0, 0, 0); font-family: arial;">Acoplamento de Dados</span><span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);"><br /><br /></span> <p class="MsoNormal" face="arial" style="text-align: justify; text-indent: 54pt; font-family: arial;">Acoplamento de dados, como já vimos, é o tipo de acoplamento onde uma classe conhece os dados da outra, fazendo com que se houver mudança em uma, automaticamente implicará mudança em outra.</p> <p class="MsoNormal" face="arial" style="text-align: justify; text-indent: 54pt; font-family: arial;"> </p><p class="MsoNormal" face="arial" style="text-align: justify; text-indent: 54pt;">Observe o exemplo a seguir, de uma classe aluno e uma classe lista ordenada, a finalidade delas é obter a matrícula de um aluno e coloca-las em uma lista ordenada.</p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUwQLn3ZvpqqVTiaBczaKLAtmt8In1SRRFE5chQV6GK66KOpqW0QJl6LyTSxYIASmJdra1suzig21VfPbrApRkU_6UJW4Nl773E6ztjMX6qT85bYJV9mQzugyEsS06T_wZriaP7XY2a2w/s1600-h/classe1.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUwQLn3ZvpqqVTiaBczaKLAtmt8In1SRRFE5chQV6GK66KOpqW0QJl6LyTSxYIASmJdra1suzig21VfPbrApRkU_6UJW4Nl773E6ztjMX6qT85bYJV9mQzugyEsS06T_wZriaP7XY2a2w/s320/classe1.JPG" alt="" id="BLOGGER_PHOTO_ID_5180296214294179986" border="0" /></a> </p> <p class="MsoNormal" face="arial" style="text-align: justify; text-indent: 54pt;"> </p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:arial;">A classe aluno obtêm a matrícula e o nome do aluno através do método get, bem como cria um novo objeto novoAluno e adiciona a lista de alunos, chamando assim a classe lista ordenada. Observe agora a classe lista ordenada:</span><br /></p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil_1vKlG-UsgfgvDA_FaKCLtTOUgoqF6-VaLnE0PM8aevJPnmevk9OLA1gbl2SKRzkK1jwkXQ3ODVHfIIyojCpC3tzEkjdcD8zvCuGv6dKlcNWXt93lXauXhBi9XCf57Zz1RcVc6qfGuE/s1600-h/classe2.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil_1vKlG-UsgfgvDA_FaKCLtTOUgoqF6-VaLnE0PM8aevJPnmevk9OLA1gbl2SKRzkK1jwkXQ3ODVHfIIyojCpC3tzEkjdcD8zvCuGv6dKlcNWXt93lXauXhBi9XCf57Zz1RcVc6qfGuE/s320/classe2.JPG" alt="" id="BLOGGER_PHOTO_ID_5180297386820251826" border="0" /></a></p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"> </p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">A classe lista ordenada recebe um objeto do tipo aluno, e agora já observamos um problema de acoplamento, a classe lista ordenada nunca poderá receber um objeto de outro tipo para que seja comparado. Continuando, através do método add, a classe compara os objetos através da variável matrícula, que só existe na classe aluno, e aí observamos mais um acoplamento, e se a variável matrícula deixar de existir na classe aluno? E se for necessário comparar os alunos não por matrícula mas por ordem alfabética?.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Para isso, vamos refatorá-las para que as duas não mais dependam uma da outra.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Uma das melhores soluções para reduzir o acoplamento é a utilização de interface, vamos relembrar o que vem a ser uma interface. Uma interface nada mais é que uma superclasse que adiciona funcionalidades à classe que a implementa, ou seja, se uma determinada classe implementa uma interface, é como se ela assinasse um contrato e em troca receberia a garantia de que iria implementar as funcionalidades que existem na interface.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;"> </p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:arial;">Observe como ficou a classe aluno:</span><br /></p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkRhS6XKtxPgpTYm34CbDU7PdZmvJI6ggUFaekRenHoYqVItJsppn_25OYo-0AMo16j6NCei0_PakdaGoyjMaOhPgjzKKIT0JKtXqwcoOAU5d2dIUyyGggQtf6mQD9XKSWZaokOlvLL14/s1600-h/classe3.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkRhS6XKtxPgpTYm34CbDU7PdZmvJI6ggUFaekRenHoYqVItJsppn_25OYo-0AMo16j6NCei0_PakdaGoyjMaOhPgjzKKIT0JKtXqwcoOAU5d2dIUyyGggQtf6mQD9XKSWZaokOlvLL14/s320/classe3.JPG" alt="" id="BLOGGER_PHOTO_ID_5180297846381752514" border="0" /></a></p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"> </p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"> </p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;"><span style="font-size:100%;">Qual a primeira mudança que notamos? Isso mesmo, a classe Aluno agora está implementando uma interface chamada “comparable”, que é a interface que permite fazer comparação de objetos. Em seguida encapsula as variáveis com os métodos get e set, o que também não acontecia no exemplo anterior, em seguida há o método compareTo, um método da interface comparable, esse método transforma aluno em uma variável do tipo comparable (Aluno aluno = (Aluno)o), e em seguida faz a comparação para retornar um inteiro à classe que irá fazer a ordenação, nesse caso a classe ListaOrdenada.<br /></span></p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLMJkum0ZnlnSu0EckCd_LlEd4wnv1uEK6PbHONNThZTLr713khV9Y5DsloOSBJnitcOIEatwL8SWUO-Ne7PVz5-fR0gtmNOIC9kCHl7pM3dTOdWUtw724cSf-KedBGl0Y0M2NUIXKbqI/s1600-h/classe4.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLMJkum0ZnlnSu0EckCd_LlEd4wnv1uEK6PbHONNThZTLr713khV9Y5DsloOSBJnitcOIEatwL8SWUO-Ne7PVz5-fR0gtmNOIC9kCHl7pM3dTOdWUtw724cSf-KedBGl0Y0M2NUIXKbqI/s320/classe4.JPG" alt="" id="BLOGGER_PHOTO_ID_5180298623770833106" border="0" /></a></p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"> </p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">A classe ListaOrdenada instancia a lista, recebe o novo elemento, põe na ordem correta e o insere na lista.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Agora qual a diferença principal que notamos nessas duas classes? A classe listaordenada é capaz de ordenar qualquer tipo de objeto, e não somente a matrícula, como era no exemplo anterior, se houver uma mudança na classe aluno, a classe listaordenada continuará ordenando pois o objeto que é passado a ela não é um objeto do tipo aluno e sim do tipo comparable.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"> </p>Maikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.com0tag:blogger.com,1999:blog-2108088787404397036.post-36481086849282613262008-03-20T08:15:00.000-07:002008-03-20T08:24:58.611-07:00Padrão Baixo Acoplamento<span style="font-style: italic; font-weight: bold; color: rgb(255, 0, 0);">Aula 10<br /><br /><br /></span> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Em um sistema orientado a objetos, os objetos são todos interligados, uns mandando mensagens a outros, como já vimos até agora, existem aqueles que têm a responsabilidade de conhecer qual o responsável por determinada ação, ou quem possui determinada informação para executar tal ação, e existem aqueles com a responsabilidade de fazer as ações, de executa-las.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">O padrão que vamos conhecer hoje é responsável por medir o quanto uma classe está ligada a outra, isso é possível através do diagrama de classe, quando se observa a ligação fisicamente, ou quando avaliamos uma classe e constatamos que ela tem muito conhecimento de outra, ou quando uma classe depende de muitos elementos de outra classe, isso se chama alto acoplamento.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">O alto acoplamento traz diversos problemas para um sistema, entre eles:</p> <p class="MsoNormal" style="margin-left: 90pt; text-align: justify; text-indent: -18pt; font-family: arial;"><!--[if !supportLists]--><span style="">1. </span><b style=""><i style="">Difícil entendimento:</i></b> vamos imaginar uma situação em que você precisa fazer uma reengenharia de um sistema que já está pronto, ou que necessita encontrar um erro que está lhe dando dor de cabeça no seu sistema, ao começar analisar as classes descobre que para entender essa classe, precisa estudar a próxima que está ligada a ela, para também entender esta, precisa estudar a próxima, e assim por diante, imagine o tempo que irá desperdiçar nisso.</p> <p class="MsoNormal" style="margin-left: 90pt; text-align: justify; text-indent: -18pt; font-family: arial;"><!--[if !supportLists]--><span style="">2.<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span><b style=""><i style="">Difícil reutilização:</i></b> vamos imaginar outra situação, digamos que seja necessário retirar uma determinada parte do sistema, algo como um módulo de calcular folha de pagamento de um sistema financeiro, para ser levada e adequada a outro sistema financeiro, imagine que as classes responsáveis por isso, estejam ligadas ao módulo de RH, você vai levar o módulo de RH junto?</p> <p class="MsoNormal" style="margin-left: 90pt; text-align: justify; text-indent: -18pt; font-family: arial;"><!--[if !supportLists]--><span style="">3.<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span><!--[endif]--><b style=""><i style=""> Propagação de mudanças:</i></b> continuando do item anterior, imagine que seja necessário mudar uma classe do módulo de folha de pagamento, para isso, teria que mudar a classe que está no módulo de RH, e se você não for o responsável pelo módulo de RH? E se além de ter que mudar esta classe, também mudar várias outras que estão ligadas à primeira.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">A solução para isso seria minimizar o acoplamento entre as classes, ou seja, deixa-las com baixo acoplamento.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Existem quatro tipos de acoplamento:</p> <ul><li><!--[if !supportLists]--><span style=""><span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"></span></span><span style="font-style: italic; color: rgb(102, 102, 102); font-family: arial;">Acoplamento de dados: </span><span style="font-family: arial;">quando uma classe conhece os dados da outra;</span></li><li style="font-family: arial;"><!--[if !supportLists]--><span style=""><span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"></span></span><span style="font-style: italic; color: rgb(102, 102, 102);">Acoplamento de controle:</span> quando uma classe exerce controle sobre o comportamento de outra.</li><li style="font-family: arial;"><!--[if !supportLists]--><span style=""><span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"></span></span><span style="font-style: italic; color: rgb(102, 102, 102);">Acoplamento de dados globais:</span> quando dois ou mais objetos compartilham os mesmos dados.</li><li style="font-family: arial;"><!--[if !supportLists]--><span style=""><span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"></span></span><span style="font-style: italic; color: rgb(102, 102, 102);">Acoplamento de dados Internos: </span>quando um objeto altera os dados locais de outro objeto, isso em java não é difícil de evitar, é só utilizar variáveis private, ao invés de públicas.</li></ul> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">O acoplamento fraco é um princípio a ser levado em conta em todas as decisões de projeto, pois é um princípio de avaliação que o projetista aplica enquanto avalia as decisões do projeto.</p>Maikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.com0tag:blogger.com,1999:blog-2108088787404397036.post-67995345677946945992008-03-13T06:56:00.000-07:002008-03-13T07:12:12.250-07:00Padrão Criador ( na prática )<span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);font-family:arial;" >Aula 9 (Laboratório)<br /><br /><br /></span> <p class="MsoNormal" face="arial" style="text-align: justify; text-indent: 54pt; font-family: arial;">Sabemos que a criação de objetos é uma das atividades mais comuns em um sistema orientado a objeto, e é útil ter um princípio para atribuição geral de responsabilidades de criação. Seguindo estes princípios o sistema apresentará maior clareza, acoplamento fraco, encapsulamento e reutilização, nos artigos anteriores discutimos todas essas qualidades, e portanto não há necessidade de defini-las novamente.</p> <p class="MsoNormal" face="arial" style="text-align: justify; text-indent: 54pt; font-family: arial;">Veremos agora uma aplicação prática do padrão criador, utilizando os mesmos diagramas e praticamente o mesmo código da AULA 8, mas um pouco mais completo.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Pelo texto da postagem anterior, sabemos que a classe “Venda” é responsável por calcular o total de uma venda, a classe “ItemVenda” por calcular o subtotal e a classe “Produto” por saber o preço unitário de cada produto, agora a questão é: quem é responsável por criar quem? Qual dessas classes cria a instância de outra? Pelo primeiro diagrama, percebe-se que a classe “produto” não cria ninguém, ela é apenas criada, então vamos começar por ela. </p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Uma vez que a classe produto só possui métodos acessores e mutatórios, ela não precisa ser instanciada mas apenas que as outras classes invoquem, ou seja, chamem esses métodos contendo as variáveis da classe produto.</p><br /><span style="font-size:78%;"><span style="font-family:arial;">public class Produto {</span><br /><span style="font-family:arial;"> </span><br /><span style="font-family:arial;"> private Integer idProduto;</span><br /><span style="font-family:arial;"> private String descricaoProduto;</span><br /><span style="font-family:arial;"> private Double valorUnitario;</span><br /><span style="font-family:arial;"> public Produto() {</span><br /><span style="font-family:arial;"> }</span><br /><span style="font-family:arial;"><span style="color: rgb(255, 0, 0);">public Integer getIdProduto() {</span></span><br /><span style="color: rgb(255, 0, 0);font-family:arial;" > return idProduto;</span><br /><span style="font-family:arial;"> }</span><br /><span style="font-family:arial;"><span style="color: rgb(255, 0, 0);">public void setIdProduto(Integer idProduto) {</span></span><br /><span style="color: rgb(255, 0, 0);font-family:arial;" > this.idProduto = idProduto;</span><br /><span style="font-family:arial;"> }</span><br /><span style="font-family:arial;"><span style="color: rgb(51, 204, 0);"><span style="color: rgb(255, 0, 0);">public String getDescricaoProduto() {</span></span></span><br /><span style="color: rgb(255, 0, 0);font-family:arial;" > return descricaoProduto;</span><br /><span style="font-family:arial;"> }</span><br /><span style="font-family:arial;"><span style="color: rgb(255, 0, 0);">public void setDescricaoProduto(String descricaoProduto) {</span></span><br /><span style="color: rgb(255, 0, 0);font-family:arial;" > this.descricaoProduto = descricaoProduto;</span><br /><span style="font-family:arial;"> }</span><br /><span style="font-family:arial;"><span style="color: rgb(255, 0, 0);">public Double getValorUnitario() {</span></span><br /><span style="color: rgb(255, 0, 0);font-family:arial;" > return valorUnitario;</span><br /><span style="font-family:arial;"> }</span><br /><span style="font-family:arial;"><span style="color: rgb(255, 0, 0);">public void setValorUnitario(Double valorUnitario) {</span></span><br /><span style="color: rgb(255, 0, 0);font-family:arial;" > this.valorUnitario = valorUnitario;</span><br /><span style="font-family:arial;"> }</span><br /><span style="font-family:arial;">}<br /><br /></span></span> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Já a classe “ItemVenda” além de possuir métodos acessores e mutatórios possui um método que obtêm a quantidade de cada produto, através da variável “qtde” e multiplica pela valor unitário de cada produto, informações estas pertencentes à classe produto, veja bem, a classe “ItemVenda” não está instanciando a classe “Produto”, apenas utilizando o método get que obtêm o valor unitário de cada produto.<br /></p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;"><span style="font-size:78%;"><br />public class ItemVenda {<br /><br /> private Double qtde;<br /> private Produto produto ;<br /> public ItemVenda() {<br /> }<br /><span style="color: rgb(255, 0, 0);"> public Double getValorItemVenda(){</span><br /><span style="color: rgb(255, 0, 0);"> return getQtde()*getProduto().getValorUnitario();</span><br /> }<br />public Double getQtde() {<br /> return qtde;<br /> }<br />public void setQtde(Double qtde) {<br /> this.qtde = qtde;<br /> }<br />public Produto getProduto() {<br /> return produto;<br /> }<br />public void setProduto(Produto produto) {<br /> this.produto = produto;<br /> }<br /> }</span><br /></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:arial;">E como a classe “ItemVenda” possui o método que calcula o valor individual de cada produto, ninguém mais interessada em utilizá-la do que a classe que calcula o total de uma venda, ou seja, a classe “Venda” e agora sim, estamos aplicando o padrão criador, pois a classe “Venda” instancia a classe “ItemVenda” para que esta realize o cálculo.<br /></span></p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:arial;"><span style="font-size:78%;"><br />public class Venda {<br /><br /> private Integer idVenda;<br /> private Date dataVenda;<br /> private Set<itemvenda> itemVendaList= new HashSet<itemvenda>();<br /><br /> public Venda() {<br /> }<br />public Integer getIdVenda() {<br /> return idVenda;<br /> }<br />public void setIdVenda(Integer idVenda) {<br /> this.idVenda = idVenda;<br /> }<br />public Date getDataVenda() {<br /> return dataVenda;<br /> }<br />public void setDataVenda(Date dataVenda) {<br /> this.dataVenda = dataVenda;<br /> }<br /> public Double getValorTotal(){<br /> Double valorTotal=0.0;<br /> for(ItemVenda currentItem : itemVendaList){<br /> valorTotal+=currentItem.getValorItemVenda(); <br /> }<br /> return valorTotal;<br /> }<br /> public void addItem(ItemVenda i){<br /> itemVendaList.add(i);<br /> }<br /> public void removeItem(ItemVenda i){<br /> itemVendaList.remove(i);<br /> }<br /> <span style="color: rgb(255, 0, 0);">public ItemVenda criarItemVenda(Double qtde, Produto produto){</span><br /><span style="color: rgb(255, 0, 0);"> ItemVenda itemVenda = new ItemVenda();</span><br /><span style="color: rgb(255, 0, 0);"> itemVenda.setProduto(produto);</span><br /><span style="color: rgb(255, 0, 0);"> itemVenda.setQtde(qtde);</span><br /><span style="color: rgb(255, 0, 0);"> addItem(itemVenda);</span><br /><span style="color: rgb(255, 0, 0);"> return itemVenda;</span><br /> }<br />}<br /></itemvenda></itemvenda></span></span></p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-family:arial;">Finalizando, teremos um método main que instancia a classe "Venda" e cada um dos produtos.<br /></span> </p>Maikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.com1tag:blogger.com,1999:blog-2108088787404397036.post-44630915733549865612008-03-09T15:33:00.000-07:002008-03-13T07:15:50.514-07:00Padrão Especialista ( na prática )<span style="font-style: italic; color: rgb(255, 0, 0); font-family: arial;"><span style="font-weight: bold;">Aula 8 (em</span></span><span style="font-style: italic; font-weight: bold; color: rgb(255, 0, 0); font-family: arial;"> </span><span style="font-style: italic; font-weight: bold; color: rgb(255, 0, 0); font-family: arial;">Laboratório)</span><br /><p class="MsoNormal" style="text-align: justify; font-style: italic; font-weight: bold; color: rgb(255, 0, 0); font-family: arial;"> </p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;"><br /></p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Nesta aula vimos a aplicação prática do padrão especialista, a implementação <st1:personname productid="em código. Vamos" st="on">em código. Vamos</st1:personname> pegar como exemplo uma parte de um modelo que tem como objetivo calcular o total de uma venda, especificando cada produto, a quantidade de cada produto, e o sub-total de cada item de venda, este diagrama contêm 3 classes somente, são essas classes:</p> <p class="MsoNormal" style="text-align: justify;"><o:p> </o:p></p> <p class="MsoNormal" style="text-align: center;" align="center"><!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" spt="75" preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"> <v:f eqn="sum @0 1 0"> <v:f eqn="sum 0 0 @1"> <v:f eqn="prod @2 1 2"> <v:f eqn="prod @3 21600 pixelWidth"> <v:f eqn="prod @3 21600 pixelHeight"> <v:f eqn="sum @0 0 1"> <v:f eqn="prod @6 1 2"> <v:f eqn="prod @7 21600 pixelWidth"> <v:f eqn="sum @8 21600 0"> <v:f eqn="prod @7 21600 pixelHeight"> <v:f eqn="sum @10 21600 0"> </v:formulas> <v:path extrusionok="f" gradientshapeok="t" connecttype="rect"> <o:lock ext="edit" aspectratio="t"> </v:shapetype><v:shape id="_x0000_i1026" type="#_x0000_t75" style="'width:175.5pt;"> <v:imagedata src="file:///C:\DOCUME~1\maikon\CONFIG~1\Temp\msohtml1\01\clip_image001.png" title=""> </v:shape><![endif]--><!--[if !vml]--><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTX1CN0kqsT9sexS90nbdf9asqERJ6ejOqQMkkDYZw5JUa0xQDYjN8j_o2Q_2_prRk2S2LHbXFDHT5CA_165xyvFjUbAfZ3rFCm9w4ZLEcX0yMxO49Zbe3afrI539o_K-xHCBDtPAcaWM/s1600-h/imagem2.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 262px; height: 188px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTX1CN0kqsT9sexS90nbdf9asqERJ6ejOqQMkkDYZw5JUa0xQDYjN8j_o2Q_2_prRk2S2LHbXFDHT5CA_165xyvFjUbAfZ3rFCm9w4ZLEcX0yMxO49Zbe3afrI539o_K-xHCBDtPAcaWM/s320/imagem2.JPG" alt="" id="BLOGGER_PHOTO_ID_5175877544399956818" border="0" /></a><!--[endif]--></p> <p class="MsoNormal" style="text-align: center;" align="center"><o:p> </o:p></p> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Partiremos do princípio de todo esquema para uma venda, saber o total dela, portanto, qual a classe responsável por conhecer o total de uma venda? A classe responsável terá que conhecer todas as instâncias <i style="">ItemVenda </i>da <i style="">Venda</i> e o subtotal de cada uma delas, portanto a classe Venda é uma forte candidata pois uma <i style="">Venda </i>contém<i style=""> ItemVenda</i>. Definida a classe que calcula o total de uma venda, vamos definir a classe responsável por conhecer o subtotal de uma venda, para isso é necessário saber a quantidade de cada produto, quem detém estas informações é a classe <i style="">ItemVenda,</i> portanto esta é a classe responsável por implementar o método de calcular subtotal. Mas para implementar este método a classe <i style="">ItemVenda</i> precisa conhecer o preço unitário de cada produto, e é aí que entra a responsabilidade da classe produto, que é obter especificação do produto para mandar como resposta para a classe ItemVenda quando esta enviar uma mensagem para obter o preço de cada produto.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">No final, com todos os métodos em suas respectivas classes, o diagrama ficou assim:</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><o:p> </o:p></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><!--[if mso & !supportInlineShapes & supportFields]><span style="'mso-element:field-begin;mso-field-lock:yes'"></span><span style="'mso-spacerun:yes'"> </span>SHAPE <span style="'mso-spacerun:yes'"> </span>\* MERGEFORMAT <span style="'mso-element:field-separator'"></span><![endif]--><!--[if gte vml 1]><v:group id="_x0000_s1026" editas="canvas" style="'width:405pt;height:225.05pt;" coordorigin="2082,8907" coordsize="7572,5233"> <o:lock ext="edit" aspectratio="t"> <v:shape id="_x0000_s1027" type="#_x0000_t75" style="'position:absolute;left:2082;" preferrelative="f"> <v:fill detectmouseclick="t"> <v:path extrusionok="t" connecttype="none"> <o:lock ext="edit" text="t"> </v:shape><v:rect id="_x0000_s1028" style="'position:absolute;left:8051;top:9113;" strokeweight=".5pt"> <v:fill color2="black"> <v:stroke color2="black"> </v:rect><v:rect id="_x0000_s1029" style="'position:absolute;left:8532;top:9201;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><span style="';font-family:Helvetica;font-size:8.0pt;">Venda</span><b><span style="';font-family:Arial;font-size:8.0pt;"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1030" style="'position:absolute;left:8051;top:9497;" strokeweight=".5pt"> <v:fill color2="black"> <v:stroke color2="black"> </v:rect><v:rect id="_x0000_s1031" style="'position:absolute;left:8234;top:9583;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><span style="';font-family:Helvetica;font-size:8.0pt;">data</span><b><span style="';font-family:Arial;font-size:8.0pt;"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1032" style="'position:absolute;left:8157;top:9788;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><span style="';font-family:Helvetica;font-size:8.0pt;">tempo</span><b><span style="';font-family:Arial;font-size:8.0pt;"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1033" style="'position:absolute;left:8051;top:10077;" strokeweight=".5pt"> <v:fill color2="black"> <v:stroke color2="black"> </v:rect><v:rect id="_x0000_s1034" style="'position:absolute;left:8151;top:10165;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><span style="';font-family:Helvetica;font-size:8.0pt;">total()</span><b><span style="'font-family:;font-size:8.0pt;"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1035" style="'position:absolute;left:4122;top:9113;" strokeweight=".5pt"> <v:fill color2="black"> <v:stroke color2="black"> </v:rect><v:rect id="_x0000_s1036" style="'position:absolute;left:4705;top:9250;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><u><span style="'font-family:;font-size:8.0pt;">:Vendaa</span></u><b><span style="';font-size:8.0pt;"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:shape id="_x0000_s1037" style="'position:absolute;left:2281;top:9353;" coordsize="865,0" path="m,l433,,865,e" filled="f" strokeweight=".5pt"> <v:stroke color2="black"> <v:path arrowok="t"> </v:shape><v:rect id="_x0000_s1038" style="'position:absolute;left:2860;top:9167;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><span style="';font-family:Helvetica;font-size:8.0pt;">t := total()</span><b><span style="';font-size:8.0pt;"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1039" style="'position:absolute;left:4122;top:10647;" strokeweight=".5pt"> <v:fill color2="black"> <v:stroke color2="black"> </v:rect><v:rect id="_x0000_s1040" style="'position:absolute;left:4298;top:10784;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><u><span style="'font-family:;font-size:8.0pt;">sli:inhaDeVenda</span></u><b><span style="';font-family:Arial;font-size:8.0pt;color:#009999';"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1041" style="'position:absolute;left:8051;top:10840;" strokeweight=".5pt"> <v:fill color2="black"> <v:stroke color2="black"> </v:rect><v:rect id="_x0000_s1042" style="'position:absolute;left:8279;top:10928;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><span style="';font-family:Helvetica;font-size:8.0pt;">LinhaDeVenda</span><b><span style="';font-size:8.0pt;"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1043" style="'position:absolute;left:8051;top:11224;" strokeweight=".5pt"> <v:fill color2="black"> <v:stroke color2="black"> </v:rect><v:rect id="_x0000_s1044" style="'position:absolute;left:8140;top:11311;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><span style="';font-family:Helvetica;font-size:8.0pt;">quantidade</span><b><span style="'font-family:;font-size:8.0pt;"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1045" style="'position:absolute;left:8051;top:11607;" strokeweight=".5pt"> <v:fill color2="black"> <v:stroke color2="black"> </v:rect><v:rect id="_x0000_s1046" style="'position:absolute;left:8151;top:11695;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><span style="';font-family:Helvetica;font-size:8.0pt;">subtotal()</span><b><span style="'font-family:;font-size:8.0pt;"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:shape id="_x0000_s1047" style="'position:absolute;left:4883;top:9593;" coordsize="0,492" path="m,l,246,,492e" filled="f" strokeweight=".5pt"> <v:stroke color2="black"> <v:path arrowok="t"> </v:shape><v:rect id="_x0000_s1048" style="'position:absolute;left:2701;top:9985;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><span style="';font-family:Helvetica;font-size:8.0pt;">2*: [i:=1..N] st := subtotal()</span><b><span style="';font-family:Arial;font-size:8.0pt;color:#009999';"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1049" style="'position:absolute;left:4122;top:12184;" strokeweight=".5pt"> <v:fill color2="black"> <v:stroke color2="black"> </v:rect><v:rect id="_x0000_s1050" style="'position:absolute;left:4449;top:12218;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><u><span style="'font-family:;font-size:8.0pt;">:Especificacao</span></u><b><span style="'font-size:"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1051" style="'position:absolute;left:4734;top:12421;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><u><span style="'font-family:;font-size:8.0pt;">Produto</span></u><b><span style="';font-size:8.0pt;"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:shape id="_x0000_s1052" style="'position:absolute;left:4883;top:11130;" coordsize="0,492" path="m,l,246,,492e" filled="f" strokeweight=".5pt"> <v:stroke color2="black"> <v:path arrowok="t"> </v:shape><v:rect id="_x0000_s1053" style="'position:absolute;left:3132;top:11520;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><span style="';font-family:Helvetica;font-size:8.0pt;">2.1: p := preco()</span><b><span style="';font-size:8.0pt;"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1054" style="'position:absolute;left:8051;top:12180;" strokeweight=".5pt"> <v:fill color2="black"> <v:stroke color2="black"> </v:rect><v:rect id="_x0000_s1055" style="'position:absolute;left:8276;top:12263;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><span style="';font-family:Helvetica;font-size:8.0pt;">Especificacao</span><b><span style="';font-size:8.0pt;"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1056" style="'position:absolute;left:8515;top:12468;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><span style="';font-family:Helvetica;font-size:8.0pt;">Produto</span><b><span style="'font-family:;font-size:8.0pt;"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1057" style="'position:absolute;left:8051;top:12758;" strokeweight=".5pt"> <v:fill color2="black"> <v:stroke color2="black"> </v:rect><v:rect id="_x0000_s1058" style="'position:absolute;left:8287;top:12844;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><span style="';font-family:Helvetica;font-size:8.0pt;">descricao</span><b><span style="'font-family:;font-size:8.0pt;"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1059" style="'position:absolute;left:8208;top:13050;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><span style="';font-family:Helvetica;font-size:8.0pt;">preco</span><b><span style="';font-family:Arial;font-size:8.0pt;"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1060" style="'position:absolute;left:8151;top:13255;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><span style="';font-family:Helvetica;font-size:8.0pt;">UPC</span><b><span style="';font-family:Arial;font-size:8.0pt;"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1061" style="'position:absolute;left:8051;top:13544;" strokeweight=".5pt"> <v:fill color2="black"> <v:stroke color2="black"> </v:rect><v:rect id="_x0000_s1062" style="'position:absolute;left:8219;top:13632;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><span style="';font-family:Helvetica;font-size:8.0pt;">preco()</span><b><span style="'font-family:;font-size:8.0pt;"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:line id="_x0000_s1063" style="'position:absolute'" from="6598,13718" to="6604,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1064" style="'position:absolute'" from="6628,13718" to="6634,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1065" style="'position:absolute'" from="6659,13718" to="6664,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1066" style="'position:absolute'" from="6689,13718" to="6696,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1067" style="'position:absolute'" from="6719,13718" to="6726,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1068" style="'position:absolute'" from="6751,13718" to="6756,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1069" style="'position:absolute'" from="6781,13718" to="6785,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1070" style="'position:absolute'" from="6811,13718" to="6817,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1071" style="'position:absolute'" from="6842,13718" to="6847,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1072" style="'position:absolute'" from="6872,13718" to="6876,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1073" style="'position:absolute'" from="6902,13718" to="6909,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1074" style="'position:absolute'" from="6934,13718" to="6939,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1075" style="'position:absolute'" from="6964,13718" to="6968,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1076" style="'position:absolute'" from="6994,13718" to="7000,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1077" style="'position:absolute'" from="7025,13718" to="7030,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1078" style="'position:absolute'" from="7055,13718" to="7059,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1079" style="'position:absolute'" from="7085,13718" to="7092,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1080" style="'position:absolute'" from="7117,13718" to="7122,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1081" style="'position:absolute'" from="7147,13718" to="7151,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1082" style="'position:absolute'" from="7177,13718" to="7183,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1083" style="'position:absolute'" from="7208,13718" to="7213,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1084" style="'position:absolute'" from="7238,13718" to="7242,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1085" style="'position:absolute'" from="7268,13718" to="7275,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1086" style="'position:absolute'" from="7300,13718" to="7305,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1087" style="'position:absolute'" from="7330,13718" to="7334,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1088" style="'position:absolute'" from="7360,13718" to="7366,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1089" style="'position:absolute'" from="7391,13718" to="7396,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1090" style="'position:absolute'" from="7421,13718" to="7425,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1091" style="'position:absolute'" from="7451,13718" to="7458,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1092" style="'position:absolute'" from="7483,13718" to="7487,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1093" style="'position:absolute'" from="7513,13718" to="7517,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1094" style="'position:absolute'" from="7543,13718" to="7549,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1095" style="'position:absolute'" from="7574,13718" to="7579,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1096" style="'position:absolute'" from="7604,13718" to="7608,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1097" style="'position:absolute'" from="7634,13718" to="7641,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1098" style="'position:absolute'" from="7666,13718" to="7670,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1099" style="'position:absolute'" from="7696,13718" to="7700,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1100" style="'position:absolute'" from="7726,13718" to="7732,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1101" style="'position:absolute'" from="7757,13718" to="7761,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1102" style="'position:absolute'" from="7787,13718" to="7791,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1103" style="'position:absolute'" from="7817,13718" to="7824,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1104" style="'position:absolute'" from="7849,13718" to="7853,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:line id="_x0000_s1105" style="'position:absolute'" from="7879,13718" to="7883,13720" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:shape id="_x0000_s1106" style="'position:absolute;left:7889;top:13675;" coordsize="41,41" path="m,20r,2l,25r1,2l2,30r1,2l4,33r2,3l7,37r2,1l12,39r2,1l15,40r3,1l20,41r2,l25,40r2,l29,39r2,-1l33,37r1,-1l37,33r1,-1l39,30r1,-3l40,25r,-3l41,20,40,18r,-2l40,14,39,12,38,9,37,8,34,6,33,4,31,3,29,2,27,1r-2,l22,,20,,18,,15,1r-1,l12,2,9,3,7,4,6,6,4,8,3,9,2,12,1,14,,16r,2l,20e" filled="f" strokeweight=".5pt"> <v:stroke color2="black"> <v:path arrowok="t"> </v:shape><v:rect id="_x0000_s1107" style="'position:absolute;left:5264;top:13504;" strokeweight=".5pt"> <v:fill color2="black"> <v:stroke color2="black"> </v:rect><v:rect id="_x0000_s1108" style="'position:absolute;left:5349;top:13587;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><span style="';font-family:Helvetica;font-size:8.0pt;">New method</span><b><span style="'font-family:;font-size:8.0pt;"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:shape id="_x0000_s1109" style="'position:absolute;left:6821;top:13504;" coordsize="74,50" path="m,l74,50,74,,,xe" strokecolor="white" strokeweight=".5pt"> <v:fill color2="black"> <v:stroke color2="black"> <v:path arrowok="t"> </v:shape><v:shape id="_x0000_s1110" style="'position:absolute;left:6821;top:13504;" coordsize="74,50" path="m74,50l,,,50r74,xe" fillcolor="black" strokeweight=".5pt"> <v:fill color2="black"> <v:stroke color2="black"> <v:path arrowok="t"> </v:shape><v:line id="_x0000_s1111" style="'position:absolute'" from="4409,9880" to="4411,10069" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:shape id="_x0000_s1112" style="'position:absolute;left:4373;top:10063;" coordsize="34,50" path="m,l17,50,34,,,xe" fillcolor="black" stroked="f"> <v:fill color2="black"> <v:path arrowok="t"> </v:shape><v:line id="_x0000_s1113" style="'position:absolute'" from="4409,11513" to="4411,11701" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:shape id="_x0000_s1114" style="'position:absolute;left:4373;top:11691;" coordsize="34,51" path="m,l17,51,34,,,xe" fillcolor="black" stroked="f"> <v:fill color2="black"> <v:path arrowok="t"> </v:shape><v:line id="_x0000_s1115" style="'position:absolute'" from="3647,9210" to="3834,9212" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:shape id="_x0000_s1116" style="'position:absolute;left:3824;top:9173;" coordsize="51,34" path="m,34l51,17,,,,34xe" fillcolor="black" stroked="f"> <v:fill color2="black"> <v:path arrowok="t"> </v:shape><v:rect id="_x0000_s1117" style="'position:absolute;left:6123;top:10530;" strokeweight=".5pt"> <v:fill color2="black"> <v:stroke color2="black"> </v:rect><v:rect id="_x0000_s1118" style="'position:absolute;left:6345;top:10664;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><u><span style="'font-family:;font-size:8.0pt;">SalesLineItem</span></u><b><span style="'font-size:"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1119" style="'position:absolute;left:6028;top:10673;" strokeweight=".5pt"> <v:fill color2="black"> <v:stroke color2="black"> </v:rect><v:rect id="_x0000_s1120" style="'position:absolute;left:6266;top:10810;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><u><span style="'font-family:;font-size:8.0pt;">:LinhaDeVenda</span></u><b><span style="'font-size:"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:shape id="_x0000_s1121" style="'position:absolute;left:5645;top:9353;" coordsize="583,549" path="m,l59,,583,r,549e" filled="f" strokeweight=".5pt"> <v:stroke color2="black"> <v:path arrowok="t"> </v:shape><v:rect id="_x0000_s1122" style="'position:absolute;left:6136;top:9117;" filled="f" stroked="f"> <v:textbox style="'mso-rotate-with-shape:t'" inset="0,0,0,0"> <![if !mso]> <table cellpadding="0" cellspacing="0" width="100%"> <tr> <td><![endif]> <div> <p class="MsoNormal" align="center" style="'text-align:center;mso-layout-grid-align:"><span style="';font-family:Helvetica;font-size:8.0pt;">1*: [i:=1..N]] sli := next()</span><b><span style="'font-size:"><o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:line id="_x0000_s1123" style="'position:absolute'" from="7076,9523" to="7079,9711" strokeweight=".5pt"> <v:stroke color2="black"> </v:line><v:shape id="_x0000_s1124" style="'position:absolute;left:7041;top:9700;" coordsize="33,51" path="m33,l17,51,,,33,xe" fillcolor="black" stroked="f"> <v:fill color2="black"> <v:path arrowok="t"> </v:shape><w:wrap type="none"> <w:anchorlock/> </v:group><![endif]--><!--[if !vml]--><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-cxYmz0cEOvuW_SMVr2PnVjWX67jMuRIP_cVBTsPO_p33-H1XkaQeOrQWhCX8oAYHFfPsAlw3SETVBiZ2WCo1g0Aa7aMX9tywgwmbOqNUv-Hid0kQeeqeHGQq_ZQQcPSgNf2Ann_wFjE/s1600-h/imagem.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-cxYmz0cEOvuW_SMVr2PnVjWX67jMuRIP_cVBTsPO_p33-H1XkaQeOrQWhCX8oAYHFfPsAlw3SETVBiZ2WCo1g0Aa7aMX9tywgwmbOqNUv-Hid0kQeeqeHGQq_ZQQcPSgNf2Ann_wFjE/s400/imagem.JPG" alt="" id="BLOGGER_PHOTO_ID_5175876346104081202" border="0" /></a><!--[endif]--><!--[if mso & !supportInlineShapes & supportFields]><v:shape id="_x0000_i1025" type="#_x0000_t75" style="'width:405pt;height:225.05pt'"> <v:imagedata croptop="-65520f" cropbottom="65520f"> </v:shape><span style="'mso-element:field-end'"></span><![endif]--></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><o:p> </o:p></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><o:p> </o:p></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><o:p> </o:p></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Implementando em código:</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;"><o:p> </o:p></p> <p style="font-family: arial;" class="MsoNormal"><span style="font-size:78%;">public class Produto<br />{<br /></span><span style=";font-size:78%;" > </span><span style="font-size:78%;">private integer idProduto;<br /></span><span style=";font-size:78%;" > </span><span style="font-size:78%;">private string descricao;<br /></span><span style=";font-size:78%;" > </span><span style="font-size:78%;">private double valorUnitário;<br /><br /></span><span style=";font-size:78%;" > </span><span style="font-size:78%;">public string getdescricao(){<br /></span><span style=";font-size:78%;" > </span><span style="font-size:78%;">return descricao;<br />} </span></p> <p style="font-family: arial;" class="MsoNormal"><span style=";font-size:78%;" > </span><span style=";font-size:78%;" >public void setDescricao(string valor){<br /></span><span style=";font-size:78%;" lang="EN-US" >valor=descricao;<br />}<br />}<br /></span></p><p style="font-family: arial;" class="MsoNormal"><span style=";font-size:78%;" lang="EN-US" ><br />public class ItemVenda{<br />private double qtde;<br /><span style=""> </span>private Produto p;<br /><br /><span style=""> </span>public void setP (Produto p) {<br /><span style=""> </span>this.p = p;<br />}<br /><o:p></o:p><br /><br />public class <st1:country-region st="on"><st1:place st="on">Venda</st1:place></st1:country-region> {<br /><span style=""> </span>private Set <itemvenda><itemvenda>itemVendaList=new HashSet<itemvenda><itemvenda>();<br /><span style=""> </span>private Date dataVenda;<br /><span style=""> </span>private integer idvenda;<o:p></o:p></itemvenda></itemvenda></itemvenda></itemvenda><br /><br /><span style=""> </span>public criarItemvenda (Produto P, double qtde)<br />{<br /><span style=""> </span>Itemvenda i =new ItemVenda();<br /><span style=""> </span>i .setP(p);<br /><span style=""> </span>i.setQtde(qtde);<br /><span style=""> </span><span style=""> </span>itemVendaList.add(i);</span></p><span style="font-size:78%;">}</span><span style="" lang="EN-US"><span style="font-size:78%;"><br />}</span><o:p></o:p></span> <p class="MsoNormal" style="text-align: justify; font-style: italic; font-weight: bold; color: rgb(255, 0, 0);"><span style="font-family: arial;"><br /></span></p><p class="MsoNormal" style="text-align: justify; font-style: italic; font-weight: bold; color: rgb(255, 0, 0);"><span style="font-family: arial;">observação: nos diagramas as classes "LinhaDeVenda" e "EspecificaçãoProduto" são as mesmas classes "ItemVenda" e "Produto" do trecho de código</span><br /></p>Maikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.com0tag:blogger.com,1999:blog-2108088787404397036.post-53783849512718488062008-03-02T14:00:00.000-08:002008-03-02T14:03:54.386-08:00Padrões GRASP (Padrão Criador)<span style="font-family: arial; font-weight: bold; color: rgb(255, 0, 0);">Aulas 6 e 7</span><br /><br /><br /><p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Nos artigos anteriores vimos que um programa construído no paradigma de orientação a objetos é nada mais que uma coleção de objetos interagindo entre si, mas o que vem a ser um objeto? Na linguagem técnica, um objeto é uma instância de uma classe, e o que é uma instância? O ato de criar objetos a partir de uma ou várias classes se chama instanciação. Mas como é feito esse trabalho de criar objetos? Objetos são criados a partir de chamadas de procedimento, ou seja, de mensagens(métodos) enviadas por classes para que sejam criados novos objetos, mas agora, vem o ponto crucial deste assunto que estamos estudando, qual a classe correta, ou seja, qual a mais indicada para criar novas instâncias de outra classe(objetos)? Afinal, existem muitos deles dentro de um programa, e não é qualquer classe que pode sair criando objetos à vontade, portanto vamos à explicação:</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Segundo o Padrão Criador (Creator), para que uma classe tenha a responsabilidade de criar instâncias de outra classe é necessário que se aplique o procedimento a seguir: Vamos supor que existam duas classes A e B, a classe responsável por criar instância da outra será aquela em que mais de uma das seguintes condições se aplicar:</p> <p class="MsoNormal" style="margin-left: 36pt; text-align: justify; text-indent: 54pt; font-family: arial;"><!--[if !supportLists]--><span style="">a.<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span><!--[endif]-->B agrega objetos da classe A.</p> <p class="MsoNormal" style="margin-left: 36pt; text-align: justify; text-indent: 54pt; font-family: arial;"><!--[if !supportLists]--><span style="">b.<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span><!--[endif]-->B contém objetos da classe A.</p> <p class="MsoNormal" style="margin-left: 36pt; text-align: justify; text-indent: 54pt; font-family: arial;"><!--[if !supportLists]--><span style="">c.<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span><!--[endif]-->B registra instâncias da classe A.</p> <p class="MsoNormal" style="margin-left: 36pt; text-align: justify; text-indent: 54pt; font-family: arial;"><!--[if !supportLists]--><span style="">d.<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span><!--[endif]-->B usa muitos objetos da classe A.</p> <p class="MsoNormal" style="margin-left: 36pt; text-align: justify; text-indent: 54pt; font-family: arial;"><!--[if !supportLists]--><span style="">e.<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span><!--[endif]-->B possui os dados usados para inicializar A.</p>Maikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.com1tag:blogger.com,1999:blog-2108088787404397036.post-11832637920462062492008-02-27T04:57:00.000-08:002008-02-27T06:39:47.671-08:00Padrões GRASP (Padrão Especialista na informação)<span style="font-weight: bold; color: rgb(255, 0, 0);font-family:arial;" >AULA 5</span><br /><span style="font-family:arial;"><br /></span> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Como foi abordado na postagem anterior, padrões de software são princípios gerais de soluções que guiam o desenvolvimento de software, em outras palavras, são normas que permitem o desenvolvimento de alta qualidade de produtos de software. Existem nove destes padrões, mas vamos nos concentrar apenas nos cinco primeiros que são: </p> <ol style="font-family: arial;"><li><span style="font-style: italic; font-weight: bold;">Especialista na informação:</span> Padrão mais utilizado para atribuir responsabilidades, é aquele que atribui responsabilidades a quem realmente detêm a informação necessária para preencher os requisitos daquela responsabilidade.</li><li><span style="font-style: italic; font-weight: bold;">Padrão Criador:</span> qual a classe responsável por criar instâncias de outra?</li><li><span style="font-style: italic; font-weight: bold;">Baixo Acoplamento:</span> responsável por minimizar dependências entre as classes e maximizar o reuso.</li><li><span style="font-style: italic; font-weight: bold;">Alta Coesão:</span> responsável por manter a alta coesão entre as classes, ou seja, delegar responsabilidades e não deixar que certas classes assumam responsabilidades de outras.</li><li><span style="font-style: italic; font-weight: bold;">Controlador:</span> responsável por tratar eventos do sistema, eventos são operações geradas por um ator externo do sistema.</li></ol> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Agora que já definimos cada um dos cinco primeiros padrões, vamos entender cada um com mais clareza.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;"><o:p> </o:p></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-weight: bold; font-family: arial;font-family:arial;"><span style="font-size:130%;">Padrão Especialista</span></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;"><o:p> </o:p></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">O principal objetivo dos padrões de projeto de software é a atribuição de responsabilidades, e o padrão especialista como o próprio nome já diz, é aquele responsável por atribuir responsabilidade à classe que tem informação necessária para suprir aquela responsabilidade.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">É o padrão mais usado de todos, a informação necessária para uma determinada classe geralmente está espalhada entre várias classes, e através deste padrão é possível descobrir esta informação, bem como no mesmo caminho feito para esta descoberta, conhecer outros “expert information” de outras classes que estão relacionadas entre si.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">As conseqüências do uso deste padrão é que o encapsulamento é mantido, já que objetos usam sua própria informação para cumprir responsabilidades, leva ao fraco acoplamento entre objetos e à alta coesão já que objetos fazem tudo que é relacionado à sua própria informação.</p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Este Padrão também é conhecido como:</p><ol style="font-family: arial;"><li>"Colocar as responsabilidades com os dados";</li><li>"Quem sabe, faz";</li><li>"Animação";</li><li>"Eu mesmo faço";</li><li>"Colocar os serviços junto as atributos que eles manipulam";<br /></li></ol><br /><p class="MsoNormal" style="text-align: justify; font-family: arial;"><a href="http://camargon.googlepages.com/grasp.pdf">5 primeiros Padrões</a></p>Maikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.com0tag:blogger.com,1999:blog-2108088787404397036.post-79052231576727370522008-02-16T12:48:00.000-08:002008-02-27T04:56:55.568-08:00Atribuições de Responsabilidades e Padrões de Projeto<span style="font-weight: bold; color: rgb(255, 0, 0);">Aula 4
<br />
<br />
<br /></span> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;">Quando entramos em um novo emprego e já temos experiência nas atividades que vamos exercer naquela empresa pode ocorrer duas coisas: primeiro, o chefe nos atribui responsabilidades sobre a nossa parte do serviço, ou seja, temos obrigação de fazer determinadas tarefas, é o que foi designado para fazermos, segundo, como já temos experiência sobre o serviço que nos foi passado, ou seja, já conhecemos o trabalho que iremos desenvolver, temos a obrigação de conhecer sobre as nossas responsabilidades.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;">A mesma coisa acontece com um sistema orientado a objeto, ele é composto de objetos que enviam mensagens uns para os outros, lembrando que uma mensagem é um método executado no contexto de um objeto, ou melhor, dentro do objeto, pois bem, continuando, se um objeto de uma classe não sabe quando disparar determinado método ou conhecer os objetos ao qual está relacionado, definitivamente a comunicação entre objetos nesse sistema estará seriamente comprometida.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;">Padrões de software são um conjunto de princípios gerais e de soluções que guiam o desenvolvimento de software. São eles que definem a distribuição de responsabilidades entre objetos ou classes. Segundo a UML, as responsabilidades de objetos estão divididas em dois tipos e possuem diferentes granularidades: </p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-style: italic; font-weight: bold;">Obrigação de fazer:</span> o objeto pode fazer algo a si mesmo, pode iniciar, controlar ou coordenar ações em outros objetos.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-weight: bold; font-style: italic;">Obrigação de conhecer:</span> um objeto tem obrigação de conhecer os objetos aos quais está relacionado, conhecer dados encapsulados.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-weight: bold; font-style: italic;">Granularidade baixa:</span> uma responsabilidade pode envolver um único método, ou poucos.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"><span style="font-weight: bold; font-style: italic;">Granularidade alta:</span> uma responsabilidade pode envolver dezenas classes e métodos.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt;">Só lembrando que uma responsabilidade não é um método, mas os métodos são usados para implementar responsabilidades.</p>
<br /><span style="font-weight: bold; color: rgb(255, 0, 0);">
<br />Referências:
<br /></span><span style="color: rgb(0, 0, 0);"><a></a><p></p></span><span style="color: rgb(0, 0, 0);"><href="http: br="" jacques="" cursos="" apoo="" html="" proj1="" htm=""><a>Padrões para atribuir Responsabilidades</a></href="http:><p></p></span><span style="font-weight: bold; color: rgb(255, 0, 0);">
<br /></span>Maikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.com0tag:blogger.com,1999:blog-2108088787404397036.post-49706514547948851292008-02-13T05:09:00.000-08:002008-02-13T05:51:21.950-08:00Diagramas de Interação<span style="color: rgb(255, 0, 0); font-weight: bold;"><span style="font-family:arial;">Aula 3</span></span><p class="MsoNormal" style="text-align: justify; text-indent: 54pt;"> </p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;"><br /></p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">A UML é uma linguagem para especificação, documentação e melhor visualização de sistemas orientados a objetos. Ela permite que os desenvolvedores visualizem melhor os produtos do seu trabalho através de diagramas, mas não diz como fazê-los.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">A UML possui diversos diagramas, sendo a maioria deles para a fase de análise, os mais importantes da fase de projeto são os diagramas de interação, estes diagramas são responsáveis por mostrar como as mensagens interagem entre os objetos, lembrando que essas mensagens se referem a métodos, e um objeto só se comunica com outro se conhecer os métodos deste, um objeto ainda pode mandar mensagens a outro mesmo quando ele não estiver ativo, ou até mesmo quando ainda não foi criado, isso é possível através do conceito de enfileiramento, basicamente como o cash de um sistema operacional. Os diagramas de interação podem se subdividir em dois: Diagrama de Seqüência e Diagrama de colaboração.</p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;"> </p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-style: italic;font-family:arial;"><span style="font-weight: bold;">Diagrama de Seqüência:</span> </p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Ilustram a interação entre os objetos através de raias que são colocadas sempre à direita de cada novo objeto, as mensagens para cada objeto seguem uma ordem vertical de cima para baixo, com isso a clareza dessas mensagens é evidente. As trocas de mensagens podem ser tanto síncronas, quando o controle é passado para o objeto que foi invocado até que esse método termine sua execução, quanto assíncrona, quando o controle é passado diretamente para o objeto que invoca o método. </p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Particularmente é um bom diagrama para se trabalhar, pela simplicidade e pela fácil localização de mensagens.</p><p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Ex:<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKlWy1XXGHFS8q-Fiy-whm_jknDIYmr3spTrdUSt3B6pxms3wJNaCKTLeFQWpsemHRBsFGdgHyQo9Qq86mj6eRwwORlDEZs3MeQCVjXoSg6iy6-vD50WOKtjIBtOyE2kBba_rA9b1hBYM/s1600-h/diagramaDeSequenciaDeJogo.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKlWy1XXGHFS8q-Fiy-whm_jknDIYmr3spTrdUSt3B6pxms3wJNaCKTLeFQWpsemHRBsFGdgHyQo9Qq86mj6eRwwORlDEZs3MeQCVjXoSg6iy6-vD50WOKtjIBtOyE2kBba_rA9b1hBYM/s320/diagramaDeSequenciaDeJogo.jpg" alt="" id="BLOGGER_PHOTO_ID_5166453714569897506" border="0" /></a></p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-style: italic;font-family:arial;"><span style="font-weight: bold;">Diagrama de colaboração:</span> </p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">O diagrama de colaboração, diferentemente do diagrama de seqüência, procura dá ênfase na localização estrutural dos objetos e não na ordem temporal das mensagens destes objetos, a identificação dos objetos é feita através de enumeração, uma vez que estes ficam misturados, é difícil identificá-los, assim como no de seqüência, um objeto é representado por um retângulo e a convenção na troca de mensagens também é a mesma.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">O diagrama de colaboração possui uma notação mais complexa, mas são os mais adequados para explicar ou demonstrar rapidamente um processo na lógica de um programa.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Ex: <a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6T_vhI49FR81OH8v9sAd1rSenPk3ZBQ8x6Imz7aPDEnPMxhdRTcl942GPtSjqBVlaLB7uQWwCgLHH2rj5Ep_PfFtRvudRrJjEsZOqTaZrivCZ6PR1kERy9OmCEVNbdEc0gc6mYyhgSlE/s1600-h/introu6.gif"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6T_vhI49FR81OH8v9sAd1rSenPk3ZBQ8x6Imz7aPDEnPMxhdRTcl942GPtSjqBVlaLB7uQWwCgLHH2rj5Ep_PfFtRvudRrJjEsZOqTaZrivCZ6PR1kERy9OmCEVNbdEc0gc6mYyhgSlE/s320/introu6.gif" alt="" id="BLOGGER_PHOTO_ID_5166454066757215794" border="0" /> </a></p><p class="MsoNormal" style="text-align: justify; font-family: arial;">Referências:</p><p class="MsoNormal" style="text-align: justify; font-family: arial;"><a href ="http://www.dei.unicap.br/~almir/seminarios/2001.1/5mno/uml/Diagramas.htm">Unicap </a><br /></p><p class="MsoNormal" style="text-align: justify; font-family: arial;"><a href ="http://docs.kde.org/stable/pt/kdesdk/umbrello/uml-elements.html">Elementos da UML</a></p>Maikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.com0tag:blogger.com,1999:blog-2108088787404397036.post-59024618331334637422008-02-10T13:35:00.000-08:002008-02-10T13:41:56.819-08:00Análise e Projeto Orientados a objeto<span style="color: rgb(255, 0, 0);font-family:arial;font-size:12;" ><red> <span style="font-style: italic;">Aula 1 e 2 </span></red></span><br /><br /><span style="font-family:arial;">Análise e projeto orientados a objetos, quais são as diferenças entre eles e quais as definições de cada um.</span><br /><br /><p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">A análise é a fase onde é feita o levantamento de informações que definirão as características do sistema, esse é um passo importante, pois não se trata somente de levantar dados aleatoriamente, mas de compreender o objetivo daquele sistema. No caso da análise orientada a objetos é onde é feita a representação dos objetos e suas estruturas, definições de classes, relacionamento entre objetos e classes, além de observar o comportamento dos objetos.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Já o projeto parte do ponto onde termina a análise, ou seja, inicia-se a partir dos dados levantados através da investigação feita pela análise, em outros termos, é uma investigação mais profunda, onde começa a surgir a solução para o problema.</p> <p class="MsoNormal" style="text-align: justify; text-indent: 54pt; font-family: arial;">Em uma linguagem mais simples, a análise é onde é definido o problema, entender o problema, já o projeto é a solução, criar soluções para o problema. Na análise as informações são para o cliente discutir e aprovar, já no projeto as informações são importantes apenas para o programador.</p>Maikon Portelahttp://www.blogger.com/profile/04088310387448682296noreply@blogger.com2