Prévia do material em texto
<p>Autor: Prof. Fábio Versolatto</p><p>Colaboradores: Prof. Luciano Soares de Souza</p><p>Prof. Eduardo de Lima Brito</p><p>Projeto de Sistemas</p><p>Orientado a Objetos</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Professor conteudista: Fábio Versolatto</p><p>Mestre em Engenharia de Software pelo Instituto de Pesquisas Tecnológicas (IPT) da USP, especializado em</p><p>Arquitetura, Componentização e SOA pela Universidade Estadual de Campinas (Unicamp), pós-graduado em Tecnologia</p><p>de Construção de Software Orientado a Objetos pelo Centro Universitário Senac e bacharel em Ciência da Computação</p><p>pelo Centro Universitário da FEI.</p><p>Professor do curso de Análise e Desenvolvimento de Sistemas da Universidade Paulista (UNIP), no qual leciona e</p><p>orienta os alunos no programa de Projeto Integrado Multidisciplinar.</p><p>Atua na área de pesquisa e possui publicações e participações em eventos na área de Engenharia de Software no</p><p>Brasil e no exterior, além de projetos de pesquisa aplicados à área social.</p><p>Atua em desenvolvimento de sistemas de software e possui larga experiência em sistemas estratégicos para</p><p>empresas de grande porte, com ênfase em análise de requisitos, projeto, arquitetura e desenvolvimento de soluções</p><p>de software.</p><p>© Todos os direitos reservados. Nenhuma parte desta obra pode ser reproduzida ou transmitida por qualquer forma e/ou</p><p>quaisquer meios (eletrônico, incluindo fotocópia e gravação) ou arquivada em qualquer sistema ou banco de dados sem</p><p>permissão escrita da Universidade Paulista.</p><p>Dados Internacionais de Catalogação na Publicação (CIP)</p><p>V564p Versolatto, Fábio Rossi.</p><p>Projeto de Sistemas Orientado a Objetos. / Fábio Rossi Versolatto.</p><p>– São Paulo: Editora Sol, 2015.</p><p>152 p., il.</p><p>Nota: este volume está publicado nos Cadernos de Estudos e</p><p>Pesquisas da UNIP, Série Didática, ano XXI, n. 2-151/15, ISSN 1517-9230.</p><p>1. Engenharia de software. 2. Sistemas. 3. Tecnologia. I. Título.</p><p>CDU 681.3.02</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Prof. Dr. João Carlos Di Genio</p><p>Reitor</p><p>Prof. Fábio Romeu de Carvalho</p><p>Vice-Reitor de Planejamento, Administração e Finanças</p><p>Profa. Melânia Dalla Torre</p><p>Vice-Reitora de Unidades Universitárias</p><p>Prof. Dr. Yugo Okida</p><p>Vice-Reitor de Pós-Graduação e Pesquisa</p><p>Profa. Dra. Marília Ancona-Lopez</p><p>Vice-Reitora de Graduação</p><p>Unip Interativa – EaD</p><p>Profa. Elisabete Brihy</p><p>Prof. Marcelo Souza</p><p>Prof. Dr. Luiz Felipe Scabar</p><p>Prof. Ivan Daliberto Frugoli</p><p>Material Didático – EaD</p><p>Comissão editorial:</p><p>Dra. Angélica L. Carlini (UNIP)</p><p>Dra. Divane Alves da Silva (UNIP)</p><p>Dr. Ivan Dias da Motta (CESUMAR)</p><p>Dra. Kátia Mosorov Alonso (UFMT)</p><p>Dra. Valéria de Carvalho (UNIP)</p><p>Apoio:</p><p>Profa. Cláudia Regina Baptista – EaD</p><p>Profa. Betisa Malaman – Comissão de Qualificação e Avaliação de Cursos</p><p>Projeto gráfico:</p><p>Prof. Alexandre Ponzetto</p><p>Revisão:</p><p>Marcilia Brito</p><p>Juliana Mendes</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Sumário</p><p>Projeto de Sistemas Orientado a Objetos</p><p>APRESENTAçãO ......................................................................................................................................................7</p><p>INTRODUçãO ...........................................................................................................................................................7</p><p>Unidade I</p><p>1 INTRODUçãO A PROJETO DE SISTEMAS ...................................................................................................9</p><p>1.1 Por que “projetar”? ..................................................................................................................................9</p><p>2 O PROJETO NO CICLO DE VIDA DA ENGENHARIA DE SOFTwARE ............................................... 11</p><p>2.1 A fase de projetos ................................................................................................................................. 11</p><p>2.2 Por que modelar? ................................................................................................................................. 14</p><p>2.3 Conceitos do projeto ........................................................................................................................... 15</p><p>2.3.1 Abstração ................................................................................................................................................... 15</p><p>2.3.2 Modularidade ........................................................................................................................................... 16</p><p>2.4 Fases de projeto .................................................................................................................................... 18</p><p>2.5 Aspectos humanos da fase de projetos ....................................................................................... 20</p><p>2.6 O que buscamos atingir no projeto? ............................................................................................ 22</p><p>2.7 Introdução ao projeto orientado a objetos ............................................................................... 26</p><p>Unidade II</p><p>3 TECNOLOGIA DE APOIO AO PROJETO ORIENTADO A OBJETOS ..................................................... 34</p><p>3.1 A UML ........................................................................................................................................................ 34</p><p>3.2 Ferramentas de modelagem UML .................................................................................................. 39</p><p>3.3 As ferramentas CASE .......................................................................................................................... 40</p><p>3.4 Tecnologia back-end ........................................................................................................................... 43</p><p>3.5 Tecnologia front-end .......................................................................................................................... 47</p><p>3.5.1 Linguagens OO, um breve comparativo ......................................................................................... 49</p><p>4 PASSANDO DA ANÁLISE AO PROJETO .................................................................................................... 50</p><p>4.1 Desenvolver o modelo de classes de projeto refinando o modelo conceitual ............ 51</p><p>4.1.1 Modelo conceitual .................................................................................................................................. 51</p><p>4.1.2 Modelo de projeto .................................................................................................................................. 52</p><p>4.1.3 Modelo de implementação ................................................................................................................. 54</p><p>4.2 Atividades clássicas para passagem da análise para o projeto .......................................... 55</p><p>4.2.1 Detalhamento dos aspectos dinâmicos do sistema .................................................................. 55</p><p>4.2.2 Refinamento dos aspectos estáticos e estruturais do sistema ............................................ 61</p><p>4.2.3 Definição de outros aspectos da solução ..................................................................................... 63</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade III</p><p>5 PROJETOS DE DADOS E CLASSES E PROJETO ARQUITETURAL ...................................................... 70</p><p>5.1 Projeto de dados e classes ................................................................................................................ 70</p><p>5.1.1 Introdução ao projeto de dados ....................................................................................................... 70</p><p>5.1.2 Introdução a banco de dados relacionais ..................................................................................... 72</p><p>5.1.3 Bancos de dados</p><p>caso de uso</p><p>Visão lógica</p><p>Visão de</p><p>implementação</p><p>Visão de processo</p><p>Visão de</p><p>implantação</p><p>Figura 6 – Visões da UML</p><p>Visão de caso de uso</p><p>Tem como objetivo capturar as funcionalidades, os requisitos, e seu comportamento sob a ótica do</p><p>usuário final, ou dos atores.</p><p>A visão de caso de uso é centralizada, uma vez que o que é produzido nessa visão é a base para as</p><p>outras visões do sistema.</p><p>Visão lógica</p><p>Também chamada de visão de projeto ou visão de classe, tem como objetivo representar como as</p><p>funcionalidades serão implementadas sob o aspecto da solução de projeto.</p><p>Representa a estrutura estática de um sistema, seus componentes e o relacionamento entre eles</p><p>e como esses interagem para resolver um determinado problema. Essa interação é capturada pela</p><p>estrutura dinâmica do sistema.</p><p>Visão de processo</p><p>Também chamada de visão de concorrência, a visão de processo tem como objetivo capturar aspectos</p><p>de paralelismo de execução de atividades sob o ponto de vista não funcional de um sistema.</p><p>A visão de processo representa uma visão mais técnica do sistema tratada como unidades de</p><p>processos e processamentos, que podem ocorrer de forma síncrona ou paralela. Essas unidades também</p><p>podem ser interpretadas como subsistemas.</p><p>Visão de implementação</p><p>Também chamada de visão de componentes, a visão de implementação tem como objetivo</p><p>representar aspectos físicos necessários para a construção do sistema e como eles interagem e fazem</p><p>interface com o sistema.</p><p>37</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>São exemplos desses aspectos físicos: sistemas de software, programas e rotinas internas, bancos de</p><p>dados e bibliotecas.</p><p>Visão de implantação</p><p>Também chamada de visão de organização, tem como objetivo representar a organização física de hardware</p><p>do sistema, como computadores, servidores e periféricos, e como eles se relacionam com o sistema.</p><p>Essa visão é utilizada principalmente no processo de implantação, também chamado de instalação</p><p>ou distribuição do sistema.</p><p>O quadro a seguir mostra as visões e os respectivos diagramas da UML que compõem cada visão.</p><p>Quadro 5 – Visões da UML x Diagramas UML</p><p>Visão Diagramas</p><p>Visão de caso de uso</p><p>Diagrama de caso de uso</p><p>Diagrama de processo</p><p>Diagrama de atividade</p><p>Visão lógica</p><p>- Estrutura estática:</p><p>Diagrama de classe</p><p>Diagrama de objeto</p><p>- Estrutura dinâmica:</p><p>Diagrama de estado</p><p>Diagrama de sequência</p><p>Diagrama de colaboração</p><p>Diagrama de interação</p><p>Diagrama de atividade</p><p>Visão de processo São utilizados os mesmos diagramas utilizados na visão</p><p>lógica, mas com ênfase na linha de execução do sistema.</p><p>Visão de implementação Diagrama de componentes</p><p>Visão de implantação Diagrama de implantação</p><p>Na fase de análise trabalhamos com mais ênfase na visão de caso de uso, desenvolvendo os diagramas</p><p>de caso de uso, de processo e de atividade, além de trabalhar com os diagramas de classe e sequência</p><p>sob o aspecto de conhecimento do domínio.</p><p>Já na fase de projetos daremos ênfase à visão lógica, bem como à visão de implementação e à de</p><p>implantação, que são as visões e, consequentemente, os diagramas que dão suporte à modelagem do</p><p>aspecto solução dos requisitos elicitados nas demais visões.</p><p>É importante que tenhamos em mente exatamente quais diagramas nos estão disponíveis para uso</p><p>e exatamente o que estamos querendo representar quando do uso de um ou de outro, e para isso é</p><p>importante gravar o Quadro 5.</p><p>38</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade II</p><p>Outro aspecto importante que devemos levar em consideração na adoção de um diagrama para</p><p>representar algo é a natureza desse diagrama: se ele representa uma visão estática ou dinâmica.</p><p>O modelo estrutural estático representa a coleção desses objetos, seus atributos, métodos e seus</p><p>relacionamentos, no entanto as formas pelas quais eles interagem para resolver um problema não pode</p><p>ser visualizada em um diagrama de classes, tampouco em um diagrama de objetos.</p><p>A visão estrutural dinâmica, também chamada de visão comportamental, tem como objetivo</p><p>representar a interação dos objetos para atingir um determinado objetivo; essa interação se dá ao longo</p><p>de uma linha de tempo.</p><p>Observação</p><p>O modelo estrutural dinâmico é originado do modelo estático. Não</p><p>existe comportamento dinâmico que não tenha sido representado nos</p><p>diagramas de classe ou de objeto. Qualquer tipo de alteração no modelo</p><p>dinâmico acarreta mudança no estático e vice-versa.</p><p>A figura a seguir mostra a estrutura dos diagramas da UML, com base em Booch, Jacobson e</p><p>Rumbaugh (2006, p. 96-9).</p><p>Diagrama de objetos</p><p>Diagrama de pacotes</p><p>Diagrama de</p><p>implantação</p><p>Diagrama de</p><p>colaboração</p><p>Diagrama de atividades</p><p>Diagrama de</p><p>máquina de estado</p><p>Diagrama de classes</p><p>Diagrama de</p><p>componentes</p><p>Diagrama de</p><p>sequência</p><p>Diagrama de</p><p>implementação</p><p>Diagrama de</p><p>caso de uso</p><p>Diagrama de</p><p>interação</p><p>Diagramas</p><p>estruturais</p><p>Diagramas UML</p><p>Diagramas</p><p>comportamentais</p><p>Figura 7 – Diagramas estruturais e comportamentais da UML</p><p>39</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Neste livro-texto iremos dar ênfase aos seguintes diagramas estruturais: diagrama de classes,</p><p>diagrama de pacotes, diagrama de componentes e diagrama de implantação. Além dos diagramas</p><p>comportamentais: diagrama de máquina de estado, diagrama de sequência e diagrama de colaboração.</p><p>3.2 Ferramentas de modelagem UML</p><p>Como já vimos, a UML é uma coisa e as ferramentas de modelagem que têm como base a UML são</p><p>outra coisa.</p><p>Neste caso, as ferramentas agem como grandes facilitadoras para o uso da UML.</p><p>Um dos grandes desafios, dada a imensa variedade de ferramentas de modelagem disponíveis</p><p>atualmente no mercado, é escolher qual ferramenta deve ser usada para modelar o projeto do sistema.</p><p>Durante a fase de projeto chega a hora de adotar uma ferramenta de modelagem, e alguns aspectos</p><p>importantes devem ser considerados:</p><p>• A ferramenta está efetivamente de acordo com a UML?</p><p>• A ferramenta está atualizada com a UML 2.0?</p><p>• A ferramenta é de uso livre, ou seja, sem custos? Sendo livre, existe alguma limitação de uso</p><p>(como limite de quantidade de diagramas ou limite de quantidade de classes)?</p><p>• A ferramenta possui recursos de engenharia reversa? Esses recursos são limitados a alguma</p><p>linguagem? As linguagens oferecidas estão de acordo com as suas necessidades?</p><p>Observação</p><p>Engenharia reversa é o nome que se dá à capacidade da ferramenta de</p><p>modelagem de gerar código-fonte a partir de diagramas e vice-versa.</p><p>Todos esses pontos são extremamente importantes quando da seleção de uma ferramenta de</p><p>modelagem, principalmente, porque existem inúmeras e incontáveis ferramentas disponíveis.</p><p>O bônus da grande variedade de ferramentas está no amplo leque de escolhas que o projetista terá,</p><p>e quanto maior a concorrência entre as ferramentas, maior é a qualidade do produto final.</p><p>O ponto negativo está relacionado à própria UML. Por se tratar de um padrão de linguagem aberto,</p><p>qualquer um pode seguir a especificação, desenvolver sua própria ferramenta e disponibilizá-la para a</p><p>comunidade.</p><p>40</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade II</p><p>No entanto, existem muitas ferramentas de boa qualidade e um grande número de ferramentas de</p><p>qualidade duvidosa.</p><p>Portanto é essencial a realização de uma grande pesquisa antes da adoção de uma ferramenta de</p><p>modelagem; é importante realizar um mapeamento e verificar em que nível a ferramenta se encaixa nas</p><p>características anteriormente citadas.</p><p>Segue uma relação de algumas ferramentas que existem no mercado:</p><p>• Enterprise Architect.</p><p>• Rational Rose.</p><p>• Visual Paradigm.</p><p>• Astah.</p><p>• StarUML.</p><p>Saiba mais</p><p>Pesquise e veja uma lista de ferramentas de modelagem em:</p><p>.</p><p>O StarUML é uma ferramenta gratuita que pode ser baixada no site:</p><p>.</p><p>3.3 As ferramentas CASE</p><p>O objetivo da engenharia de software é apoiar o desenvolvimento de software a partir de técnicas</p><p>para especificar, projetar, manter e gerir um sistema de software (SOMMERVILLE, 2010). Ela é baseada</p><p>em três pilares: métodos, ferramentas e processos.</p><p>Ferramentas, de qualquer natureza, são utilizadas na engenharia para dar suporte ou auxiliar, na</p><p>execução de uma ou mais atividades.</p><p>CASE é o acrônimo em inglês para Computer-Aided Software Engineering, ou em português:</p><p>Engenharia de Software Auxiliada por Computador.</p><p>41</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Sommerville (2010, p. 512), define CASE como “o processo de desenvolvimento de software com uso</p><p>de suporte automatizado”.</p><p>Pressman (2006) segue a mesma linha e define CASE como um sistema de software que dá suporte</p><p>a profissionais da engenharia de software em todas as atividades do processo de software.</p><p>Huang (1998) sai um pouco da linha de Pressman (2006) definindo CASE como um produto de</p><p>software que dá suporte a uma ou mais atividades do processo de software, enquanto Pressman (2006)</p><p>defende que uma ferramenta CASE deva dar suporte a todas as atividades do processo.</p><p>Qualquer que seja a definição, todos convergem para a mesma linha de pensamento, que é justamente</p><p>a oposta do que muitos adotam quando falamos em ferramenta CASE, pois uma ferramenta destas não</p><p>serve apenas para desenho de diagramas.</p><p>Ferramentas CASE são classificadas de acordo com a sua funcionalidade dentro do processo; seguem</p><p>alguns exemplos.</p><p>• Ferramentas para planejamento de projetos.</p><p>• Ferramentas para gerenciamento de projetos.</p><p>• Ferramentas para análise e projeto.</p><p>• Ferramenta para construção (desenvolvimento).</p><p>• Ferramentas para integração de testes.</p><p>Algumas de suas principais características:</p><p>• Criação de diagramas e manutenção da consistência entre esses diagramas.</p><p>• Engenharia reversa: geração de código a partir de diagramas e vice-versa.</p><p>• Gerenciamento de versão.</p><p>• Gerenciamento de mudança.</p><p>• Testes automáticos, verificação e relatórios.</p><p>Precisamos ter algo muito claro em mente: essas ferramentas têm como único objetivo apoiar</p><p>o processo de software, e não substituí-lo. Elas devem ser usadas em conjunto com o processo de</p><p>engenharia de software.</p><p>Sendo assim, todas as ferramentas CASE devem ser integradas ao processo e consequentemente</p><p>entre si.</p><p>42</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade II</p><p>Por exemplo, um diagrama de classes gerado na fase de análise, ou seja, com o auxílio de uma</p><p>ferramenta de modelagem UML (conforme vimos anteriormente), é utilizado como base para o diagrama</p><p>de classes que será gerado na fase de projeto.</p><p>Neste caso, um diagrama não substitui, mas complementa o outro. Logo, eles passam a ter uma</p><p>relação, na qual uma alteração ou mudança em um necessariamente se refletirá no outro; assim, temos</p><p>algumas necessidades implícitas a esse cenário, como: gerenciamento de dependência e gerenciamento</p><p>de versão.</p><p>A mesma linha de pensamento podemos usar na relação de diagrama e descrição de caso de uso,</p><p>com os artefatos produzidos na fase de projetos; consequentemente, esses artefatos devem ter relação</p><p>com o código-fonte produzido na construção, que, por sua vez, possui relação com os planos de testes,</p><p>e assim por diante.</p><p>A forma de integração das ferramentas CASE, e não somente sua simples adoção, é fator fundamental</p><p>para o sucesso do projeto, mas não somente isso.</p><p>Pfleeger (2004, p. 27) mostra que apenas a integração do processo à ferramenta não garante o</p><p>sucesso do projeto. A autora afirma que durante um longo período, fabricantes dessas ferramentas se</p><p>esforçaram para vender a ideia de que apenas “ferramentas padronizadas e integradas em ambientes de</p><p>desenvolvimento, melhorariam o desenvolvimento de software”.</p><p>A palavra-chave para a melhoria no desenvolvimento de software a partir do uso de ferramentas</p><p>CASE é “maturidade”. Apenas a maturidade do ambiente CASE associada à maturidade da equipe</p><p>aumenta o fator de produtividade (PLEEGER, 2004. p. 89).</p><p>Nós, enquanto analistas e projetistas, devemos estar atentos quando do momento da adoção de</p><p>uma ferramenta CASE em um de nossos projetos, uma vez que, como vimos, é importante, na fase de</p><p>projetos, que tenhamos suporte e rastreabilidade dos artefatos produzidos na análise, dos que serão</p><p>produzidos no projeto e ainda do que será efetivamente construído.</p><p>O trabalho de Tsuda et al. (1992) mostra um pouco dessa realidade, discutindo alguns fatores que</p><p>levam ao aumento da produtividade com a adoção de ferramentas a partir de um estudo de caso de um</p><p>cenário real.</p><p>Uma frase do artigo de Brooks (1987, p. 1), de título reflexivo No Silver Bullet: Essence</p><p>and Accidents of Software Engineering, em português, algo como “não existe bala de prata:</p><p>essência e acidentes da engenharia de software”, é ainda muito atual, pois “não existe um</p><p>único desenvolvimento, em qualquer tecnologia ou gestão técnica, que por si só prometa uma</p><p>ordem de grandeza de melhoria de uma década em termos de produtividade, confiabilidade ou</p><p>simplicidade”.</p><p>43</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Saiba mais</p><p>Para aprofundar seus conhecimentos sobre avaliação de benchmarking</p><p>envolvendo algumas das principais ferramentas CASE, leia:</p><p>MAHDY. A. A. E-R.; AHMED, M. M. A. E-S.; ZAHRAN, S. M. Flexible</p><p>CASE tools for requirements engineering: a benchmarking survey. In:</p><p>INTERNATIONAL CONFERENCE OF INFORMATICS AND SYSTEMS, 2008.</p><p>Proceedings... Cairo, 2008. Disponível em: . Acesso em: 17 abr. 2015.</p><p>Ferramentas CASE ou ferramentas de apoio à engenharia de software podem ser classificadas em</p><p>dois grupos: front-end e back-end.</p><p>3.4 Tecnologia back-end</p><p>Tecnologias de apoio ao projeto classificadas como back-end estão relacionadas ao gerenciamento e</p><p>armazenamento das informações. São os Sistemas Gerenciadores de Banco de Dados (SGBD).</p><p>Segundo Silberschatz, Korth e Sudarshan (2006, p. 1), “um sistema de gerenciamento de banco de</p><p>dados (DBMS) é uma coleção de dados inter-relacionados e um conjunto de programas para acessar</p><p>esses dados que tem como objetivo fornecer uma maneira de recuperar informações de um banco de</p><p>dados de forma conveniente e eficiente”.</p><p>Observação</p><p>O objetivo desta disciplina não é se aprofundar no tema Banco de</p><p>Dados. Abordaremos apenas aspectos que tangenciem a fase de análise e</p><p>que tenham correlação com o tema.</p><p>A figura a seguir mostra a evolução do conceito de banco de dados, à medida que cresceu também</p><p>a complexidade dos sistemas de informação.</p><p>Arquivos</p><p>sequenciais em</p><p>fita magnética</p><p>BD em rede /</p><p>Surgimento do</p><p>SGBD</p><p>Bibliotecas</p><p>específicas de</p><p>acesso a dados /</p><p>Primeiros BDs</p><p>BD relacional</p><p>Banco de dados</p><p>orientado a</p><p>objetos / IA</p><p>aplicada</p><p>1ª Geração 2ª Geração 3ª Geração 4ª Geração 5ª Geração</p><p>Aumento da complexidade de sistemas de informação</p><p>Figura 8 – Evolução dos bancos de dados</p><p>44</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade II</p><p>A primeira geração dos repositórios de informações é marcada pela gravação sequencial das</p><p>informações em fita magnética, sendo de responsabilidade do programador desenvolver seu próprio</p><p>algoritmo para leitura e escrita dessas</p><p>informações.</p><p>Na segunda geração começam a surgir as primeiras bibliotecas de acesso aos dados, facilitando um</p><p>pouco o dia a dia do desenvolvedor. É nessa época também que surgem os primeiros esboços de bancos</p><p>de dados, que viriam em substituição às fitas magnéticas.</p><p>Em seguida, na terceira geração, surgem as padronizações no acesso a dados, sistemas que faziam</p><p>desde o gerenciamento da atualização até a leitura das informações. A esses sistemas foi dado o nome</p><p>de Sistemas Gerenciadores de Banco de Dados (SGBD).</p><p>A quarta geração é aquela na qual se baseia o que temos atualmente: consolidação dos SGBDs, dos</p><p>bancos de dados relacionais e da linguagem SQL.</p><p>A quinta geração ainda é algo incipiente e que ainda carece de maior desenvolvimento, que é a</p><p>inclusão de banco de dados orientado a objetos e a incorporação de técnicas de inteligência artificial no</p><p>conceito de banco de dados (MEDEIROS, 2013).</p><p>Na fase de projetos, e isso se aplica também ao paradigma da orientação a objetos, atualmente se</p><p>utilizam dois modelos de banco de dados: o modelo entidade-relacionamento e o modelo orientado a</p><p>objetos, sendo este último utilizado em menor escala.</p><p>O modelo entidade-relacionamento ou E-R, tem como base a percepção do mundo real como um</p><p>conjunto de entidades e do relacionamento entre elas. As entidades são caracterizadas no banco de</p><p>dados pelos seus atributos (SILBERSCHATZ; KORTH; SUDARSHAN, 2006).</p><p>Similar ao E-R, o modelo orientado a objetos tem por base um conjunto de objetos. Cada objeto</p><p>possui um conjunto de características (atributos) que, ao possuírem um determinado conjunto de</p><p>valores, passam a constituir uma identidade para o objeto.</p><p>A diferença conceitual do modelo orientado a objetos para o E-R está em alguns pontos:</p><p>• No modelo orientado a objetos, cada objeto possui um conjunto de códigos que operam sobre</p><p>este objeto, chamado de método.</p><p>• Objetos que possuem o mesmo conjunto de atributos e métodos são denominados classe.</p><p>• Cada objeto possui uma identidade única independente dos valores contidos em seus atributos,</p><p>ou seja, mesmo que um objeto possua os mesmos valores dos atributos de outro objeto no mesmo</p><p>banco de dados, estes possuem identidades diferentes.</p><p>• Adoção de mecanismos de relacionamento: composição, agregação e herança.</p><p>45</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Lembrete</p><p>Os conceitos fundamentais do modelo orientado a objetos para</p><p>banco de dados são os mesmos conceitos fundamentais do paradigma</p><p>da orientação a objetos: objeto, classe, métodos, atributos, herança e</p><p>identidade.</p><p>O banco de dados orientado a objetos ainda esbarra em alguns pontos, frutos da própria incipiência</p><p>da tecnologia.</p><p>Um desses pontos é a mistificação do desempenho. A pesquisa de Saxena e Pratap (2013) é um</p><p>exemplo de trabalho que faz um comparativo entre as duas tecnologias E-R e OO em um cenário</p><p>específico.</p><p>O resultado obtido nessa pesquisa, e que pode ser visto na figura a seguir, é muito próximo ao</p><p>cenário obtido por muitas pesquisas que seguem essa mesma linha: o desempenho do BD OO aumenta</p><p>à medida que a complexidade do negócio aumenta.</p><p>+</p><p>+</p><p>-</p><p>-</p><p>Banco de dados OO</p><p>Banco de dados relacional</p><p>Complexidade de objetos</p><p>Te</p><p>m</p><p>po</p><p>d</p><p>e</p><p>re</p><p>sp</p><p>os</p><p>ta</p><p>Figura 9 – Comparativo de desempenho: banco de dados OO versus relacional</p><p>A pesquisa de Saxena e Pratap (2013) chega à conclusão de que o tempo de resposta de um banco</p><p>de dados relacional é maior em todos os cenários — atualização, leitura e escrita — quando o número de</p><p>objetos e a complexidade deles é baixa; do contrário, se o número e a complexidade de objetos for maior,</p><p>o desempenho do banco de dados orientado a objetos mostrar-se-á mais satisfatório.</p><p>Atualmente, em quantidade de uso, bancos de dados orientados a objetos possuem números menores</p><p>se comparados a bancos de dados relacionais, e muito disso se deve à falta de maturidade e à falta de</p><p>uso de uma padronização.</p><p>46</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade II</p><p>São dois os principais padrões para banco de dados orientado a objetos: o padrão Common Object</p><p>Request Broker Architecture (CORBA) e o padrão Object Request Broker (ORB), ambos definidos pela OMG.</p><p>O padrão CORBA define uma arquitetura-padrão para comunicação: troca de informações entre</p><p>objetos independentemente do produto, hardware ou sistema operacional, garantindo a portabilidade e</p><p>a interoperabilidade (OMG, 2014).</p><p>Saiba mais</p><p>Para aprofundar seus conhecimentos sobre a especificação CORBA, acesse:</p><p>.</p><p>O Object Management Architecture (OMA) define um padrão arquitetural para gerenciamento de</p><p>objetos em um modelo de dados em cujo centro está o padrão ORB, que, segundo a OMG (2014),</p><p>“fornece uma infraestrutura que permita que objetos se comuniquem independente das plataformas e</p><p>de técnicas específicas utilizadas para implementar os objetos abordados. A ORB garante portabilidade</p><p>e interoperabilidade dos objetos através de uma rede de sistema heterogêneo”.</p><p>Saiba mais</p><p>Sobre a especificação OMA, acesse:</p><p>OBJECT MANAGEMENT ARCHITECTURE. Object Management Group,</p><p>2014. Disponível em: . Acesso em: 17 abr. 2015.</p><p>Paralelamente aos padrões definidos pela OMG, surge também o padrão definido pela Object</p><p>Data Management Group (ODMG): o Object-oriented Database Management Systems (OODBMS), que</p><p>também tem como objetivo definir um padrão de comunicação entre aplicações orientadas a objetos e</p><p>um sistema gerenciador de banco de dados orientado a objetos (CATTELL et al., 2000).</p><p>Saiba mais</p><p>Saiba mais sobre o padrão da ODMG em:</p><p>CATTELL, R. G. et al. The object data management standard: ODMG 3.0.</p><p>California: Morgan Kaufmann, 2000.</p><p>Ou acesse:</p><p>.</p><p>47</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Essa falta de maturidade na padronização ainda não colocou os principais participantes do mercado</p><p>da indústria de bancos de dados (Microsoft, Oracle etc.) com a força que se espera no mercado de banco</p><p>de dados orientado a objetos.</p><p>A seguir a lista de alguns dos principais bancos de dados orientados a objetos disponíveis atualmente:</p><p>• Gemstone.</p><p>• ObjectStore.</p><p>• Versant.</p><p>• Objectivity/DB.</p><p>• Easy/DB.</p><p>• Ontos/DB.</p><p>• Jasmine.</p><p>3.5 Tecnologia front-end</p><p>Tecnologias de apoio front-end são subdivididas em duas categorias: ferramentas de modelagem e</p><p>linguagens de programação OO.</p><p>As ferramentas de modelagem, voltadas para o paradigma da orientação a objetos, em sua maioria,</p><p>restringem-se às ferramentas que possuem a UML como base.</p><p>Lembrete</p><p>Como vimos, o assunto Ferramentas de Modelagem é extenso e</p><p>costumeiramente gera dúvidas quanto a sua relação com a UML, conforme</p><p>debatemos nas seções iniciais desta unidade.</p><p>As linguagens de programação orientada a objetos são mecanismos de implementação do modelo</p><p>de projeto que desenhamos na fase de projeto.</p><p>Analogamente ao exemplo da construção de uma casa, é como se o modelo produzido na fase de</p><p>projetos fosse o nosso conjunto de plantas e os mecanismos de construção desse modelo — tijolos, areia,</p><p>cimento, canos etc. — fossem a nossa plataforma de desenvolvimento orientado a objetos.</p><p>A primeira linguagem orientada a objetos pura utilizada para a construção dentro do paradigma OO</p><p>foi a linguagem Smalltalk, que teve seu uso difundido na década de 1980 e tem importância para as</p><p>gerações futuras, pois sua terminologia é referencial para outras linguagens OO (THE HISTORY..., 2010).</p><p>48</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade II</p><p>Saiba mais</p><p>Saiba mais sobre a linguagem Smalltalk em:</p><p>.</p><p>Não é qualquer linguagem de programação que pode ser considerada orientada a objetos; para tal,</p><p>é necessário que se cumpram determinados prerrequisitos (LEE; TAPFENHART, 2001):</p><p>• Encapsulamento de dados – garantir a confiabilidade e a capacidade de modificação do sistema de</p><p>software, expondo apenas o necessário ao restante do sistema, sendo que o estado de um objeto</p><p>deve estar representado em atributos privados, visíveis apenas no escopo do próprio objeto.</p><p>• Abstração de dados – a linguagem deve estar apta a implementar um tipo abstrato de dados, ou</p><p>seja, um conjunto de métodos utilizados para manipular essas informações.</p><p>• Coesão dinâmica – a linguagem deve implementar o mecanismo de troca de mensagens no qual</p><p>existe o objeto chamador, que envia a mensagem e o objeto receptor que recebe a mensagem e</p><p>executa um método.</p><p>• Herança – permitir a codificação de classes que sejam especializações de outras classes.</p><p>Lee e Tapfenhart (2001, p. 31) observam que as linguagens ditas puras OO, ou seja, que seguem à</p><p>risca todos os conceitos do paradigma OO, tais como: Object C, Smalltalk e Eiffel, não se mostraram</p><p>produtivas quanto ao desenvolvimento em larga escala de sistemas de software para fins comerciais.</p><p>Para tal, foi criada uma série de extensões das linguagens ditas puras que partem do princípio da</p><p>extensão, e não da modificação, na qual, o programador pode utilizar técnicas não orientada a objetos</p><p>quando apropriado.</p><p>Linguagens como: C++, Java e C# passam a ocupar fatia importante do mercado de desenvolvimento.</p><p>Saiba mais</p><p>Saiba mais sobre aplicação de C++ em projeto orientado a objetos em:</p><p>LEE, R. C; TAPFENHART, W. M. UML e C++: guia prático de desenvolvimento</p><p>orientado a objeto. São Paulo: Makron Books, 2001.</p><p>49</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Esta disciplina não tem como objetivo dar ênfase a uma linguagem específica, mas faz parte das</p><p>habilidades necessárias do arquiteto, conforme vimos, o conhecimento aprofundado nas plataformas</p><p>tecnológicas, uma vez que soluções técnicas poderão ser adotadas ou não, em função da plataforma</p><p>escolhida.</p><p>De qualquer forma, é importante que nós, neste momento, nos livremos de alguns mitos e inverdades</p><p>que possam limitar erroneamente nosso campo de visão.</p><p>3.5.1 Linguagens OO, um breve comparativo</p><p>Atualmente, quando falamos em plataforma de desenvolvimento, duas das mais utilizadas são: Java</p><p>e Microsoft .NET.</p><p>Essas duas plataformas respondem por parcela significativa no mercado de desenvolvimento.</p><p>Segundo a pesquisa do Instituto Gartner (DRIVER, 2007), aproximadamente 80% das grandes empresas</p><p>dependem de ambas.</p><p>Essa pesquisa traz resultados interessantes, pois coloca em números questões sobre esse debate que</p><p>muitas vezes envereda pelo lado passional ou por preferências pessoais às tecnologias A ou B.</p><p>Observação</p><p>O Instituto Gartner é um importante e confiável instituto de pesquisa</p><p>norte-americano especializado na análise de tendências do mercado de</p><p>tecnologia.</p><p>Um dos muitos indicativos interessantes que a pesquisa traz, e que começa a derrubar um pouco um</p><p>dos principais mitos, está relacionado ao domínio de mercado por uma tecnologia. Seguem os números</p><p>desses indicadores (DRIVER, 2007):</p><p>• Empresas consideradas pequenas: 70% utilizam Microsoft e menos de 5% utilizam Java.</p><p>• Empresas consideradas médias: 60% utilizam Microsoft e 25% utilizam Java.</p><p>• Empresas consideradas grandes: 25% utilizam Microsoft e 50% utilizam Java.</p><p>Em todos os intervalos de números a diferença para a totalidade é destinada a outras tecnologias,</p><p>como 4GL, Legacy, dentre outros.</p><p>Outra conclusão importante, e que permeia muitas discussões, está relacionada à produtividade.</p><p>Segundo a pesquisa, a produtividade do desenvolvedor na plataforma Java é menor que a produtividade</p><p>do desenvolvedor Microsoft (DRIVER, 2007).</p><p>50</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade II</p><p>Um fator interessante deste indicador. Se compararmos o indicador flexibilidade com o fator</p><p>produtividade, a flexibilidade técnica da plataforma Java será maior que a flexibilidade Microsoft,</p><p>com um detalhe: a produtividade Java versus a produtividade Microsoft e a flexibilidade Java versus a</p><p>flexibilidade Microsoft apresentam indicadores inversamente proporcionais.</p><p>Pode-se concluir que ambas as plataformas possuem qualidades e defeitos bem pontuados e</p><p>atenuados, de tal forma que uma discussão que questione qual plataforma é melhor, sem uma análise</p><p>minuciosa do cenário no qual será aplicada, certamente será direcionada para o lado passional da</p><p>discussão, o que não nos parece algo relacionado à engenharia.</p><p>Saiba mais</p><p>Veja mais indicadores em:</p><p>DRIVER, M. Java and .NET: you can’t pick a favorite child. In: DEVELOPER</p><p>SUMMIT, 2007. Palm Springs. Proceedings... Palm Springs, 2007. Disponível</p><p>em: . Acesso em: 22 abr. 2015.</p><p>4 PASSANDO DA ANÁLISE AO PROJETO</p><p>Como vimos, em um projeto de desenvolvimento de software temos a necessidade de representar</p><p>as diversas visões desse software e para tal nos utilizamos das chamadas visões da UML, ou visões de</p><p>modelagem.</p><p>A visão central deste modelo é a de caso de uso, que é a base de tudo e que fornece uma perspectiva</p><p>do software sob o ponto de vista do externo a este software (negócio/ator).</p><p>Ainda na fase de análise, produzimos o modelo de classes conceitual que representa a estrutura</p><p>estática da interação de objetos para resolver um determinado problema. Nesse modelo são representados</p><p>os atributos, os métodos e como as classes se relacionam (herança, ligação, composição, agregação).</p><p>O diagrama de objetos também pode ser utilizado como complemento ao modelo de classes de</p><p>domínio, uma vez que ele também representa uma visão estrutural que pode ser considerada como uma</p><p>instância do diagrama de classes (BEZERRA, 2006).</p><p>Na fase de análise o modelo de classe é utilizado para representar objetos do domínio do problema.</p><p>Logo, podemos dizer que o modelo de casos de uso somado ao modelo de classes de domínio tem por</p><p>objetivo esclarecer o problema a ser resolvido.</p><p>51</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Observação</p><p>Na fase de projetos utilizamos como insumo os artefatos produzidos</p><p>durante a fase de análise que, dentre outras atividades, compreende</p><p>elicitação e análise dos requisitos do negócio no qual o sistema de software</p><p>se dispõe a atender uma necessidade ou resolver um determinado problema.</p><p>O modelo de classes evolui durante o ciclo de vida do software e na fase de projeto (design) é</p><p>utilizado para representar objetos da solução.</p><p>Se o modelo de classes é o mesmo, quando termina a fase de análise e começa a fase de projetos?</p><p>Podemos dizer que a fase de projetos começa a partir do momento em que fechamos a primeira</p><p>versão do modelo de classe de domínio; nesse momento, temos a transição análise-projeto.</p><p>4.1 Desenvolver o modelo de classes de projeto refinando o modelo conceitual</p><p>A perspectiva dada pelo modelo de classe de domínio não é suficiente para avançarmos para a fase</p><p>de implementação (construção). Precisamos definir aspectos inerentes à solução do problema.</p><p>Há três perspectivas do modelo de classes:</p><p>• Modelo conceitual.</p><p>• Modelo de projeto.</p><p>• Modelo de implementação.</p><p>A seguir, cada modelo será detalhado para melhor compreensão.</p><p>4.1.1 Modelo conceitual</p><p>Desenvolvido na fase de análise, este modelo representa as classes no domínio do negócio em</p><p>questão e não leva em consideração restrições inerentes à tecnologia a ser utilizada na</p><p>solução de um</p><p>problema.</p><p>O modelo conceitual representa uma entidade do mundo real que possui:</p><p>• Identidade: valor de uma característica que o identifica para reconhecimento.</p><p>• Atributos: qualidades e características.</p><p>• Comportamento: habilidades de processamento.</p><p>52</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade II</p><p>4.1.2 Modelo de projeto</p><p>Também chamado de modelo de especificação, o modelo de projeto é desenvolvido na fase de</p><p>projeto (design) e é uma evolução do modelo conceitual, no qual são adicionados detalhes da solução</p><p>de software.</p><p>Representa um objeto do mundo real, dentro de um universo de software que contém:</p><p>• Identidade: identificador em termos de implementação (em memória).</p><p>• Atributos: os atributos que definem o objeto passam a ter tipos de dados. Nota-se aqui, uma</p><p>correlação maior com a linguagem ou plataforma de desenvolvimento a ser utilizada, uma vez</p><p>que os tipos de dados podem variar de uma linguagem para outra, por exemplo, Int32, Int64,</p><p>Integer, String, Double, Decimal etc.</p><p>Saiba mais</p><p>Para aprofundar seus conhecimentos sobre os tipos de dados presentes</p><p>no Microsoft .Net Framework, consulte a biblioteca:</p><p>.</p><p>Se preferir a plataforma Java, consulte-a em:</p><p>.</p><p>• Comportamento: funções ou procedimentos que determinam o comportamento do objeto passam</p><p>a possuir assinaturas. e é obrigatório que se defina o nível de visibilidade dos métodos.</p><p>Observação</p><p>A assinatura de um método, assim como a assinatura de uma função</p><p>em algoritmos, é composta de: tipo de retorno + nome do método +</p><p>parâmetros de entrada (tipo de dado, nome do parâmetro).</p><p>Vamos relembrar alguns pontos importantes sobre visibilidade de atributos e métodos, uma vez que</p><p>são pontos obrigatórios na fase de projetos.</p><p>Visibilidade indica quando e em que nível um atributo ou um método de um objeto pode ser acessível</p><p>aos objetos que se relacionam com ele. Em orientação a objetos, temos três níveis de visibilidade de</p><p>atributos e métodos:</p><p>53</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>• Público: o atributo ou o método pode ser acessado por qualquer classe. Na UML, indicamos que</p><p>um atributo ou um método é público utilizando o sinal + (positivo), conforme exemplo a seguir.</p><p>Figura 10 – Exemplo de representação de um método público</p><p>Ainda de acordo com a figura anterior, podemos dizer que o método efetuarSaque pode ser chamado</p><p>por qualquer outro objeto.</p><p>• Privado: um atributo ou método privado pode ser acessado somente na própria classe em que</p><p>está declarado. Na UML, indicamos que um atributo ou um método é privado utilizando o sinal -</p><p>(negativo), conforme exemplo a seguir.</p><p>Figura 11 – Exemplo de representação de um método privado</p><p>Ainda a partir da figura apresentada, podemos dizer que o método obterSaldoCC pode ser chamado</p><p>apenas dentro da própria classe Cliente. Por exemplo: poderíamos ter uma chamada a esse método</p><p>dentro do método efetuarSaque.</p><p>Observação</p><p>Atributos e métodos marcados como privado são a chave para</p><p>implementação de encapsulamento.</p><p>• Protegido: um atributo ou um método protegido pode ser acessado apenas na classe em que</p><p>está declarado e em suas classes-filhas. Na UML, indicamos que um atributo ou um método é</p><p>protegido utilizando o sinal # (sustenido), conforme exemplo a seguir.</p><p>54</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade II</p><p>Figura 12 – Exemplo de representação de um atributo protegido</p><p>Podemos dizer, de acordo com a figura anterior, que o atributo saldoCC é acessível apenas na classe</p><p>Cliente e nas suas classes-filhas: ClientePF e ClientePJ.</p><p>4.1.3 Modelo de implementação</p><p>O modelo de classes de implementação corresponde à implementação das classes em alguma</p><p>linguagem de programação, por exemplo, C# (Microsoft .Net Framework) ou Java, como mostram as</p><p>figuras a seguir.</p><p>Nestes exemplos, estamos codificando uma classe chamada Cliente que possui um atributo (saldo)</p><p>e um método (efetuarSaque).</p><p>Figura 13 – Exemplo de implementação de classe em C#</p><p>55</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Figura 14 – Exemplo de implementação de classe em Java</p><p>4.2 Atividades clássicas para passagem da análise para o projeto</p><p>Segundo Bezerra (2006), o objetivo desse momento do ciclo de vida do projeto é obter um nível</p><p>de detalhamento dos modelos tal que possamos passá-los para os desenvolvedores implementarem o</p><p>sistema (modelo de implementação).</p><p>Observação</p><p>Um pouco de vivência prática sobre a visão do arquiteto e a codificação: o</p><p>arquiteto adentra a fase de construção codificando a estrutura ou adotando</p><p>algum framework utilizando, dentre outros elementos, padrão de projeto,</p><p>além de codificar os pontos da aplicação considerados fundamentais.</p><p>São três as atividades clássicas enumeradas por Bezerra (2006): detalhamento dos aspectos dinâmicos</p><p>do sistema, refinamento dos aspectos estáticos e estruturais do sistema e definição de outros aspectos</p><p>da solução.</p><p>4.2.1 Detalhamento dos aspectos dinâmicos do sistema</p><p>O objetivo dessa fase é a representação da interação dos objetos de forma dinâmica. O dinamismo</p><p>está relacionado à representação do estado e do comportamento do objeto em uma linha de tempo.</p><p>Lembrete</p><p>O diagrama de classes representa uma visão estática, pois não nos dá o</p><p>aspecto temporal de um objeto.</p><p>Os modelos que representam os aspectos dinâmicos de um sistema são: modelo de interações,</p><p>modelo de estados e modelo de atividades; este último é o menos utilizado.</p><p>56</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade II</p><p>O modelo de interação dos objetos representa a forma pela qual estes interagem para</p><p>resolver um determinado problema, e, conforme vimos pelo paradigma da orientação a objetos,</p><p>a interação dos objetos se dá pela troca de mensagens, e estas são o centro da representação</p><p>desse modelo.</p><p>Antes de entrar na modelagem das mensagens vamos relembrar os possíveis significados de uma</p><p>mensagem.</p><p>Uma mensagem pode ter três significados (STADZISZ, 2002):</p><p>• Chamada de função ou procedimento: é o tipo mais utilizado de mensagem. Significa que um</p><p>objeto está solicitando a execução de um método de outro objeto.</p><p>Neste caso, a função ou procedimento corresponde a um método público em um objeto que pode</p><p>ser acessível a um objeto “chamador”, conforme mostra a figura a seguir.</p><p>Figura 15 – Exemplo de troca de mensagens: chamada de função</p><p>É possível notar, nessa figura, que os métodos e alguns atributos das classes já possuem</p><p>características do modelo de projeto, ou seja, tipos de dados e nível de visibilidade. Além do mais,</p><p>57</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>as mensagens do diagrama de sequência devem obrigatoriamente refletir os métodos e a assinatura</p><p>descritos no diagrama de classes.</p><p>• Envio explícito de mensagem: utilizando um tipo de serviço bem específico e especializado para</p><p>envio e recebimento de mensagens, por exemplo, Message Queue (fila de mensagens).</p><p>• Evento: quando uma mensagem é enviada para um objeto do sistema originária de um evento</p><p>externo ao sistema. É comum que esse tipo de mensagem seja próprio da comunicação entre</p><p>atores e objetos. Por exemplo: um clique de mouse pode ser considerado um evento externo ao</p><p>sistema e que deve ser interpretado por um objeto interno do mesmo sistema.</p><p>Além do significado de uma mensagem, ao detalharmos os aspectos</p><p>dinâmicos do sistema,</p><p>devemos entender que tipo de mensagem estamos querendo representar, pois isso definirá como o</p><p>comportamento do sistema será construído. Aqui começamos a tratar de questões importantes de um</p><p>sistema, por exemplo, paralelismo.</p><p>Segundo o padrão de comunicação de interação de objetos, que pode ser observado em Stadzisz</p><p>(2002), existem dois tipos de mensagem entre objetos:</p><p>• Mensagens síncronas: são mensagens que implicam um sincronismo rígido entre os estados do</p><p>objeto que envia a mensagem e os do objeto de destino da mensagem.</p><p>— Em um nível de projeto, podemos interpretar que este tipo de mensagem é utilizado quando o</p><p>método do objeto chamado possui algum tipo de retorno no qual o objeto chamador espera.</p><p>• Mensagens assíncronas: não há dependência de estado do objeto chamador e do processamento</p><p>do objeto chamado. O objeto chamador envia a mensagem e continua o seu processamento.</p><p>— Em um nível de projeto, utilizamos esse tipo de mensagem quando queremos iniciar algum tipo</p><p>de processamento paralelo entre dois objetos, ou seja, o objeto chamador pode continuar o seu</p><p>processamento independentemente do retorno do objeto chamado ou dos processamentos</p><p>iniciados pelo objeto chamado após o envio da mensagem.</p><p>Além de mensagens síncronas e assíncronas, Larman (2007) observa mais alguns tipos de mensagens:</p><p>• Autodelegação de mensagens: um objeto pode enviar uma mensagem para ele mesmo, solicitando</p><p>a execução de um método. Esse movimento é chamado de autodelegação. O método que só pode</p><p>ser chamado pelo próprio objeto que o contém, conforme vimos, é um método privado, e isso é</p><p>muito importante levarmos em consideração no momento do projeto, pois isso garante o correto</p><p>uso do encapsulamento.</p><p>• Criação e destruição de objetos: no ciclo de vida de um objeto, existem dois métodos, construtores</p><p>e destrutores, que têm como objetivo criar e remover um objeto da estrutura de memória de um</p><p>sistema. Em orientação a objetos, quando um objeto cria outro para utilizá-lo ou para enviar-lhe</p><p>58</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade II</p><p>uma mensagem, dizemos que o primeiro possui uma referência à instância do objeto criado e,</p><p>na fase de projeto, é importante que criemos as referências apenas quando necessário, pois isso</p><p>define a dependência entre objetos e é o início da coesão e do acoplamento.</p><p>A figura a seguir mostra os elementos de uma estrutura dinâmica que debatemos até agora, dispostos no</p><p>diagrama de sequência da UML. O exemplo dessa figura mostra um processo fictício de fechamento de notas:</p><p>Figura 16 – Exemplo de modelagem de aspectos dinâmicos de um sistema</p><p>59</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Quadro 6 – Exemplo de modelagem de aspectos dinâmicos de um sistema</p><p>Letra Descrição</p><p>A</p><p>Diagrama de classes, com inclusão de tipos de dados nos</p><p>atributos, assinatura completa nos métodos e visibilidade de</p><p>atributos e métodos.</p><p>Note que a forma pela qual os métodos estão especificados no</p><p>diagrama de classes é a mesma do diagrama de sequência.</p><p>B</p><p>O retângulo representa um objeto que faz parte da execução do</p><p>cenário. Note que estamos falando de objetos, e não de classes,</p><p>pois quando estamos representando a troca de mensagens,</p><p>no aspecto dinâmico do sistema, o objeto já está instanciado.</p><p>Obrigatoriamente, os objetos do diagrama de sequência devem</p><p>constar no modelo de classes.</p><p>C</p><p>Representa o ator, envolvido no contexto. Como vimos, um ator</p><p>pode ser um elemento externo ao sistema, como um usuário,</p><p>um dispositivo de hardware ou outro sistema.</p><p>D</p><p>O retângulo posicionado abaixo do objeto significa que naquele</p><p>espaço de tempo iniciou-se o ciclo de vida do objeto. Como</p><p>vimos, um objeto é criado, utilizado e destruído, e nesse espaço</p><p>de tempo representado pelo retângulo o objeto está ativo, ou</p><p>seja, está criado, e está apto a receber mensagens.</p><p>E A linha tracejada abaixo dos atores e dos objetos representa a</p><p>linha de tempo.</p><p>F</p><p>A seta com linha tracejada logo abaixo da seta com ponta cheia</p><p>representa um retorno de uma mensagem, retorno este de uma</p><p>mensagem síncrona representada pela seta com ponta cheia.</p><p>Neste momento, o objeto do Professor está aguardando o</p><p>retorno e o processamento do objeto Aluno.</p><p>G</p><p>A seta recursiva indica uma autodelegação de mensagem.</p><p>É o objeto do tipo Professor enviando uma mensagem para ele</p><p>mesmo a partir do método privado calcularNota.</p><p>H</p><p>A seta aberta indica o envio de uma mensagem assíncrona.</p><p>Após o envio da mensagem receberNota do objeto do</p><p>tipo Professor para o objeto do tipo Aluno, ambos podem</p><p>executar outros processamentos, independentemente da</p><p>resposta deste método.</p><p>Que é o que efetivamente ocorre, o objeto do tipo Aluno</p><p>envia uma mensagem (com significado de evento) para o ator</p><p>Impressora, e o objeto do tipo Professor envia uma mensagem</p><p>para ele mesmo: efetuarFechamento.</p><p>É claro que todo processamento paralelo uma hora é</p><p>sincronizado dentro do sistema, por isso a importância de</p><p>modelarmos e especificarmos corretamente o que é síncrono e o</p><p>que é assíncrono na fase de projeto (design).</p><p>Na UML, mais precisamente no diagrama de sequência, ainda podemos representar estruturas de</p><p>decisão e repetição, o mesmo conceito que vimos em algoritmos básicos.</p><p>60</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade II</p><p>Saiba mais</p><p>Para aprofundar seus conhecimentos sobre estruturas de decisão e</p><p>repetição, leia:</p><p>MARTINS, C. T. K.; RODRIGUES, M. Algoritmos elementares C++. São</p><p>Paulo: LCTE, 2006.</p><p>A figura a seguir mostra um exemplo de estrutura de decisão. No diagrama de sequência, temos o</p><p>elemento operador de controle, que pode ser observado no ponto indicado com a letra A. O indicativo</p><p>“alt” no operador de controle significa fluxo alternativo, ou seja, só será executado se uma condição for</p><p>satisfeita; no caso, a senha informada deve ser correta.</p><p>Figura 17 – Exemplo de fluxo alternativo em diagrama de sequência</p><p>A seguir, mostra-se um exemplo de laço de repetição. O indicativo loop no operador de controle,</p><p>indicado pela letra A, sinaliza uma repetição: no caso, a mensagem informarSenha será enviada no</p><p>mínimo uma vez e no máximo três vezes, conforme indicado no operador de controle.</p><p>61</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Figura 18 – Exemplo de estrutura de repetição em diagrama de sequência</p><p>Note a importância de se modelar corretamente as estruturas de decisão e de repetição; no momento</p><p>em que o desenvolvedor analisar o modelo, saberá exatamente o que construir, diminuindo, e muito,</p><p>problemas de entendimento ou até mesmo problemas de desempenho decorrentes de má prática de</p><p>programação.</p><p>4.2.2 Refinamento dos aspectos estáticos e estruturais do sistema</p><p>O refinamento dos aspectos estáticos do sistema tem como objetivo promover a passagem do</p><p>modelo de classes de domínio para o modelo de classes de projetos (BEZERRA, 2006).</p><p>O primeiro passo a ser dado é detalhar os atributos e os métodos, pois quando começamos a associar</p><p>os tipos de dados e a complementar a assinatura dos métodos, alguns elementos podem ficar confusos,</p><p>principalmente para o desenvolvedor.</p><p>Para evitar mal-entendido e efetivamente validar se o modelo a ser construído tem relação com</p><p>o problema que pretende resolver, os atributos e métodos devem ser detalhados quanto ao seu uso e</p><p>significado dentro do contexto do sistema.</p><p>O mesmo se aplica no detalhamento do relacionamento entre os objetos, que é igualmente</p><p>necessário e deve ser feito na sequência, com o principal objetivo de detalhar os relacionamentos</p><p>do tipo associação de objetos, uma vez que essas relações não são facilmente</p><p>absorvidas em um</p><p>primeiro momento.</p><p>62</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade II</p><p>Observação</p><p>Se um objeto envia uma mensagem para outro, eles possuem uma</p><p>ligação, chamada de associação simples, ou seja, uma ligação que acontece</p><p>apenas em um determinado momento.</p><p>O último passo para o refinamento é a atribuição de responsabilidades aos objetos da classe de</p><p>domínio.</p><p>A atribuição de responsabilidades está relacionada aos atributos e métodos dessa classe.</p><p>Devemos verificar se o objeto é suficientemente autocontido ou se, eventualmente, não possui mais</p><p>responsabilidades do que deveria, o que causaria uma baixa coesão no universo sistêmico.</p><p>Uma classe do modelo de domínio pode gerar uma ou mais classes do modelo de projetos e</p><p>vice-versa. Não existe uma regra para isso, tudo depende do cenário que estamos modelando.</p><p>A divisão de responsabilidades é uma das características fundamentais em uma boa modelagem de</p><p>sistemas. Objetos com responsabilidades bem-definidas aumentam a sua capacidade de reúso.</p><p>Organizar e dividir os objetos por responsabilidade é a base para o conceito de padrões de projeto,</p><p>que vem a ser um conjunto de soluções e organização sistêmica com um objetivo específico.</p><p>No caso, a divisão de responsabilidades pode ser encarada como um padrão de projeto com</p><p>o objetivo de aumentar o reúso e diminuir o acoplamento entre objetos de um sistema. Esse</p><p>conceito é a base para o padrão de projeto Model-View-Controller (MVC), que veremos com</p><p>maiores detalhes.</p><p>Quando estamos definindo as responsabilidades dos objetos dentro do sistema, passamos a identificar</p><p>as classes de entidade, de fronteira e de controle.</p><p>Entidade</p><p>Uma entidade, classe de entidade ou ainda objeto de entidade são objetos mais próximos do domínio</p><p>do mundo real que o sistema representa, são abstrações do mundo real que normalmente conseguimos</p><p>identificar nos casos de uso.</p><p>Esses objetos têm como objetivo principal manter informações referentes ao domínio de problema</p><p>que queremos resolver.</p><p>Nas classes de entidade, representamos informações e comportamentos que são, de alguma forma,</p><p>armazenados no sistema. Por exemplo: dentro do domínio do nosso problema de saque em terminal de</p><p>autoatendimento, temos as classes de entidade cliente, cartão e terminal de autoatendimento.</p><p>63</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Fronteira</p><p>Classes de fronteira ou objetos de fronteira, como o próprio nome diz, têm como responsabilidade</p><p>dividir o ambiente interno do sistema e suas interações externas.</p><p>Podemos interpretar interações externas a um sistema como toda e qualquer comunicação</p><p>que um sistema faz com atores do sistema ou ainda alimentar informações de outros sistemas.</p><p>Por exemplo: dentro do domínio do nosso problema de saque, o sistema deve se comunicar com</p><p>outro sistema, externo, responsável por efetuar a autenticação de segurança da senha de acesso</p><p>do cliente.</p><p>Outros exemplos clássicos de interface externa: envio de informações para sistemas governamentais,</p><p>como informações fiscais; consumo de informações de outros sistemas, como informações de crédito;</p><p>interface com SGBD.</p><p>Lembrete</p><p>Na fase de análise do ciclo de vida da engenharia de software, na</p><p>atividade de modelagem de casos de uso, atores de um sistema são</p><p>agentes externos ao sistema, que executam determinada ação e que</p><p>esperam algum resultado, podendo ser um usuário, um dispositivo de</p><p>hardware ou outro sistema.</p><p>Controle</p><p>Classes de controle, objetos de controle ou ainda controladores são objetos que têm como</p><p>objetivo realizar o sequenciamento da execução de um caso de uso na estrutura de objetos do</p><p>sistema, bem como fazer a coordenação entre as camadas internas do sistema, representadas pelas</p><p>classes de entidade, com as camadas externas ao sistema, representadas pelas classes de fronteira.</p><p>Alguns autores também chamam esse movimento de orquestração.</p><p>4.2.3 Definição de outros aspectos da solução</p><p>A definição de outros aspectos da solução passa para um nível arquitetural do processo de passagem</p><p>da fase de análise para a fase de projetos. Com o modelo de classes de projeto pronto, começamos a</p><p>pensar em como organizar essas classes da melhor forma.</p><p>O primeiro passo a ser dado é a decomposição do sistema em subsistemas, ou também chamados</p><p>de componentes; esse é o processo de componentização de um sistema de software (BEZERRA, 2006).</p><p>Analogamente, e também superficialmente, é como a indústria eletrônica já trabalha há muito</p><p>tempo.</p><p>64</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade II</p><p>Cada componente eletrônico é um conjunto de CIs (circuitos integrados), e cada qual possui uma</p><p>finalidade dentro do componente. Em um sistema eletrônico, apenas os componentes conversam entre</p><p>si por interfaces de comunicação bem definidas, não existe comunicação entre os CIs. Desta forma, cada</p><p>componente em um sistema eletrônico funciona como uma unidade autônoma nesse sistema.</p><p>A componentização na indústria eletrônica promove alguns benefícios, dentre eles: maior</p><p>produtividade, pois é possível que equipes trabalhem em paralelo, uma vez que as interfaces de</p><p>comunicação já estão definidas; e manutenibilidade, pois é possível que se substitua um componente</p><p>do sistema (por falha ou evolução) sem que o todo seja desestruturado.</p><p>A indústria eletrônica está mais avançada que a de software nesse quesito, todavia o nível de</p><p>maturidade das corporações e a especialização dos profissionais já mostram promissores fatores para a</p><p>mudança deste cenário.</p><p>Saiba mais</p><p>O assunto componentização é extenso e deve ser aprofundado</p><p>na forma de especialização. O tema é muito valorizado e tem grande</p><p>mercado de atuação; referências no assunto:</p><p>HEINEMAN G. T.; COUNCILL, W. T. Component-based software</p><p>engineering: putting the pieces together. Boston: Addison-Wesley Longman</p><p>Publishing, 2001.</p><p>SZYPERSKI, C. Component software: beyond object-oriented</p><p>programming. 2. ed. Boston: Addison-Wesley Longman Publishing, 2002.</p><p>Componentes definidos, devemos especificar e modelar como distribuiremos esses componentes nos</p><p>recursos de hardware que possuímos.</p><p>Atualmente, muitos são os recursos disponíveis para distribuição do software, por exemplo, sistemas</p><p>distribuídos em rede, serviços web (ou Web Services), cloud computing etc. Trataremos com maiores</p><p>detalhes sobre como representamos essa distribuição, nas próximas unidades.</p><p>Ainda sobre a definição de outros aspectos da solução, devemos definir como os objetos serão</p><p>persistidos em um repositório de informações.</p><p>O ato de definir como e quais objetos serão persistidos em um repositório tem grande relação com o</p><p>modelo de dados adotado para o SGBD, ou seja, qualquer que seja o modelo adotado, E-R ou orientado</p><p>a objetos, deve-se refletir e planejar sobre isso neste momento. Trataremos esse assunto com maior</p><p>aprofundamento nas próximas unidades.</p><p>65</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Com relação a essas três atividades, da passagem da análise ao projeto, é importante que</p><p>tenhamos em mente que elas não são executadas de forma linear em um único sentido, ou seja,</p><p>todos os modelos produzidos em cada atividade poderão, e deverão, ser refinados sempre que</p><p>houver necessidade.</p><p>Isso quer dizer que um modelo de classes de projeto poderá e deverá ser alterado se, no momento</p><p>da modelagem dos aspectos dinâmicos, for encontrada alguma anomalia, assim como o próprio modelo</p><p>de análise, se preciso for. Isso</p><p>é extremamente importante nesta fase do ciclo de vida do projeto.</p><p>Resumo</p><p>Nesta unidade tratamos de dois temas centrais: a tecnologia de</p><p>apoio ao projeto orientado a objetos e a transição da fase de análise</p><p>para a fase de projeto.</p><p>Sobre o tema da tecnologia de apoio ao projeto orientado a objetos,</p><p>vimos que boa parte desse suporte é baseado na UML.</p><p>Embora muitos ainda confundam algumas coisas, vimos que a UML</p><p>não é uma tecnologia, nem um software, nem uma ferramenta ou uma</p><p>linguagem de desenvolvimento.</p><p>A UML é uma linguagem de modelagem unificada, utilizada para</p><p>representar as diversas visões de um software durante o seu ciclo de</p><p>vida de desenvolvimento.</p><p>Um software, segundo Kruchten (1995) e Booch, Jacobson e</p><p>Rumbaugh (2006), possui cinco visões: visão lógica, visão de processo,</p><p>visão de implementação, visão de implantação e visão de caso de uso,</p><p>sendo esta última a central, ou seja, a que fornece subsídios para todas</p><p>as visões.</p><p>Cada visão possui uma finalidade bem-definida, logo cada uma</p><p>possui um conjunto de diagramas da UML específicos para cada uma</p><p>dessas finalidades. Antes de utilizarmos a UML a esmo, precisamos ter a</p><p>noção de qual visão estamos querendo modelar e de quais os diagramas</p><p>corretos para cada finalidade.</p><p>Para desenharmos os diagramas da UML, utilizamos como</p><p>facilitadores as ferramentas de modelagem, todavia vimos que a</p><p>adoção e o uso consciente de uma ferramenta de mercado são fatores</p><p>fundamentais para o sucesso nessa fase do projeto.</p><p>66</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade II</p><p>Outra tecnologia de apoio ao projeto são as chamadas ferramentas</p><p>CASE, que têm como objetivo apoiar todo o ciclo de vida da engenharia</p><p>de software, e não somente uma fase específica.</p><p>Todavia, a simples adoção de uma ferramenta CASE também não</p><p>é garantia de qualidade e sucesso no projeto. As ferramentas CASE</p><p>utilizadas no projeto devem estar interligadas e, principalmente,</p><p>devem ter um modelo de processo de desenvolvimento sólido e</p><p>maduro como suporte.</p><p>As tecnologias de apoio OO podem ser classificadas como back-end e</p><p>front-end.</p><p>Tecnologias back-end basicamente são as tecnologias relacionadas ao</p><p>armazenamento e gerenciamento de informações; são os chamados SGDBs,</p><p>ou Sistemas Gerenciadores de Bancos de Dados.</p><p>Debatemos que, em se tratando de banco de dados, dois são os principais</p><p>modelos — o modelo E-R e o modelo orientado a objetos — e que, enquanto</p><p>o modelo entidade-relacionamento é utilizado largamente, o orientado a</p><p>objetos ainda é muito incipiente tecnologicamente, mas possui um grande</p><p>campo de expansão pela frente; basta definir ainda algumas questões,</p><p>principalmente as relacionadas à padronização.</p><p>Tecnologias front-end são as ferramentas de modelagem e as linguagens</p><p>de programação orientada a objetos.</p><p>Para uma linguagem ser considerada orientada a objetos, ela deve</p><p>seguir algumas predefinições, que são possibilitar: o encapsulamento de</p><p>dados, a abstração de dados, a coesão dinâmica e a herança. Linguagens</p><p>puramente orientadas a objetos, como vimos em Lee e Tapfenhart (2001),</p><p>não tiveram grande apelo no desenvolvimento de sistemas comerciais e,</p><p>para tal, foram estendidas para utilizar técnicas não orientadas a objeto</p><p>apenas quando apropriado.</p><p>As linguagens OO mais utilizadas na atualidade são Java e as linguagens</p><p>da plataforma Microsoft .Net, em especial, a linguagem C#. Debatemos</p><p>que, na discussão sobre qual das duas é melhor, raramente se levam em</p><p>consideração os números. Como mostra a pesquisa do Instituto Gartner</p><p>(DRIVER, 2007), as discussões partem sempre para o lado passional e</p><p>acabam se baseando em interesses particulares.</p><p>A segunda frente desta unidade tratou do tema da passagem da fase de</p><p>análise para a fase de projeto, cujo objetivo central é refinar o modelo de</p><p>67</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>domínio produzido na análise para obter o modelo de projeto, um modelo</p><p>que possa ser implementável.</p><p>A fase de projeto, ou design, começa a partir do momento em que</p><p>fechamos a primeira versão do modelo de classe de domínio; nesse</p><p>momento, temos a transição análise-projeto.</p><p>São três perspectivas do modelo de classes: modelo conceitual,</p><p>produzido na fase de análise; modelo de projeto, produzido na fase de</p><p>projeto; e modelo de implementação, que corresponde ao modelo de</p><p>projeto construído em uma determinada linguagem.</p><p>A diferença entre o modelo conceitual e o de projeto está na adição, no</p><p>modelo de projeto, dos tipos de dados, assinatura dos métodos, detalhamento</p><p>dos atributos e métodos e inclusão de novos objetos inerentes à solução</p><p>técnica com o objetivo de que este modelo possa ser implementável, ou</p><p>seja, construído.</p><p>Segundo Bezerra (2006), são três as atividades para a passagem da</p><p>análise para o projeto: detalhamento dos aspectos dinâmicos do sistema,</p><p>refinamento dos aspectos estáticos e estruturais do sistema e definição de</p><p>outros aspectos da solução.</p><p>Na fase de detalhamento dos aspectos dinâmicos do sistema nós</p><p>damos ênfase à representação da troca de mensagens entre os objetos com</p><p>o objetivo de resolver um determinado problema.</p><p>No refinamento dos aspectos estáticos e estruturais, a ênfase</p><p>é dada a refinar o modelo conceitual de tal forma que esse novo</p><p>modelo possa ser implementável a partir da adição dos tipos de dados,</p><p>assinatura dos métodos, detalhamento dos atributos e métodos e</p><p>inclusão de novos objetos, se necessário, e neste ponto vimos que</p><p>uma classe do modelo de classes de domínio pode gerar uma ou mais</p><p>classes no modelo de classes de projeto e vice-versa, e isso é muito</p><p>importante ter em mente.</p><p>Por último, na definição de outros aspectos da solução, demos ênfase a:</p><p>arquitetura, componentização, distribuição dos componentes nos recursos</p><p>de hardware e mapeamento dos objetos em um SGBD.</p><p>Cada fase possui a sua sequência de atividades, no entanto é importante</p><p>que tenhamos em mente que sempre podemos, e devemos, refinar e corrigir</p><p>modelos produzidos nas fases anteriores quando necessário.</p><p>68</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade II</p><p>Exercícios</p><p>Questão 1. A UML (Unified Modeling Language), na definição de Booch et al. (2006, p. 13), “é</p><p>uma linguagem-padrão para elaboração da estrutura de projetos de software [...] adequada para a</p><p>modelagem de sistemas”. Com relação a UML, analise as duas afirmativas apresentadas a seguir:</p><p>Existem inúmeras ferramentas no mercado que se utilizam da UML para a geração de diagramas. A</p><p>própria UML em si pode ser considerada uma plataforma ou uma ferramenta de modelagem.</p><p>Porque</p><p>A UML não é uma linguagem de programação, muito embora seja possível a geração de código</p><p>a partir de alguns diagramas, o diagrama de classes principalmente, assim como o inverso, ou seja, a</p><p>geração de diagramas a partir de código fonte.</p><p>Acerca dessas afirmativas, assinale a opção correta:</p><p>A) As duas afirmativas são proposições verdadeiras e a segunda é uma justificativa correta da</p><p>primeira.</p><p>B) As duas afirmativas são proposições verdadeiras e a segunda não é uma justificativa correta da</p><p>primeira.</p><p>C) A primeira afirmativa é uma proposição verdadeira e a segunda é uma proposição falsa.</p><p>D) A primeira afirmativa é uma proposição falsa e a segunda é uma proposição verdadeira.</p><p>E) As duas afirmativas são proposições falsas.</p><p>Resposta correta: alternativa D.</p><p>Análise das alternativas</p><p>Justificativa geral: a primeira afirmativa é uma proposição falsa e a segunda é uma proposição</p><p>verdadeira.</p><p>A versão correta da primeira afirmativa é:</p><p>Existem</p><p>inúmeras ferramentas no mercado que se utilizam da UML para a geração de diagramas, mas</p><p>a UML em si não pode ser considerada uma plataforma ou uma ferramenta de modelagem tampouco</p><p>um software.</p><p>69</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Como apresentado no livro-texto, a confusão nesse ponto se dá pela falsa sensação de que não</p><p>conseguimos trabalhar com UML e desenvolver diagramas sem que tenhamos uma ferramenta de</p><p>modelagem.</p><p>Questão 2. Com relação à modelagem de Sistemas Gerenciadores de Banco de Dados, alguns</p><p>pontos do modelo orientado a objetos marcam sua diferença conceitual para o modelo Entidade-</p><p>Relacionamento.</p><p>Com base nas diferenças do modelo orientado a objetos avalie as afirmativas a seguir:</p><p>I – Cada objeto possui um conjunto de códigos que operam sobre este objeto, chamado de método.</p><p>II – Cada objeto possui uma identidade única independente dos valores contidos em seus atributos,</p><p>ou seja, mesmo que um objeto possua os mesmos valores dos atributos de outro objeto no mesmo</p><p>banco de dados, estes possuem identidades diferentes.</p><p>III – A presença de atributos.</p><p>IV – Adoção de mecanismos de relacionamento: composição, agregação e herança.</p><p>É correto apenas o que apenas se afirma em:</p><p>A) I e II.</p><p>B) II e IV.</p><p>C) I, II, III e IV.</p><p>D) I, II, e IV.</p><p>E) I e III.</p><p>Resolução desta questão na plataforma.</p><p>70</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade III</p><p>Unidade III</p><p>5 PROJETOS DE DADOS E CLASSES E PROJETO ARQUITETURAL</p><p>5.1 Projeto de dados e classes</p><p>Como vimos na Unidade I, a fase de projetos é organizada em quatro fases: projeto de dados, projeto</p><p>arquitetural, projeto de interfaces e projeto de componentes.</p><p>Lembrete</p><p>A subdivisão das atividades na fase de projeto é delimitada pelos</p><p>artefatos que produzem.</p><p>Na Unidade II, tratamos do processo da passagem da fase de análise para a fase de projetos, ou seja,</p><p>entramos efetivamente na fase de projetos, na atividade de projeto de dados e classes, com a produção</p><p>do modelo de classes de projeto, realizado a partir do refinamento do diagrama de classes do domínio.</p><p>A partir de agora, trataremos única e exclusivamente das tarefas técnicas de projeto, tendo como</p><p>base o modelo de classes de projeto e dos aspectos dinâmicos do projeto de objetos mapeados até aqui.</p><p>Segundo Pressman (2006, p. 208), a fase de projetos de dados tem como objetivo a geração do</p><p>modelo de dados e a transformação de classes e objetos conceituais em classes e objetos equivalentes</p><p>em projeto.</p><p>Até este momento atingimos a parte de transformação de classes e objetos conceituais em classes e</p><p>objetos equivalentes em projeto; entraremos, agora, na modelagem de dados.</p><p>5.1.1 Introdução ao projeto de dados</p><p>O projeto de dados, ou modelagem de dados, tem como objetivo definir uma estrutura de informações</p><p>necessárias para implementar o sistema de software (PRESSMAN, 2006).</p><p>Em linhas gerais, devemos montar uma estrutura para armazenar, atualizar e recuperar as informações</p><p>do sistema.</p><p>Nesta fase, como estamos tratando de aspectos de construção do projeto, devemos determinar a</p><p>organização, métodos de acesso, associações e alternativas de processamento dessas informações.</p><p>71</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Como vimos, boa parte dessas atividades é feita pelo SGBD, que é o responsável por prover os</p><p>mecanismos de acesso, gerenciamento e processamento das informações em um repositório de dados.</p><p>Todavia, fica a cargo do projeto a adoção de um SGBD que satisfaça as necessidades do sistema de</p><p>software, e faz parte das atribuições técnicas do arquiteto o conhecimento das tecnologias disponíveis</p><p>a serem utilizadas.</p><p>Nesta fase daremos ênfase à organização das informações e em como representar um dicionário de</p><p>dados que dê suporte à resolução do problema pelo sistema de software.</p><p>Projetar um banco de dados também não é uma tarefa que pode ser realizada sem organização.</p><p>O processo de projeto de banco de dados pode ser subdividido em três fases: projeto conceitual,</p><p>projeto lógico e projeto físico, como mostra a figura a seguir (ELMASRI; NAVATHE, 2011).</p><p>Projeto conceitual</p><p>Modelo de dados de alto nível</p><p>Esquema interno do SGBD</p><p>Requisitos de dados</p><p>Análise de</p><p>requisitos</p><p>Modelo de dados lógicos de um SGBD específico</p><p>Projeto físico</p><p>SGBD</p><p>Projeto lógico</p><p>(mapeamento do modelo de dados)</p><p>Figura 19 – Projeto de banco de dados</p><p>• Projeto conceitual: tem como objetivo produzir um modelo de alto nível, ou seja, sem detalhes</p><p>específicos de um SGBD, que represente os requisitos de dados. Esses requisitos expressam tudo</p><p>aquilo que deverá ser armazenado pelo sistema, e o modelo de alto nível pode ser utilizado como</p><p>instrumento de validação com a própria área usuária.</p><p>• Projeto lógico: essa fase do projeto utiliza como base o modelo produzido no projeto conceitual</p><p>e monta o modelo de dados de implementação, que contempla detalhes que possam tornar esse</p><p>modelo implementável em um SGBD específico.</p><p>72</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade III</p><p>• Projeto físico: é a implementação do modelo lógico em uma linguagem de programação que</p><p>possa fazer a transação do modelo lógico para o esquema interno do SGBD. É a concretização do</p><p>projeto de dados.</p><p>Atualmente, como já mencionamos, o modelo de dados relacional é um dos modelos mais utilizados</p><p>quando falamos em paradigma de projetos de banco de dados.</p><p>Saiba mais</p><p>Aprofunde seus conhecimentos sobre outros modelos de banco de</p><p>dados, como o modelo orientado a objetos, em:</p><p>ELMASRI, R.; NAVATHE, S. B. Sistemas de banco de dados. 6. ed. São</p><p>Paulo: Addison-Wesley, 2011.</p><p>SILBERSCHATZ, A.; KORTH, H. F.; SUDARSHAN, S. Sistema de banco de</p><p>dados. 5. ed. Rio de Janeiro. Campus, 2006.</p><p>5.1.2 Introdução a banco de dados relacionais</p><p>O modelo entidade relacional enxerga os dados do mundo real como o conjunto: entidade, atributos</p><p>e relacionamento. Cada entidade, ou um conjunto de entidades, gera uma tabela, seus atributos ou</p><p>características são representados por colunas desta tabela e cada linha desta tabela representa uma</p><p>instância dessa entidade.</p><p>A figura a seguir mostra um exemplo de um modelo conceitual, de alto nível, produzido na fase conceitual</p><p>do projeto de banco de dados, e o quadro na sequência explica o significado de cada um desses elementos.</p><p>Suponhamos que o cenário de negócio a ser modelado seja a inscrição de alunos para cursar</p><p>disciplinas. Nesse caso fictício, um aluno pode não estar inscrito em nenhuma disciplina ou pode estar</p><p>inscrito em várias (sem limite preestabelecido), enquanto uma disciplina pode não ter nenhum aluno</p><p>inscrito ou possuir no máximo quarenta inscrições.</p><p>Matrícula Nome NomeTurma</p><p>Aluno</p><p>Cursa</p><p>(0, N) (0, 40)</p><p>Disciplina</p><p>Código</p><p>A A</p><p>B</p><p>D</p><p>C C</p><p>D</p><p>Figura 20 – Modelo Conceitual E-R</p><p>73</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Quadro 7 – Elementos do modelo conceitual E-R</p><p>Letra Descrição</p><p>A Entidades: representação de algo do mundo real.</p><p>B</p><p>Relacionamento: indicação do relacionamento entre duas entidades. No</p><p>exemplo, a relação entre “Aluno” e “Disciplina” é “Cursa”. A leitura que podemos</p><p>fazer deste modelo é: Aluno(s) cursa(m) Disciplina(s) e Disciplina(s) é(são)</p><p>cursada(s) por Aluno(s).</p><p>C</p><p>Atributos: conjunto de características de uma entidade. No exemplo, podemos</p><p>fazer as seguintes leituras:</p><p>- Aluno possui: Matrícula, Nome e Turma;</p><p>- Disciplina possui: Código e Nome;</p><p>Obs: note que os atributos “Matricula” em “Aluno” e “Codigo” em “Disciplina”</p><p>estão sublinhados.</p><p>Esses atributos são “Chaves Primárias” de suas entidades;</p><p>isso quer dizer</p><p>que esses campos são identificadores únicos de uma entidade, ou seja, um</p><p>aluno nunca poderá possuir uma matrícula igual ao outro e um código de</p><p>disciplina nunca poderá ser repetido.</p><p>Os conceitos de chave primária e identificadores únicos, em banco de dados,</p><p>garantem a identidade e a integridade referencial.</p><p>D</p><p>Multiplicidade: denota a proporção, ou a quantificação, do relacionamento</p><p>entre duas entidades. No caso do exemplo, fazemos as seguintes leituras:</p><p>- Um aluno cursa no mínimo zero disciplina e no máximo N (sem número</p><p>preciso) disciplina(s).</p><p>- Uma disciplina é cursada por no mínimo zero aluno e no máximo quarenta.</p><p>Existem as seguintes representações de multiplicidade:</p><p>(0,1): lê-se zero para um;</p><p>(1,1): lê-se um para um;</p><p>(0,N): lê-se zero para N;</p><p>(1,N): lê-se um para N.</p><p>Note que no exemplo da figura anterior os atributos das entidades não possuem tipos de dados;</p><p>não sabemos, por exemplo, se o código da disciplina é um número ou um texto, e essas informações são</p><p>importantes para a conversão dessas entidades em tabelas do SGBD.</p><p>Para isso, seguindo o processo de projeto de banco de dados, precisamos adentrar a fase de projeto</p><p>lógico, para o refinamento do modelo conceitual de tal forma que geremos um modelo lógico mais</p><p>próximo do que será implementado no SGBD.</p><p>No nosso exemplo de disciplina/aluno, suponhamos que esse modelo gere tabelas que, quando</p><p>preenchidas, produzam algo como:</p><p>74</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade III</p><p>Figura 21 – Exemplo de tabelas E-R</p><p>Nesse caso, a partir da figura anterior, podemos pensar, por exemplo, que o código da disciplina é</p><p>um texto e que a matrícula do aluno é um número. Mas isso ainda não é suficiente, isso são apenas</p><p>suposições. Além do mais, a partir desse modelo de tabela simulado, não conseguimos saber quais alunos</p><p>estão matriculados em uma determinada disciplina, nem em quantas disciplinas um determinado aluno</p><p>está matriculado, como indicado pelo modelo conceitual.</p><p>Faz-se necessário o desenvolvimento de um modelo lógico, como mostram o exemplo da figura</p><p>seguinte e o quadro explicativo na sequência.</p><p>Figura 22 – Exemplo de modelo lógico (Diagrama E-R)</p><p>Neste caso, podemos observar a criação de uma terceira entidade, que implementa o relacionamento</p><p>proposto pelo modelo conceitual. Ainda é possível notarmos, nessa entidade, o uso do conceito de chave</p><p>estrangeira (ou foreign key/FK).</p><p>Chave estrangeira pode ser considerada como uma referência à chave primária de outra tabela em</p><p>uma relação entre duas entidades. No caso do nosso exemplo, as chaves primárias “codigo” e “matricula”</p><p>tornam-se referências na entidade “aluno_disciplina”, uma vez que esses atributos são identificadores</p><p>de suas respectivas entidades.</p><p>75</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Podemos notar também a simbologia da representação da cardinalidade. Enquanto no modelo</p><p>conceitual tínhamos a notação da cardinalidade explícita, no modelo lógico temos a representação em</p><p>simbologia.</p><p>A próxima figura mostra a simbologia para representação de cardinalidade e seus respectivos</p><p>significados.</p><p>Cardinalidade Representação</p><p>(0,1)</p><p>(1,1)</p><p>(0,N)</p><p>(1,N)</p><p>Figura 23 – Representação de cardinalidade ER</p><p>Assim, esse modelo lógico, quando simulado em uma estrutura de tabelas e com informações</p><p>fictícias, produz o resultado exibido pela figura a seguir:</p><p>Figura 24 – Exemplos de tabelas E-R</p><p>76</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade III</p><p>A partir do exemplo desta última figura, podemos visualizar quais alunos cursam uma determinada</p><p>disciplina e quais disciplinas um aluno cursa. Todavia, ainda não conseguimos saber os tipos de dados</p><p>dos atributos.</p><p>Precisamos de um modelo mais próximo do SGBD, que é o que o modelo físico se presta a fazer. Um</p><p>exemplo de como seria o modelo físico, implementado a partir da linguagem SQL, utilizando o SGBD</p><p>MySQL, segue na próxima figura:</p><p>Figura 25 – Exemplo de modelo físico E-R</p><p>Se executarmos o script descrito pela figura anterior em um SGBD MySQL, serão criadas três tabelas,</p><p>com seus respectivos atributos, tipos de dados, chaves primárias e chaves estrangeiras.</p><p>Retomando a orientação a objetos, os dados de uma classe têm de ser, muitas vezes, persistidos.</p><p>Persistir um dado é colocá-lo em um meio de guarda permanente, em geral um banco de dados.</p><p>77</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>5.1.3 Bancos de dados relacionais versus orientação a objetos</p><p>Pode-se notar que o modelo relacional e o modelo orientado a objetos possuem certas diferenças,</p><p>por exemplo, no modelo relacional, não temos o armazenamento dos métodos que poderiam agir sobre</p><p>uma determinada classe.</p><p>Em contrapartida, esses modelos possuem semelhanças:</p><p>• Assim como na orientação a objetos, uma entidade possui atributos.</p><p>• Assim como na orientação a objetos, uma entidade possui uma identidade, que pode ser obtida a</p><p>partir de um conjunto de valores de seus atributos. Podemos dizer então que cada linha de uma</p><p>tabela é uma instância de uma entidade, ou um objeto.</p><p>• Assim como na orientação a objetos, as entidades se relacionam.</p><p>É exatamente aqui que está um dos principais problemas na relação entre paradigma orientado a</p><p>objetos e modelo relacional: como representar algumas características da orientação a objetos, herança,</p><p>por exemplo, já que não existe herança em modelos relacionais?</p><p>Uma possível solução para o problema está no banco de dados orientado a objetos. Todavia, como</p><p>vimos, o modelo orientado a objetos ainda é muito incipiente.</p><p>A saída viável é fazer um “mapeamento” entre as classes do modelo orientado a objetos e as entidades</p><p>do modelo relacional. Para fazer a persistência dos dados é necessário mapear as classes cujos objetos</p><p>se deseja persistir em tabelas.</p><p>Quando definimos o modelo de classes de projetos e atribuímos as responsabilidades para cada</p><p>classe dentro do sistema de software, modelamos classes transientes ou que não tenham necessidade</p><p>de persistência, como aquelas que só contêm métodos, classes do tipo controle.</p><p>Lembrete</p><p>Temos três tipos de classes, quando analisamos pela questão</p><p>responsabilidade, no paradigma orientado a objetos: entidade (entity),</p><p>controle (control) e fronteira (boundary).</p><p>Olhando por esse aspecto, classes de fronteira (boundary) geralmente são transientes, bem como as</p><p>classes de controle (control), logo não precisam ser persistidas, pois são compostas, em sua maioria, de</p><p>métodos, e os poucos atributos que possuem não necessitam ser persistidos.</p><p>Outro ponto importante: neste mapeamento, é necessário mapear se todos os atributos serão</p><p>persistidos ou apenas uma parte, pois podem existir atributos em uma classe que não necessariamente</p><p>precisem ser persistidos, que são usados somente no contexto da aplicação.</p><p>78</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade III</p><p>Existem algumas formas de se persistir uma classe em uma ou mais tabelas.</p><p>A situação mais simples é quando uma classe é persistida diretamente em uma tabela; neste caso,</p><p>o único trabalho é verificar quais atributos serão persistidos e eventualmente fazer uma adaptação de</p><p>chave primária, criando ou alterando uma existente.</p><p>A segunda situação é quando temos uma composição de classes que, no caso do modelo</p><p>E-R, denote uma associação do tipo “um para muitos”. Nesse caso, é necessário adicionar uma</p><p>chave estrangeira na extremidade “muitos” para referenciar a chave primária da tabela da outra</p><p>extremidade.</p><p>A terceira situação é quando temos uma composição de classes que, no caso do modelo E-R, denote</p><p>uma associação do tipo “muitos para muitos”. Nesse</p><p>relacionais versus orientação a objetos ..................................................... 77</p><p>5.2 Projeto arquitetural ............................................................................................................................. 81</p><p>5.2.1 Qual o papel da arquitetura? ............................................................................................................. 81</p><p>5.2.2 O que é arquitetura de software? .................................................................................................... 82</p><p>5.2.3 A importância da arquitetura de software ................................................................................... 83</p><p>5.2.4 Processo de arquitetura de software .............................................................................................. 84</p><p>5.2.5 Processo de arquitetura de software em aspectos humanos ............................................... 87</p><p>6 VISÕES DA ARQUITETURA DE SOFTwARE ............................................................................................. 88</p><p>6.1 Visão estática ......................................................................................................................................... 88</p><p>6.1.1 Utilização de padrões na arquitetura de software .................................................................... 89</p><p>6.1.2 Estilo arquitetural ................................................................................................................................... 90</p><p>6.1.3 Estruturação de sistemas em subsistemas e camadas ............................................................ 92</p><p>6.1.4 Introdução a padrões de projeto (design patterns) .................................................................. 96</p><p>6.2 Visão dinâmica ....................................................................................................................................101</p><p>6.2.1 Definindo responsabilidades ............................................................................................................102</p><p>6.2.2 Refinando o diagrama de sequência ............................................................................................103</p><p>6.3 Documentação de arquitetura ......................................................................................................104</p><p>Unidade IV</p><p>7 REFINANDO A MODELAGEM DE ASPECTOS DINÂMICOS DO SOFTwARE ...............................110</p><p>7.1 Diagrama de comunicação .............................................................................................................110</p><p>7.2 Diagrama de máquina de estado .................................................................................................114</p><p>8 PROJETO DE INTERFACES E PROJETO DE COMPONENTES ............................................................121</p><p>8.1 Projeto de interfaces .........................................................................................................................121</p><p>8.1.1 Especificando as interfaces dos objetos ..................................................................................... 122</p><p>8.1.2 Diagrama de pacotes .......................................................................................................................... 123</p><p>8.1.3 Introdução ao projeto de interfaces com o usuário .............................................................. 129</p><p>8.2 Projeto de componentes .................................................................................................................130</p><p>8.2.1 Introdução à componentização e ao reúso de software ..................................................... 130</p><p>8.2.2 Definindo as interfaces externas ................................................................................................... 132</p><p>8.2.3 Diagrama de componentes .............................................................................................................. 133</p><p>8.2.4 Diagrama de distribuição ................................................................................................................. 135</p><p>7</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>APreSentAçãO</p><p>A disciplina Projeto de Sistemas Orientado a Objetos tem como objetivo apresentar ao aluno as boas</p><p>práticas para transformar as necessidades das organizações, inseridas em um mercado cada vez mais</p><p>competitivo, em um projeto de software eficiente, com qualidade de desenvolvimento e, principalmente, que</p><p>possibilite vantagem competitiva à organização, utilizando para isso o paradigma da orientação a objetos.</p><p>Para atingir este objetivo a disciplina começa contextualizando para o aluno os problemas que o</p><p>projeto software enquanto atividade do ciclo de vida do software se propõe a resolver.</p><p>Com o aluno integrado na temática, a disciplina apresenta e discute a importância de as atividades</p><p>de projeto serem executadas de forma organizada dentro de um projeto de software, apresentando</p><p>as principais metodologias e técnicas empregadas no processo de transformação das necessidades da</p><p>organização em sistema de software.</p><p>Conceitos básicos e motivações postos, debate-se a arquitetura de software como fase fundamental</p><p>dentro de um projeto de desenvolvimento, explanando a importância dos modelos e mostrando as</p><p>principais técnicas para modelagem, documentação e padrões utilizados para definição da arquitetura</p><p>de um sistema de software.</p><p>Dentro de todo esse contexto, a disciplina apresenta as tecnologias que dão suporte ao projeto</p><p>orientado a objetos e os diagramas da UML (Unified Modeling Language) como uma ferramenta para</p><p>representação e modelagem de um sistema de software, utilizando-os como ferramenta de apoio em</p><p>todo o processo.</p><p>IntrOduçãO</p><p>Desde que o software se estabeleceu como uma ferramenta importante na estratégia competitiva</p><p>das grandes empresas, a indústria de desenvolvimento vem passando por transformações para atender</p><p>as necessidades cada vez maiores deste mercado.</p><p>O desafio lançado não está mais no simples fato de se desenvolver uma série de linhas de código</p><p>que, agrupadas, compõem um sistema de software, mas sim em desenvolver este software como um</p><p>produto, como uma ferramenta de estratégia competitiva que atenda a uma série de exigências e</p><p>determinados padrões de qualidade.</p><p>O velho paradigma de que “software bom é aquele que funciona” começa a ser quebrado por esses</p><p>padrões de qualidade. Atualmente, o mínimo que se espera de um software é que ele funcione; é o</p><p>mínimo que se exige para que tanto a organização que utiliza o sistema quanto aquela que o desenvolveu</p><p>se mantenham em um mercado cada vez mais competitivo.</p><p>Se o software deve ser enxergado como uma ferramenta de estratégia competitiva em uma grande</p><p>corporação, parece-nos razoável que um projeto não deva tomar um tempo excessivo, afinal de contas,</p><p>em um mercado cada vez mais competitivo, tem a vantagem aquele que larga na frente.</p><p>8</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Seguindo a mesma linha de raciocínio, espera-se que um projeto não tenha custos exorbitantes,</p><p>o que pode inclusive torná-lo inviável. Em casos de projetos malsucedidos, o custo de um processo</p><p>de negócio realizado de forma não automatizada pode ser mais vantajoso que automatizá-lo. Logo,</p><p>podemos notar que o software deve ter boa relação custo-benefício.</p><p>Idealmente, um projeto deve ser executado em um tempo razoável e com um custo viável. Como se</p><p>isso não bastasse, um sistema de software competitivo deve atingir certo nível de qualidade.</p><p>Palavras como manutenibilidade, desempenho, escalabilidade, disponibilidade, dentre outras,</p><p>permeiam, cada vez mais, o universo da engenharia de software e demonstram o nível de qualidade que</p><p>se espera de um sistema de software.</p><p>O nível de qualidade de um sistema de software pode ser traduzido não só pelo nível de atingimento</p><p>de automatização das necessidades de negócio, mapeados na engenharia de requisitos, mas</p><p>caso, é necessário criar uma tabela intermediária</p><p>contendo duas chaves estrangeiras, cada uma relacionada à chave primária de cada classe do</p><p>relacionamento.</p><p>A quarta e última situação é o grande problema do mapeamento E-R/orientado a objetos: como</p><p>mapear herança? Como mapear uma relação?</p><p>Figura 26 – Exemplo de relação de herança a ser mapeada no modelo E-R</p><p>Temos três possíveis soluções.</p><p>Solução A: criar uma entidade única contendo todas as informações, conforme mostra a figura a</p><p>seguir. Neste caso, teríamos uma desvantagem, pois alguns campos ficariam vazios quando fôssemos</p><p>persistir um professor ou um aluno, e isso é péssimo para o desempenho do banco de dados e para o</p><p>79</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>algoritmo tratamento no sistema de software. Como resultado dessa solução, com os dados preenchidos</p><p>na tabela, teríamos o que segue na figura:</p><p>Figura 27 – Resultado da Solução A</p><p>Solução B: criar duas entidades, uma para professor e outra para aluno, como mostra a figura a</p><p>seguir. Eliminaríamos o problema dos campos vazios, todavia teríamos os mesmos atributos mapeados</p><p>em entidades diferentes, o que também não é produtivo. Como resultado dessa solução, com os dados</p><p>preenchidos nas tabelas, teríamos o que segue nas figuras:</p><p>Figura 28 – Resultado da Solução B</p><p>Solução C: criar três entidades, “aluno”, “professor” e uma terceira entidade conceitual “pessoa”.</p><p>Eliminaríamos o problema dos campos vazios, não teríamos os mesmos atributos mapeados em entidades</p><p>diferentes, todavia teríamos a necessidade da criação de um uma terceira entidade, apenas conceitual, e</p><p>teríamos um custo para manter esse modelo. Como resultado dessa solução, com os dados preenchidos</p><p>nas tabelas, teríamos o que segue nas figuras:</p><p>80</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade III</p><p>Figura 29 – Resultado da Solução C</p><p>Dentre as três situações, a que fere menos os princípios da normalização de banco de dados é</p><p>a situação C; de qualquer forma, temos de ter em mente que não existe uma adaptação natural do</p><p>modelo E-R para o modelo OO.</p><p>Observação</p><p>Normalização é o nome que se dá ao processo de organizar e dividir</p><p>as tabelas da forma mais eficiente possível, diminuindo a redundância e</p><p>permitindo a evolução do BD com o mínimo de efeitos colaterais.</p><p>Atualmente existem alguns frameworks, ou bibliotecas prontas, chamados frameworks, de</p><p>persistência, por exemplo, o NHibernate, para aplicações baseadas no Microsoft .Net, e o Hibernate,</p><p>similar, utilizado para soluções desenvolvidas utilizando a plataforma Java.</p><p>O objetivo desses componentes é justamente fazer o mapeamento, de forma automática, do</p><p>modelo orientado a objetos para o E-R e vice-versa, além de abstrair para o desenvolvedor todo o</p><p>81</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>gerenciamento dessas informações no SGDB, ou seja, o próprio framework disponibiliza funções prontas</p><p>para criação, atualização e recuperação das informações do BD para o modelo orientado a objetos, sem</p><p>que o desenvolvedor necessite desenvolver essas funcionalidades.</p><p>Observação</p><p>Atualmente, a interface entre uma aplicação e as funções para</p><p>criação, atualização e recuperação das informações do BD se dá a partir</p><p>do desenvolvimento de consultas baseadas na linguagem SQL, e essas</p><p>consultas são desenvolvidas pela equipe de construção.</p><p>A única e principal ressalva a ser feita na adoção desses mecanismos é que, muito embora sejam</p><p>facilitadores na produtividade do desenvolvimento, eles passam a não ter um bom desempenho, uma</p><p>vez que uma das partes do modelo não está benfeita.</p><p>Normalmente, quando estamos tratando de sistemas legados, ou que já existam há algum tempo,</p><p>é comum que nos deparemos com modelos E-R, ou até mesmo modelos de classes, desenvolvidos sem</p><p>utilizar as melhores práticas.</p><p>Nesses casos, não é recomendável a utilização destes frameworks. Em muitos casos, na fase de</p><p>projeto, tecnologia alguma substitui a capacidade analítica da equipe de projeto.</p><p>5.2 Projeto arquitetural</p><p>Neste subtópico avançaremos para a fase de projeto arquitetural, que é a fase seguinte à de projeto</p><p>de dados e classes que debatemos no subtópico anterior.</p><p>5.2.1 Qual o papel da arquitetura?</p><p>Na engenharia civil, arquitetura é a arte de projetar e construir prédios, edifícios ou outras estruturas,</p><p>a constituição de um edifício ou a contextura de um todo (MICHAELIS, 1998).</p><p>Analogamente à arquitetura na engenharia civil, a arquitetura desempenha papel importante</p><p>também na engenharia de software.</p><p>Na engenharia de software, o papel da arquitetura é bem semelhante ao da arquitetura na engenharia</p><p>civil, ou seja, projetar estruturas, a constituição de um software ou a contextura de um todo, assim</p><p>como na arquitetura da engenharia civil.</p><p>A figura a seguir mostra exatamente onde a arquitetura se encontra dentro do contexto do ciclo de</p><p>vida de um projeto de software.</p><p>82</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade III</p><p>Implementação</p><p>Necessidade</p><p>Arquitetura</p><p>Figura 30 – Disposição da arquitetura dentro de um projeto de software</p><p>Arquitetura de software é o nome dado à disciplina fundamental da fase de projeto arquitetural.</p><p>5.2.2 O que é arquitetura de software?</p><p>Algumas das definições clássicas de arquitetura de software são:</p><p>• Arquitetura de software é uma representação do sistema que auxilia na compreensão de como ele</p><p>irá se comportar (SEI, 2015a).</p><p>• Arquitetura de software é uma descrição de como um sistema de software é organizado</p><p>(SOMMERVILLE, 2010).</p><p>• Arquitetura é a organização fundamental de um sistema incorporada em seus componentes,</p><p>seus relacionamentos com o ambiente, e nos princípios que conduzem seu projeto, construção e</p><p>evolução (ISO, 2011b).</p><p>• Arquitetura de software pode ser definida como uma representação, em alto nível de abstração,</p><p>dos componentes de um sistema de software, suas propriedades externamente visíveis, e como</p><p>estes interagem com o objetivo de resolver as necessidades, ou problema de um cenário de negócio</p><p>(BASS; CLEMENTS; KAZMAN, 2010).</p><p>Observação</p><p>A norma ISO/IEC/IEEE 42010 (2011b) tem como objetivo padronizar a</p><p>prática da arquitetura definindo termo, apresentando uma base conceitual</p><p>para expressar, comunicar e rever arquiteturas e especificações de requisitos</p><p>que se aplicam às descrições de arquitetura, frameworks arquiteturais e</p><p>linguagens de descrição de arquitetura. Esta norma substitui a norma ISO</p><p>1471 de 2000.</p><p>Todas as definições de arquitetura de software corroboram um conceito único: o de projeto de</p><p>software.</p><p>83</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Está claro que a arquitetura de um software não é o software em si, mas sim a representação, o</p><p>modelo, a organização do software que será efetivamente construído.</p><p>Mais importante do que pensar em componentes de um sistema de software e como estes se</p><p>comunicam é pensar na natureza desses componentes, quais são suas responsabilidades, qual é o</p><p>significado de suas conexões e qual o significado da forma como estes componentes estão distribuídos</p><p>no modelo (BASS; CLEMENTS; KAZMAN, 2010).</p><p>O tema Arquitetura de Software é bem amplo. O livro de Bass, Clements e Kazman (2010), que é uma</p><p>das principais referências no tema, entende que pensar na natureza dos componentes é uma forma</p><p>diferente de se pensar em arquitetura de software.</p><p>Os autores ainda defendem que essa abordagem deve ter ênfase nos requisitos não funcionais, ou</p><p>atributos de qualidade, do problema a ser resolvido.</p><p>Esta ênfase nos atributos de qualidade dá-se pela maior dependência destes em</p><p>relação à estrutura</p><p>do software, uma vez que as funcionalidades, ou requisitos funcionais, podem ser implementadas em</p><p>um número maior de alternativas, sendo assim menos dependentes das decisões arquiteturais (BASS;</p><p>CLEMENTS; KAZMAN, 2010).</p><p>5.2.3 A importância da arquitetura de software</p><p>A importância fundamental da arquitetura de um software é a mesma importância que a arquitetura</p><p>tem na construção de uma casa: a arquitetura, ou o projeto arquitetural, representado por uma planta,</p><p>por exemplo, é o principal guia para a construção.</p><p>Assim como a arquitetura na engenharia civil, a arquitetura de software produz modelos e organiza</p><p>a estrutura de um software de tal forma que sirva como o principal guia para a construção.</p><p>Segundo o SEI (2015a), a arquitetura de um sistema de software serve como modelo tanto para o</p><p>projeto quanto para a construção, facilitando inclusive a divisão das tarefas a serem realizadas pela</p><p>equipe de projeto e de construção.</p><p>Além do mais, a arquitetura é o principal meio para o atingimento de qualidade de um sistema</p><p>como: desempenho, manutenibilidade e segurança. Nenhum índice de qualidade pode ser alcançado</p><p>sem uma visão arquitetural unificada (SEI, 2015a).</p><p>Observação</p><p>Note que, assim como Bass, Clements e Kazman (2010), o SEI (2015a)</p><p>bate na tecla de que a arquitetura de software está intimamente ligada aos</p><p>atributos de qualidade, ou requisitos não funcionais, que podem ser vistos,</p><p>por exemplo, na norma ISO 25010 (ISO, 2011a).</p><p>84</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade III</p><p>Bass, Clements e Kazman (2010) pontuam a importância da arquitetura de software:</p><p>• Facilita a comunicação entre os envolvidos no projeto.</p><p>• Representa, em escala menor e compreensível, a forma pela qual os componentes de um sistema</p><p>são estruturados e interagem.</p><p>• Modela e coloca em evidência as decisões de projeto como fator fundamental para o sucesso do</p><p>sistema de software.</p><p>Alguns outros benefícios de uma arquitetura bem-definida para um sistema de software:</p><p>• Facilita a evolução do software.</p><p>• Facilita o reúso de componentes, logo promove maior produtividade na construção e na</p><p>manutenção, pois também facilita a manutenção.</p><p>• Promove a diminuição do espaço entre as fases de análise e construção e, por consequência, a</p><p>diminuição do retrabalho na construção.</p><p>• Auxilia a gestão do projeto quanto à estimativa de tempo, ao custo e à complexidade do projeto.</p><p>• Promove mitigação e diminuição de riscos.</p><p>5.2.4 Processo de arquitetura de software</p><p>Segundo Albin (2003), a participação de arquitetura de software pode ser dividida em cinco fases, e</p><p>deve ser iniciada antes mesmo da fase de projetos do ciclo de vida da engenharia de software:</p><p>Fases do ciclo de vida da engenharia de software Fases da arquiteura</p><p>Análise de requisitos Pré-projeto</p><p>Projeto</p><p>Análise de domínio</p><p>Projeto esquemático</p><p>Implementação e testes</p><p>Desenvolvimento de projeto</p><p>Construção</p><p>Implantação (sem correspondência)</p><p>Figura 31 – Participação da arquitetura versus fases da engenharia de software</p><p>Participação da arquitetura dentro do ciclo de vida do projeto:</p><p>• Pré-projeto: é comum observarmos que a arquitetura de software participa do ciclo de</p><p>vida de desenvolvimento apenas a partir da fase de projetos. No entanto, é aconselhável</p><p>85</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>que o arquiteto, ou a equipe de arquitetura, participe como observador na fase de análise</p><p>de requisitos. Essa participação é importante, pois possibilita a extração de informações</p><p>técnicas importantes por exemplo, padrões de arquitetura corporativa para integração de</p><p>sistemas, que podem ser importantes para mitigação de custo, tempo de desenvolvimento e</p><p>perfil da equipe.</p><p>• Análise de domínio: o entendimento dos requisitos funcionais fundamentais é ponto crucial para</p><p>definição do modelo de domínio que será utilizado como entrada para a fase de projeto, como</p><p>vimos nas unidades anteriores.</p><p>• Projeto esquemático: criação ou seleção de um modelo de arquitetura. Nessa fase o arquiteto</p><p>deve criar ou escolher um modelo arquitetural que irá direcionar o processo de modelagem</p><p>arquitetural e o desenvolvimento.</p><p>• Desenvolvimento do projeto: nessa fase ocorre a escolha de elementos tecnológicos, como</p><p>frameworks ou componentes de desenvolvimento, que deem suporte à implementação.</p><p>• Construção: a implementação ou construção é orientada pela arquitetura. Ela irá orientar</p><p>tecnologias e todo o processo de desenvolvimento no qual os desenvolvedores estarão</p><p>envolvidos.</p><p>O processo de definição da arquitetura também pode ser subdividido em algumas atividades, que são</p><p>extensões das fases que citamos anteriormente. A figura a seguir mostra a sequência de atividades do</p><p>processo de definição de arquitetura sugerido por Albin (2003), e o quadro na sequência contextualiza</p><p>o objetivo de cada fase.</p><p>Entendimento do problema</p><p>Definição do</p><p>contexto do</p><p>sistema</p><p>Identificação dos</p><p>módulos</p><p>Descrição dos</p><p>componentes e</p><p>dos conectores</p><p>Identificação de elementos do</p><p>projeto e seus relacionamentos</p><p>Avaliação da arquitetura</p><p>Alteração da arquitetura</p><p>Figura 32 – Fases do processo de definição de arquitetura</p><p>86</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade III</p><p>Quadro 8 – Fases do processo de arquitetura</p><p>Fase Descrição</p><p>Entendimento do problema A fase de entendimento do problema deve ser iniciada, idealmente, na fase</p><p>de análise de requisitos, como dissemos anteriormente.</p><p>Identificação de elementos do</p><p>projeto e seus relacionamentos</p><p>Nesta etapa, estabelecemos uma decomposição do sistema em uma linha de</p><p>base que, inicialmente, divide o sistema baseado nos requisitos funcionais.</p><p>A arquitetura de um aplicativo de software é, muitas vezes, representada</p><p>como um conjunto de módulos ou subsistemas interligados, muitas vezes</p><p>chamados de componentes.</p><p>Estes módulos são construções organizacionais que o código-fonte estrutura,</p><p>mas muitas vezes não são diretamente visíveis no código-fonte.</p><p>O código-fonte é uma abstração de instruções de máquina e padrões</p><p>de dados estruturados em termos de gramática de uma linguagem de</p><p>programação.</p><p>Esta fase também pode ser subdividida em três etapas:</p><p>• Definição do contexto do sistema: o contexto do sistema ajuda a descrever</p><p>a aplicação de uma perspectiva externa ao sistema, ou seja, aos usuários do</p><p>sistema. O contexto do sistema é útil para descrever a finalidade do sistema,</p><p>bem como para identificar as interfaces externas deste sistema; o insumo</p><p>para definir o contexto do sistema é a lista de requisitos inicial.</p><p>• Identificação dos módulos: os módulos são unidades de software (binário</p><p>e fonte). Módulos binários são instanciados em tempo de execução, e</p><p>essas instâncias são chamadas de componentes. Um determinado módulo</p><p>interage com os demais a partir de conectores e ele pode atender a uma</p><p>determinada quantidade de situações e possuir mais de um conector.</p><p>• Descrição dos componentes e dos conectores: é importante a descrição</p><p>dos componentes, seu comportamento nas mais diversas situações, bem</p><p>como as condições de seu acionamento, que vêm a ser a descrição de seus</p><p>conectores. A partir dessa descrição podemos avaliar se um componente</p><p>possui alto ou baixo acoplamento e alta ou baixa coesão.</p><p>Avaliação da arquitetura A atividade de avaliação da arquitetura tem como objetivo verificar possíveis</p><p>pontos frágeis da arquitetura, para melhoria.</p><p>Alteração da arquitetura A alteração da arquitetura vem em decorrência dos possíveis pontos frágeis</p><p>encontrados na fase de avaliação.</p><p>Saiba mais</p><p>A avaliação de arquitetura de um sistema de software deve, por boa</p><p>prática, seguir um método ou modelo de referência. Um exemplo de modelo</p><p>de referência para avaliação de arquitetura é o ATAM; mais informações</p><p>podem ser encontradas em:</p><p>SOFTWARE ENGINEERING INSTITUTE (SEI). Architecture tradeoff analysis</p><p>method, 2015b. Disponível em: . Acesso em: 4 maio 2015.</p><p>Nos próximos capítulos, daremos ênfase ao detalhamento da fase de identificação de elementos do</p><p>projeto e aos seus relacionamentos.</p><p>87</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>5.2.5 Processo de arquitetura de software em aspectos humanos</p><p>O processo de arquitetura de software, bem como as demais atividades desenvolvidas ao longo de</p><p>todo o ciclo de desenvolvimento do projeto, possuem alta dependência do fator humano.</p><p>Segundo o OpenUP ([s.d.]a), existem alguns interessados no processo de definição de arquitetura de</p><p>um sistema de software: analistas de requisitos, desenvolvedores, gerentes de projetos e arquitetos de</p><p>software.</p><p>Existem algumas divergências quanto à participação do gerente de projetos nesse processo, uma vez</p><p>que se trata de uma atividade de cunho estritamente técnico.</p><p>Na verdade, se levarmos em consideração o papel da arquitetura de software dentro do projeto de</p><p>software, veremos que o gerente de projeto é um dos principais envolvidos no processo de definição</p><p>de arquitetura.</p><p>Lembrete</p><p>O fato de um papel envolver interesse em um processo não quer dizer</p><p>que ele seja responsável direto por desempenhar uma determinada função.</p><p>No caso da arquitetura, lembramos que um de seus principais benefícios</p><p>é auxiliar a gestão do projeto quanto à estimativa de tempo, ao custo e à</p><p>complexidade do projeto; logo, o gerente de projeto é um interessado no</p><p>processo de arquitetura.</p><p>Obviamente, o papel principal durante o projeto arquitetural é do arquiteto de software. Mas, afinal</p><p>de contas, quem é o arquiteto? Quais são suas responsabilidades? Quais são as habilidades necessárias</p><p>para ser um arquiteto de software?</p><p>Para definirmos quem é o arquiteto de software, vamos dividir a visão da seguinte forma:</p><p>primeiramente sob a ótica do projeto em que atua, e depois sob a ótica de sua área de atuação.</p><p>Sob o ponto de vista do projeto em que atua, o arquiteto tem a obrigação de:</p><p>• Conhecer os aspectos culturais do seu cliente.</p><p>• Conhecer as estratégias de mercado do cliente e o que ele pretende com software.</p><p>• Conhecer as limitações de tecnologia e infraestrutura do cliente.</p><p>• Conhecer o domínio do negócio e do problema sobre o qual pretende promover uma solução.</p><p>88</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade III</p><p>Já sob o ponto de vista da área de atuação, o arquiteto tem a obrigação de:</p><p>• Manter-se constantemente atualizado a respeito das metodologias, tecnologias, soluções e</p><p>plataformas de desenvolvimento.</p><p>• Conhecimento nível sênior em engenharia de software, que compreende conhecimento em</p><p>pessoas, ferramentas e processos inerentes à engenharia de software.</p><p>As responsabilidades do arquiteto no projeto arquitetural, além de converter os requisitos do cliente</p><p>em projeto de software, são:</p><p>• Promover um estudo sobre a viabilidade das soluções técnicas adotadas, a chamada prova de</p><p>conceitos.</p><p>• Avaliar as tendências tecnológicas, em vista das soluções adotadas no projeto, sob o ponto de</p><p>vista de competitividade do produto a ser desenvolvido.</p><p>• Buscar o aumento do tempo de vida útil do software.</p><p>6 VISÕES DA ARQUITETURA DE SOFTWARE</p><p>Como vimos, a arquitetura de um sistema de software define os componentes que formarão este</p><p>sistema de software. Estes componentes podem ter o menor nível de composição, dependendo do nível</p><p>de abstração utilizado nessa composição.</p><p>Esses componentes podem ser divididos em dois grupos: estáticos e dinâmicos.</p><p>• A visão estática da arquitetura promove a visão da organização dos componentes do software</p><p>e de suas relações com elementos de dados (banco de dados, arquivos-texto etc.) com sistemas</p><p>de hardware e com outros sistemas de software. Além, claro, de promover a visão de como estes</p><p>componentes se relacionam entre si.</p><p>• A visão dinâmica da arquitetura promove a visão comportamental do sistema e de seus componentes</p><p>durante a execução de uma determinada ação. Nessa visão, definimos como os componentes do</p><p>sistema reagem a eventos internos e externos e ainda a forma como eles se comunicam entre</p><p>si, ou seja, o protocolo de comunicação interno, e até mesmo como eles se comunicam com</p><p>componentes externos ao domínio do software, chamado de protocolo de comunicação externa.</p><p>6.1 Visão estática</p><p>A definição da estrutura arquitetural estática de uma solução não deve ser uma atividade executada</p><p>de forma aleatória, sem um estudo prévio.</p><p>Projetar uma estrutura de software significa escolher as alternativas de soluções adequadas e</p><p>inerentes ao domínio do problema, e esse domínio possui inúmeras variantes, por exemplo, os aspectos</p><p>89</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>culturais, a limitação tecnológica e de infraestrutura do cliente e a expectativa de competitividade do</p><p>cliente em relação ao software a ser desenvolvido.</p><p>Essas alternativas de soluções devem validadas antes que sejam utilizadas através de provas de</p><p>conceitos (poc) ou mesmo a partir de soluções que tenham sido previamente validadas.</p><p>Soluções previamente validadas podem ser: frameworks, linguagens, estilos e principalmente</p><p>padrões. Definir a arquitetura de software passa principalmente por saber utilizar padrões.</p><p>6.1.1 Utilização de padrões na arquitetura de software</p><p>Utilização de padrões e padronização é um conceito amplamente utilizado por outras engenharias.</p><p>A engenharia civil, por exemplo, possui uma gama de padrões para resolver o problema de distribuição</p><p>elétrica de uma residência, assim como a engenharia elétrica possui um conjunto de soluções-padrão</p><p>para comunicação entre componentes eletrônicos em uma placa de circuito.</p><p>Padrões são determinadas soluções que comprovadamente funcionam para resolver um</p><p>determinado problema. Ressaltamos, aqui, que se trata de determinadas soluções para determinados</p><p>problemas.</p><p>No entanto, pode surgir uma dúvida: uma determinada solução que comprovadamente resolve um</p><p>determinado problema é garantia de solução para outros problemas?</p><p>Esse é o principal dilema para o uso de padrões na arquitetura de software, pois existe a tendência</p><p>em se usar soluções que garantem a resolução de um determinado problema para resolver outros</p><p>problemas.</p><p>Utilizar dessa maneira um padrão na arquitetura de software é como utilizar um medicamento errado</p><p>ou utilizar o medicamento certo em dose errada para o tratamento de uma determinada enfermidade.</p><p>Gamma et al. (1995), uma das principais referências em padrões na arquitetura de software, definem</p><p>padrão como uma solução reutilizável descrita com base em três partes: um contexto, um problema e</p><p>uma solução.</p><p>• Contexto: estende o problema a ser solucionado, apresentando situações de ocorrência desses</p><p>problemas.</p><p>• Problema: determinado por um sistema de forças, em que estas forças estabelecem os aspectos</p><p>do problema que devem ser considerados.</p><p>• Solução: mostra como resolver o problema recorrente e como balancear as forças associadas a ele.</p><p>90</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade III</p><p>Observação</p><p>Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides, autores do</p><p>livro Design Patterns: Elements of Reusable Object-Oriented Software, são</p><p>considerados as maiores autoridades e precursores na utilização de projetos</p><p>em arquitetura de software. Este grupo foi apelidado de gang of four (GoF)</p><p>ou grupo dos quatro e é tratado assim na literatura específica da área.</p><p>A utilização de padrões na arquitetura de software tem como objetivos principais resolver problemas</p><p>macros</p><p>comuns a todos os sistemas de software, como: produtividade, reúso, redução de complexidade</p><p>e geração de um protocolo de comunicação entre todos os envolvidos em um projeto de software. A</p><p>opção pela utilização de um determinado padrão ou de um conjunto de padrões é chamada de decisão</p><p>arquitetural.</p><p>O uso de um conjunto de padrões que resolve um determinado problema é chamado de estilo</p><p>arquitetural ou modelo arquitetural.</p><p>6.1.2 Estilo arquitetural</p><p>Estilo arquitetural, modelo arquitetural ou ainda padrão arquitetural é a organização, em um alto</p><p>nível de abstração, de um sistema de software em um conjunto finito de subsistemas. Essa organização</p><p>especifica as responsabilidades, regras de organização e o relacionamento entre estes subsistemas</p><p>(BUSCHMANN et al., 1996).</p><p>Buschmann et al. (1996) aponta que um padrão arquitetural, além de auxiliar no desenvolvimento da</p><p>estrutura fundamental de um sistema de software, auxilia no atendimento de um atributo de qualidade</p><p>deste sistema, por exemplo, manutenibilidade.</p><p>O benefício da aplicação de um estilo arquitetural dá-se pela capacidade de reúso; logo, pela</p><p>produtividade que ele proporciona.</p><p>Um estilo arquitetural visa à solução de um problema em um determinado contexto, todavia tem</p><p>sua ênfase no nível estrutural da solução, não adentrando o nível de implementação, razão que lhe</p><p>confere maior possibilidade de reúso no caso de este problema também existir em um contexto de</p><p>negócio diferente do original (BUSCHMANN et al., 1996).</p><p>Os principais estilos arquiteturais, extraídos de Buschmann et al. (1996), são classificados em quatro</p><p>categorias. Essas categorias representam contextos de problemas com características similares, por</p><p>exemplo, a necessidade de separação do sistema em componentes ou a necessidade de apoiar melhor a</p><p>interação humano-computador, e um estilo pode se encaixar em mais de uma classificação. O seguinte</p><p>mostra o agrupamento desses estilos e uma breve descrição de cada estilo arquitetural.</p><p>91</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Quadro 9 – Estilos arquiteturais</p><p>Categoria Estilo arquitetural</p><p>From mud to structure</p><p>(Da “lama” à estrutura)</p><p>Camadas ou Layers</p><p>Pipes and Filters</p><p>Blackboard</p><p>Sistemas distribuídos</p><p>Broker</p><p>Microkernel</p><p>Pipes and Filters</p><p>Sistemas interativos</p><p>Model-View-Controller (MVC)</p><p>Presentation-Abstraction-Control (PAC)</p><p>Sistemas adaptáveis</p><p>Reflection</p><p>Microkernel</p><p>• Camadas ou Layers: padrão que promove a divisão em níveis de abstração, em que o critério para</p><p>essa divisão é a responsabilidade de cada nível, ou camada (BUSCHMANN et al., 2007).</p><p>• Pipes and Filters: este padrão promove a divisão de cada atividade da aplicação em um passo</p><p>a passo de processamento de informações. Cada passo é uma unidade de processamento que</p><p>recebe, processa e devolve uma informação que serve de entrada para o próximo. Esse processo</p><p>gera uma cadeia denominada pipeline (BUSCHMANN et al., 2007).</p><p>• Blackboard: neste padrão são montadas soluções para uma tarefa através do uso da heurística</p><p>computacional. Essas soluções são chamadas hipóteses e são alimentadas gradualmente através</p><p>de algoritmos de pequenos componentes do sistema e armazenadas em uma área de memória</p><p>chamada blackboard. A solução da tarefa é colaborativa, dada pelo conjunto dessas hipóteses,</p><p>originadas de um conjunto de componentes da aplicação (BUSCHMANN et al., 2007).</p><p>• Broker: promove o encapsulamento de detalhes da infraestrutura de comunicação e a separação</p><p>desta das funcionalidades da aplicação (BUSCHMANN et al., 2007).</p><p>• Microkernel: promove a criação de um componente fechado com todos os serviços fundamentais</p><p>para a aplicação, esse componente é chamado microkernel. Outras funcionalidades específicas</p><p>são distribuídas em outros componentes da aplicação (BUSCHMANN et al., 2007).</p><p>• Model-View-Controller (MVC): propõe a divisão lógica da aplicação em três camadas: model, view</p><p>e controller. A camada Model ou modelo é responsável por objetos que representem o domínio</p><p>da aplicação, por exemplo, as regras de negócio; a camada View ou visão representa a interface</p><p>com o usuário; e a camada Controller tem como objetivo o gerenciamento do fluxo da aplicação</p><p>(BUSCHMANN et al., 2007).</p><p>• Presentation-Abstraction-Control (PAC): propõe a divisão da aplicação em componentes, em que</p><p>cada qual tem três divisões lógicas: presentation, abstraction e control. A camada Presentation ou</p><p>92</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade III</p><p>apresentação é responsável pela interface com o usuário, a camada Abstraction ou abstração</p><p>é responsável por objetos que representam o domínio da aplicação, por exemplo, as regras de</p><p>negócio, e a camada Control ou controle é responsável pelo fluxo da solução e comunicação</p><p>entre os componentes da solução. O padrão PAC difere do MVC em um ponto: permite que cada</p><p>componente seja uma célula de processamento, ou thread independente; pode-se dizer que</p><p>cada componente é uma implementação do padrão MVC (COUTAZ, 1987).</p><p>• Reflection: propõe a separação da aplicação em duas camadas, denominadas metanível e nível-base.</p><p>A camada metanível tem os chamados meta-objetos, que são objetos cujas responsabilidades estão</p><p>ligadas a características estruturais, comportamentais e de estados da aplicação. A camada-base</p><p>contém as funcionalidades da aplicação (BUSCHMANN et al., 2007).</p><p>Observação</p><p>Esta disciplina não tem como objetivo principal a formação de arquiteto</p><p>de software; para tal, é preciso maior especialização em algumas áreas e</p><p>disciplinas específicas. Nosso objetivo principal é fazer você ter o primeiro</p><p>contato com o tema e na sua vida profissional saiba entender e seguir um</p><p>estilo adotado em um sistema de software.</p><p>De todos esses estilos, nos aprofundaremos em um dos estilos arquiteturais mais utilizados</p><p>atualmente: arquitetura em camadas, que tem sua importância por ser uma arquitetura-base para</p><p>outros estilos, como MVC e PAC.</p><p>6.1.3 Estruturação de sistemas em subsistemas e camadas</p><p>Antes de explorarmos a solução, vamos debater um pouco do problema que teremos de resolver.</p><p>Imagine a seguinte situação: você é contratado para desenvolver um simples sistema de cadastro de</p><p>funcionários. Nesse sistema, terá apenas de inserir informações básicas de um funcionário, como nome,</p><p>CPF, RG, número do PIS e salário; no requisito salário, o usuário do sistema entra com o salário bruto</p><p>e o sistema automaticamente calcula o salário líquido a partir de algumas regras como desconto de</p><p>imposto de renda e INSS. Suponhamos ainda que esse sistema seja um sistema web.</p><p>Você então desenvolve uma página web e dentro dessa página você desenvolve as regras de negócio</p><p>para cálculo, validações de campos obrigatórios, de consistência de CPF, efetua conexão com o banco</p><p>de dados e insere um registro no repositório de informações.</p><p>Até o momento, aparentemente, tudo está normal, afinal de contas, todos os requisitos do usuário</p><p>foram atendidos e o sistema se dispõe a resolver o problema proposto.</p><p>Imaginemos agora que nesse sistema seja acrescido o cadastro de plano de previdência privada,</p><p>que está associado ao salário líquido do funcionário. Aparentemente, não há problema algum, exceto</p><p>93</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>pelo fato de que você não terá como reutilizar o código para implementar o cálculo do salário líquido</p><p>do funcionário, o que não aparenta ser um grande problema, pois você pode copiar e colar o código de</p><p>uma página para outra.</p><p>Agora o sistema está funcionando normalmente, a operação dia a dia ocorre sem mais problemas,</p><p>até que um determinado dia ocorre uma mudança.</p><p>É comum a ocorrência de mudanças na legislação, que acabam por acarretar modificações nos</p><p>sistemas de informação que porventura</p><p>utilizem ou trabalhem com informações governamentais.</p><p>Pois bem, eis que ocorre uma mudança hipotética no cálculo do imposto de renda e do INSS, o que</p><p>interfere diretamente no cálculo do salário líquido dos funcionários.</p><p>Aproveitando esse momento, seu cliente decide, já que o sistema será alterado, solicitar algumas</p><p>mudanças no layout das páginas web, como mudança no padrão de cores, imagens e melhoria na</p><p>usabilidade. Já que estamos em um momento de mudança, o diretor de TI do seu cliente decide resolver</p><p>um antigo problema: a mudança do fornecedor do SGDB e a padronização dos nomes das tabelas do</p><p>banco de dados.</p><p>As alterações não parecem complexas e na verdade elas realmente não são, todavia você esbarra,</p><p>agora, em alguns problemas:</p><p>• Você não se lembra em quantos pontos do código a regra de cálculo de salário líquido é executada.</p><p>O sistema cresceu demais, outras páginas foram criadas, outras regras, implementadas, enfim,</p><p>você terá de procurar todos os pontos, alterá-los e testá-los.</p><p>• Você tem um alto acoplamento de fatores que não têm nenhuma relação, como o banco de dados</p><p>e suas páginas web. Como a parte de banco de dados está na página web, você acabou criando</p><p>uma dependência indireta de componentes que não necessitam um do outro para funcionar. Na</p><p>prática, a mudança no banco de dados não deveria influenciar a sua página web, mas, da forma</p><p>como está construído, você necessariamente terá de testar tudo novamente, uma vez que haverá</p><p>alteração no código-fonte da página.</p><p>• Você monta um cronograma com as atividades sequenciais, aumentando o custo da manutenção.</p><p>Por quê? Porque é impossível dividir e paralelizar as tarefas de alteração da regra de negócio do</p><p>cálculo de impostos, a alteração das páginas e a alteração do banco de dados, uma vez que todas</p><p>elas serão feitas nos mesmos componentes do software, ou seja, nas páginas web.</p><p>O problema por que você está passando, infelizmente, é muito comum de encontrar na nossa vida</p><p>profissional. O seu sistema possui:</p><p>• Alto acoplamento e baixa coesão: quando existem dependências demais de tecnologias e</p><p>componentes que, em tese, não deveriam depender, pois possuem independência funcional umas</p><p>das outras.</p><p>94</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade III</p><p>• Baixa manutenibilidade: ocorre quando a sua produtividade na manutenção é baixa, você tem</p><p>de procurar todos os pontos do código que devem ser alterados e é impossível que se altere um</p><p>componente sem que o todo seja afetado.</p><p>• Baixo reúso: é quando seu sistema basicamente não possui reúso, lembrando que copiar e colar</p><p>um trecho de código não pode ser considerado reúso, mas, meramente, uma cópia, uma facilidade</p><p>para que você não precise digitar todo o código novamente.</p><p>Imaginemos então que pudéssemos separar em uma “caixa” todas as classes que fossem</p><p>relacionadas a páginas web, em uma segunda “caixa” todas as classes que executassem algum</p><p>tipo de regra de negócio e em uma terceira todas as classes que fizessem interface com o banco</p><p>de dados, e que essas “caixas” tivessem um protocolo de comunicação entre elas, como mostra a</p><p>figura a seguir:</p><p>Páginas web</p><p>Regras de negócio</p><p>Banco de dados</p><p>Figura 33 – Organização em “caixas”</p><p>Neste caso, teríamos resolvido alguns problemas:</p><p>• Divisão de responsabilidades: cada “caixa” teria uma responsabilidade bem-definida.</p><p>• Baixo acoplamento: as “caixas” teriam apenas as dependências necessárias, por exemplo, as</p><p>páginas web não precisariam depender do banco de dados e vice-versa.</p><p>• Boa manutenibilidade: agora é possível saber exatamente em que “caixa” se encontram os</p><p>componentes responsáveis por fazer algum tipo de cálculo ou executar alguma regra de negócio,</p><p>bem como é possível paralelizar as atividades, cada equipe cuida da manutenção de uma “caixa”:</p><p>uma cuida do banco de dados, outra das páginas web e uma terceira das mudanças nas regras de</p><p>negócio. O trabalho é mais produtivo.</p><p>• Reúso: os componentes podem ser reutilizáveis, ou seja, você pode simplesmente usar um</p><p>componente da “caixa” regra de negócio de quantas páginas web você quiser, com a certeza de</p><p>que o código implementado é o mesmo, sem ter de utilizar o artifício de copiar o código.</p><p>95</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Notamos que a simples decomposição das classes e a organização delas em estruturas conceituais</p><p>de acordo com as suas responsabilidades já resolve boa parte dos problemas.</p><p>É como se dividíssemos o nosso sistema em camadas, em que cada “caixa” corresponde a uma</p><p>camada. Esse é o estilo arquitetural de camadas, ou arquitetura três camadas, que possui a estrutura</p><p>final, representada na figura a seguir:</p><p>Camada de apresentação</p><p>Ob</p><p>je</p><p>to</p><p>s d</p><p>e</p><p>ne</p><p>gó</p><p>ci</p><p>o</p><p>Camada de negócios</p><p>Camada de integração</p><p>Figura 34 – Arquitetura em camadas</p><p>Nesta arquitetura temos três camadas principais:</p><p>• Camada de apresentação: que contém classes responsáveis pela interação com o usuário, como</p><p>páginas web, formulários etc.</p><p>• Camada de negócios: que contém classes responsáveis por execução de regras de negócio, como</p><p>cálculos, validações etc.</p><p>• Camada de integração: que contém classes responsáveis por fazer integração com tecnologias</p><p>externas ao sistema, como banco de dados, serviços web, além de outros sistemas ou dispositivos</p><p>de hardware.</p><p>Definimos que as camadas se comunicarão através de um protocolo e que esse protocolo é definido</p><p>pela camada auxiliar de objetos de negócio. Essa camada é composta por objetos cuja finalidade é</p><p>apenas transportar informação, sem executar nenhuma regra, sem fazer nenhuma interface externa.</p><p>São as nossas classes do tipo entidade, ou entity.</p><p>No nosso exemplo, poderíamos ter nessa camada uma classe “Funcionário” apenas com os atributos:</p><p>nome, CPF, RG, número do PIS, salário bruto e salário líquido:</p><p>96</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade III</p><p>Funcionario</p><p>+ nome: String</p><p>+ CPF: int</p><p>+ RG: int</p><p>+ salario_bruto: double</p><p>+ salario_liquido: double</p><p>Figura 35 – Classe “Funcionario”</p><p>Lembrete</p><p>Podemos atribuir responsabilidades às classes em um modelo de projeto,</p><p>que são: entidade (entity), controle (control) e fronteira (boundary).</p><p>Ainda na linha das responsabilidades das classes, seria correto afirmar que, nas camadas de</p><p>integração e de apresentação, teremos única e exclusivamente objetos do tipo fronteira (boundary),</p><p>e, na camada de negócios, apenas objetos do tipo controle (control).</p><p>A arquitetura em camadas é muito importante; por ora, direcione seus esforços a entender o</p><p>conceito, que é simples.</p><p>Saiba mais</p><p>Aprofunde seus conhecimentos sobre arquitetura em camadas</p><p>utilizando a plataforma Microsoft .Net em:</p><p>.</p><p>6.1.4 Introdução a padrões de projeto (design patterns)</p><p>Padrão de projeto, ou design pattern, é a menor estrutura arquitetural proveniente dos subsistemas</p><p>de um sistema de software e do relacionamento entre eles (BUSCHMANN et al., 1996).</p><p>É semelhante aos estilos arquiteturais em todos os pontos, todavia difere pelo nível de abstração.</p><p>Ao passo que um estilo arquitetural tem ênfase no nível estrutural da solução, o padrão de projeto</p><p>tem ênfase na estrutura do subsistema da solução (BASS; CLEMENTS; KAZMAN, 2010; BUSCHMANN</p><p>et al., 1996).</p><p>A exemplo do estilo arquitetural, o padrão de projeto não entra no nível de implementação, sendo</p><p>independente de qualquer tipo de tecnologia ou linguagem, razão pela qual possibilita seu reúso em</p><p>97</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>diversos contextos de problemas, além de promover a redução da complexidade da solução através</p><p>da decomposição de</p><p>subsistemas de maior complexidade em componentes de menor complexidade</p><p>(BUSCHMANN et al., 1996).</p><p>Gamma et al. (1995) propõem um catálogo com 23 padrões de projetos, organizados em quatro</p><p>categorias, que representam contextos de uso com características similares. O quadro a seguir mostra</p><p>o agrupamento desses padrões:</p><p>Quadro 10 – Padrões de projeto</p><p>Categoria Padrão de projeto</p><p>Padrões para criação</p><p>Abstract factory</p><p>Builder</p><p>Factory method</p><p>Prototype</p><p>Singleton</p><p>Padrões estruturais</p><p>Adapter</p><p>Bridge</p><p>Composite</p><p>Decorator</p><p>Facade</p><p>Flyweight</p><p>Proxy</p><p>Padrões comportamentais</p><p>Chain of responsibility</p><p>Command</p><p>Interpreter</p><p>Iterator</p><p>Mediator</p><p>Memento</p><p>Observer</p><p>State</p><p>Strategy</p><p>Template method</p><p>Visitor</p><p>Segue uma breve descrição de cada padrão de projeto apresentado no quadro anterior:</p><p>• Abstract factory: padrão que provê uma interface para criação de famílias de objetos relacionados</p><p>ou dependentes sem que haja necessidade de discriminação de suas classes concretas (GAMMA et</p><p>al., 1995).</p><p>98</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade III</p><p>• Builder: propõe a separação da construção de um objeto complexo de sua representação, assim,</p><p>o mesmo processo de criação pode criar diferentes representações (GAMMA et al., 1995).</p><p>• Factory method: padrão que provê uma interface para criação de um objeto, esta atividade fica a</p><p>cargo de subclasses, que decidem quais classes devem ser instanciadas (GAMMA et al., 1995).</p><p>• Prototype: propõe a criação de objetos através da instância de um protótipo. Instâncias de novos</p><p>objetos são criadas pela cópia deste protótipo (GAMMA et al., 1995).</p><p>• Singleton: padrão que promove a garantia de que uma classe terá uma única instância dentro da</p><p>aplicação e propõe um ponto de acesso único de todos os pontos da aplicação à instância dessa</p><p>classe (GAMMA et al., 1995).</p><p>• Adapter: propõe a conversão da interface de uma classe para outra interface esperada pelo cliente</p><p>(GAMMA et al., 1995).</p><p>• Bridge: promove a separação da abstração de uma classe de sua implementação (GAMMA et al.,</p><p>1995).</p><p>• Composite: padrão que propõe a composição de um objeto em uma árvore hierárquica que</p><p>representa o conceito todo/parte desse objeto (GAMMA et al., 1995).</p><p>• Decorator: propõe que comportamentos sejam adicionados a um objeto de forma dinâmica</p><p>(GAMMA et al., 1995).</p><p>• Facade: padrão que provê um ponto único de interface para um conjunto de interfaces de</p><p>subsistemas (GAMMA et al., 1995).</p><p>• Flyweight: este padrão propõe a criação de um objeto compartilhado que pode ser usado em</p><p>múltiplos contextos simultaneamente, com o objetivo de apoiar o uso de um grande número de</p><p>objetos de menor granularidade de forma eficiente (GAMMA et al., 1995).</p><p>• Proxy: este padrão propõe que um objeto crie um mecanismo para controlar o acesso de outro</p><p>objeto a seus recursos (GAMMA et al., 1995).</p><p>• Chain of responsability: propõe a separação de um objeto remetente de uma solicitação ao seu</p><p>destinatário, dando a mais de um objeto a capacidade de receber essa solicitação. Esses objetos</p><p>são colocados em uma cadeia, e a solicitação é passada de um a outro até que o destinatário a</p><p>receba (GAMMA et al., 1995).</p><p>• Command: propõe a abstração de uma requisição como um objeto. Possibilita parametrização de</p><p>clientes com diferentes requisições, filas ou armazenamento dessas informações em formato de</p><p>log e ainda apoia operações que podem ser desfeitas (GAMMA et al., 1995).</p><p>99</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>• Interpreter: esse padrão descreve como definir uma representação para uma determinada</p><p>linguagem, representar sentenças nesta linguagem e interpretar essas sentenças (GAMMA et</p><p>al., 1995).</p><p>• Iterator: propõe um ponto de acesso a elementos de um objeto agregado ou uma lista de objetos</p><p>de forma sequencial sem que haja necessidade de exposição de detalhes da implementação desses</p><p>elementos (GAMMA et al., 1995).</p><p>• Mediator: propõe a criação de um objeto que encapsule a forma de interação de um conjunto de</p><p>outros objetos (GAMMA et al., 1995).</p><p>• Memento: propõe o armazenamento de um objeto interno sem que haja violação de</p><p>encapsulamento, para que esse objeto possa ser recuperado a este estado futuramente (GAMMA</p><p>et al., 1995).</p><p>• Observer: padrão que propõe a composição de um objeto em uma árvore hierárquica de objetos</p><p>dependentes. Quando este objeto muda de estado, todos os objetos desta árvore são notificados,</p><p>e seu estado é atualizado automaticamente (GAMMA et al., 1995).</p><p>• State: este padrão propõe que um objeto altere seu comportamento assim que seu estado muda,</p><p>o efeito é como se a classe do objeto mudasse (GAMMA et al., 1995).</p><p>• Strategy: propõe a criação de uma família de algoritmos encapsulados e intercambiáveis que são</p><p>acessados independentemente do cliente que os utiliza por uma interface-padrão denominada</p><p>strategy (GAMMA et al., 1995).</p><p>• Template method: este padrão propõe que uma subclasse redefina certos passos de um algoritmo</p><p>sem que haja mudança na estrutura deste algoritmo (GAMMA et al., 1995).</p><p>• Visitor: este padrão promove a criação de novas operações através da adição de subclasses na</p><p>hierarquia da classe na qual essa nova operação irá atuar (GAMMA et al., 1995).</p><p>Saiba mais</p><p>Para aprofundar seus conhecimentos em padrões de projeto, consulte:</p><p>BUSCHMANN, F.; HENNEY, K.; SCHIMIDT, D. Pattern-oriented software</p><p>architecture: a pattern language for distributed computing. New York:</p><p>Wiley, 2007. v. 4.</p><p>GAMMA, E. et al. Design patterns: elements of reusable object-oriented</p><p>software. Boston: Addison-Wesley, 1995.</p><p>100</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade III</p><p>A maneira mais simples de entender e assimilar design pattern é buscar um padrão dentro deste</p><p>catálogo, entender qual é seu objetivo, ler o seu modelo de classes e implementar, na forma de prova de</p><p>conceito, na linguagem orientada a objetos de nossa preferência.</p><p>Lembrete</p><p>A implementação de padrões de projeto, ou design pattern, é</p><p>independente da linguagem de programação. Essa é uma das grandes</p><p>vantagens de utilizarmos padrões.</p><p>O padrão Singleton, por exemplo, tem por objetivo utilizar uma única instância de uma classe em</p><p>todo o sistema. A figura seguinte representa a documentação do padrão Singleton.</p><p>Singleton</p><p>- instance: Singleton</p><p>- Singleton()</p><p>+ getInstance(): Singleton</p><p>Figura 36 – Padrão Singleton</p><p>Agora vamos entender cada ponto que o padrão sugere:</p><p>• Repare que o construtor da classe é privado. Por que privado? Porque nenhum outro objeto terá</p><p>acesso a esse construtor, logo não poderá instanciar essa classe.</p><p>• Temos um método público (e estático), de nome getInstance, que retorna um objeto do tipo da</p><p>própria classe em que está criado. Por que público e por que estático? Público para que outros</p><p>objetos possam acessar e estático para que ele possa ser chamado sem que haja necessidade de</p><p>instanciar a classe em que ele está declarado.</p><p>• Temos um atributo privado, de nome instance, do tipo da própria classe em que está criado. Por</p><p>que do tipo da própria classe? Para que possamos armazenar uma instância dessa classe.</p><p>Quando estamos entendendo padrões de projeto, é importante que não deixemos passar despercebido</p><p>nenhum detalhe, por exemplo, a visibilidade dos atributos, métodos e construtores.</p><p>101</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>A figura seguinte mostra a implementação desta classe utilizando Microsoft .Net C#.</p><p>Figura 37 – Implementação Singleton em C#</p><p>Na figura apresentada, podemos notar que o detalhe está na implementação do método getInstance,</p><p>no qual se verifica se a variável responsável por armazenar a instância da classe é nula; em caso</p><p>positivo,</p><p>cria-se a instância (para primeira utilização), e, caso contrário, retorna-se a instância, garantindo assim</p><p>que essa classe seja instanciada apenas na primeira vez.</p><p>Saiba mais</p><p>Aprofunde seus estudos sobre design pattern com o livro:</p><p>FREEMAN, E et al. Head first design patterns. Sebastopol: O’Reilly, 2004.</p><p>Saiba como implementar padrões de projeto utilizando o Microsoft .Net</p><p>Framework em:</p><p>DOFACTORY. .NET design pattern framework 4.5, [s.d.]. Disponível em:</p><p>.</p><p>Acesso em: 4 maio 2015.</p><p>6.2 Visão dinâmica</p><p>O objetivo principal da visão dinâmica da arquitetura é representar a realização dos casos de uso,</p><p>que fundamentalmente se dá pela troca de mensagens entre os objetos no decorrer do tempo.</p><p>O primeiro passo para se determinar como uma tarefa será executada é definir as responsabilidades</p><p>de cada objeto.</p><p>102</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade III</p><p>6.2.1 Definindo responsabilidades</p><p>Como vimos, o estilo arquitetural em camadas tem, entre outros objetivos, o de subdividir e agrupar</p><p>as classes em grupos de acordo com as suas responsabilidades.</p><p>Vimos que, ao fazer isso, classificamos as classes como: entidade (entity), controle (control) e fronteira</p><p>(boundary) e cada uma delas possui uma atribuição bem-definida no contexto do sistema.</p><p>Voltando ao exemplo do cadastro de funcionários, após a reorganização (também chamada de refactory)</p><p>do seu sistema, suponhamos que você tenha chegado ao seguinte modelo de classes de projeto:</p><p>></p><p>Funcionario</p><p>+ nome: String</p><p>+ CPF: int</p><p>+ RG: int</p><p>+ salario_bruto: double</p><p>+ salario_liquido: double</p><p>></p><p>PaginaWebNovoFuncionario</p><p>+ cadastrarFuncionario() : void</p><p>></p><p>FuncionarioNegocio</p><p>+ incluirFuncionario(Funcionario) : void</p><p>+ calcularSalarioLiquido(double) : double</p><p>></p><p>FuncionarioDados</p><p>+ incluirFuncionario(Funcionario) : void</p><p>Figura 38 – Modelo de classes de projeto com responsabilidades</p><p>Note que agora temos todas as classes referentes ao nosso problema: a página web</p><p>(“PaginaWebNovoFuncionario”), a classe responsável pelas regras de negócio (“FuncionarioNegocio”), a</p><p>classe responsável pelo armazenamento dos dados no banco de dados (“FuncionarioDados”) e a nossa</p><p>entidade “Funcionario”.</p><p>No entanto, ainda precisamos representar o fluxo de mensagens dessas entidades. É necessário</p><p>representar quais objetos estão envolvidos em uma troca de mensagens, quais são essas mensagens</p><p>trocadas e o significado dessas mensagens. Precisamos, por exemplo, saber qual evento da tela é o</p><p>gatilho para todo o processo de cadastrar funcionário.</p><p>Para isso, precisamos pegar os conceitos e os diagramas de sequência que fizemos até então e</p><p>adaptá-los, refiná-los adicionando as novas classes e as suas respectivas responsabilidades.</p><p>103</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>6.2.2 Refinando o diagrama de sequência</p><p>Antes de refinar o diagrama de sequência, precisamos saber como representamos as classes, ou</p><p>objetos, de acordo com suas respectivas responsabilidades no diagrama de sequência. A figura a seguir</p><p>mostra os estereótipos utilizados nessa representação.</p><p>Fronteira Controle Entidade</p><p>Figura 39 – Estereótipos de responsabilidades no diagrama de sequência</p><p>Agora podemos refinar ou desenvolver o diagrama de sequência representando corretamente as</p><p>classes, suas respectivas responsabilidades e os significados de suas mensagens, como mostra o exemplo</p><p>da figura a seguir que representa a visão dinâmica do processo de cadastrar funcionário:</p><p>Usuário</p><p>: PaginaWebNovoFuncionario : Funcionario : FuncionarioNegocio : FuncionarioDados</p><p>: cadastrarFuncionario()</p><p>create()</p><p>incluirFuncionario(Funcionario)</p><p>incluirFuncionario(Funcionario)</p><p>calcularSalarioLiquido(double): double</p><p>Figura 40 – Diagrama de sequência refinado</p><p>104</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade III</p><p>6.3 Documentação de arquitetura</p><p>Como vimos, um sistema de software é um conjunto de componentes dispostos em uma estrutura,</p><p>que diz como eles estão arranjados, suas composições, dependências e ainda como eles se relacionam</p><p>para resolver um determinado problema, além de definir como estes componentes estão distribuídos em</p><p>uma infraestrutura (BASS; CLEMENTS; KAZMAN, 2010).</p><p>Visões arquiteturais são representações de cada uma dessas estruturas, e cada uma dessas visões</p><p>terá uma forma específica de documentação. Neste livro-texto utilizaremos a documentação das visões</p><p>arquiteturais a partir da UML.</p><p>Saiba mais</p><p>Existem outras abordagens de documentação de arquitetura, por</p><p>exemplo, o modelo RMODP. Para aprofundar seus conhecimentos sobre</p><p>esse modelo, leia:</p><p>INTERNATIONAL ORGANIZATION FOR STANDARDIZATION (ISO). 10746-3:</p><p>open distributed processing – reference model. Geneve: ISO, 2009.</p><p>Segundo Bass, Clements e Kazman (2010), são três as visões arquiteturais:</p><p>• Visão modular: representa a visão do sistema em termos de unidade de implementação; essas</p><p>unidades podem ser classes, componentes ou módulos.</p><p>• Visão componente e conector: representa a forma pela qual os componentes interagem, ou seja,</p><p>seus protocolos de comunicação.</p><p>• Visão de alocação: representa a forma pela qual esses componentes estão distribuídos em uma</p><p>infraestrutura.</p><p>Para cada uma dessas visões, temos um diagrama, ou um conjunto bem-definido de diagramas da</p><p>UML que nos auxiliam na modelagem e na documentação.</p><p>Por ora, atente-se em saber quais diagramas são utilizados para cada uma das visões; adiante,</p><p>detalharemos cada um deles. O quadro seguinte mostra a relação entre os diagramas da UML e as visões</p><p>arquiteturais.</p><p>105</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Quadro 11 – Diagramas UML e visões arquiteturais</p><p>Visão arquitetural Diagrama UML</p><p>Visão modular Diagrama de pacotes</p><p>Diagrama de classes</p><p>Visão componente e conector Diagrama de componentes</p><p>Visão de alocação Diagrama de distribuição</p><p>Além dos diagramas referentes às visões arquiteturais, que têm como função principal representar a</p><p>visão estática da arquitetura, temos de documentar a visão dinâmica da arquitetura.</p><p>Para isso, é preciso um conjunto de diagramas da UML que servem como complemento ao diagrama</p><p>de sequência, que vem a ser o principal diagrama para documentarmos a visão dinâmica de uma</p><p>arquitetura.</p><p>Os diagramas a seguir são utilizados para documentar a visão dinâmica de uma arquitetura:</p><p>• Diagrama de sequência.</p><p>• Diagrama de colaboração.</p><p>• Diagrama de máquinas de estado.</p><p>Observação</p><p>A documentação da arquitetura não se resume apenas no</p><p>desenvolvimento de diagramas UML. É importante que tenhamos uma</p><p>organização e uma gestão de conteúdo que faça o relacionamento entre</p><p>os diagramas produzidos e seus significados para o sistema, casos de uso</p><p>que se deseja resolver e justificativas de solução.</p><p>Resumo</p><p>Nesta unidade, abordamos o ciclo de vida das atividades referentes ao</p><p>projeto.</p><p>Lembramos que o ciclo de vida das atividades de projeto é dividido em</p><p>quatro atividades: projeto de classes e dados, projeto arquitetural, projeto</p><p>de interfaces e projeto de componentes.</p><p>106</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade III</p><p>A fase de projeto de dados tem o objetivo de definir um dicionário de</p><p>dados, uma estrutura de informação necessária para a implementação</p><p>de um sistema de software. Nesta fase, a ênfase dá-se em projetar um</p><p>banco de dados.</p><p>Projetar um banco de dados é algo que não deve ser feito a esmo, e,</p><p>como vimos, o projeto é dividido em três fases: projeto conceitual, projeto</p><p>lógico e projeto físico.</p><p>A fase de projeto</p><p>conceitual tem como objetivo produzir um modelo</p><p>de alto nível de abstração que represente a estrutura do banco de</p><p>dados; o projeto lógico tem como objetivo refinar este modelo de tal</p><p>forma que acrescente detalhes inerentes ao SGBD; e o projeto físico</p><p>tem como objetivo pegar este modelo e convertê-lo em um modelo</p><p>no nível do SGBD; esta é a fase mais associada à tecnologia de todo o</p><p>processo.</p><p>Na atualidade o modelo de dados relacional é um dos modelos mais</p><p>utilizados em projetos de banco de dados, e, por isso, a ênfase foi dada à</p><p>produção do modelo entidade relacionamento ou MER.</p><p>O MER é baseado em três pilares: as entidades, que são representações</p><p>de entidades do mundo real, seus atributos ou características, e o</p><p>relacionamento entre essas entidades.</p><p>Vimos que a adaptação do MER ao paradigma da orientação a objetos</p><p>requer alguns cuidados, principalmente, porque o MER não possui</p><p>características fundamentais à orientação a objetos, como armazenamento</p><p>de métodos e herança.</p><p>Em contrapartida, esses paradigmas possuem semelhanças: os conceitos</p><p>de entidades e atributos, que são análogos aos de classes e atributos, e o</p><p>conceito de identidade de entidade, que pode ser considerado análogo ao</p><p>conceito de identidade da orientação a objetos.</p><p>De qualquer forma, uma alternativa viável para armazenarmos os</p><p>objetos em um modelo relacional é fazer um mapeamento de quais classes</p><p>devem ser persistidas na base de dados; boas classes candidatas a isso são</p><p>as do tipo entidade (entity).</p><p>Após a fase de projeto de dados e classes, passamos a debater a fase de</p><p>projeto arquitetural.</p><p>107</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Vimos que, analogamente à engenharia civil, a arquitetura, na</p><p>engenharia de software, tem papel fundamental, apesar de nem sempre</p><p>ser valorizada pelas organizações.</p><p>É na arquitetura de software que se projetam as estruturas, a</p><p>constituição de um software que servirá como base fundamental para a</p><p>fase de construção.</p><p>Existem muitas definições de arquitetura de software, na visão de</p><p>Bass, Clements e Kazman (2010), que são uma das melhores referências</p><p>no tema. Ela pode ser definida como uma representação, em alto nível de</p><p>abstração, dos componentes de um sistema de software, as propriedades</p><p>externamente visíveis destes componentes e como eles interagem com o</p><p>objetivo de resolver as necessidades, ou o problema, de um determinado</p><p>cenário de negócio (BASS; CLEMENTS; KAZMAN, 2010).</p><p>A arquitetura é muito importante, pois facilita a comunicação entre os</p><p>envolvidos no projeto, representa em escala menor a estrutura do sistema,</p><p>evidencia as decisões de projeto, além de facilitar a evolução, o reúso e a</p><p>manutenção do software.</p><p>Existe uma lacuna entre a arquitetura e o gerenciamento de projeto que,</p><p>como debatemos, não deveria existir, uma vez que a arquitetura auxilia a gestão</p><p>do projeto quanto à estimativa de tempo, ao custo e à complexidade do projeto,</p><p>além de auxiliá-la na mitigação e na diminuição de riscos.</p><p>Vimos que o processo de definição da arquitetura de um software,</p><p>idealmente, deve iniciar-se ainda na fase de análise de requisitos e</p><p>modelagem do domínio, na qual o arquiteto obtém informações importantes</p><p>tanto a respeito do negócio quanto a respeito do cliente que influenciarão as</p><p>decisões arquiteturais futuras. Esse processo de definição também pode ser</p><p>subdividido em quatro fases: entendimento do problema, identificação dos</p><p>elementos do projeto e de seus relacionamentos, avaliação da arquitetura</p><p>e atualização da arquitetura.</p><p>Demos ênfase, nesta unidade, à fase de identificação dos elementos</p><p>do projeto e de seus relacionamentos, que tem no arquiteto a figura</p><p>humana central do processo. Esse papel, necessariamente, deve ser</p><p>exercido por um profissional que possua uma série de habilidades e</p><p>um perfil próprio.</p><p>A identificação dos elementos do projeto e de seus relacionamentos</p><p>passa pela representação das duas visões da arquitetura de software: a</p><p>visão estática e a visão dinâmica.</p><p>108</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade III</p><p>Na visão estática estruturamos o sistema em subsistemas e organizamos</p><p>seus componentes internos; para isso, utilizamos uma ferramenta muito</p><p>importante: os padrões.</p><p>Estilos arquiteturais e padrões de projetos são importantes soluções</p><p>para um problema específico em um contexto específico, e essas duas</p><p>variáveis são importantes nessa hora. Não devemos usar esses padrões</p><p>simplesmente por usar.</p><p>Na visão dinâmica, modelamos como os componentes e os objetos</p><p>se comunicam para resolver um determinado problema; na verdade,</p><p>nesse ponto, apenas refinamos nosso diagrama de sequência com os</p><p>conceitos de responsabilidade e organização arquitetural que vimos na</p><p>visão estática.</p><p>Ambas as visões são registradas na documentação da arquitetura a</p><p>partir de um conjunto específico de diagramas da UML.</p><p>Exercícios</p><p>Questão 1. Arquitetura de software é o nome dado à disciplina fundamental da fase de projeto</p><p>arquitetural. Dentre os benefícios de uma arquitetura de software bem definida encontram-se:</p><p>A) Facilita o reuso de componentes, logo promove maior produtividade na construção e na</p><p>manutenção, pois também facilita a manutenção.</p><p>B) Permite uma melhor análise dos requisitos funcionais durante a especificação do software.</p><p>C) Propõe um padrão de documentação, principalmente em linguagens orientadas a objetos.</p><p>D) Permite a evolução dos sistemas operacionais, SGBDs e software básico existentes.</p><p>E) Nenhuma das alternativas anteriores é correta.</p><p>Resposta correta: alternativa A.</p><p>Análise das alternativas</p><p>A) Alternativa correta.</p><p>Justificativa: dentre tantos benefícios de uma arquitetura de software bem definida, o reuso de</p><p>componentes promove a produtividade na construção, pois permite reusar componentes já construídos</p><p>e também na manutenção, já que os ajustes são realizados em poucos componentes ao invés de grandes</p><p>blocos de código.</p><p>109</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>B) Alternativa incorreta.</p><p>Justificativa: arquitetura de software não se concentra em requisitos funcionais.</p><p>C) Alternativa incorreta.</p><p>Justificativa: padrões de documentação são tratados por outras disciplinas e não por arquitetura de</p><p>software.</p><p>D) Alternativa incorreta.</p><p>Justificativa: a arquitetura de software objetiva o software a ser desenvolvido. O software básico de</p><p>apoio como Sistema Operacional, SGBD e outros não têm suas estruturas avaliadas.</p><p>Questão 2. A arquitetura de software participa das fases do ciclo de vida do projeto de software.</p><p>Com relação à fase de Pré-Projeto de software, analise as duas afirmativas apresentadas a seguir:</p><p>É comum observarmos que a arquitetura de software participa do ciclo de vida de desenvolvimento</p><p>apenas a partir da fase de projetos. No entanto, é aconselhável que o arquiteto, ou a equipe de arquitetura,</p><p>participe como observador na fase de análise de requisitos.</p><p>Porque</p><p>Essa participação possibilita a extração de informações técnicas importantes, por exemplo, padrões</p><p>de arquitetura corporativa para integração de sistemas, que podem ser importantes para mitigação de</p><p>custo, tempo de desenvolvimento e perfil da equipe.</p><p>Acerca dessas afirmativas, assinale a alternativa correta:</p><p>A) As duas afirmativas são proposições verdadeiras e a segunda é uma justificativa correta da</p><p>primeira.</p><p>B) As duas afirmativas são proposições verdadeiras e a segunda não é uma justificativa correta da</p><p>primeira.</p><p>C) A primeira afirmativa é uma proposição verdadeira e a segunda é uma proposição falsa.</p><p>D) A primeira afirmativa é uma proposição falsa e a segunda é uma proposição verdadeira.</p><p>E) As duas afirmativas são proposições falsas.</p><p>Resolução desta questão na plataforma.</p><p>110</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade IV</p><p>Unidade IV</p><p>Agora que já vimos como fazer a passagem do modelo de análise para o modelo de projeto e que</p><p>já entramos efetivamente na fase de projetos, nas atividades de projeto de dados e classes e também</p><p>nas atividades de projeto arquitetural, sabemos quais os objetivos de cada atividade e quais modelos</p><p>precisamos produzir, com o auxílio da UML.</p><p>Veremos, nesta unidade, como produzir esses modelos, representados pelos diagramas da UML, quais</p><p>são os seus elementos e como podemos utilizar cada um da melhor forma.</p><p>7 REFINANDO A MODELAGEM DE ASPECTOS DINÂMICOS DO SOFTWARE</p><p>Anteriormente, vimos que na fase de projeto arquitetural é necessária a representação dos aspectos dinâmicos</p><p>da arquitetura e, basicamente, utilizamos o diagrama de sequência da UML para dar corpo a essa representação.</p><p>O objetivo deste tópico é apresentar modelos e diagramas da UML que complementem a visão</p><p>dada pelo diagrama de sequência quando da modelagem dos aspectos dinâmicos do software.</p><p>Complementar não significa substituir, portanto nenhum diagrama que veremos a seguir tem como</p><p>objetivo substituir a visão dada pelo diagrama de sequência, mas auxiliar no refinamento da visão</p><p>arquitetural dinâmica dada por este diagrama.</p><p>7.1 Diagrama de comunicação</p><p>O diagrama de comunicação passou a ter esse nome a partir da versão 2.0 da UML; nas versões</p><p>anteriores, esse diagrama é chamado de diagrama de colaboração (UML-DIAGRAMS, 2009-2014b).</p><p>A característica marcante do diagrama de comunicação é a forte semelhança com o diagrama de</p><p>sequência. As informações modeladas em ambos são, no geral, as mesmas, todavia a representação em</p><p>cada um dos modelos possui ênfases diferentes.</p><p>O diagrama de comunicação é um tipo de diagrama comportamental da UML que representa as</p><p>interações de dois objetos e suas partes utilizando para isso uma sequência de mensagens representadas</p><p>de forma livre de formatação (UML-DIAGRAMS, 2009-2014b).</p><p>Lembrete</p><p>Embora os diagramas de comunicação e de sequência possuam grande</p><p>semelhança, o diagrama de comunicação é um complemento do diagrama</p><p>de sequência.</p><p>111</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Enquanto o diagrama de sequência dá ênfase à troca de mensagens em uma linha de tempo, o</p><p>diagrama de comunicação dá ênfase a como os objetos estão interligados e quais mensagens são</p><p>trocadas entre eles para realizar uma determinada tarefa.</p><p>No diagrama de comunicação as mensagens possuem uma numeração, é como se elas fossem</p><p>etiquetadas com uma numeração em ordem crescente, e é essa sequência numérica que representa a</p><p>sequência em que as mensagens são trocadas entre os objetos.</p><p>O diagrama de sequência obedece a uma ordem natural de leitura, ou seja, sabemos que devemos</p><p>ler a sequência das mensagens da esquerda para a direita. Enquanto isso, no diagrama de comunicação,</p><p>começamos a ler a sequência das mensagens procurando inicialmente a mensagem identificada como</p><p>1.0, seguindo essa mensagem do objeto que envia até o objeto que a recebe, e assim sucessivamente.</p><p>Podemos dizer que os diagramas de sequência e de comunicação são isomórficos, ou seja, um pode</p><p>ser transformado no outro. Isso porque os objetos, atores e mensagens que são representados nesses</p><p>diagramas são originados nos diagramas de caso de uso e nos diagramas de classes de análise e projeto,</p><p>e o que é representado no diagrama de sequência; também é representado no diagrama de comunicação</p><p>(LEE e TAPFENHART, 2001).</p><p>Observação</p><p>Existem muitas ferramentas que fazem a conversão automática do</p><p>diagrama de sequência para o diagrama de comunicação e vice-versa.</p><p>Todavia, sempre tenha muito cuidado e faça uma revisão no diagrama</p><p>gerado a partir destes tipos de ferramentas.</p><p>Quando escolher um e quando escolher o outro?</p><p>Se o seu objetivo for representar a interação dos objetos no decorrer de uma linha do tempo, então</p><p>você deverá usar o diagrama de sequência, mas se você desejar dar ênfase à interação desses objetos no</p><p>contexto do sistema, então o melhor que você terá a fazer é dar prioridade ao diagrama de comunicação</p><p>(MEDEIROS, 2004).</p><p>De qualquer forma, é importante que tenhamos em mente o principal: os diagramas são</p><p>complementares. No momento do desenvolvimento de um diagrama de comunicação a partir de um</p><p>de sequência, podemos identificar pontos de melhoria ou até mesmo erros no modelo original, daí uma</p><p>ótima oportunidade para revisar, alterar e melhorar o modelo.</p><p>Lembre-se sempre de que o objetivo dos diagramas não é produzir informação em larga quantidade,</p><p>mas produzir informação de qualidade.</p><p>Produzir um diagrama de sequência e um diagrama de comunicação com qualidade é importante</p><p>fator para a qualidade na comunicação entre os envolvidos no projeto e na qualidade da construção do</p><p>produto final.</p><p>112</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade IV</p><p>O diagrama de comunicação é baseado em alguns componentes:</p><p>• Objetos: têm a mesma conotação do objeto que representamos no diagrama de sequência, com</p><p>uma diferença fundamental, pois no diagrama de comunicação não damos ênfase à linha de</p><p>tempo de vida do objeto.</p><p>• Vínculos: identificam uma ligação entre dois objetos, que é feita a partir da troca de mensagens</p><p>entre esses objetos.</p><p>• Mensagens: análogas às mensagens do diagrama de sequência, possuem apenas duas diferenças</p><p>básicas: as mensagens são identificadas numericamente e não existe uma pré-formatação para</p><p>a representação dessas mensagens, como temos no diagrama de sequência. Na representação</p><p>de mensagens, podemos representar todos os tipos de mensagem — síncronas, assíncronas e</p><p>automensagem.</p><p>• Atores: nesse diagrama, bem como no diagrama de sequência, podemos representar o autor. Com</p><p>o detalhe importante de que esse autor deve necessariamente estar representado também no</p><p>diagrama de caso de uso.</p><p>Cliente</p><p>2.3:[compra_encerrada] atualizar_estoque()</p><p>1.1:procurar()</p><p>1*:procurar_livros()</p><p>2:finalizar_compra()</p><p>1.2:</p><p>[livro_interessado]</p><p>vizualizar_livro()</p><p>2.1:</p><p>recuperar_livros()</p><p>1.3:</p><p>[livro_interessado]adcionarCarrinho()</p><p>2.2:[não vazio(Carrinho)]finalizar_compra()</p><p>:Estoque</p><p>:LojaOnline</p><p>:Compra</p><p>carrinho(Cliente)</p><p>CarrinhoCompras</p><p>I :LivroA</p><p>D</p><p>C</p><p>E</p><p>F</p><p>G</p><p>H</p><p>B</p><p>Figura 41 – Elementos do diagrama de comunicação UML</p><p>113</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Quadro 12 – Elementos do diagrama de comunicação UML</p><p>Letra Descrição</p><p>A Notação de ator – com o estereótipo idêntico ao visto no</p><p>diagrama de caso de uso.</p><p>B</p><p>Notação de objeto – representamos um objeto com um</p><p>retângulo, a exemplo de como representamos um objeto no</p><p>diagrama de sequência.</p><p>Podemos representar um objeto apenas como um tipo de,</p><p>como no exemplo da letra B, em que “:Estoque” lê-se um</p><p>objeto anônimo do tipo Estoque</p><p>OU</p><p>Podemos representar um objeto nominal como no exemplo</p><p>da letra G, onde “l:Livro” lê-se o objeto l do tipo Livro.</p><p>C</p><p>Representação de vínculo – a linha contínua que liga dois</p><p>objetos indica que existe um vínculo, ou uma dependência,</p><p>entre esses objetos.</p><p>Quando há um vínculo entre objetos, presume-se que haverá</p><p>troca de mensagens entre esses objetos.</p><p>D</p><p>Indicador de sequência da mensagem – no caso da figura,</p><p>temos a representação 1.*, onde podemos ler que 1 é a</p><p>sequência da mensagem e * é o número da iteração.</p><p>Ainda no exemplo da figura, podemos ver que a mensagem</p><p>inicial é a mensagem “procurar_livros()”</p><p>E</p><p>Notação de mensagem – nota-se que a representação</p><p>da mensagem é idêntica à representação de mensagem</p><p>no diagrama de sequência, ou seja: nome do método +</p><p>parâmetros de entrada + tipo de retorno.</p><p>Observação: se a mensagem for do tipo retorno, será</p><p>representada com uma seta tracejada:</p><p>F</p><p>Indicação de parâmetro da mensagem — no caso da figura,</p><p>estamos passando como</p><p>parâmetro para a mensagem</p><p>“atualizar_estoque” os livros comprados que constam na</p><p>ordem de compra.</p><p>G Declaração de objeto com nome e tipo — vide comentários</p><p>descritos na letra B.</p><p>H</p><p>Descrição de objeto com seletor e tipo — no caso da figura, o</p><p>objeto carrinho não pode ser qualquer carrinho, mas deve ser</p><p>um carrinho selecionado para um determinado cliente.</p><p>Observação: na notação de objetos, também podemos utilizar</p><p>os estereótipos de responsabilidade — entidade, fronteira e</p><p>controle —, exatamente da mesma forma que representamos</p><p>no diagrama de sequência.</p><p>Como ficaria o processo que representamos na figura anterior, utilizando o diagrama de comunicação,</p><p>se optássemos por utilizar o diagrama de sequência?</p><p>114</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade IV</p><p>A figura a seguir mostra um diagrama de sequência análogo ao diagrama de comunicação:</p><p>Cliente</p><p>procurar_livros()</p><p>procurar()</p><p>:Estoque:LojaOnline :Compracarrinho(Cliente)</p><p>CarrinhoCompras</p><p>I :Livro</p><p>visualizarLivro(Livro)</p><p>finalizarCompra()</p><p>finalizarCompra(Carrinho)</p><p>recuperarLivrosCarrinho()</p><p>adcionarCarrinho(Livro)</p><p>Figura 42 – Exemplo de diagrama de sequência análogo ao diagrama de comunicação</p><p>A partir das figuras apresentadas podemos ter a clara noção das diferenças e semelhanças entre os</p><p>diagramas e de por que dizemos que eles são complementares.</p><p>Podemos notar também que a representação desse cenário, especificamente, utilizando o diagrama</p><p>de comunicação, projeta um diagrama que, em linhas gerais, se apresenta mais fácil de ser entendido.</p><p>Isso porque, como você pode encontrar em algumas referências, o diagrama de comunicação pode ser</p><p>utilizado para a modelagem de cenários mais simples, o que não pode ser encarado como mentira, mas</p><p>também não é uma verdade absoluta.</p><p>7.2 Diagrama de máquina de estado</p><p>O diagrama de máquina de estado, ou simplesmente diagrama de estado, tem como objetivo</p><p>representar o comportamento de um determinado elemento a partir de um conjunto finito de estados.</p><p>115</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Esse elemento a ser representado no diagrama de estado é, na maioria das vezes, uma instância</p><p>de uma classe, um objeto, uma vez que um objeto, pelos princípios da orientação a objetos, possui um</p><p>estado (LARMAN, 2007).</p><p>Note que mencionamos que na maioria das vezes utilizamos um diagrama de máquina de estados</p><p>para representar uma instância de uma classe. Isso porque podemos representar, também, a mudança</p><p>de estados de um caso de uso.</p><p>Observação</p><p>O estado de um objeto, ou a identidade desse objeto, é denominado</p><p>pelo conjunto de valores associados aos seus atributos em um determinado</p><p>período dentro do universo sistêmico.</p><p>A figura a seguir mostra a diferença entre classe, objeto e estado do objeto. Podemos notar que a</p><p>classe Cliente possui alguns atributos: agência, conta-corrente, CPF e saldo de conta-corrente.</p><p>A partir do momento em que essa classe se torna um objeto no sistema, os atributos passam a ter</p><p>um determinado valor associado e esse objeto passa a ter uma identidade única dentro do sistema,</p><p>passa a estar apto a receber e enviar mensagens, ou seja, ele passa a ser concretamente um cliente.</p><p>Classe</p><p>Atributos</p><p>Operações</p><p>Cliente</p><p>agencia: int</p><p>contaCorrente: string</p><p>cpf: string</p><p>saldoCC: decimal</p><p>informarAgenciaCC()</p><p>sacarCC()</p><p>Informar</p><p>Agência e CC</p><p>Classe</p><p>Objeto</p><p>Sacar CC</p><p>Agência: 0123</p><p>Conta-corrente: 123456-7</p><p>CPF: 999.888.777-65</p><p>Saldo de conta-corrente: R$1.000,00</p><p>Figura 43 – Classe, objeto e estado de um objeto</p><p>Já verificamos que o objeto possui um estado, por exemplo, no momento da “fotografia”, nota-se</p><p>que o cliente possui R$ 1.000,00 em sua conta-corrente. Podemos dizer então que, nesse momento, ele</p><p>possui este estado.</p><p>Em contrapartida, se este mesmo cliente, pouco tempo depois dessa “fotografia”, efetuar um saque</p><p>em conta-corrente no valor de R$ 300,00, seu estado será alterado, pois o valor do seu atributo “saldoCC”</p><p>será alterado, ou seja, haverá uma mudança de estado.</p><p>116</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade IV</p><p>É exatamente isto que o diagrama de máquina de estado se dispõe a representar: os estados dos</p><p>objetos no decorrer do tempo e o que motivou uma possível mudança de estado. O “motivador” de uma</p><p>mudança de estado é chamado de evento.</p><p>Segundo Larman (2007), um evento é uma ocorrência digna de nota que promove a mudança de</p><p>estado de algum objeto. Como o exemplo do próprio autor: um telefone está ocioso até que é tirado do</p><p>gancho; a partir desse evento ele passa a estar ativo.</p><p>Outro exemplo simples (e aqui resumimos bem o processo, apenas para mostrar uma aplicação para</p><p>o diagrama), como mostra a figura a seguir, é o de uma máquina de autoatendimento bancário, que está</p><p>inativa até que um cartão seja inserido.</p><p>Inativo</p><p>Ativo</p><p>Inicial</p><p>[cartão removido] [cartão inserido]</p><p>Figura 44 – Diagrama de estado para um ATM</p><p>Aqui, podemos notar os elementos básicos da notação de um diagrama de estados, que estão</p><p>representados no quadro a seguir:</p><p>Quadro 13 – Elementos básicos do diagrama de estados</p><p>Símbolo Significado</p><p>Estado</p><p>Estado – representa uma determinada situação de um elemento em um</p><p>determinado momento.</p><p>Um estado pode possuir os seguintes significados:</p><p>1. A espera pela ocorrência de um evento.</p><p>2. A reação a um estímulo.</p><p>3. A execução de alguma atividade.</p><p>4. A satisfação de alguma condição.</p><p>(LARMAN, 2007)</p><p>Transição – a seta representa um evento que gera uma transição de estado</p><p>no sentido apontado.</p><p>117</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Estado inicial – representa o marco inicial, o ponto de partida da máquina</p><p>de estados.</p><p>Neste momento os objetos ainda não possuem um estado inicial, eles</p><p>passam a ter um no momento em que se inicia a máquina, ou seja, em que</p><p>a máquina sai do estado inicial.</p><p>Estado final – indica o final dos estados modelados.</p><p>O estado de um objeto pode ser classificado como:</p><p>• Simples: quando é autossuficiente, ou seja, não possui a necessidade da composição ou da divisão</p><p>em estados menores.</p><p>• Composto: quando um estado contém internamente dois ou mais estados, chamados subestados,</p><p>como mostra o exemplo da figura seguinte:</p><p>Estado 1</p><p>Subestado 1</p><p>Subestado 2</p><p>Inicial</p><p>Figura 45 – Exemplo de estado composto</p><p>Quando um objeto entra em um determinado estado, ele executa determinadas atividades, que são:</p><p>• Atividade de entrada (entry): é a primeira atividade a ser executada quando um objeto assume um</p><p>determinado estado.</p><p>• Atividades de fazer (do): são atividades executadas quando um objeto se encontra em um</p><p>determinado estado.</p><p>• Atividades de saída (exit): são atividades executadas no momento em que um objeto sai de um</p><p>determinado estado.</p><p>Existem alguns tipos de transições que não produzem alteração no estado de um objeto, ou seja,</p><p>ocorrem durante o estado do objeto sem que esse estado seja modificado.</p><p>118</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade IV</p><p>Essas transições são chamadas de:</p><p>• Transições internas: são transições que acontecem enquanto um objeto se encontra em um</p><p>determinado estado e que não promovem modificação neste estado do objeto. Essas transições</p><p>executam atividades de fazer (do).</p><p>• Autotransições: são transições que executam atividades do tipo sair (exit) de um objeto, executam</p><p>uma determinada ação e voltam para o estado de que saíram sem que haja alteração desse</p><p>estado, como mostra o exemplo a seguir:</p><p>Efetuando dispensa</p><p>de cédulas</p><p>Efetuando contagem</p><p>de cédulas</p><p>Dispensando cédulas</p><p>Inicial</p><p>Final</p><p>[notas prontas]</p><p>[contar notas]</p><p>[dispensar notas]</p><p>Figura 46 – Exemplo de autotransição</p><p>Podemos notar que, enquanto as notas não estiverem prontas na contagem, não</p><p>também,</p><p>pelo nível de eficiência no qual a solução de software atinge essas necessidades e pelo custo-benefício</p><p>do processo de desenvolvimento e construção dessa solução.</p><p>Parece-nos razoável, em um mundo onde a tecnologia de hardware evoluiu e segue em constante</p><p>evolução, que devamos nos preocupar em desenvolver sistemas de software que se adaptem às diversas</p><p>tecnologias e plataformas de computadores pessoais, sistemas operacionais, dispositivos móveis, dentre</p><p>outros. Tudo isso sem perder o foco em fornecer uma experiência rica ao usuário final, fazer que ele</p><p>tenha segurança e conforto no uso, fazer que ele possa realizar suas atividades de maneira produtiva.</p><p>Se o software deve ser enxergado como uma ferramenta de estratégia competitiva em uma</p><p>grande corporação e deve ser desenvolvido em tempo e custo de tal forma que o torne efetivamente</p><p>competitivo, não é difícil enxergar a necessidade de pensarmos em um projeto que nos possibilite</p><p>manutenção rápida e eficiente. Afinal de contas, se o mercado competitivo muda com muita rapidez,</p><p>é possível imaginar que um sistema de software também deva se adaptar a essa realidade.</p><p>Posta essa reflexão inicial, podemos nos questionar: será que realmente estamos dando a devida</p><p>importância ao processo de pensar a solução antes de simplesmente nos colocarmos em frente ao</p><p>computador e sairmos digitando linhas de código a esmo? Por que características de “outras engenharias”</p><p>como padronização, arquitetura, componentização, projeto e estabelecimento de um processo produtivo</p><p>nos parecem tão distantes da engenharia de software?</p><p>O paradigma da orientação a objetos busca oferecer um norte para as melhores práticas de</p><p>desenvolvimento de tal forma que possamos atingir, como produto final, o software como uma</p><p>ferramenta de estratégia competitiva de qualidade. Dentro do ciclo de vida de um projeto de software,</p><p>a atividade de projeto, ou design, busca organizar as soluções de projeto de tal forma que explore todo</p><p>o potencial da orientação a objetos em prol de um sistema de software de qualidade.</p><p>9</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Unidade I</p><p>1 IntrOduçãO A PrOJetO de SISteMAS</p><p>Nesta unidade iremos abordar os aspectos introdutórios que motivam a fase de projetos no paradigma</p><p>da orientação a objetos.</p><p>1.1 Por que “projetar”?</p><p>Antes de pensarmos em um projeto de software, vamos pensar em outro tipo de projeto tão comum</p><p>no nosso dia a dia: o projeto de uma casa.</p><p>Suponhamos a seguinte situação: você possui um terreno e deseja construir neste terreno uma casa.</p><p>Em um primeiro momento você mapeia tudo o que deseja que essa casa tenha, como uma lista</p><p>de desejos, ou seja, quantidade de quartos, de banheiros, área de lazer, enfim, tudo aquilo que lhe é</p><p>necessário.</p><p>Fazendo um paralelo com a engenharia de software, é como se nesse momento você tivesse a sua</p><p>lista de requisitos.</p><p>Com os seus requisitos listados você os valida, verificando se todas as suas necessidades estão</p><p>listadas e detalhadas tal qual você deseja, se a quantidade de cômodos está adequada, se a</p><p>metragem desejada para cada cômodo está detalhada e se a metragem da casa é compatível com</p><p>a metragem do terreno.</p><p>Feito isso, basta comprar os materiais e começar a construir, certo? Todos sabem que não é bem assim.</p><p>Excluindo desse cenário hipotético todos os problemas legais, é até possível que você consiga uma</p><p>casa, mas é mais provável que você enfrente muitos problemas, como os que seguem.</p><p>• A casa construída pode não atender as suas necessidades, por exemplo, a quantidade de quartos</p><p>pode até estar adequada aos seus desejos, mas a metragem não.</p><p>• Pode ocorrer de a casa ficar com má qualidade: paredes tortas, telhado torto, janelas e portas fora</p><p>das medidas-padrão.</p><p>• Podem ocorrer problemas na infraestrutura: por mau dimensionamento, as instalações</p><p>eletro-hidráulicas podem ficar incompletas, não funcionar como deveriam, além de oferecer risco</p><p>à estrutura da casa e a seus ocupantes.</p><p>10</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade I</p><p>• O dinheiro gasto no fim da obra pode superar o valor que você havia previsto inicialmente.</p><p>• O tempo de construção também pode superar o tempo previsto.</p><p>Esse é apenas um dos possíveis cenários não muito favoráveis que você poderá encontrar se não</p><p>adotar uma metodologia, ou um paradigma, para a construção da casa.</p><p>Na engenharia civil o paradigma de projeto já é mais que difundido. No caso do seu projeto, após os</p><p>seus requisitos, ou sua lista de desejos fechados, verificados e validados, a linha certa a ser adotada seria</p><p>desenvolver o projeto da sua casa.</p><p>O projeto da sua casa muito provavelmente não seria desenvolvido por você, mas sim por um</p><p>profissional ou uma equipe capaz de traduzir os seus desejos em algo mais concreto.</p><p>Por exemplo, a planta baixa da sua casa, a planta elétrica, a planta hidráulica, uma maqueta 3-D,</p><p>enfim, tudo aquilo que possa representar os seus desejos de tal forma que eles possam ser convertidos</p><p>efetivamente no produto final: a casa.</p><p>As plantas produzidas pela equipe de projeto serão utilizadas como guia para a equipe de construção,</p><p>de tal forma que os riscos associados à má qualidade da casa sejam diminuídos, ou seja, começa a</p><p>diminuir a probabilidade de problemas relacionados, por exemplo, à metragem dos cômodos, às paredes</p><p>e a todos os demais que comentamos anteriormente.</p><p>Além de servirem como um guia para a equipe de construção, as plantas, ou melhor, chamemos a</p><p>partir de agora de modelos, servem como importante instrumento de transição entre os seus requisitos</p><p>e o que será construído.</p><p>Os modelos, no projeto da sua casa, são artefatos importantes para a comunicação entre os</p><p>envolvidos no projeto, neste caso, a comunicação entre você e o projetista, e entre o projetista e a</p><p>equipe de construção.</p><p>Cada modelo é desenvolvido dirigido ao público-alvo a quem se deseja comunicar e com um objetivo</p><p>específico. Por exemplo, a planta, ou maquete da parte elétrica, possui algumas finalidades:</p><p>• Mostrar para você e para a equipe de construção os locais corretos onde haverá tomadas e pontos</p><p>de luz.</p><p>• Fornecer subsídios para que a equipe especializada em eletricidade determine quais componentes</p><p>serão utilizados, de tal forma que se possa mensurar a capacidade e a segurança do sistema.</p><p>Como você pode notar, a fase de projeto, bem como os modelos produzidos nela, são fatores</p><p>fundamentais para o sucesso do projeto da sua casa.</p><p>11</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>A engenharia civil é, obviamente, muito mais antiga que a engenharia de software; se compararmos,</p><p>a engenharia de software não chega perto do que a civil evoluiu em termos de profissionais, ferramentas</p><p>e processos.</p><p>Façamos o seguinte exercício de analogia: em vez do projeto de construção de uma casa, imagine</p><p>que seu objetivo agora seja construir um sistema de software.</p><p>Inicialmente você mapeia, valida e verifica os requisitos do usuário, como você já viu nas disciplinas</p><p>anteriores.</p><p>Ainda no campo da suposição, você é um desenvolvedor, um programador habilidoso, pega os</p><p>requisitos e parte para a codificação.</p><p>A prática e a experiência mostram que os resultados para o seu produto final, o software, não fogem</p><p>muito dos resultados obtidos no projeto de construção da casa.</p><p>Um produto de má qualidade, que não atende às necessidades do usuário, que possuí problemas,</p><p>que não se adapta à infraestrutura, ou que foi desenvolvido fora dos custos e do tempo previsto, é ainda</p><p>uma realidade na indústria de software.</p><p>Em um mercado cada vez mais competitivo, problemas dessa natureza passam a ser intoleráveis. A</p><p>competitividade do software começa a trazer à tona discussões sobre outros aspectos importantes do</p><p>produto, como manutenibilidade e usabilidade.</p><p>Como construir</p><p>haverá a transição</p><p>de estado entre efetuar a dispensa e efetivamente dispensar as cédulas (BEZERRA, 2006).</p><p>No diagrama de máquina de estados, podemos ainda representar processamentos paralelos, ou seja,</p><p>quando em um determinado ponto do processo, existe uma divisão de processamentos, logo mudanças</p><p>de estados de objetos que ocorrem em paralelo.</p><p>Para representar esse paralelismo, utilizamos alguns mecanismos, como a barra de bifurcação e a</p><p>barra de união, como mostra o exemplo da figura a seguir:</p><p>Finalizando</p><p>impressão</p><p>Imprimindo folha Exibindo número</p><p>da página impressa</p><p>Inicial Bifurcação</p><p>União</p><p>Figura 47 – Exemplo de barra de bifurcação e barra de união</p><p>119</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Lembrete</p><p>Sempre que utilizarmos uma barra de bifurcação, em algum momento</p><p>do processo deveremos utilizar uma barra de união; não é possível, no</p><p>desenvolvimento de sistemas, que não haja um ponto de conversão de</p><p>processamentos paralelos.</p><p>Existe ainda a situação em que devemos representar um ponto de decisão, uma espécie de controle</p><p>do tipo if/else, um ponto em que a máquina de estado se divida em função de uma decisão.</p><p>Para essas situações, utilizamos o pseudoestado de escolha, que representa um ponto na</p><p>transição de dois estados em que deve ser tomada uma decisão, conforme mostra o exemplo da</p><p>figura seguinte:</p><p>[se valor maior que saldo e menor que limite] [se valor maior que saldo e maior que limite]</p><p>Verificando saldo</p><p>Negando saqueSolicitando</p><p>empréstimo</p><p>Efetuando saque</p><p>[se valor menor que saldo]</p><p>Figura 48 – Exemplo de pseudoestado de escolha</p><p>Além desses elementos considerados básicos, pois utilizamos com frequência em praticamente</p><p>qualquer processo que desejamos modelar, temos também os elementos considerados elementos</p><p>avançados de modelagem (GUEDES, 2009).</p><p>São eles:</p><p>• Pseudoestado de história: utilizado para representar o registro do último estado em que um</p><p>objeto se encontrava quando, por alguma razão, o processo foi interrompido. Utilizamos esse</p><p>estado para que possamos voltar o processo exatamente no ponto em que o estado se encontrava</p><p>antes de uma interrupção. Utilizamos um H para representar esse estado.</p><p>120</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade IV</p><p>Inicial</p><p>[produto adicionado]</p><p>[continuar seleção]</p><p>Adicionando carrinho</p><p>Produto adicionado</p><p>Finalizando compras</p><p>H</p><p>Figura 49 – Exemplo de pseudoestado de história</p><p>• Estado de submáquina: utilizamos um estado de submáquina quando precisamos representar um</p><p>estado composto de alta complexidade e que, se utilizarmos apenas a representação de estado</p><p>composto, dificultará muito o entendimento em apenas um diagrama.</p><p>Inicial</p><p>Consultando pedido</p><p>Finalizando pedido</p><p>Finalizando pedido é</p><p>detalhado em outro</p><p>diagrama</p><p>Figura 50 – Exemplo de estado de submáquina</p><p>• Pseudoestado de junção: utilizamos esse estado para representar a união de múltiplos fluxos em</p><p>um único ponto.</p><p>121</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>[se valor maior que saldo e menor que limite] [se valor maior que saldo e maior que limite]</p><p>Verificando saldo</p><p>Negando saqueSolicitando</p><p>empréstimo</p><p>Efetuando saque</p><p>Finalizando processo</p><p>[se valor menor que saldo]</p><p>Figura 51 – Exemplo de pseudoestado de junção</p><p>Com o diagrama de máquina de estados e com o diagrama de comunicação, fechamos a parte de</p><p>refinamento da representação dos aspectos dinâmicos da arquitetura, no projeto arquitetural.</p><p>Saiba mais</p><p>Na UML existe ainda um diagrama classificado como diagrama</p><p>comportamental, mas que é pouco utilizado atualmente, chamado</p><p>diagrama de tempo, ou de temporização. Acesse em:</p><p>UML-DIAGRAMS. Timing diagrams, 2009-2014a. Disponível em:. Acesso em: 28 abr. 2015.</p><p>8 PROJETO DE INTERFACES E PROJETO DE COMPONENTES</p><p>8.1 Projeto de interfaces</p><p>Pressman (2006, p. 222) faz uma analogia interessante sobre o que vêm a ser os componentes de um</p><p>projeto de interfaces de um sistema de software: “o projeto de interfaces é análogo a um conjunto de</p><p>desenhos detalhados de portas, janelas e ligações externas de uma casa [...] representam a maneira pela</p><p>122</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade IV</p><p>qual as ligações de serviços públicos entram na casa e são distribuídos entre os cômodos representados</p><p>na planta”.</p><p>Os elementos do projeto de interfaces, ainda segundo Pressman (2006), representam como as</p><p>informações entram em um sistema de software e saem dele e como essas informações trafegam entre</p><p>as estruturas desse sistema definidas no projeto arquitetural.</p><p>O projeto de interface pode ser dividido em três níveis:</p><p>• Interfaces internas entre os componentes do sistema.</p><p>• Interfaces externas entre o sistema e outros sistemas de software, dispositivos de hardware ou</p><p>qualquer entidade que produza ou consuma informação relevante para o sistema de software.</p><p>• Interface com o usuário final.</p><p>Neste tópico daremos ênfase ao projeto de interfaces internas e externas e debateremos apenas</p><p>aspectos introdutórios sobre o projeto de interface com o usuário.</p><p>8.1.1 Especificando as interfaces dos objetos</p><p>O primeiro passo para a definição das interfaces internas de um sistema, ou seja, as interfaces entre</p><p>os componentes e objetos internos de um sistema, é definirmos claramente como esses objetos estão</p><p>organizados.</p><p>Como já vimos em projeto arquitetural, agrupamos objetos que tenham alguma correlação,</p><p>geralmente, agrupamos os objetos que tenham as mesmas responsabilidades, por exemplo, no estilo</p><p>arquitetural em camadas.</p><p>Lembrete</p><p>A arquitetura em camadas pode ser entendida como “caixas”, ou</p><p>agrupamentos que são estritamente conceituais, de objetos com funções</p><p>semelhantes.</p><p>Na arquitetura em camadas, organizamos os objetos em blocos conceituais, e a comunicação</p><p>entre essas camadas se dá através de um protocolo, definido por objetos de negócio que contêm as</p><p>informações trafegadas entre essas camadas.</p><p>Podemos dizer que, ao definirmos essa camada de objetos de negócio e esse protocolo de</p><p>comunicação entre as camadas de negócio, apresentação e integração, estamos definindo uma interface</p><p>de comunicação entre esses objetos e essas camadas.</p><p>123</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Obviamente, até então, estávamos pensando nessas camadas como blocos conceituais, ou “caixas”,</p><p>para entendermos o conceito da organização arquitetural interna de um software.</p><p>Agora, iremos partir, efetivamente, para a representação desse modelo em uma linguagem de</p><p>modelagem de software. Utilizaremos, para isso, o diagrama de pacotes da UML.</p><p>8.1.2 Diagrama de pacotes</p><p>Como vimos, o processo de organização e de modelagem da solução de um sistema de software</p><p>pode envolver uma grande quantidade de objetos, classes e diagramas que podem ficar tão complexos</p><p>quanto se queira.</p><p>Ante esse cenário, é possível que você perceba a necessidade de se organizar esses componentes</p><p>em um nível de abstração um pouco maior, de tal forma que facilite o entendimento de uma visão um</p><p>pouco mais macro da solução.</p><p>Um pacote é utilizado com o propósito de agrupar logicamente objetos, entendendo-se um objeto</p><p>como qualquer elemento passível de agrupamento no processo de modelagem de um sistema: classes,</p><p>objetos, componentes e casos de uso (LARMAN, 2007).</p><p>A função principal do pacote é organizar esses objetos, esses elementos de modelagem, que possuem</p><p>semelhantes características, em agrupamentos maiores que podem ser mais facilmente entendíveis.</p><p>Como mencionado por Bezerra (2006), quando modelamos a arquitetura de uma aplicação utilizando</p><p>pacotes, podemos representar as diferentes</p><p>visões da arquitetura desse sistema, além de definirmos e</p><p>controlarmos a visibilidade dos elementos de um pacote.</p><p>A partir do momento em que definimos a visibilidade dos elementos de um pacote e a forma, ou o</p><p>protocolo, de como estes pacotes se comunicam, estamos definindo, como pano de fundo, as interfaces</p><p>dos objetos dentro do universo do sistema, também chamadas de interfaces internas.</p><p>Para representar um pacote, no diagrama de pacotes, utilizamos uma pasta com guias, como mostra</p><p>o exemplo a seguir:</p><p>Cliente</p><p>Cliente</p><p>Figura 52 – Notação de pacotes na UML</p><p>124</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade IV</p><p>Note ainda que temos duas formas de descrever o nome de um pacote: na aba do pacote, como na</p><p>notação superior, ou dentro do pacote, como na notação inferior, sendo mais comum que utilizemos a</p><p>descrição na guia da pasta.</p><p>Como um pacote é um agrupamento de elementos, podemos também utilizar um pacote como um</p><p>agrupamento de outros pacotes; nesse caso, dizemos que um pacote está contido em outro:</p><p>Cliente</p><p>Vendas</p><p>Figura 53 – Exemplo de notação de pacotes e subpacotes</p><p>No caso da figura anterior, utilizamos o nome qualificado da seguinte forma: “Cliente::Vendas”, ou</p><p>seja, no prefixo, indicamos o nome do pacote que contém o elemento.</p><p>Ainda no caso de subpacotes, podemos representar essa relação de composição, da mesma forma</p><p>que representamos composição de classes.</p><p>No caso da figura a seguir, lemos que o pacote “Cliente” é composto pelo pacote “Vendas”, ou</p><p>podemos utilizar o nome qualificado.</p><p>Cliente</p><p>Vendas</p><p>Figura 54 – Exemplo de composição de pacotes e subpacotes</p><p>Podemos utilizar pacotes para agrupar casos de uso que sejam de um contexto comum, como mostra</p><p>a figura a seguir, em que temos dois pacotes de casos de uso separados pelos seus canais de execução.</p><p>125</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Cliente</p><p>Efetuar saque</p><p>Contratar</p><p>empréstimo</p><p>Efetuar depósito</p><p>Consultar saldo</p><p>Imprimir extrato CC</p><p>Autoatendimento</p><p>Internet banking</p><p>Figura 55 – Exemplo de pacotes de caso de uso</p><p>Para representar um pacote como um agrupamento de classes, incluímos essas classes no pacote</p><p>desejado, como mostra o exemplo da figura a seguir, e nesse exemplo, também podemos utilizar a</p><p>notação de nome qualificado: “Vendas::Cliente” e “Vendas::Pedido”.</p><p>Vendas</p><p>Cliente</p><p>efetua</p><p>Pedido</p><p>Figura 56 – Exemplo de pacote de classes</p><p>Vamos nos aprofundar um pouco mais na parte mais importante do diagrama de pacotes, que é</p><p>modelar a arquitetura estática de alto nível de um sistema de software.</p><p>126</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade IV</p><p>Observação</p><p>Não confunda agrupamento lógico, que é o promovido pelo diagrama</p><p>de pacotes, com agrupamento físico de classes ou componentes. Veremos</p><p>como representar agrupamento físico adiante.</p><p>Como dissemos anteriormente, podemos definir a visibilidade de elementos dentro de um pacote.</p><p>A visibilidade dos elementos segue o mesmo conceito básico de visibilidade de atributos e métodos que</p><p>vimos nos capítulos anteriores. Temos três níveis de visibilidade: público, representado pelo sinal de positivo</p><p>(+); privado, representado pelo sinal de negativo (-); e protegido, representado pelo sinal sustenido (#), com</p><p>algumas diferenças exploradas no contexto de pacotes, como se explica a seguir:</p><p>Vendas</p><p>+ Cliente</p><p>- Pedido</p><p># ItemPedido</p><p>Figura 57 – Exemplo de visibilidade de elementos de um pacote</p><p>Na figura anterior, temos um pacote com três classes: “Cliente”, “Pedido” e “ItemPedido”; seus</p><p>respectivos níveis de visibilidade estão descritos na representação da própria classe.</p><p>Nesse caso, fazemos as seguintes leituras:</p><p>• Um elemento marcado como público (+) é visível por todos os outros pacotes do sistema. As</p><p>partes públicas desse pacote constituem a interface desse pacote.</p><p>• Um elemento marcado como privado (-) é visível somente por outros elementos do mesmo pacote.</p><p>Elementos privados não podem ser vistos por outros pacotes.</p><p>• Um elemento marcado como protegido (#) é visível somente em pacotes-filhos do pacote ao qual</p><p>pertence. Um pacote-filho é um pacote que possui relação de herança com outro pacote.</p><p>Já que tocamos no assunto herança de pacotes, vejamos quais são os tipos de relacionamento</p><p>possíveis entre pacotes e como podemos representá-los no diagrama.</p><p>Podemos dizer que um pacote X dependerá de um pacote Y se um elemento, ou um objeto qualquer</p><p>de X, depender de outro elemento ou objeto qualquer de Y (BEZERRA, 2006).</p><p>127</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>É importante que se diga que, a partir do momento em que criamos dependência entre pacotes,</p><p>uma alteração no pacote de destino afeta diretamente o pacote dependente. Observe alguns tipos de</p><p>dependências (MEDEIROS, 2004):</p><p>Dependência simples é quando um elemento de um pacote possui alguma relação com um</p><p>elemento de outro pacote. Como mostra o exemplo da figura a seguir, que é a representação, em</p><p>pacotes, da arquitetura em camadas que vimos anteriormente. Neste caso, podemos afirmar que</p><p>classes do pacote de interface do usuário possuem ligação com classes do pacote de negócios, e</p><p>assim sucessivamente.</p><p>Interface com o Usuário</p><p>Camada de Negócios</p><p>Camada de Integração</p><p>Objetos de Negócios</p><p>Figura 58 – Exemplo de dependência simples de pacotes</p><p>Dependência com estereótipo de acesso é quando o pacote dependente é incorporado aos</p><p>elementos públicos do pacote de destino.</p><p>Dependência com estereótipo de importação é quando os elementos públicos do pacote de</p><p>destino são adicionados ao pacote dependente, como mostra a figura a seguir:</p><p>128</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade IV</p><p>Pagamento</p><p>Cliente</p><p>></p><p>> ></p><p>Carrinho de compras</p><p>Item</p><p>Figura 59 – Exemplo de dependência estereotipada de pacotes</p><p>Herança aplicada a pacotes possui o mesmo conceito utilizado em herança do paradigma da</p><p>orientação a objetos. Utilizamos herança de pacotes quando desejamos representar generalização ou</p><p>especialização de famílias de pacotes. O exemplo, representado pela figura a seguir, mostra pacotes com</p><p>classes específicas para desenho de formulários de sistemas desktop, ou baseado em janelas.</p><p>Nesse caso, temos num pacote-mãe, todos os objetos responsáveis pelo desenho de janelas genéricas,</p><p>e, nos pacotes-filhos, temos as especializações, para desenho de janelas em sistemas operacionais dos</p><p>tipos Windows, Linux e Mac.</p><p>Linux User Interface Window</p><p>User Interface Window</p><p>Windows User Interface Window Mac User Interface Window</p><p>Figura 60 – Exemplo de herança de pacotes</p><p>129</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Saiba mais</p><p>A implementação de “pacotes” na linguagem da plataforma Microsoft</p><p>.Net corresponde ao conceito de namespace. Para aprofundar seus</p><p>conhecimentos sobre o tema, leia:</p><p>CAMARA, F. Orientação a objeto com .NET. 2. ed. Santa Catarina: Visual</p><p>Books, 2006.</p><p>Assim como “pacotes” corresponde ao conceito de package da linguagem</p><p>Java, como se vê em:</p><p>SIERRA, K; BATES, B. Use a Cabeça! Java. 2. ed. Rio de Janeiro: Alta</p><p>Books, 2007.</p><p>8.1.3 Introdução ao projeto de interfaces com o usuário</p><p>O projeto de interfaces com o usuário está ligado diretamente ao fator usabilidade. Abordaremos</p><p>aspectos introdutórios e que são muito importantes para o sucesso do projeto de software.</p><p>Dentro de um modelo de atributos de qualidade de software, de acordo com a ISO 25010 (2011a),</p><p>a usabilidade encaixa-se entre os seis principais que delimitam a qualidade de um produto, que são:</p><p>confiabilidade, funcionalidade, eficiência, manutenibilidade, portabilidade e usabilidade.</p><p>Usabilidade</p><p>está ligada ao projeto, à avaliação e à implementação de sistemas computacionais,</p><p>contemplando hardware e software, de tal forma que ajude os usuários em suas tarefas, em um contexto</p><p>específico, de maneira produtiva (ISO, 2011a; ROCHA; BARANAUSKAS, 2003).</p><p>Engenharia de usabilidade é o nome dado ao conjunto de atividades distribuídas na forma estruturada</p><p>de projeto de sistemas computacionais cujo objetivo é a usabilidade (ROCHA; BARANAUSKAS, 2003).</p><p>Mayhew (1999), outra referência quando falamos sobre usabilidade, também define engenharia da</p><p>usabilidade como uma disciplina que visa fornecer técnicas, processos e ferramentas que possam servir</p><p>de suporte a um projeto de um sistema computacional com ênfase no usuário.</p><p>O principal objetivo da engenharia da usabilidade, qualquer que seja o modelo adotado, é a</p><p>diminuição do custo no desenvolvimento de um projeto centrado no usuário através da redução</p><p>nos tempos de desenvolvimento, treinamento e retrabalho (ROCHA; BARANAUSKAS, 2003;</p><p>NIELSEN, 1993).</p><p>É importante mencionar que engenharia de usabilidade não está ligada apenas a atividades,</p><p>processos e técnicas, mas também à filosofia de considerar o usuário como centro do processo, levando</p><p>130</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade IV</p><p>em consideração o ambiente e aspectos cognitivos e psicológicos na execução de sua rotina (AVELINO,</p><p>2005; MAYHEW, 1999; NIELSEN, 1993).</p><p>Como podemos notar, o projeto de interface do usuário está ligado à engenharia da usabilidade,</p><p>que deve ser tratada com muito mais aprofundamento do que simplesmente desenharmos interfaces</p><p>do usuário.</p><p>Shneiderman (1998), por exemplo, aponta como um dos fatores fundamentais de sucesso para</p><p>um sistema computacional interativo, a preocupação com aspectos inerentes às atividades do usuário,</p><p>como sua capacidade perceptiva e sua habilidade cognitiva na execução de suas tarefas diárias.</p><p>A usabilidade não tem recebido a atenção necessária na fase de elaboração da arquitetura de um</p><p>sistema computacional, fato este que pode levar ao retrabalho tardio, bem como tornar o sistema</p><p>menos usável do que poderia ser (GOLDEN; JOHN; BASS, 2005).</p><p>Saiba mais</p><p>Para aprofundar seus conhecimentos sobre a preocupação com a</p><p>usabilidade e os aspectos que influenciam o projeto de um sistema de</p><p>software, leia:</p><p>GOLDEN, E.; JOHN, B. E.; BASS, L. The value of a usability-supporting</p><p>architectural pattern in software architecture design: a controlled</p><p>experiment. In: INTERNATIONAL CONFERENCE ON SOFTWARE ENGINEERING</p><p>– ICSE, 2005, St. Louis. Proceedings... St. Louis: ICSE, 2005.</p><p>8.2 Projeto de componentes</p><p>Antes de pensarmos em como projetar componentes, precisamos ter muito claro o que é um</p><p>componente, bem como quais os objetivos e os benefícios em se componentizar um software.</p><p>8.2.1 Introdução à componentização e ao reúso de software</p><p>A componentização, ou o desenvolvimento componentizado de software, é um paradigma, tal qual</p><p>o paradigma da orientação a objetos, que não se limita apenas ao desenvolvimento de componentes,</p><p>assim como a orientação não se limita a classes a esmo.</p><p>Analogamente ao paradigma da orientação a objetos, que define um guia, uma forma de se</p><p>desenvolver software, cujo fundamento é o conceito de objetos, a componentização tem como base o</p><p>conceito de componentes.</p><p>131</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Os cinco princípios básicos de um componente, segundo Cheesman e Daniels (2000), uma das</p><p>melhores referências no assunto, são:</p><p>• Um componente obrigatoriamente deve possuir uma especificação.</p><p>• Um componente obrigatoriamente deve possuir uma implementação.</p><p>• Um componente obrigatoriamente deve seguir uma padronização.</p><p>• Um componente obrigatoriamente deve ter a capacidade de ser empacotado em módulos.</p><p>• Um componente obrigatoriamente deve ter a capacidade de ser distribuído.</p><p>Um componente de software é como um componente de um sistema eletrônico, uma unidade</p><p>projetada e construída para possuir seus próprios processamento, regras e informações.</p><p>Essa unidade pode ser substituída, por qualquer motivo (erro ou evolução), por outra unidade com</p><p>as mesmas características de relação para com o restante do sistema, sem que haja dano ou modificação</p><p>no funcionamento do todo.</p><p>Nesta disciplina, não conseguiremos abordar todo o paradigma da componentização, mas veremos</p><p>os aspectos introdutórios fundamentais que fazem a conexão entre o paradigma da orientação a objetos</p><p>e o da componentização.</p><p>Um componente de software se dispõe a prestar um serviço para o restante do sistema; por princípio,</p><p>ele deve ser consistente e conciso com relação às suas responsabilidades, de tal forma que atinja baixo</p><p>acoplamento e alta coesão.</p><p>Lembrete</p><p>Os conceitos de acoplamento e coesão de componentes são os mesmos</p><p>que aplicamos quando debatemos acoplamento e coesão de classes</p><p>anteriormente.</p><p>Esse serviço prestado pelo componente deve ser visível a outros componentes (clientes) que,</p><p>porventura, desejem acessar esse serviço. Analogamente ao paradigma da orientação a objetos, é como</p><p>se cada componente possuísse um método público que pudesse ser chamado por outros componentes.</p><p>Podemos dizer que entre o componente que disponibiliza o serviço e o componente que consome</p><p>esse serviço existe um contrato, uma regra que não pode ser quebrada por nenhuma das partes.</p><p>Para o componente que consome o serviço, é indiferente como o componente implementa ou qual a</p><p>lógica interna que é utilizada para resolver um determinado problema; o importante é que o protocolo</p><p>de comunicação seja mantido.</p><p>132</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade IV</p><p>A interface de um componente é análoga à que temos no paradigma da orientação a objetos, ou</p><p>seja, é um contrato que determina o que deve ser feito, mas que não estipula como deve ser feito.</p><p>Essa padronização do protocolo de comunicação entre os componentes e entre os objetos nos</p><p>garante uma alta capacidade de reúso do componente que oferece um determinado serviço; se um</p><p>componente quiser utilizar um determinado serviço, bastará adaptar-se a esse protocolo, sem que haja</p><p>necessidade de alteração no componente fornecedor.</p><p>Os paradigmas da componentização e da orientação a objetos se cruzam em um ponto, na medida</p><p>em que podemos considerar que um componente é uma estrutura de software composta por objetos,</p><p>que, quando compilados, geram estruturas físicas e concisas que podem ser encaradas como um sistema</p><p>computacional, por exemplo, bibliotecas (dlls), executáveis (exes), tabelas, documentos etc.</p><p>Observação</p><p>Componentes e pacotes são semelhantes quanto à função de</p><p>agrupamento, todavia diferem com relação ao final desse agrupamento:</p><p>componentes são agrupamentos físicos de objetos, enquanto pacotes são</p><p>meramente agrupamentos lógicos.</p><p>Se temos serviços definidos por interfaces e implementados por classes, podemos dizer que essas</p><p>interfaces podem ser externas ou exportadoras de serviços desses sistemas de software.</p><p>Saiba mais</p><p>Para aprofundar seus conhecimentos sobre o assunto, leia:</p><p>CHEESMAN, J.; DANIELS, J. UML components: a simple process for</p><p>specifying component-based software. Addison-Wesley, 2000.</p><p>GIMENES, I. M. S.; HUZITA, E. H. M. Desenvolvimento baseado em</p><p>componentes: conceitos e técnicas. Rio de Janeiro: Ciência Moderna, 2005.</p><p>8.2.2 Definindo as interfaces externas</p><p>As interfaces externas ao componente, ou ao sistema de software, são determinadas pelas suas</p><p>interfaces, que definem o protocolo, ou o contrato de comunicação entre objetos consumidores e</p><p>provedores de serviço.</p><p>Essa relação de consumo de serviços acaba por criar uma dependência entre esses componentes ou</p><p>entre objetos. As dependências podem ser classificadas como simples ou estereotipadas.</p><p>133</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>:</p><p>F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Observação</p><p>A relação de dependência entre componentes e objetos, nesse contexto,</p><p>é considerada fraca, uma vez que o consumidor depende apenas da</p><p>interface, e não da implementação do fornecedor do serviço.</p><p>Dependências simples são dependências entre componentes delimitadas pela interface, por</p><p>exemplo, uma dependência entre um executável e uma DLL, enquanto dependências estereotipadas são</p><p>dependências particulares de um determinado cenário, por exemplo, dependências entre páginas de um</p><p>web site, que podem ser marcadas como >.</p><p>Para representação e modelagem de componentes e de suas interfaces, utilizaremos o diagrama de</p><p>componentes da UML.</p><p>8.2.3 Diagrama de componentes</p><p>No diagrama de componentes da UML utilizamos, para representação de componentes, uma caixa</p><p>com tabs, como mostra o exemplo da figura a seguir. Ainda na figura, podemos notar a identificação do</p><p>nome do componente.</p><p>kernel32.dll</p><p>Figura 61 – Exemplo de notação de componentes</p><p>Podemos ainda utilizar a estereotipação para identificar o tipo do componente, como mostra o</p><p>exemplo da figura a seguir:</p><p>></p><p>Nome do executável</p><p>></p><p>Nome da dll</p><p>Figura 62 – Exemplo de representação de componentes com estereotipação</p><p>134</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade IV</p><p>O quadro seguinte mostra os possíveis tipos de estereotipação para componentes e seus respectivos</p><p>significados.</p><p>Quadro 14 – Tipos de componentes e estereotipação</p><p>Estereótipo Tipo de componente</p><p>> Componente que pode ser executado.</p><p>> Biblioteca, que pode ser estática ou dinâmica.</p><p>> Banco de dados.</p><p>> Tabela de um banco de dados.</p><p>> Documento.</p><p>> Arquivo, que pode ser desde um arquivo que possui</p><p>apenas informações a um arquivo com código-fonte.</p><p>A representação de interface de componentes, no diagrama da UML, é feita como mostra a</p><p>figura a seguir. Nessa figura, podemos ler que o componente DLL possui uma interface que é</p><p>consumida pelo executável; o conector convexo indica a interface, e o conector côncavo indica</p><p>o consumidor.</p><p>></p><p>Nome do executável</p><p>></p><p>Nome do executável</p><p>></p><p>Nome da dll</p><p>></p><p>Nome da dll</p><p>></p><p>Interface</p><p>Dependência</p><p>Implementação</p><p>Figura 63 – Exemplo de conexão e de dependência entre componentes</p><p>Essa é a representação de dependências simples entre componentes, ou seja, quando há a conexão</p><p>feita a partir de interfaces. A figura a seguir mostra um exemplo de dependência estereotipada.</p><p>135</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>></p><p>Index.html</p><p>></p><p>Cliente.html</p><p>></p><p>Figura 64 – Exemplo de representação de dependência estereotipada</p><p>Lembrete</p><p>Pacotes são agrupamentos lógicos de elementos, que podem ser</p><p>classes ou casos de uso, como vimos anteriormente; ou podemos</p><p>utilizar pacotes para agrupar logicamente componentes que possuam</p><p>funções semelhantes.</p><p>O diagrama de componentes representa uma visão mais física do sistema de software; as partes</p><p>desse sistema são apresentadas sob uma perspectiva mais concreta, ou seja, podemos empacotar esses</p><p>componentes e distribuí-los.</p><p>Contudo, esse diagrama não nos dá a visão da organização desses componentes sob o enfoque da</p><p>organização da estrutura física sobre a qual o software será implantado e executado.</p><p>Pensando em estrutura física, podemos imaginar que iremos distribuir esses componentes em</p><p>diversas plataformas, ou que, eventualmente, parte do nosso sistema de software será executada</p><p>em uma plataforma, um sistema operacional, enquanto outra parte poderá ser executada em outra</p><p>plataforma, ou em outro tipo de sistema operacional.</p><p>Como representar, modelar e especificar essas questões importantes e que nem sempre têm</p><p>a atenção devida? O diagrama de distribuição ou de implantação auxilia-nos nesse primeiro</p><p>momento.</p><p>8.2.4 Diagrama de distribuição</p><p>O diagrama de distribuição, ou de implantação, mostra como os componentes são configurados para</p><p>execução, em “nós” de processamento (LARMAN, 2007).</p><p>136</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade IV</p><p>Um “nó” de processamento é um recurso computacional que permite a execução de um sistema de</p><p>software, ou de parte dele, como um componente. Esse “nó” pode ser um computador, um dispositivo</p><p>móvel ou até mesmo uma estrutura de memória ou um dispositivo periférico.</p><p>No diagrama de implantação, utilizamos um cubo para representar um “nó”, que “nó” deve possuir</p><p>um nome e um tipo, como mostra a figura a seguir:</p><p>PC</p><p>Figura 65 – Exemplo de representação de nó do tipo computador do usuário</p><p>Com a visão que nos é fornecida pelo diagrama de implantação, podemos visualizar as dependências</p><p>entre os “nós” e como se dá a comunicação entre esses “nós”.</p><p>Por exemplo, em um sistema cliente-servidor, teremos dois “nós”: o cliente e o servidor.</p><p>Com o diagrama, poderemos deixar clara a dependência entre esses dois “nós”, além de especificar</p><p>o protocolo de comunicação entre esses “nós”, por exemplo, se será uma comunicação via HTTP ou</p><p>HTTPS. Esses detalhes são fundamentais para o dimensionamento da infraestrutura necessária ao</p><p>sistema de software.</p><p>Neste diagrama podemos representar os componentes contidos em cada “nó”, como mostra o</p><p>exemplo da figura a seguir:</p><p>Servidor</p><p>Servidor de Banco de Dados</p><p>PC</p><p>></p><p>Navegador web</p><p>></p><p>e-commerce</p><p>Base de dados SQL</p><p>TCP/IP</p><p>HTTP</p><p>Figura 66 – Exemplo de distribuição de componentes em nós</p><p>137</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Resumo</p><p>Nesta unidade demos ênfase a como produzir os modelos referentes</p><p>às fases de projeto arquitetural, projeto de interfaces e projeto de</p><p>componentes, uma vez que, na unidade anterior, vimos onde, quais e</p><p>quando esses modelos seriam utilizados.</p><p>Começamos o debate desta unidade explanando que refinar os</p><p>aspectos dinâmicos da arquitetura de um sistema de software significa</p><p>complementar a visão dada pelo diagrama de sequência, e não substituí-lo.</p><p>O objetivo desse refinamento se dá pela necessidade de prover uma</p><p>melhor qualidade da informação que é passada pela equipe de construção</p><p>e pelos demais envolvidos no projeto, pois quantidade de informação, como</p><p>vimos, não necessariamente quer dizer melhor qualidade.</p><p>Para complementar a visão do diagrama de sequência, vimos,</p><p>inicialmente, o diagrama de comunicação, que, nas versões anteriores da</p><p>UML, era chamado de diagrama de colaboração.</p><p>Este diagrama, assim como o de sequência, tem característica</p><p>comportamental, ou seja, visa à modelagem das interações dos objetos,</p><p>mas, diferentemente do diagrama de sequência, não dá ênfase à troca de</p><p>mensagens em uma linha de tempo, mas à interligação e à dependência</p><p>dos objetos.</p><p>Temos, no diagrama de colaboração, três elementos principais de</p><p>modelagem: o objeto, os vínculos entre eles e as mensagens trocadas,</p><p>que são etiquetadas em ordem numérica e crescente para que possamos</p><p>visualizar a sequência em que elas são executadas.</p><p>Vimos que os diagramas de sequência e colaboração são análogos, ou</p><p>seja, as informações contidas em um, obrigatoriamente, aparecem no outro;</p><p>a diferença fica apenas no enfoque de cada diagrama. No entanto, deve-se</p><p>ficar atento para ferramentas que promovem a conversão automática dos</p><p>diagramas.</p><p>O último diagrama a complementar a visão comportamental da</p><p>arquitetura é o diagrama de máquina de estado, ou diagrama de estado,</p><p>cujo objetivo é representar as mudanças de estado de um objeto no decorrer</p><p>do tempo.</p><p>138</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade IV</p><p>O estado de um objeto é dado pelo conjunto de valores de seus</p><p>atributos, que pode ser modificado por um evento do sistema. Esse</p><p>evento promove uma transição de estado do objeto, e esse processo</p><p>é objeto de representação desse diagrama a partir de uma máquina</p><p>finita de estados.</p><p>Além dos elementos básicos de modelagem: estado/transição e</p><p>todos os tipos de mensagens presentes no diagrama de sequência, o</p><p>diagrama de estado provê mecanismos avançados de representação de</p><p>fluxos alternativos, paralelos, além de mecanismos para facilitação da</p><p>representação de estados mais complexos, por exemplo, o pseudoestado</p><p>de história, o estado composto e o estado de submáquina.</p><p>Avançando para o projeto de interfaces, vimos que essa fase pode ser</p><p>dividida em três níveis: projeto de interfaces internas, externas e interface</p><p>com o usuário final.</p><p>O projeto de interfaces internas dá ênfase a como os objetos internos</p><p>do sistema de software se comunicam, e para representar a organização</p><p>lógica desses componentes utilizamos o diagrama de pacotes, pois o</p><p>primeiro passo para a definição do protocolo de comunicação é estabelecer</p><p>quais objetos possuem interfaces com quais objetos.</p><p>O pacote é um mecanismo de organização lógica de elementos de</p><p>modelagem; esses elementos podem ser: os casos de uso, as classes e</p><p>os componentes.</p><p>O projeto de interface com o usuário envolve a engenharia da usabilidade,</p><p>que é a área de estudo preocupada em fazer o usuário executar as tarefas</p><p>do dia a dia de forma produtiva.</p><p>O projeto de componentes é um assunto profundo e ligado intimamente</p><p>ao paradigma da componentização, que cruza com o paradigma da</p><p>orientação a objetos.</p><p>Um componente obrigatoriamente deve possuir: especificação,</p><p>implantação, padronização e capacidade de ser empacotado e distribuído.</p><p>Um componente de software é uma unidade autônoma e suficiente,</p><p>que objetiva baixo acoplamento e alta coesão e promove o reúso. Esse</p><p>componente é formado por objetos.</p><p>Cada componente é um provedor de serviços, e esses serviços são</p><p>definidos por interfaces, que são contratos que determinam quais</p><p>139</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>serviços são fornecidos e qual é o protocolo de comunicação entre</p><p>o cliente e o fornecedor, sem se preocupar com o modo pelo qual</p><p>esses serviços serão implementados.</p><p>Para modelar os componentes de um sistema, utilizamos o diagrama</p><p>de componentes da UML, sempre lembrando que o mais importante é a</p><p>definição clara das dependências entre os componentes, dadas a partir das</p><p>interfaces.</p><p>No diagrama de distribuição representamos em que lugar, dentro de</p><p>uma infraestrutura, esses componentes serão distribuídos. A importância</p><p>desse diagrama se dá pela visão que temos para mensurar a infraestrutura</p><p>necessária para o sucesso do projeto.</p><p>Exercícios</p><p>Questão 1. Um componente de software é como um componente de um sistema eletrônico, uma</p><p>unidade projetada e construída para possuir seu próprio processamento, regras e informações.</p><p>Com base nos cinco princípios básicos de um componente, segundo Cheesman e Daniels (2001),</p><p>analise as afirmativas a seguir:</p><p>I – Um componente obrigatoriamente deve possuir uma especificação em UML.</p><p>II – Um componente obrigatoriamente deve possuir uma implementação.</p><p>III – Um componente opcionalmente deve seguir uma padronização.</p><p>IV – Um componente obrigatoriamente deve ter a capacidade de ser empacotado em módulos.</p><p>V – Um componente obrigatoriamente deve ter a capacidade de ser distribuído.</p><p>É correto apenas o que se afirma em:</p><p>A) I e II.</p><p>B) II e IV.</p><p>C) I, II, III e IV.</p><p>D) II, IV e V.</p><p>E) I, II, e IV.</p><p>Resposta correta: alternativa D.</p><p>140</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade IV</p><p>Análise das afirmativas</p><p>I – Afirmativa incorreta.</p><p>Justificativa: não há menção da obrigatoriedade da linguagem UML para a especificação do</p><p>componente na descrição dos cinco princípios básicos de um componente, segundo Cheesman e Daniels</p><p>(2001).</p><p>II – Afirmativa correta.</p><p>Justificativa: um componente obrigatoriamente deve possuir uma implementação.</p><p>III – Afirmativa incorreta.</p><p>Justificativa: um componente deve obrigatoriamente, e não opcionalmente, seguir uma</p><p>padronização.</p><p>IV – Afirmativa correta.</p><p>Justificativa: um componente obrigatoriamente deve ter a capacidade de ser empacotado em</p><p>módulos.</p><p>V – Afirmativa correta.</p><p>Justificativa: um componente obrigatoriamente deve ter a capacidade de ser distribuído.</p><p>Questão 2. O diagrama de comunicação é um tipo de diagrama de comportamental da UML,</p><p>que representa as interações entre dois objetos e suas partes utilizando para isso uma sequência de</p><p>mensagens representadas de forma livre de formatação (UML Diagrams, 2015).</p><p>De acordo com os conceitos do diagrama de comunicação, analise as duas afirmativas apresentadas</p><p>a seguir:</p><p>O diagrama de comunicação dá ênfase em como os objetos estão interligados e quais mensagens</p><p>são trocadas entre eles para realizar uma determinada tarefa.</p><p>Porque</p><p>No diagrama de comunicação, as mensagens possuem uma numeração, é como se elas fossem</p><p>“etiquetadas” com uma numeração, em ordem crescente, e é essa sequência numérica que representa a</p><p>sequência nas quais as mensagens são trocadas entre os objetos.</p><p>Acerca dessas afirmativas, assinale a alternativa correta:</p><p>141</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>A) As duas afirmativas são proposições verdadeiras e a segunda é uma justificativa correta da</p><p>primeira.</p><p>B) As duas afirmativas são proposições verdadeiras e a segunda não é uma justificativa correta da</p><p>primeira.</p><p>C) A primeira afirmativa é uma proposição verdadeira e a segunda é uma proposição falsa.</p><p>D) A primeira afirmativa é uma proposição falsa e a segunda é uma proposição verdadeira.</p><p>E) As duas afirmativas são proposições falsas.</p><p>Resolução desta questão na plataforma.</p><p>142</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>FIGURAS E ILUSTRAçõES</p><p>Figura 1</p><p>SOMMERVILLE, I. Engenharia de software. São Paulo: Pearson, 2010. p. 30. Adaptado.</p><p>Figura 4</p><p>PRESSMAN, R. S. Engenharia de software. 6. ed. São Paulo: Mcgraw-hill, 2006. p. 208. Adaptado.</p><p>Figura 8</p><p>MEDEIROS, L. F. Banco de dados: princípios e prática. Curitiba: InterSaberes, 2013. Adaptado.</p><p>Figura 9</p><p>SAXENA, V.; PRATAP, A. Performance comparison between relational and object-oriented databases.</p><p>International Journal of Computer Applications, p. 6-9, 2013. Adaptado.</p><p>Figura 10</p><p>BEZERRA, E. Princípios de análise e projeto de sistemas com UML: um guia prático para modelagem de</p><p>sistemas orientados a objetos através da linguagem de modelagem unificada. Rio de Janeiro: Campus,</p><p>2006. p. 168. Adaptado.</p><p>Figura 11</p><p>BEZERRA, E. Princípios de análise e projeto de sistemas com UML: um guia prático para modelagem de</p><p>sistemas orientados a objetos através da linguagem de modelagem unificada. Rio de Janeiro: Campus,</p><p>2006. p. 168. Adaptado.</p><p>Figura 12</p><p>BEZERRA, E. Princípios de análise e projeto de sistemas com UML: um guia prático para modelagem de</p><p>sistemas orientados a objetos através da linguagem de modelagem unificada. Rio de Janeiro: Campus,</p><p>2006. p. 168. Adaptado.</p><p>Figura 17</p><p>BOOCH, G.; JACOBSON, I.; RUMBAUGH, J. UML: guia do usuário. 2. ed. Rio de Janeiro: Campus, 2006. p.</p><p>258. Adaptado.</p><p>143</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Figura 18</p><p>BOOCH, G.; JACOBSON, I.; RUMBAUGH, J. UML: guia do usuário. 2. ed. Rio de Janeiro: Campus, 2006.</p><p>p. 258. Adaptado.</p><p>Figura 19</p><p>ELMASRI, R.; NAVATHE, S. B. Sistemas de banco de dados. 6. ed. São Paulo: Addison-Wesley, 2011. p.</p><p>133. Adaptado.</p><p>Figura 30</p><p>MERSON, P. How to represent the architecture of your application using UML 2.0 and more. Pitsburgo:</p><p>Software Engineering Institute, 2006. Adaptado.</p><p>Figura 39</p><p>TIAKO, P. F. Software applications: concepts, methodologies,</p><p>tools, and applications. 1. ed. Langston:</p><p>Information Science Reference, 2009. p. 597. Adaptado.</p><p>Figura 41</p><p>UML-DIAGRAMS. UML communication diagrams overview, 2009-2014. Disponível em: . Acesso em: 27 abr. 2015. Adaptado.</p><p>Figura 52</p><p>LARMAN, C. Utilizando UML e padrões: uma introdução à análise e ao projeto orientados a objetos e</p><p>ao processo unificado. 2. ed. Porto Alegre: Bookman, 2007. Adaptado.</p><p>Figura 53</p><p>LARMAN, C. Utilizando UML e padrões: uma introdução à análise e ao projeto orientados a objetos e</p><p>ao processo unificado. 2. ed. Porto Alegre: Bookman, 2007. Adaptado.</p><p>Figura 56</p><p>LARMAN, C. Utilizando UML e padrões: uma introdução à análise e ao projeto orientados a objetos e</p><p>ao processo unificado. 2. ed. Porto Alegre: Bookman, 2007. Adaptado.</p><p>Figura 59</p><p>UML-DIAGRAMS. UML package diagrams overview, 2009-2014. Disponível em:. Acesso em: 28 abr. 2015. Adaptado.</p><p>144</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Figura 66</p><p>LARMAN, C. Utilizando UML e padrões: uma introdução à análise e ao projeto orientados a objetos e</p><p>ao processo unificado. 2. ed. Porto Alegre: Bookman, 2007. p. 585. Adaptado.</p><p>REFERêNCIAS</p><p>Textuais</p><p>ACOPLAMENTO. In: Michaelis: moderno dicionário da língua portuguesa. São Paulo: Companhia</p><p>Melhoramentos, 1998.</p><p>ALBIN, S. T. The art of software architecture: design methods and techniques. Indianapolis: John Wiley, 2003.</p><p>ARQUITETURA. In: Michaelis: moderno dicionário da língua portuguesa. São Paulo: Companhia</p><p>Melhoramentos, 1998.</p><p>AVELINO, V. F. Merusa: metodologia de especificação de requisitos de usabilidade e segurança</p><p>orientada para arquitetura. 2005. Tese (Doutorado em Engenharia) – Escola Politécnica da</p><p>Universidade de São Paulo, São Paulo, 2005.</p><p>BASS, L.; CLEMENTS, P.; KAZMAN, R. Software architecture in practice. Boston: Addison-Wesley, 2010.</p><p>BEZERRA, E. Princípios de análise e projeto de sistemas com UML: um guia prático para modelagem</p><p>de sistemas orientados a objetos através da linguagem de modelagem unificada. Rio de Janeiro:</p><p>Campus, 2006.</p><p>BOOCH, G.; JACOBSON, I.; RUMBAUGH, J. UML: guia do usuário. 2. ed. Rio de Janeiro: Campus, 2006.</p><p>BROOKS, F. No silver bullet: essence and accidents of software engineering. Computer, v. 20, n. 4, p.</p><p>10-9, 1987.</p><p>BUSCHMANN, F. et al. Pattern-oriented software architecture: a system of patterns. New York: Wiley,</p><p>1996. v. 1.</p><p>BUSCHMANN, F.; HENNEY, K.; SCHIMIDT, D. Pattern-oriented software architecture: a pattern language</p><p>for distributed computing. New York: Wiley, 2007. v. 4.</p><p>CAMARA, F. Orientação a objeto com .NET. 2. ed. Santa Catarina: Visual Books, 2006.</p><p>CATTELL, R. G. et al. The object data management standard: ODMG 3.0. California: Morgan Kaufmann, 2000.</p><p>CHEESMAN, J.; DANIELS, J. UML components: a simple process for specifying component-based</p><p>software. Addison-Wesley, 2000.</p><p>145</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>CHIAVENATO, I. Os novos paradigmas: como as mudanças estão mexendo com as empresas. Barueri:</p><p>Manole, 2008.</p><p>COAD, P.; YOURDON, E. Projetos baseados em objetos. Rio de Janeiro: Campus, 1993.</p><p>COESO. In: Michaelis: moderno dicionário da língua portuguesa. São Paulo: Companhia</p><p>Melhoramentos, 1998.</p><p>CORTÊS, M. L.; CHIOSSI, T. C. S. Modelos de qualidade de software. Campinas: Unicamp, 2001.</p><p>COSTA, I. et al. Qualidade em Tecnologia da Informação. São Paulo. Atlas, 2013.</p><p>COUTAZ, J. PAC, an object oriented model for dialog design. In: HUMAN-COMPUTER INTERACTION</p><p>– INTERAC’ 87, 1987, Stuttgart. Proceedings... Stuttgart: Elsevier Science Publishers, 1987. p. 431-6.</p><p>Disponível em: . Acesso em: 24 abr. 2015.</p><p>DOFACTORY. .NET design pattern framework 4.5, [s.d.]. Disponível em: . Acesso em: 4 maio 2015.</p><p>DRIVER, M. Java and .NET: you can’t pick a favorite child. In: DEVELOPER SUMMIT, 2007, Palm Springs.</p><p>Proceedings... Palm Springs, 2007. Disponível em: . Acesso em: 22 abr. 2015.</p><p>ELMASRI, R.; NAVATHE, S. B. Sistemas de banco de dados. 6. ed. São Paulo: Addison-Wesley, 2011.</p><p>FREEMAN, E et al. Head first design patterns. Sebastopol: O’Reilly, 2004.</p><p>GAMMA, E. et al. Design patterns: elements of reusable object-oriented software. Boston: Addison-</p><p>Wesley, 1995.</p><p>GIMENES, I. M. S.; HUZITA, E. H. M. Desenvolvimento baseado em componentes: conceitos e técnicas.</p><p>Rio de Janeiro: Ciência Moderna, 2005.</p><p>GOLDEN, E.; JOHN, B. E.; BASS, L. The value of a usability-supporting architectural pattern in software</p><p>architecture design: a controlled experiment. In: INTERNATIONAL CONFERENCE ON SOFTWARE</p><p>ENGINEERING – ICSE, 2005, St. Louis. Proceedings... St. Louis: ICSE, 2005.</p><p>GUEDES, G. T. A. UML 2: uma abordagem prática. São Paulo: Novatec, 2009.</p><p>GUERRA, A. C.; COLOMBO, R. M. T. Tecnologia da informação: qualidade de produto de software.</p><p>Brasília: PBQP, 2009.</p><p>HEINEMAN G. T.; COUNCILL, W. T. Component-based software engineering: putting the pieces</p><p>together. Boston: Addison-Wesley Longman Publishing, 2001.</p><p>146</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>HUANG, R. Making active CASE tools: toward the next generation CASE tools. Software Engineering</p><p>Notes, v. 23, p. 47-50, janeiro, 1998.</p><p>INTERNATIONAL ORGANIZATION FOR STANDARDIZATION (ISO). ISO 10746-3: open distributed</p><p>processing – Reference model. Geneve: ISO, 2009.</p><p>___. ISO 25010: systems and software engineering – Systems and software quality requirements and</p><p>evaluation (square) – system and software quality models. Geneve: ISO, 2011a.</p><p>___. ISO 42010: systems and software engineering – Architecture description. Geneve: ISO, 2011b.</p><p>KRUCHTEN, P. The 4+1 view model of architecture. IEEE Software, Washington, v. 12, n. 6, p. 42-50,</p><p>nov. 1995.</p><p>LARMAN, C. Utilizando UML e padrões: uma introdução à análise e ao projeto orientados a objetos e</p><p>ao processo unificado. 2. ed. Porto Alegre: Bookman, 2007.</p><p>LEE, R. C; TAPFENHART, W. M. UML e C++: guia prático de desenvolvimento orientado a objeto. São</p><p>Paulo: Makron Books, 2001.</p><p>MAGDY, A. et al. Flexible CASE Tools for Requirements Engineering: A benchmarking Survey. Cairo, p.</p><p>20-6, 2008.</p><p>MAHDY. A. A. E-R.; AHMED, M. M. A. E-S.; ZAHRAN, S. M. Flexible CASE tools for requirements</p><p>engineering: a benchmarking survey. In: INTERNATIONAL CONFERENCE OF INFORMATICS AND</p><p>SYSTEMS, 2008. Proceedings... Cairo, 2008. Disponível em: . Acesso em: 17 abr. 2015.</p><p>MARTINS, C. T. K.; RODRIGUES, M. Algoritmos elementares C++. São Paulo: LCTE, 2006.</p><p>MAYHEW, D. J. The usability engineering lifecycle: a practitioner’s handbook for user interface design.</p><p>São Francisco: Morgan Kaufmann, 1999.</p><p>MCGLAUGHLIN, R. Some Notes on Program Design, Software Engineering Notes, v. 16, n. 4, p. 53-4, Oct. 1991.</p><p>MEDEIROS, L. F. Banco de dados: princípios e prática. Curitiba: InterSaberes, 2013.</p><p>MEDEIROS, S. E. Desenvolvendo software com UML 2.0: definitivo. São Paulo: Makron Books, 2004.</p><p>MERSON, P. How to represent the architecture of your application using UML 2.0 and more. Pitsburgo:</p><p>Software Engineering Institute, 2006.</p><p>MICHAELIS. Moderno dicionário da língua portuguesa. São Paulo: Melhoramentos, 1998.</p><p>NIELSEN, J. Usability engineering. São Francisco: Morgan Kaufmann, 1993.</p><p>147</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>OBJECT MANAGEMENT ARCHITECTURE. Object Management Group, 2014. Disponível em: . Acesso em: 17 abr. 2015.</p><p>OBJECT MANAGEMENT GROUP (OMG). Corba basics, 2015. Disponível em: . Acesso em: 5 maio 2015.</p><p>OPENUP. Introduction to OpenUP.</p><p>[s.d.]a. Disponível em: . Acesso em: 4 maio 2015.</p><p>___. Role: analyst, [s.d.]c. Disponível em: . Acesso em: 4 maio 2015.</p><p>___. Role: architect, [s.d.]b. Disponível em: . Acesso em: 4 maio 2015.</p><p>___. Role: stakeholder, [s.d.]d. Disponível em: . Acesso em: 4 maio 2015.</p><p>PFLEEGER, S. L. Engenharia de software: teoria e prática. 2. ed. São Paulo: Prentice Hall, 2004.</p><p>PRESSMAN, R. S. Engenharia de software. 6. ed. São Paulo: McGraw-Hill, 2006.</p><p>ROCHA, H. V.; BARANAUSKAS, M. C. C. Design e avaliação de interfaces humano-computador.</p><p>Campinas: Instituto de Computação da Universidade Estadual de Campinas, 2003.</p><p>SAXENA, V.; PRATAP, A. Performance comparison between relational and object-oriented databases.</p><p>International Journal of Computer Applications, p. 6-9, 2013.</p><p>SHNEIDERMAN, B. Designing the user interface: strategies for effective human-computer interaction.</p><p>3. ed. Menlo Park: Addison-Wesley, 1998.</p><p>SIERRA, K; BATES, B. Use a Cabeça! Java. 2. ed. Rio de Janeiro: Alta Books, 2007.</p><p>SILBERSCHATZ, A.; KORTH, H. F.; SUDARSHAN, S. Sistema de banco de dados. 5. ed. Rio de Janeiro:</p><p>Campus, 2006.</p><p>SOFTWARE ENGINEERING INSTITUTE (SEI). Architecture tradeoff analysis method, 2015a. Disponível</p><p>em: . Acesso em: 4 maio 2015.</p><p>___. Defining software architecture, 2015b. Disponível em: .</p><p>Acesso em: 4 maio 2015.</p><p>SOMMERVILLE, I. Engenharia de software. São Paulo: Pearson, 2010.</p><p>148</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>STADZISZ, P. C. Projeto de software usando a UML. Paraná: UTFPR, 2002.</p><p>SZYPERSKI, C. Component software: beyond object-oriented programming. 2. ed. Boston: Addison-</p><p>Wesley Longman, 2002.</p><p>THE HISTORY OF SMALLTALK. Smalltalk.org, 2010. Disponível em: . Acesso em: 17 abr. 2015.</p><p>TIMING DIAGRAMS. UML Diagrams, 2009-2014. Disponível em:. Acesso em: 28 abr. 2015.</p><p>TIAKO, P. F. Software applications: concepts, methodologies, tools, and applications. Langston:</p><p>Information Science Reference, 2009.</p><p>TSUDA, M. et al. Productivity analysis of software development with an integrated CASE tool. In:</p><p>INTERNATIONAL CONFERENCE ON SOFTWARE ENGINEERING, 14., 1992, Melbourne. Proceedings...</p><p>Melbourne: ICSE, 1992.</p><p>UML-DIAGRAMS. Timing diagrams, 2009-2014a. Disponível em:. Acesso em: 28 abr. 2015.</p><p>___. UML 2.5 Diagrams Overview, 2009-2014b. Disponível em:. Acesso em: 28 abr. 2015.</p><p>VERSOLATTO, F. R. Uma abordagem arquitetural aplicada ao ciclo de vida da Engenharia da Usabilidade</p><p>em prontuário eletrônico de pacientes. 2012. Dissertação (Mestrado em Engenharia de Software) –</p><p>Instituto de Pesquisas Tecnológicas de São Paulo (IPT), São Paulo, 2012.</p><p>Sites</p><p>.</p><p>.</p><p>.</p><p>.</p><p>.</p><p>.</p><p>.</p><p>.</p><p>.</p><p>.</p><p>149</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>150</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>151</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>152</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Informações:</p><p>www.sepi.unip.br ou 0800 010 9000</p><p>o software de tal forma que atenda aos requisitos do usuário de forma eficaz e que,</p><p>ainda assim, seja sustentável e competitivo? Uma das respostas pode estar no paradigma da projetização.</p><p>2 O PrOJetO nO CICLO de VIdA dA enGenHArIA de SOFtwAre</p><p>2.1 A fase de projetos</p><p>Como você deve lembrar, na engenharia de software temos alguns modelos de processo de</p><p>desenvolvimento.</p><p>Observação</p><p>O processo de desenvolvimento de software resume-se a um conjunto</p><p>de atividades executadas em uma determinada sequência. Esse conjunto de</p><p>atividades também pode ser chamado de etapas da engenharia de software</p><p>ou paradigmas da engenharia de software (PRESSMAN, 2006).</p><p>Muitos são os modelos de processos aplicados e debatidos atualmente. Para exemplificar, vamos</p><p>trabalhar com um dos modelos mais tradicionais: o Modelo Cascata.</p><p>12</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade I</p><p>Também chamado de waterfall ou também citado na literatura como ciclo de vida clássico, o Modelo</p><p>Cascata é composto de cinco atividades:</p><p>• Análise de requisitos.</p><p>• Projeto.</p><p>• Codificação.</p><p>• Testes.</p><p>• Implantação e manutenção.</p><p>Análise de</p><p>requisitos</p><p>Projeto</p><p>Codificação</p><p>Testes</p><p>Implantação e</p><p>manutenção</p><p>Figura 1 – Sequência de execução das atividades no Modelo Cascata</p><p>No Modelo Cascata, as atividades são executadas de forma sequencial. Assim, uma atividade não é</p><p>iniciada até que sua predecessora seja completamente finalizada. Isso nos permite afirmar, por exemplo,</p><p>que a construção não é iniciada até que seja finalizada a arquitetura do sistema de software na fase de</p><p>projeto, que, por sua vez, não é iniciada até que todos os requisitos sejam levantados, documentados e</p><p>aprovados pelo usuário.</p><p>A fase de projeto não se inicia até que todos os requisitos sejam elicitados, documentados e aprovados</p><p>pelo usuário. É comum que requisitos novos surjam e sejam alterados no curso do projeto, pelas mais</p><p>diversas razões, dentre elas a falta de habilidade do analista em extrair e captar as necessidades do</p><p>processo de negócio. A mudança nos requisitos pode ocorrer durante a fase de projeto, codificação</p><p>ou até mesmo na fase de testes, assim como problemas na arquitetura podem ser identificados na</p><p>construção ou na implantação.</p><p>13</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Saiba mais</p><p>Existem ainda outros modelos, como o Modelo Incremental, o Modelo</p><p>Espiral e o Processo Unificado. Para aprofundar seus conhecimentos sobre</p><p>o assunto, leia:</p><p>PRESSMAN, R. S. Engenharia de software. 6. ed. São Paulo: McGraw Hill,</p><p>2006.</p><p>SOMMERVILLE, I. Engenharia de software. São Paulo: Pearson, 2010.</p><p>Independentemente do modelo de ciclo de vida que adotarmos, peguemos como exemplo o Modelo</p><p>Cascata. A fase de projetos encontra-se sempre na fronteira entre a análise de requisitos, o problema e</p><p>a construção, ou implementação.</p><p>A fase de projetos sempre se inicia após a fase de requisitos, ou após uma primeira iteração dos</p><p>requisitos, nos casos em que adotamos um modelo de ciclo de vida iterativo incremental ou qualquer</p><p>variante dele.</p><p>Observação</p><p>A diferença fundamental entre os modelos clássico, cascata e iterativo:</p><p>no modelo incremental não é necessário que todos os requisitos estejam</p><p>mapeados para se iniciar o ciclo de desenvolvimento.</p><p>Logo, enquanto não tivermos os requisitos, ou parte deles, elicitados, verificados e validados, não se</p><p>inicia a fase de projeto. Isso significa dizer que, uma vez iniciada a fase de projetos, os requisitos não</p><p>poderão ser alterados?</p><p>A resposta é não, pois os requisitos sempre poderão ser alterados, inclusive, é comum que isso</p><p>aconteça; no entanto, uma vez que haja necessidade de alteração dos requisitos após a fase de projetos</p><p>ser iniciada, os impactos deverão ser mapeados e mensurados, e as devidas alterações no projeto deverão</p><p>ser feitas.</p><p>Podemos dizer que a fase de projeto dentro do ciclo de vida da engenharia de software é a</p><p>fronteira entre o domínio do problema e o domínio da solução. Como Pressman (2006, p. 206)</p><p>cita, “o modelo de requisitos dá ênfase no o que precisa ser feito, enquanto o modelo de projeto</p><p>indica o como será feito”.</p><p>14</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade I</p><p>Observação</p><p>Na literatura a terminologia indicativa de projeto em inglês é design.</p><p>Não se confunda com project.</p><p>2.2 Por que modelar?</p><p>Voltemos ao nosso exemplo do projeto de construção de uma casa. A planta baixa da casa é a</p><p>representação de uma visão da casa, podemos considerar que ela é um modelo que representa a casa.</p><p>Este modelo pode ser utilizado tanto para você validar se todas as suas necessidades serão</p><p>efetivamente construídas quanto para ser um guia para a equipe de construção.</p><p>Imaginemos que, em uma situação hipotética, você não tenha gostado de algo da planta; o projetista,</p><p>por alguma razão, não conseguiu captar suas necessidades, ou até mesmo você mudou de ideia com</p><p>relação a alguma necessidade.</p><p>Diante dessa situação, basta alterar a planta, ou o modelo, e validá-lo novamente. Os esforços</p><p>seriam muito maiores se tivéssemos de alterar a construção, em vez do modelo.</p><p>Na fase de projeto, os modelos de projeto têm como objetivo representar as diversas visões da</p><p>solução de um sistema de software.</p><p>Assim como a planta da casa, esses modelos têm como objetivo representar como os requisitos serão</p><p>atendidos, antecipam possíveis alterações que possam ser feitas quando do momento da construção</p><p>(codificação), antecipando, assim, alguns dos riscos do projeto.</p><p>Modelos são como guia para a construção e são insumos fundamentais para a validação da qualidade</p><p>do software. Trataremos com mais detalhes a seguir.</p><p>Saiba mais</p><p>A discussão sobre o processo de qualidade é ampla. Leia:</p><p>COSTA, I. et al. Qualidade em tecnologia da informação. São Paulo:</p><p>Atlas, 2013.</p><p>É na fase de projeto, também, que incorporamos elementos de tecnologia para a solução, como no</p><p>exemplo da casa, quando falamos sobre os componentes de uma planta elétrica.</p><p>15</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Nesse caso, modelos são úteis para que possamos mensurar a infraestrutura necessária e efetuar</p><p>provas de conceito de possíveis soluções que possamos adotar, sempre, antes do momento da construção.</p><p>Observação</p><p>O objetivo central deste livro-texto é discutir a fase de projetos de um</p><p>sistema de software que, por sua vez, tem ênfase em como serão resolvidos</p><p>os problemas e as necessidades do negócio que são levantadas na fase</p><p>de análise. É importante ter em mente que, em qualquer modelo de ciclo</p><p>de vida, antes da fase de projeto, temos a fase de análise, que, dentre</p><p>outras atividades, compreende a engenharia e análise dos requisitos e dos</p><p>problemas a serrem resolvidos pelo sistema de software.</p><p>2.3 Conceitos do projeto</p><p>Em seu livro, Pressman (2006, p. 212), enumera uma série de conceitos básicos de projeto que</p><p>“fornecem a organização necessária para estruturá-lo e fazer com que funcione corretamente”.</p><p>Observação</p><p>Roger Pressman e Iam Sommerville são considerados dois dos maiores</p><p>expoentes da Engenharia de Software.</p><p>Abstração e modularidade são dois dos principais conceitos apresentados por Pressman (2006).</p><p>2.3.1 Abstração</p><p>O projeto deve, por finalidade, possuir vários níveis de abstração. Nos níveis mais altos de abstração</p><p>do software nos aproximamos do nível de análise, enquanto nos níveis mais baixos nos aproximamos</p><p>da solução técnica do software.</p><p>Observação</p><p>O conceito de abstração está ligado a nossa capacidade, enquanto</p><p>analistas, de resolver problemas, de selecionar determinados aspectos do</p><p>problema e de isolar o que é importante do que não é, para um determinado</p><p>propósito. Abstração é dar ênfase àquilo que é essencial.</p><p>No começo do projeto é importante darmos ênfase a soluções macro,</p><p>e à medida que o projeto for</p><p>avançando, vamos descendo ao nosso nível de solução, ou de abstração.</p><p>16</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade I</p><p>2.3.2 Modularidade</p><p>O software deve ser dividido em componentes, ou módulos, que trabalham em conjunto para</p><p>desempenhar uma determinada atividade e atingir um determinado objetivo.</p><p>O grande desafio da modularidade está em equilibrar as responsabilidades de cada componente, de</p><p>tal forma que não haja uma superdependência ou a sobrecarga de um único componente.</p><p>O que se deseja atingir com a modularidade é: baixo acoplamento e alta coesão. Para entender a</p><p>questão, veja a figura a seguir.</p><p>A</p><p>B</p><p>D</p><p>C</p><p>E</p><p>Figura 2 – Exemplo de dependência entre módulos</p><p>Imagine que o sistema tenha cinco módulos: A, B, C, D e E. Como indicado pelas setas, na figura</p><p>anterior, temos as seguintes relações de dependência:</p><p>• “B” depende funcionalmente de “A”.</p><p>• “C” depende funcionalmente de “A”.</p><p>• “D” depende funcionalmente de “A”.</p><p>• “E” depende funcionalmente de “A”.</p><p>Uma característica marcante dessa estrutura, e que pode ser facilmente notada, é uma alta</p><p>dependência do módulo A. Por exemplo, em uma situação hipotética de falha ou de algum tipo de</p><p>manutenção no módulo A, todos os demais módulos seriam afetados diretamente, comprometendo,</p><p>assim, todo o sistema.</p><p>No caso hipotético desse sistema, dizemos que ele tem um alto acoplamento e uma baixa coesão.</p><p>A definição do dicionário Michaelis (1998) para acoplamento que mais se aproxima do cenário de</p><p>software é: “união de dois circuitos, com a finalidade de transferir energia de um para outro”.</p><p>17</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>No nosso caso, acoplamento está relacionado à união de dois componentes, todavia com a finalidade</p><p>de transferir informações de um para outro.</p><p>O mesmo dicionário (MICHAELIS, 1998) define coeso como algo “firmemente unido ou ligado”.</p><p>Para software indicamos e buscamos uma alta coesão que sempre se dá pelo baixo acoplamento, ou</p><p>seja, o ideal é o inverso do que se mostra na figura anterior.</p><p>A</p><p>B C</p><p>Figura 3 – Exemplo de dependência entre módulos</p><p>O mesmo efeito da Figura 2 pode ser notado na Figura 3, na qual temos três módulos: A, B e C, e com</p><p>o relacionamento indicado pelas setas podemos chegar às seguintes conclusões:</p><p>• “A” depende funcionalmente de “B” e “C”.</p><p>• “B” depende funcionalmente de “A” e “C”.</p><p>Assim como na Figura 2, uma característica marcante dessa estrutura é a alta dependência em relação ao</p><p>módulo C. Uma falha ou algum tipo de manutenção no módulo C e todos os demais módulos seriam afetados</p><p>diretamente, comprometendo, assim, todo o sistema. Todavia existe algo ainda mais marcante nessa estrutura:</p><p>uma dependência circular, o que igualmente provoca alto acoplamento e baixa coesão.</p><p>Nem sempre é fácil enxergar esses problemas no momento em que estamos pensando na solução do</p><p>projeto, e, para isso, Pressman (2006), cita outros conceitos fundamentais de projeto, todos associados</p><p>diretamente ou indiretamente a esses problemas, que são:</p><p>• Divisão por interesses: indica que um problema complexo pode ser mais facilmente resolvido se</p><p>for dividido em pequenas partes ou pequenos problemas.</p><p>• Encapsulamento de informações: significa dizer que os módulos devem ser projetados de uma</p><p>forma tal que as informações e sua lógica interna não sejam visíveis por outros módulos, a não</p><p>ser que seja necessário. Em resumo, é deixar visível apenas o necessário.</p><p>Lembrete</p><p>Encapsulamento é um dos conceitos fundamentais da orientação a</p><p>objetos, assim como: classe, objeto, abstração, herança e polimorfismo.</p><p>18</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade I</p><p>• Independência funcional: é uma das balizas fundamentais quando estamos querendo atingir</p><p>acoplamento e coesão. Independência funcional está associada a projetar módulos que tenham</p><p>funções bem-definidas, minimizando a dependência em relação a outros módulos. Em resumo, é</p><p>dizer que um módulo não deve fazer mais nem menos.</p><p>2.4 Fases de projeto</p><p>Como debatemos anteriormente, o objetivo da fase de projetos é solucionar tecnicamente, ou dar</p><p>solução, aos requisitos do usuário mapeados no modelo de requisitos.</p><p>As fases, ou subdivisão das atividades, da fase de projeto estão associadas ao que efetivamente deve</p><p>ser produzido como artefato na fase de projeto. Pressman (2006) divide o modelo de projetos em quatro</p><p>fases:</p><p>• Projeto de componentes.</p><p>• Projeto de interfaces.</p><p>• Projeto arquitetural.</p><p>• Projeto de dados/classes.</p><p>Conforme mostra a figura a seguir:</p><p>Projeto de</p><p>componentes</p><p>Projeto de interfaces</p><p>Projeto arquitetural</p><p>Projeto de dados/classes</p><p>Modelo de requisitos</p><p>Figura 4 – Fases do modelo de projeto</p><p>19</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>A figura anterior mostra a sequência de atividades e o fluxo das informações da fase de projeto.</p><p>• Projeto de dados/classes: essa fase, que tem como insumo o modelo de requisitos (casos de</p><p>uso, descrição de casos de uso, modelo de classe conceitual etc.), tem como objetivo a geração</p><p>do modelo de dados e a transformação de classes e objetos conceituais em classes e objetos</p><p>equivalentes em projeto.</p><p>• Projeto arquitetural: organiza as classes e objetos em componentes do software e define seus</p><p>relacionamentos.</p><p>Observação</p><p>A discussão sobre arquitetura de software é mais ampla do que a simples</p><p>organização de componentes e dos seus relacionamentos, como mostra o</p><p>livro de Bass, Clements e Kazman (2010). Trataremos do assunto com mais</p><p>profundidade nas próximas unidades.</p><p>• Projeto de interfaces: descreve todas as possíveis interfaces de um sistema, que podem ser:</p><p>interfaces internas (como a comunicação entre os componentes será organizada), interfaces</p><p>externas (comunicação do sistema com outros sistemas) e interfaces com o usuário.</p><p>Saiba mais</p><p>O projeto de interface com o usuário envolve muitos aspectos e vem</p><p>sendo considerado cada vez mais como uma disciplina apartada chamada</p><p>usabilidade, como é possível verificar em:</p><p>NIELSEN, J. Usability engineering. San Francisco: Morgan Kaufmann,</p><p>1993.</p><p>VERSOLATTO, F. R. Uma abordagem arquitetural aplicada ao ciclo de</p><p>vida da Engenharia da Usabilidade em prontuário eletrônico de pacientes.</p><p>2012. Dissertação (Mestrado em Engenharia de Software) — Instituto de</p><p>Pesquisas Tecnológicas de São Paulo (IPT), São Paulo, 2012.</p><p>• Projeto de componentes: a partir do modelo desenhado no projeto de arquitetura, refina-os e</p><p>detalha-os de tal forma que seja possível a descrição procedimental desses componentes.</p><p>Neste livro-texto, trabalharemos com os artefatos produzidos em cada fase de projeto da metodologia</p><p>proposta por Pressman (2006), porém polarizado para o paradigma da orientação a objetos.</p><p>20</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade I</p><p>2.5 Aspectos humanos da fase de projetos</p><p>Conforme vimos nas disciplinas anteriores, em todos os modelos de ciclo de vida, uma fase é</p><p>composta por uma série de atividades, que produzem um determinado número de artefatos.</p><p>Estas atividades, além de produzirem algum resultado, são executadas por pessoas, ou papéis.</p><p>Lembrete</p><p>Um papel pode ser desempenhado por mais de uma pessoa, assim como</p><p>uma pessoa pode desempenhar diferentes papéis ao longo do ciclo de vida</p><p>do projeto.</p><p>Nesta seção iremos mapear os papéis envolvidos, diretamente ou indiretamente, na atividade de</p><p>projeto, baseado no processo unificado especificado no OpenUP (OPENUP, [s.d.]a).</p><p>São eles:</p><p>Arquiteto</p><p>Quadro 1 – Atividades e habilidades do arquiteto no OpenUP</p><p>Atividades</p><p>• Conduz ou coordena o projeto técnico do sistema e tem a responsabilidade pelas</p><p>decisões técnicas.</p><p>• Identifica e documenta os aspectos significativos para a arquitetura do sistema como</p><p>visões que descrevem requisitos, projeto, implementação e implantação.</p><p>• Justifica as soluções técnicas equilibrando os interesses das várias partes envolvidas,</p><p>reduzindo os riscos e garantindo que essas soluções sejam comunicadas, validadas e</p><p>principalmente seguidas pela equipe de construção.</p><p>• Trabalha junto com gerentes de projeto, recursos humanos e planejamento do projeto; o</p><p>processo recomenda que a equipe seja organizada em torno da arquitetura.</p><p>• Trabalha junto com os analistas e desenvolvedores para garantir que o guia da</p><p>arquitetura seja seguido.</p><p>Habilidades</p><p>• Experiência nos domínios do problema e da engenharia de software.</p><p>• Habilidade de liderança.</p><p>• Habilidade de comunicação.</p><p>• Habilidade de análise crítica, principalmente, para garantir que o desenvolvimento não</p><p>fuja da arquitetura definida.</p><p>• Proatividade com ênfase nos objetivos e nos resultados.</p><p>Adaptado de: OpenUP ([s.d.]b).</p><p>21</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Analista</p><p>Quadro 2 – Atividades e habilidades do analista no OpenUP</p><p>Atividades</p><p>• Identifica e detalha os requisitos.</p><p>• Descreve os casos de uso.</p><p>• Auxilia no desenvolvimento da visão técnica, fornecendo os subsídios necessários.</p><p>Habilidades</p><p>• Experiência na identificação de problemas e soluções.</p><p>• Capacidade de articular as necessidades que são associadas com o problema-chave</p><p>a ser resolvido.</p><p>• Capacidade de colaborar efetivamente com a equipe a partir de sessões</p><p>colaborativas de trabalho.</p><p>• Capacidade de comunicação verbal e escrita.</p><p>• Conhecimento dos domínios de negócios e de tecnologia ou a capacidade de</p><p>absorver e compreender essas informações rapidamente.</p><p>Adaptado de: OPENUP ([s.d.]c).</p><p>Gerente de projetos</p><p>Quadro 3 – Atividades e habilidades do gerente de projetos no OpenUP</p><p>Atividades</p><p>• Liderança da equipe para um bom resultado e da aceitação do produto por parte do</p><p>cliente.</p><p>• É responsável pelo resultado do projeto e da aceitação do produto por parte do</p><p>cliente.</p><p>• É responsável pela avaliação dos riscos do projeto e por controlar esses riscos por</p><p>meio de estratégias de mitigação.</p><p>• Aplica-se o conhecimento de gestão, habilidades, ferramentas e técnicas para uma</p><p>ampla gama de tarefas para entregar o resultado desejado para um determinado</p><p>projeto em tempo hábil.</p><p>Habilidades</p><p>• Capacidades de liderança e formação de equipes.</p><p>• Experiência completa do ciclo de vida de desenvolvimento de software para treinar,</p><p>orientar e apoiar outros membros da equipe.</p><p>• Proficiência em resolução de conflitos e técnicas de resolução de problemas.</p><p>• Bons conhecimentos em apresentação, facilitação, comunicação e negociação.</p><p>Adaptado de: OpenUP ([s.d.]d).</p><p>Além desses três papéis, envolvidos com a fase de projeto, existem os stakeholders, que são, segundo</p><p>o OpenUP ([s.d.]c), grupos de interesse, cujas necessidades devem ser satisfeitas pelo projeto. É um papel</p><p>que pode ser desempenhado por qualquer pessoa que é (ou potencialmente será) afetada pelo resultado</p><p>do projeto.</p><p>Um papel secundário na fase de projetos, uma vez que sua ênfase de atuação é na fase de construção,</p><p>é o do desenvolvedor, que na fase de projetos participa em duas frentes: entendimento da arquitetura</p><p>e sugestão de soluções técnicas.</p><p>22</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade I</p><p>Saiba mais</p><p>O OpenUP é uma variante de processo unificado que determina um</p><p>modelo de ciclo de vida iterativo e incremental. Para aprofundar seus</p><p>conhecimentos, acesse:</p><p>.</p><p>2.6 O que buscamos atingir no projeto?</p><p>Pressman (2006), citando McGlaughlin (1991), coloca três metas fundamentais da fase de projeto:</p><p>• O projeto deve contemplar a implementação de todos os requisitos explícitos, e aí uma observação</p><p>importante e que muitas vezes é deixada de lado, o projeto deve acomodar, ou deixar apto a</p><p>receber, todos os requisitos implícitos.</p><p>• O projeto deve ser um guia para desenvolvedores, testadores e para aqueles de darão suporte ao</p><p>software.</p><p>• O projeto deve fornecer uma visão completa do software sempre tendo como norte o aspecto</p><p>implementação (MCGLAUGHLIN, 1991, p. 209 apud PRESSMAN, 2006).</p><p>Lembrete</p><p>Na Engenharia de Requisitos não é tão incomum um requisito não ser</p><p>mapeado, ou ser mapeado incompletamente. Isso pode ser devido a uma</p><p>série de fatores, dentre eles, por exemplo, uma falha de comunicação entre</p><p>o analista de requisitos e o usuário.</p><p>Além desses três pontos enumerados por Pressman (2006), a norma ISO 25010 (ISO, 2011a) trata</p><p>da classificação e da definição de requisitos não funcionais, mas que também definem um modelo de</p><p>qualidade utilizado como referência para a avaliação de qualidade de software.</p><p>Observação</p><p>O International Organization for Standardization (ISO) é um grupo</p><p>fundado em 1947, sem relações com órgãos governamentais, localizado na</p><p>cidade de Genebra, na Suíça, com o objetivo de definir diretrizes normativas.</p><p>A norma descreve seis características que definem a qualidade de software: funcionalidade, confiabilidade,</p><p>usabilidade, eficiência, manutenibilidade e portabilidade. Essas características, também denominadas atributos</p><p>de qualidade, são comumente usadas quando trabalhamos com requisitos não funcionais.</p><p>23</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>O quadro a seguir mostra a definição dos atributos de qualidade de acordo com a ISO 25010.</p><p>Quadro 4 – Atributos de qualidade segundo a ISO 25010</p><p>Atributo Descrição</p><p>Funcionalidade</p><p>Está ligado à capacidade do sistema de software de prover funcionalidades</p><p>que atendam às necessidades explícitas e implícitas quando usado sob as</p><p>condições especificadas.</p><p>Confiabilidade Está ligado à capacidade do sistema de software de manter um determinado</p><p>nível de desempenho quando usado sob as condições especificadas.</p><p>Usabilidade</p><p>Está ligado à capacidade do sistema de software de auxiliar os usuários na</p><p>realização de suas tarefas, de maneira produtiva (ROCHA; BARANAUSKAS,</p><p>2003).</p><p>Eficiência Está ligado à capacidade do sistema de software de prover desempenho</p><p>apropriado, relativo à quantidade de recursos utilizados.</p><p>Manutenibilidade Está ligado à capacidade do sistema de software de ser modificado, e essa</p><p>modificação pode ser uma correção, melhoria ou adaptação.</p><p>Portabilidade Está ligado à capacidade do sistema de software de ser portável entre</p><p>plataformas de ambientes.</p><p>Adaptado de: ISO (2011a, p.16-21).</p><p>A figura a seguir mostra a estrutura hierárquica dos atributos de qualidade, quanto à sua classificação,</p><p>proposta pela norma ISO 25010 (ISO, 2011a).</p><p>Funcionalidade</p><p>Adequação, acurácia,</p><p>interoperabilidade, segurança</p><p>de acesso e conformidade</p><p>Usabilidade Inteligibilidade, facilidade no</p><p>aprendizado e operacionalidade</p><p>Manutenibilidade Facilidade de análise, alteração,</p><p>estabilização e teste</p><p>Confiabilidade Maturidade, tolerância a falhas</p><p>e facilidade na recuperação</p><p>Eficiência Comportamento em relação ao</p><p>tempo e utilização de recursos</p><p>Portabilidade</p><p>Adaptabilidade, capacidade</p><p>para ser instalado, coexistência,</p><p>capacidade para substituir</p><p>Atributos de</p><p>qualidade</p><p>Figura 5 – Requisitos não funcionais, segundo a classificação da ISO 25010</p><p>24</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade I</p><p>Conforme ilustrado, os seis atributos de qualidade – funcionalidade, confiabilidade, usabilidade,</p><p>eficiência, manutenibilidade e portabilidade – também possuem uma estratificação para outros atributos</p><p>de qualidade, conforme citado também por Cortês e Chiossi (2001).</p><p>• Funcionalidade</p><p>— Adequação: é a garantia de que o software possui as funções que foram definidas.</p><p>— Acurácia: está relacionada ao grau de precisão dos resultados gerados pelo software.</p><p>— Interoperabilidade: é a capacidade do software de interagir com outros sistemas.</p><p>— Segurança de acesso: está ligada à capacidade do software de prevenir acessos por pessoas ou</p><p>aplicações não autorizadas.</p><p>— Conformidade: se o software foi desenvolvido seguindo os padrões, convenções ou regras</p><p>preestabelecidas no projeto.</p><p>• Confiabilidade</p><p>— Maturidade: está relacionada à baixa frequência de falhas ou defeitos do software em operação.</p><p>— Tolerância a falhas: está relacionada a um determinado nível de desempenho que o software</p><p>deve atingir, mesmo em momentos de problemas.</p><p>— Facilidade na recuperação: está ligada à capacidade do software de se restabelecer, e de</p><p>restabelecer seus dados e parâmetros sem que haja necessidade de intervenção, após uma</p><p>falha.</p><p>• Usabilidade</p><p>— Inteligibilidade: medida da facilidade do usuário para reconhecer a lógica de funcionamento</p><p>do software.</p><p>— Facilidade no aprendizado: medida da facilidade encontrada pelo usuário para aprender a</p><p>utilizar o software.</p><p>— Operacionalidade: medida da facilidade para operar o produto com segurança e sem falhas.</p><p>• Eficiência</p><p>— Comportamento em relação ao tempo: está relacionado ao tempo de resposta e de</p><p>processamento do software em seus serviços.</p><p>25</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>— Utilização de recursos: está relacionada à quantidade de recursos utilizados (CPU, memória,</p><p>processador) e ao tempo de resposta e de processamento do software em seus serviços.</p><p>• Manutenibilidade</p><p>— Facilidade na análise: medida do esforço necessário para diagnosticar falhas e localizar as</p><p>partes para corrigir os problemas.</p><p>— Facilidade na alteração: medida do esforço necessário para corrigir as falhas ou adequar o</p><p>produto a eventuais mudanças.</p><p>— Facilidade na estabilização: medida do esforço necessário em se estabilizar o software após as</p><p>alterações.</p><p>— Facilidade no teste: medida do esforço necessário para testar o produto de software alterado.</p><p>• Portabilidade</p><p>— Adaptabilidade: está ligada à facilidade em se adaptar o software para funcionar em outros</p><p>ambientes.</p><p>— Capacidade para ser instalado: medida do esforço necessário para instalar o software em um</p><p>ambiente de operação.</p><p>— Coexistência: está relacionado ao nível de conformidade do software a padrões referentes à</p><p>portabilidade.</p><p>— Capacidade para substituir: medida do esforço necessário em substituir um software por outro</p><p>previamente especificado.</p><p>Os atributos de qualidade listados na ISO 25010 (2011a) também são tratados na engenharia de</p><p>requisitos como requisitos não funcionais. É apenas uma questão de mudança de enfoque: enquanto</p><p>esses atributos de qualidade, na engenharia de requisitos, são tratados como requisitos não funcionais,</p><p>no projeto, são tratados como diretivas de qualidade de projeto.</p><p>Saiba mais</p><p>A qualidade de software é disciplina extensa e muito importante para ser</p><p>debatida apenas no contexto deste livro-texto. Veja no trabalho de Guerra</p><p>e Colombo (2009) como a norma ISO 9126 (que é a norma predecessora da</p><p>ISO 25010) pode ser aplicada na avaliação da qualidade:</p><p>GUERRA, A. C.; COLOMBO, R. M. T. Tecnologia da informação: qualidade</p><p>de produto de software. Brasília: PBQP, 2009.</p><p>26</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade I</p><p>2.7 Introdução ao projeto orientado a objetos</p><p>O projeto orientado a objetos partilha exatamente dos mesmos princípios e objetivos que debatemos</p><p>até agora, ou seja, possui as mesmas fases, é baseado na produção de modelos, é fundamentado nos</p><p>mesmos conceitos básicos, aspectos humanos e objetivos.</p><p>Mas então qual é a diferença?</p><p>A diferença fundamental está na utilização do paradigma da orientação a objetos e de seus conceitos</p><p>fundamentais.</p><p>Um paradigma é um conjunto de regras que ajuda-nos a organizar e</p><p>a coordenar a maneira como olhamos o mundo entre o que é certo</p><p>e errado, entre o que é verdadeiro e o que é falso, entre o que se deve</p><p>fazer e o que não se deve fazer. [...] Ele funciona como um conjunto</p><p>de categorias que define e orienta o comportamento das pessoas</p><p>(CHIAVENATO, 2008, p. 8).</p><p>O paradigma da orientação a objetos é uma forma de se desenvolver um sistema de software que o</p><p>enxerga como um conjunto de componentes que interagem para resolver um determinado problema. A</p><p>cada componente, dá-se o nome de objeto.</p><p>A motivação da abordagem orientada a objetos se dá pela tentativa de aproximar o desenvolvimento</p><p>de software daquilo que acontece no mundo real.</p><p>Vamos relembrar um pouco os conceitos fundamentais do paradigma da orientação a objetos.</p><p>Podemos dizer que esses conceitos são básicos para conseguirmos desenvolver a fase de projeto.</p><p>O paradigma da orientação a objetos é baseado nos seguintes pilares.</p><p>Classes</p><p>Podemos definir classe, ou classe de objetos, como um grupo de objetos com iguais propriedades</p><p>(atributos), comportamento (operações), relacionamentos e semântica.</p><p>Uma classe deve possuir responsabilidades bem-definidas, e cada responsabilidade representa</p><p>um contrato ou obrigações dela.</p><p>Semanticamente, dizemos que uma classe é uma especificação de um objeto, pois nela está definido</p><p>tudo o que o objeto possui (atributos) e tudo aquilo que o objeto pode fazer (métodos).</p><p>27</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Objeto</p><p>Podemos afirmar que todo objeto possui uma identidade, representada por um conjunto de</p><p>informações conferidas aos seus atributos, e ainda que todo objeto possui um estado, definido também</p><p>pelo conjunto dessas informações em um determinado espaço de tempo.</p><p>Encapsulamento</p><p>Encapsulamento significa deixar visível, ou deixar acessível a outros objetos, apenas o que é necessário.</p><p>Por exemplo, podemos ocultar dos demais objetos de um sistema detalhes da implementação ou</p><p>a lógica algorítmica de um método de um determinado objeto, uma vez que esses detalhes não são</p><p>importantes para os demais, apenas para o objeto que possui essa lógica.</p><p>Para os demais objetos que se comunicam com esse objeto, basta que ele faça o que deve fazer, não</p><p>sendo importante o como será feito.</p><p>Abstração</p><p>Abstração é um dos principais conceitos aplicados à resolução de problemas, que é fundamental</p><p>para a modelagem da estrutura de um sistema de software.</p><p>Está ligada a nossa capacidade de selecionar determinados aspectos do problema e isolar o que</p><p>é importante para algum propósito do que não for para um determinado propósito, ou seja, é dar</p><p>ênfase àquilo que é necessário. Um conceito que parece simples à primeira vista, entretanto faz toda a</p><p>diferença na resolução e na modelagem de sistemas complexos.</p><p>Na modelagem de um sistema de software, abstração está relacionada à nossa capacidade, enquanto</p><p>analistas, desenvolvedores e arquitetos, de estabelecer um modelo de objetos que resolva o problema da</p><p>melhor forma possível, isto é, não basta resolver o problema, é preciso pensar em cada objeto como uma</p><p>unidade autônoma, ou seja, fazendo única e exclusivamente aquilo que precisa fazer e tendo apenas as</p><p>dependências que deve ter.</p><p>A melhor forma de se representar a estrutura estática de um sistema orientado a objetos é utilizando</p><p>o modelo de classes. São três os modelos utilizados, segundo Bezerra (2006).</p><p>• Modelo de classe de domínio: desenvolvido na fase de análise, o modelo de classe de domínio</p><p>representa os objetos, ou classes, inerentes ao domínio do problema que queremos resolver,</p><p>deixando de lado, nesta visão, detalhes tecnológicos da solução do problema.</p><p>• Modelo de classe de especificação: construído na fase de projeto, o modelo de classe de</p><p>especificação adiciona ao modelo de classes de domínio, objetos ou classes específicas para a</p><p>solução do problema sob o aspecto tecnológico, ou seja, é uma extensão do modelo de classe de</p><p>domínio.</p><p>28</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade I</p><p>• Modelo de classe de implementação: o modelo de implementação nada mais é que a implementação</p><p>das classes, especificadas no modelo de especificação, construídas ou codificadas em alguma</p><p>linguagem de desenvolvimento orientada a objetos, como a linguagem Java ou a linguagem C#.</p><p>Observação</p><p>Atualmente existe uma distorção grande quando falamos de</p><p>orientação a objetos e linguagem de desenvolvimento, ou programação</p><p>orientada a objetos. Como vimos, orientação a objetos é um paradigma,</p><p>não uma linguagem. Todavia, as linguagens possibilitam ao desenvolvedor</p><p>implementar um software baseado nesse paradigma.</p><p>Dentro do ciclo de vida da engenharia de software, nas atividades ou fases anteriores à fase de</p><p>projeto, a ênfase é dada ao modelo de classe de domínio e à elicitação de requisitos nos quais eram</p><p>produzidos artefatos utilizando como suporte, principalmente, a Unified Modeling Language (UML)</p><p>como uma ferramenta para representação e modelagem de um sistema de software.</p><p>Saiba mais</p><p>A especificação e a definição completas da UML estão disponíveis no</p><p>site da OMG:</p><p>.</p><p>Pois bem, no paradigma da orientação a objetos, a fase de projeto utiliza como espinha dorsal</p><p>todos os princípios da fase de projetos que vimos até agora, soma-se aos conceitos fundamentais da</p><p>orientação a objetos e adentra o modelo de classes de especificação apresentados por Bezerra (2006).</p><p>O objetivo da fase de projetos no paradigma da orientação a objetos é dar sequência ao modelo</p><p>de classes de domínio, transformando as classes que possuem alto nível de abstração, utilizadas</p><p>fundamentalmente para o entendimento do problema, em classes de projeto.</p><p>Classes de projeto é um nível mais baixo de abstração, ou, podemos dizer, um nível mais refinado das</p><p>classes de análise, que possuem maiores detalhes de implementação, de infraestrutura que suportarão</p><p>a concretização das regras de negócio (PRESSMAN, 2006).</p><p>Assim como os componentes de software, que citamos anteriormente, as classes (que também podem</p><p>ser enxergadas como componentes em outro nível de abstração) devem ser e possuir, respectivamente:</p><p>completa e suficiente, ou seja, devem possuir nível suficiente de encapsulamento e de número de</p><p>funcionalidade. Não deve fazer mais, nem menos; alta coesão e baixo acoplamento.</p><p>29</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Ambler (2001 apud Pressman, 2006, p. 219) enumera os cinco tipos de classes de projetos que</p><p>podem ser desenvolvidas na fase de projetos:</p><p>• Classes de interface do usuário: definem a interação homem-máquina</p><p>ou IHC (interação homem-computador).</p><p>• Classes de domínio de negócio: são refinamentos das classes do modelo</p><p>de domínio (ou de análise). Possuem atributos e métodos utilizados</p><p>para implementar elementos do domínio do negócio.</p><p>• Classes de processos: têm como objetivo gerir as classes de domínio</p><p>de negócio.</p><p>• Classes persistentes: têm como objetivo a persistência de informações</p><p>em um repositório de dados, por exemplo, um banco de dados.</p><p>• Classes de sistema: têm como objetivo gerir a comunicação do software</p><p>com o seu ambiente computacional interno e externo.</p><p>Coad e Yourdon (1993) têm uma visão semelhante, mas polarizada um pouco mais para a visão</p><p>arquitetural; enxergando os componentes de um software como uma composição de classes, definem</p><p>quatro tipos de componentes:</p><p>• Componente do domínio do problema: são componentes responsáveis por implementar os</p><p>requisitos dos usuários.</p><p>• Componente de interação humana: são componentes responsáveis por implementar a interação</p><p>homem-máquina ou IHC (interação homem-computador).</p><p>• Componente de gerência de tarefa: são responsáveis por controlar e coordenar tarefas do software.</p><p>• Componente de gerência de dados: são responsáveis por controlar a persistência dos objetos em</p><p>um repositório de dados.</p><p>Nas próximas unidades iremos trabalhar como modelar e representar a evolução do modelo de domínio</p><p>para o modelo de projetos, como iremos representar os tipos de classe de projeto e componentes de</p><p>projeto, associando aos artefatos que devem ser produzidos, tendo como suporte os diagramas da UML.</p><p>resumo</p><p>Esta unidade teve como objetivo apresentar os conceitos introdutórios e</p><p>fundamentais sobre projeto de sistemas no paradigma da orientação a objetos.</p><p>Iniciou-se com o debate e o convite a debatermos sobre a real motivação</p><p>em seguir um modelo de projetização.</p><p>30</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade I</p><p>Traçando um paralelo, vimos que, muito em função do seu tempo de</p><p>existência, incomparavelmente maior, a engenharia civil está muito mais</p><p>avançada no aspecto projeto que a engenharia de software.</p><p>Construir um software sem um projeto é como construir uma casa</p><p>sem um projeto, que engloba, dentre outras coisas, um conjunto de</p><p>plantas e modelos que representam a casa e servem de guia para essa</p><p>construção.</p><p>Na engenharia de software temos diversas opções de modelos de</p><p>processo, ou de ciclo de vida, para desenvolvimento de projetos de software,</p><p>por exemplo, o Modelo Cascata (waterfall), o Modelo Iterativo Incremental,</p><p>Modelo Espiral e o Processo Unificado (UP).</p><p>Esses modelos definem e direcionam uma sequência de fases e de</p><p>atividades realizadas dentro de cada fase com o objetivo de organizar o</p><p>desenvolvimento de um produto de software.</p><p>Qualquer que seja o modelo de processo adotado, a fase de projetos</p><p>está sempre entre a fase de elicitação e análise de requisitos e a construção</p><p>ou desenvolvimento.</p><p>O objetivo da fase de projetos é desenhar a solução para os problemas</p><p>levantados na engenharia de requisitos, desenho esse que serve como guia</p><p>para a construção.</p><p>A fase de projetos não é iniciada até que todos os requisitos, ou parte</p><p>deles, sejam elicitados, documentados e aprovados. Depende do modelo de</p><p>ciclo de vida adotado, em que poderão ser mapeados e validados todos os</p><p>requisitos do sistema, como no Modelo Tradicional ou apenas uma parte</p><p>desses requisitos, como no Modelo Iterativo Incremental.</p><p>No Modelo Cascata, por exemplo, todos os requisitos são levantados,</p><p>e após isso se inicia a fase de projetos, enquanto em um Modelo Iterativo</p><p>Incremental, a cada iteração, uma fatia do total dos requisitos é elicitada e</p><p>validada para depois se iniciarem as atividades da fase de projetos.</p><p>Vimos que, assim como na engenharia civil, que possui plantas de casas</p><p>como modelos, a técnica de modelagem é fundamental na fase de projeto</p><p>de um software.</p><p>Um modelo é uma abstração, uma representação de uma perspectiva</p><p>do sistema, utilizada para dar ênfase a aspectos importantes, deixando</p><p>aspectos menos importantes de lado para facilitar o entendimento.</p><p>31</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Modelos são fundamentais, pois ajudam no gerenciamento da</p><p>complexidade, na comunicação entre os envolvidos no projeto, reduzem</p><p>os custos do desenvolvimento e simulam o comportamento do sistema,</p><p>servindo, assim, como um laboratório.</p><p>Dois são os conceitos fundamentais quando estamos modelando um</p><p>sistema na fase de projetos: abstração e modularidade.</p><p>Abstração, que também é um dos conceitos fundamentais da orientação</p><p>a objetos, está ligada a nossa capacidade, enquanto analistas e projetistas, de</p><p>enxergar aspectos relevantes à solução de um problema no seu devido tempo.</p><p>Modularidade é a divisão do software em componentes, ou módulos,</p><p>que interagem para resolver um determinado problema. Todavia, a simples</p><p>modularização não resolve os desafios de se produzir um software com</p><p>qualidade.</p><p>O que se busca com a modularidade é: baixo acoplamento e alta</p><p>coesão. Isso se dá a partir do uso de técnicas de encapsulamento e de uma</p><p>divisão de responsabilidade de cada módulo, de tal forma que eles tenham</p><p>funções bem-definidas. Cada componente não deve “fazer demais”, nem</p><p>“fazer pouco”.</p><p>Dentro da fase de projeto, temos uma subdivisão em quatro</p><p>atividades (ou fases): projeto de componentes, projeto de interfaces,</p><p>projeto arquitetural e projeto de dados/classes; cada fase é delimitada</p><p>pelos artefatos que produz.</p><p>Vimos que alguns dos principais envolvidos na fase de projetos</p><p>são: o arquiteto, o analista, o gerente de projetos, os stakeholders e os</p><p>desenvolvedores, estes últimos em menor grau nessa fase.</p><p>São três os objetivos a serem atingidos pelos profissionais envolvidos</p><p>na fase de projetos: o modelo do software deve ser um guia não só para a</p><p>implementação, que é o principal, mas para todas as fases subsequentes; deve</p><p>fornecer uma visão completa da solução; e deve contemplar todos os requisitos</p><p>explícitos mapeados na engenharia de requisitos e, principalmente, estar pronto,</p><p>ou apto, aos possíveis, e prováveis, requisitos implícitos.</p><p>Além desses três objetivos, vimos que a norma ISO 25010 (2011a)</p><p>utilizada na engenharia de requisitos para determinar um conjunto de</p><p>requisitos não funcionais, é utilizada na fase de projetos como uma baliza</p><p>para a avaliação da qualidade de um produto de software, em um mercado</p><p>cada vez mais competitivo.</p><p>32</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Unidade I</p><p>O projeto orientado a objetos utiliza-se da espinha dorsal de todos os</p><p>princípios e objetivos de projeto e, somando-se aos pilares do paradigma</p><p>da orientação a objetos, refina o modelo de classes de domínio, obtido na</p><p>fase de análise com o objetivo de montar um modelo de classes que possa</p><p>efetivamente ser construído.</p><p>O objetivo das próximas unidades é construir o modelo de classes de</p><p>projeto, com todos os tipos de classes: de domínio de negócio, de interface</p><p>do usuário, de processos, persistentes e de sistema e seus respectivos</p><p>artefatos, tendo como base o paradigma da orientação a objetos e seus</p><p>conceitos fundamentais e a UML como ferramenta de apoio.</p><p>exercícios</p><p>Questão 1. O modelo cascata, também conhecido como ciclo de vida clássico, requer uma</p><p>abordagem sistemática e sequencial. Esta abordagem apresenta algumas deficiências que são, em parte,</p><p>endereçadas a outros modelos, como o espiral e os atuais métodos ágeis.</p><p>Considerando as características do modelo cascata, avalie as afirmativas a seguir:</p><p>I – Em projetos complexos demora-se muito para se obter o software em execução.</p><p>II – Erros ocorridos nas etapas de levantamento e análise só são percebidos em fases avançadas, o</p><p>que maximiza o custo de correção destes.</p><p>III – Dificilmente consegue-se listar todos os requisitos do software logo no início do projeto.</p><p>IV – Este modelo pressupõe interação e entrega de pequenos módulos e pacotes de software aos</p><p>usuários, na medida em que o projeto avança.</p><p>V – Uma versão executável do software só é disponível em uma fase avançada do modelo.</p><p>É correto apenas o que se afirma em:</p><p>A) I e II.</p><p>B) II e IV.</p><p>C) I, II, III e V.</p><p>D) I, II e III.</p><p>E) II, III e V.</p><p>Resposta correta: alternativa C.</p><p>33</p><p>AD</p><p>S</p><p>-</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>M</p><p>ar</p><p>ci</p><p>lia</p><p>-</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: F</p><p>ab</p><p>io</p><p>-</p><p>0</p><p>8/</p><p>05</p><p>/2</p><p>01</p><p>5</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Análise das afirmativas</p><p>I – Afirmativa correta.</p><p>Justificativa: o modelo cascata pressupõe que uma fase ou etapa termine para que a outra comece,</p><p>desta forma o software só é disponibilizado para uso ao final do projeto de desenvolvimento.</p><p>II – Afirmativa correta.</p><p>Justificativa: os testes, atividades que permitem que o usuário tenha contato com o sistema,</p><p>são realizados ao final da fase de codificação e na fase de testes. Estas vêm após as fases iniciais de</p><p>levantamento e análise. Sendo assim, o acerto de erros nas primeiras fases pressupõe ajustes em quase</p><p>todo o ciclo de vida transcorrido até o momento.</p><p>III – Afirmativa correta.</p><p>Justificativa: por mais amplo que seja o levantamento de requistos é comum que novos requsitos</p><p>apareçam durante o projeto. Quanto mais longo for o projeto maior é a probabilidade do aparecimento</p><p>de novos requisitos.</p><p>IV – Afirmativa incorreta.</p><p>Justificativa: este modelo não pressupõe interação e entrega de pequenos módulos e pacotes de</p><p>software aos usuários na medida em que o projeto avança.</p><p>V – Afirmativa correta.</p><p>Justificativa: pela característica de ser sequencial, somente em uma fase avançada é que se</p><p>disponibiliza uma versão executável do software.</p><p>Questão 2. O paradigma da orientação a objetos é uma forma de se desenvolver um sistema de</p><p>software que o enxerga como um conjunto de componentes que interagem entre si para resolver um</p><p>determinado problema.</p><p>De acordo com este paradigma, cada componente é chamado de:</p><p>A) Classe.</p><p>B) Classe persistente.</p><p>C) Método.</p><p>D) Objeto.</p><p>E) Herança.</p><p>Resolução desta questão na plataforma.</p><p>34</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade II</p><p>Unidade II</p><p>3 TECNOLOGIA DE APOIO AO PROJETO ORIENTADO A OBJETOS</p><p>3.1 A UML</p><p>Antes de nos aprofundarmos sobre o tema, listaremos a seguir, algumas das principais confusões a</p><p>respeito da UML.</p><p>A UML não é:</p><p>• Uma linguagem de programação.</p><p>• Uma plataforma de desenvolvimento.</p><p>• Uma ferramenta de modelagem.</p><p>• Um software.</p><p>A UML (Unified Modeling Language), na definição de seus criadores, Booch, Jacobson e Rumbaugh</p><p>(2006, p.13) “é uma linguagem-padrão para elaboração da estrutura de projetos de software [...]</p><p>adequada para a modelagem de sistemas”.</p><p>Os autores ainda pontuam:</p><p>• A UML é apenas uma linguagem.</p><p>• É independente do modelo de processo adotado.</p><p>• É destinada a visualização, especificação e documentação de artefatos.</p><p>Vamos então tentar desmitificar um a um os mal-entendidos acerca da UML.</p><p>• Uma linguagem de programação</p><p>A UML não é uma linguagem de programação, muito embora seja possível a geração de código</p><p>a partir de alguns diagramas, o diagrama de classes principalmente, assim como o inverso, ou seja, a</p><p>geração de diagramas a partir de código-fonte.</p><p>35</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Projeto de SiStemaS orientado a objetoS</p><p>Todavia é importante que se tenha em mente que a geração de código não é algo propriamente da</p><p>UML, mas sim de ferramentas de modelagem que tenham a UML como padrão e que tenham recursos</p><p>para geração de código ou de engenharia reversa.</p><p>• Uma plataforma de desenvolvimento.</p><p>• Uma ferramenta de modelagem.</p><p>• Um software.</p><p>Existem inúmeras ferramentas no mercado que se utilizam da UML para a geração de diagramas, mas</p><p>a UML em si não pode ser considerada uma plataforma ou uma ferramenta de modelagem, tampouco</p><p>um software.</p><p>A confusão, nesse ponto, dá-se pela falsa sensação de que não conseguimos trabalhar com UML e</p><p>desenvolver diagramas sem que tenhamos uma ferramenta de modelagem.</p><p>Nesse caso, as ferramentas de modelagem são importantes facilitadores na utilização da UML e</p><p>nada mais.</p><p>Assim como na fase de análise, ou na disciplina de análise de sistemas OO, na fase de projetos a UML</p><p>é uma das principais ferramentas de apoio para a modelagem da solução.</p><p>Mas antes de saber como utilizar um diagrama, precisamos saber quais diagramas devemos utilizar</p><p>e em quais circunstâncias, dentro da atividade de projetos.</p><p>Segundo a abordagem de Kruchten (1995), um sistema de software pode ser organizado em cinco</p><p>visões, e cada visão possui um conjunto de diagramas UML, que representam aspectos particulares</p><p>desse sistema.</p><p>Saiba mais</p><p>A mesma divisão pode ser vista, em menor grau de detalhe, em:</p><p>BOOCH, G.; JACOBSON, I.; RUMBAUGH, J. UML: guia do usuário. 2. ed.</p><p>Rio de Janeiro: Campus, 2006.</p><p>A figura a seguir demonstra as cinco visões propostas por Kruchten (1995) e por Booch, Jacobson e</p><p>Rumbaugh (2006):</p><p>36</p><p>Re</p><p>vi</p><p>sã</p><p>o:</p><p>N</p><p>om</p><p>e</p><p>do</p><p>re</p><p>vi</p><p>so</p><p>r -</p><p>D</p><p>ia</p><p>gr</p><p>am</p><p>aç</p><p>ão</p><p>: N</p><p>om</p><p>e</p><p>do</p><p>d</p><p>ia</p><p>gr</p><p>am</p><p>ad</p><p>or</p><p>-</p><p>d</p><p>at</p><p>a</p><p>Unidade II</p><p>Visão de</p>