Baixe o app para aproveitar ainda mais
Prévia do material em texto
PROJETO DE SISTEMAS 1. Introdução O projeto é o que virtualmente todo engenheiro quer fazer. É o lugar em que a criatividade impera – em que os requisitos do cliente, as necessidades de negócio e as considerações técnicas se juntam na formulação de um produto ou sistema. O projeto cria uma representação ou modelo do software, mas diferente do modelo de análise (que enfoca a descrição dos dados, função e comportamento requeridos), o modelo de projeto fornece detalhe sobre as estruturas de dados, arquitetura, interfaces e componentes do software necessários para implementar o sistema. O projeto engloba um conjunto de princípios, conceitos e práticas que levam ao desenvolvimento de um sistema ou produto de alta qualidade. Princípios de projeto estabelecem uma filosofia prevalecente que guia o projetista no trabalho realizado. Conceitos de projeto devem ser compreendidos antes que a “mecânica” do projeto seja aplicada, e práticas de projeto em si levam à criação de várias representações de software que norteiam a atividade de construção que se segue. A importância do projeto se deve ao fato de que permite ao engenheiro de software modelar o sistema ou produto que deve ser construído. Esse modelo pode ser avaliado quanto à qualidade e aperfeiçoamento antes que o código seja gerado, testes sejam conduzidos e usuários finais fiquem envolvidos em grande número. Na fase de projeto a qualidade de software é estabelecida. Os passos para o desenvolvimento do projeto são: primeiro, a arquitetura do sistema ou produto precisa ser representada. Depois, as interfaces que conectam o software aos usuários finais, a outros sistemas e dispositivos e aos seus próprios componentes constitutivos são modelados. Por fim, os componentes de software usados para construir o sistema são projetados. Cada uma dessas visões representa uma diferente ação do projeto, mas todas 136 precisam estar de acordo com um conjunto de conceitos básicos de projeto que norteiam todo o trabalho de projeto de software. 2. Conceitos de Projeto de Sistemas Um conjunto de conceitos fundamentais de projeto de software tem evoluído durante a história da engenharia de software. Apesar de o grau de interesse em cada conceito ter variado ao longo dos anos, cada um resistiu ao tempo, fornecendo ao projetista de software uma base por meio da qual métodos mais sofisticados de projeto podem ser aplicados. 2.1 Abstração Quando consideramos uma solução modular para qualquer problema, muitos níveis de abstração podem ser colocados. No nível mais alto de abstração, uma solução é enunciada em termos amplos usando a linguagem do ambiente do problema. Nos níveis mais baixos de abstração, uma descrição mais detalhada da solução é fornecida. À medida que nos deslocamos entre diferentes níveis de abstração, trabalhamos para criar abstrações procedimentais e de dados. Uma abstração procedural refere-se a uma seqüência de instruções que tem uma função específica e limitada. O nome de uma abstração procedural implica essas funções, mas detalhes específicos são omitidos. A abstração de dados é uma coleção de dados com um denominação que descreve um objeto de dados. Como projetista, devemos trabalhar duro para deduzir tanto abstrações procedurais quanto de dados que sirvam ao problema, mas que também possam ser reutilizadas em outras situações. 2.2 Arquitetura Em sua forma mais simples, arquitetura é a estrutura ou organização dos componentes de programa (módulos), o modo pelo 137 qual esses componentes interagem e as estruturas dos dados que são usadas pelos componentes. Em um sentido mais amplo, no entanto, componentes podem ser generalizados para representar os principais elementos do sistema e suas interações. Uma meta do projeto de software é derivar um quadro arquitetural do sistema. Esse quadro serve como arcabouço com base no qual as atividades de projeto detalhado são conduzidas. Um conjunto de padrões de software arquiteturais permite ao engenheiro de software reusar conceitos de projeto. O projeto arquitetural pode ser representado usado um ou vários modelos diferentes. Modelos estruturais representam a arquitetura como uma coleção organizada de componentes de programa. Modelos de arcabouço aumentam o nível de abstração de projeto tentando identificar arcabouços de projeto arquitetural repetíveis (padrões), que são encontrados em tipos de aplicação similares. Modelos dinâmicos tratam dos aspectos comportamentais da arquitetura de programa, indicando como a estrutura ou a configuração do sistema pode mudar em função de eventos externos. Modelos de processo focalizam o projeto dos processos de negócio ou técnicos que o sistema deve acomodar. Por fim, modelos funcionais podem ser usados para representar a hierarquia funcional de um sistema. Não devemos deixar que a arquitetura apenas aconteça. Se o fizermos, vamos gastar tempo de projeto tentando encaixar nela o projeto à força. Devemos projetar a arquitetura de forma clara e objetiva. 2.3 Padrões Um padrão de projeto descreve uma estrutura de projeto que resolve um problema particular de projeto em um contexto específico e em meio a “forças” que podem ter impacto na maneira pela qual o padrão é aplicado e usado. A intenção de cada padrão de projeto é fornecer uma descrição que habilite o projetista a determinar: a) se o padrão é aplicável ao trabalho corrente; b) se o padrão pode ser reutilizado (consequentemente, ganhando tempo de projeto) e; c) se o padrão 138 pode servir como guia para desenvolvimento de um padrão similar, mas funcionalmente ou estruturalmente diferente dele. 2.4 Modularidade Arquitetura de software e padrões de projetam incorporam modularidade; o software é dividido em componentes nomeados separadamente e endereçáveis, algumas vezes chamados de módulos, que são integrados para satisfazer aos requisitos do problema. Costuma-se dizer que a modularidade de um sistema define se ele é gerenciável intelectualmente. Softwares monolíticos (um programa grande composto de um único módulo) não pode ser facilmente compreendido por um engenheiro de software. O número de caminhos de controle, intervalos de referência, número de variáveis e a complexidade global faz com que a compreensão seja quase impossível. A complexidade perceptível de dois problemas, quando combinados, é em geral maior que a soma da complexidade perceptível quando cada problema é considerado separadamente. Isso leva à estratégia “dividir e conquistar” – é mais fácil resolvermos um problema complexo quando dividimos em partes gerenciáveis. Isso tem implicações importantes como relação à modularidade e ao software. É na realidade um argumento a favor da modularidade. É possível concluir que se subdividirmos o software indefinidamente, o esforço necessário para desenvolvê-lo tornar-se-á pequeno. Infelizmente, outras forças entram em jogo, fazendo com que essa conclusão seja tristemente inválida. Observando a Figura 4.1, o esforço (custo) para desenvolver um módulo de software individual de fato diminui à medidaque o número total de módulos aumenta. Dado o mesmo conjunto de requisitos, mais módulos significa menor tamanho individual. No entanto, à medida que o número de módulos cresce, o esforço (custo) associado à integração dos módulos também cresce. Essa característica leva à curva de custo, ou esforço total, mostrada na figura. Há um número M de módulos que resultaria no custo de 139 desenvolvimento, mas não temos a sofisticação necessária para prever M com segurança. Dessa forma, não devemos modularizar demais um sistema. A simplicidade de cada módulo será comprometida pela complexidade da integração. Figura 4.1–Modularidade e custo de software (Fonte: Pressman, 2006). 2.5 Ocultamento da Informação O conceito de modularidade leva todo projetista de software a uma questão fundamental: “Como decompomos uma solução de software para obter o melhor conjunto de módulos?”. Módulos devem ser especificados e projetados para que a informação (algoritmos e dados) contida em um módulo seja inacessível a outros módulos que não necessitam dessa informação. Ocultamento implica que efetiva modularidade pode ser conseguida pela definição de um conjunto de módulos independentes que informam uns aos outros apenas o necessário para realizar uma função de software. Abstração ajuda a definir as entidades procedurais (ou informacionais) que constituem o software. Ocultamento define e impõe restrições de acesso, tanto a detalhes de processamento dentro de um módulo quanto a qualquer estrutura de dados local usada pelo módulo. O uso de ocultamento da informação como critério de projeto para sistemas modulares fornece os maiores benefícios quando são necessárias modificações durante o teste e, posteriormente, 140 durante a manutenção do software. Como a maior parte dos dados e procedimentos estão ocultas de outras partes do software, erros inadvertidamente introduzidos durante a modificação são menos prováveis de serem propagados para outros módulos do software. Além disso, o conhecimento de detalhes não precisa ser algo que os usuários do módulo devam saber. 2.6 Independência Funcional A independência funcional é uma decorrência direta da modularidade e dos conceitos de abstração e ocultamento da informação. Ela é obtida pelo desenvolvimento de módulos com função de “finalidade única” e não recomenda a interação excessiva entre os módulos. Os módulos independentes são mais fáceis de desenvolver, de manter e de testar: a função pode ser compartimentalizada, as interfaces são simplificadas, os efeitos secundários causados por modificação de projeto ou código são limitados, a propagação de erros é reduzida e os módulos reusáveis são possíveis. A independência é avaliada por meio de dois critérios qualitativos: coesão e acoplamento. A coesão indica robustez funcional relativa a um módulo e é uma extensão natural do conceito de ocultamento da informação. Um módulo coeso realiza uma única tarefa, requerendo pouca interação com outros componentes em outras partes do programa. O acoplamento indica a interdependência relativa entre módulos e depende da complexidade da interface entre módulos, do ponto em que é feita a entrada ou referência a um módulo e de quais dados passam pela interface. Em projetos de software, o objetivo é conseguir o acoplamento mais baixo possível. 2.7 Classes de Projeto Na Unidade 3, vimos que o nível de abstração de uma classe de análise é relativamente alto. À medida em que o modelo de projeto evolui, a equipe de desenvolvimento de software deve definir um conjunto de classes de projeto que refina as classes de análise, fornecendo detalhes de projeto que vão permitir que as 141 classes sejam implementadas, e crie um conjunto de classes de projeto que implemente uma infra-estrutura de software para apoiar a solução do negócio. Cinco diferentes tipos de classes de projeto, cada um representando uma camada diferente do projeto de arquitetura, são sugeridos: ● Classes de interface com o usuário: definem todas as abstrações necessárias para a interação entre homem e computador. ● Classes do domínio de negócio: frequentemente são refinamentos de classes de análise definidas anteriormente. As classes identificam os atributos e métodos necessários para implementar algum elemento do domínio de negócio. ● Classes de processo: implementam abstrações de mais baixo nível de negócio necessárias para a completa gestão das classes de domínio de negócios. ● Classes persistentes: representam depósitos de dados que vão persistir além da execução do software. ● Classes de sistema: implementam funções de gestão e controle de software que habilitam o sistema a operar e se comunicar em seu ambiente e com o mundo externo. 2. Projeto no contexto da Engenharia de Software O projeto de software situa-se no núcleo técnico da engenharia de software e é aplicado independentemente do modelo de processo de software usado. Iniciando logo que os requisitos de software tenham sido analisados e modelados, o projeto de software é a última ação do engenheiro de software dentro da atividade de modelagem e prepara a cena para construção (geração de código e teste). Cada um dos elementos do modelo de análise fornece informação necessária para criar os quatro modelos necessários para uma completa especificação do projeto. O fluxo de informação durante o projeto de software é mostrado na Figura 4.2. O modelo de análise manifestado por elementos baseados em cenário e em classe, orientados a fluxo e comportamentais alimenta a tarefa de projeto. 142 Figura 4.2–Tradução do modelo de análise para um modelo de projeto (Fonte: Pressman, 2006). Durante o projeto tomamos decisões que vão, em ultima análise, afetar o sucesso da construção do software e, mais importante, a facilidade com a qual o software pode ser mantido. Mas por que o projeto é tão importante? A importância do projeto de software pode ser definida com uma única palavra – qualidade. Projeto é a etapa na qual a qualidade é incorporada na engenharia de software. O projeto nos fornece representações do software que podem ser avaliadas quanto à qualidade. É o único modo pelo qual podemos traduzir precisamente os requisitos do cliente em um produto ou sistema de software acabado. O projeto de software serve de base para todos os passos de engenharia de software e de suporte de software que se seguem. Sem projeto, nos arriscamos a construir um sistema instável – que falhará quando pequenas modificações forem feitas; 143 que pode ser difícil de testar; cuja qualidade não pode ser avaliada até uma fase avançada do processo de software, na qual o prazo está se esgotando e muito dinheiro já foi gasto. No processo iterativo de um projeto de software, os requisitos são traduzidos em um “documento” para construção do software. Inicialmente o documento mostra uma visão holística do software, ou seja, o projeto é representado em um alto nível de abstração, nível que pode ser diretamente relacionado ao objetivo específico do sistema e arequisitos mais detalhados de dados, funcionais e comportamentais. À medida que ocorrem as iterações de projeto, os refinamentos subsequentes levam a representações de projeto em níveis de abstração muito mais baixos. Esses ainda podem ser relacionados aos requisitos, mas a conexão é mais sutil. Ao longo do processo, a qualidade do projeto em evolução é avaliada com uma série de revisões técnicas formais ou walkthroughs de projetos. Um bom projeto deve: ● Implementar todos os requisitos explícitos contidos no modelo de análise e acomodar todos os requisitos implícitos desejados pelo cliente; ● Ser um guia legível, compreensível para aqueles que geram código e para os que testam e, subsequentemente, dão suporte ao software; ● Fornecer um quadro completo do software, focalizando os domínios de dados, funcional e comportamental sob uma perspectiva de implementação. Um modelo de projeto pode ser visto em duas dimensões diferentes como ilustrado na Figura 4.3. A dimensão processo indica a evolução do modelo de projeto à medida que as tarefas são executadas como parte do processo de software. A dimensão 144 abstração representa o nível de detalhe à medida que cada elemento do modelo de análise é transformado em um projeto equivalente e, então, refinado iterativamente. Observando a figura, a linha pontilhada indica a fronteira entre os modelos de análise e projeto. Em outros casos, o modelo de análise paulatinamente se mistura ao modelo de projeto e uma distinção clara é menos óbvia. Figura 4.3–Dimensões do modelo de projeto (Fonte: Pressman, 2006). Os elementos do modelo de projeto usam muitos dos mesmos diagramas UML que foram usados no modelo de análise. A diferença é que esses diagramas são refinados e elaborados como parte do projeto; mais detalhe específico de implementação é fornecido e são enfatizadas a estrutura e o estilo arquitetural, os componentes que residem na arquitetura e as interfaces entre os componentes e o mundo externo. É importante mencionar, no entanto, que os elementos do modelo anotados ao longo do eixo horizontal não são sempre desenvolvidos de forma sequencial. Na maioria dos casos, o projeto de arquitetura preliminar prepara o palco e é seguido pelo projeto de interface e projeto em nível de componente, que frequentemente 145 ocorrem em paralelo. O modelo de implantação é usualmente adiado até que o projeto tenha sido totalmente desenvolvido. 3.1 Projeto de dados /classes O projeto de dados / classes transforma modelos de análise-classe em realizações de classes de projeto e nas estruturas de dados dos requisitos necessárias para implementar o software. As classes e os relacionamentos definidos nos cartões de índice CRC e o conteúdo detalhado dos dados mostrados pelos atributos das classes e outras notações fornecem a base para a atividade de projeto de dados. Parte do projeto de classes pode ocorrer em conjunção com o projeto da arquitetura do software. O projeto de classe mais detalhado ocorre à medida que cada componente do software é projetado. Como outras atividades de engenharia de software, o projeto de dados (algumas vezes denominado arquitetura de dados) cria um modelo de dados e/ou informação que é representado no nível mais alto de abstração (a visão dos dados do cliente / usuário). Esse modelo de dados é então refinado em representações cada vez mais específicas da implementação que podem ser processadas pelo sistema baseado em computador. Em muitas aplicações de software, a arquitetura dos dados terá uma profunda influência na arquitetura do software que deve processá-los. A estrutura de dados é uma parte importante do projeto de software. No nível de componente de programa, o projeto das estruturas de dados e dos algoritmos associados necessários para manipulá-las é essencial para a criação de aplicações de alta qualidade. No nível de aplicação, a tradução do modelo de dados (derivado como parte da engenharia de requisitos) para um banco 146 de dados é fundamental para satisfazer aos objetivos de negócios de um sistema. Em nível de negócio, a coleção de informação armazenada em diferentes bancos de dados e reorganizada em um “armazém de dados” (data warehouse) possibilita a mineração de dados ou descoberta de conhecimento que pode ter impacto no sucesso do próprio negócio. Em qualquer caso, o projeto de dados desempenha um papel importante. 3.2 Projeto arquitetural O projeto arquitetural define os relacionamentos entre os principais elementos estruturais do software, os estilos arquiteturais e padrões de projeto que podem ser usados para satisfazer aos requisitos definidos para o sistema e as restrições que afetam o modo pelo qual o modelo arquitetural pode ser implementado. A representação do projeto arquitetural – o arcabouço de um sistema baseado em computador – pode ser derivada da especificação do sistema, do modelo de análise e da interação dos subsistemas definida no modelo de análise. O projeto arquitetural do software é o equivalente à planta baixa de uma casa. A planta baixa representa a disposição global dos cômodos, seu tamanho, forma e relacionamento entre eles, e as portas e janelas que permitem movimento para dentro e para fora dos cômodos. A planta baixa nos dá uma visão geral da casa. Elementos do projeto arquitetural nos dão uma visão geral do software. Por constituírem um processo criativo em que se tenta estabelecer uma organização de sistema que satisfaça os requisitos funcionais e não funcionais do sistema, as atividades de processo do projeto arquitetural podem ser muito diferentes dependendo do tipo de sistema que será desenvolvido, da origem, da experiência 147 do arquiteto do sistema e dos requisitos específicos do sistema. É, portanto, mais útil pensar no processo de projeto de arquitetura sob uma perspectiva de decisão em vez de uma perspectiva de atividade. O resultado do processo de projeto arquitetural é expresso em um documento de projeto arquitetural. Ele pode incluir várias representações gráficas do sistema junto com um texto descritivo associado. Deve ser descrito como o sistema está estruturado em subsistemas, a abordagem adotada e como cada subsistema está estruturado em módulos. Ao decorrer desta seção serão ilustradas algumas representações arquiteturais com foco na organização do sistema e outras direcionadas ao estilo arquitetural. 3.2.1 Organização de sistema A organização de um sistema reflete a estratégia básica para estruturá-lo. Precisamos tomar decisões sobre o modelo geral organizacional de um sistema com antecedência no processo de projeto arquitetural. A organização do sistema pode refletir-se diretamente na estrutura do subsistema. Em muitos casos, mais de um estilo pode ser adequado e alternativas podem ser projetadas e avaliadas. Por exemplo, uma arquitetura em camadas (adequada à maioria dos sistemas) pode ser combinada com uma arquitetura de repositório (centrada em dados) emmuitas aplicações de banco de dados. Nesta seção abordaremos três estilos organizacionais amplamente usados que podem ser implementados separadamente ou juntos: o modelo de repositório, o modelo cliente-servidor e o modelo em camadas. 3.2.1.1 Arquitetura de repositório (ou centrada nos dados) 148 A maioria dos sistemas que usam grandes quantidades de dados é organizada com base em um banco de dados ou repositório compartilhado. Esse modelo é, portanto, adequado para aplicações em que dados são gerados por um subsistema e usados por outro. Exemplos desse tipo de sistema incluem sistemas de comando e controle, sistemas de informações gerenciais, sistemas CAD e ferramentas CASE. A Figura 4.4 ilustra um exemplo de uma arquitetura de conjunto de ferramentas CASE. Figura 4.4–Arquitetura de um conjunto de ferramentas CASE integradas (Fonte: Sommerville, 2007). 3.2.1.2 Arquitetura cliente-servidor No modelo de arquitetura cliente-servidor o sistema é organizado como um conjunto de serviços, servidores e clientes associados que acessam e usam os serviços. Os principais componentes desse modelo são: ● um conjunto de servidores que oferecem serviços para outros subsistemas; ● um conjunto de clientes que solicita os serviços oferecidos pelos servidores e; ● uma rede que permite aos clientes acessarem esses 149 serviços. Os clientes talvez precisem saber os nomes dos servidores disponíveis e os serviços que eles fornecem. No entanto, os servidores não precisam saber a identidade dos clientes ou quantos clientes existem. Os clientes acessam os serviços fornecidos pelo servidor por meio de chamadas remotas de procedimento usando um protocolo request-reply, como o protocolo http utilizado na Web. Essencialmente, um cliente faz um pedido a um servidor e espera até receber uma resposta. A Figura 4.5 ilustra um exemplo de um sistema baseado no modelo ciente-servidor. Figura 4.5–Arquitetura de um sistema de acervo de filmes e fotografias (Fonte: Sommerville, 2007). 3.2.1.3 Arquitetura em camadas A estrutura básica de uma arquitetura em camadas é ilustrada na Figura 4.6. Um certo número de camadas diferentes é definido, cada uma realizando operações que se tornam progressivamente mais próximas do conjunto de instruções da máquina. Na camada exterior, os componentes servem as operações da interface com o usuário. Na camada mais interna, os componentes realizam a interface com o sistema operacional. As camadas intermediárias 150 fornecem serviços utilitários e funções do software de aplicação. Figura 4.6–Arquitetura em camadas (Fonte: Pressman, 2006). 3.2.2 Estilos arquiteturais Depois de escolhida a organização geral do sistema, precisamos tomar uma decisão sobre o estilo arquitetural empregado na análise modular dos subsistemas. Não há uma distinção rígida entre organização do sistema e o estilo arquitetural empregado, pois as arquiteturas descritas anteriormente podem ser aplicadas neste nível. No entanto, achamos melhor descrevê-las separadamente para proporcionar melhor compreensão. Os estilos arquiteturais são apenas um pequeno subconjunto dos que estão disponíveis para o projetista de software. Depois que a engenharia de requisitos descobre as características e restrições do sistema a ser construído, o estilo arquitetural ou combinação de estilos, que melhor se encaixa nessas características e restrições, pode ser escolhido. Abordaremos a arquitetura de fluxo de dados e a arquitetura orientada a objetos. 3.2.2.1 Arquitetura de fluxo de dados 151 Na arquitetura de fluxo de dados (ou pipelining orientado a funções), as transformações funcionais processam suas entradas e produzem saídas. Os dados fluem de uma função a outra e são transformados ao moverem-se seqüencialmente. Cada etapa do processamento é implementada como uma transformação. Os dados de entrada fluem através dessas transformações até serem convertidos em saída. As transformações podem ser executadas seqüencial ou paralelamente. Os dados podem ser processados por cada transformação item por item ou em um único lote. Quando as transformações são representadas como processos separados, esse modelo é algumas vezes chamado estilo de duto (pipe) e filtro. Quando as transformações são seqüenciais com dados processados em lotes, esse modelo de arquitetura é um modelo seqüencial em lote, comum para sistemas de processamento de dados, como sistemas de cobrança. Sistemas de processamento de dados geram normalmente muitos relatórios de saída derivados de processamentos simples sobre uma grande quantidade de registros de entrada. Um exemplo desse tipo de arquitetura de sistema é ilustrada na Figura 4.7. Figura 4.7–Modelo de fluxo de dados de um sistema de processamento de faturas (Fonte: Sommerville, 2007). 3.2.2.2 Arquitetura orientada a objetos 152 Um modelo de arquitetura orientada a objetos estrutura o sistema em um conjunto de objetos não firmemente acoplados com interfaces bem definidas onde os objetos chamam serviços oferecidos por outros objetos. A decomposição orientada a objetos está relacionada a classes de objetos, seus atributos e suas operações. Quando implementados, os objetos são criados a partir dessas classes e algum modelo de controle é usado para coordenar as operações de objetos. A Figura 4.8 ilustra um exemplo de modelo de arquitetura orientada a objetos de um sistema de processamento de faturas. Figura 4.8–Modelo de objeto de um sistema de processamento de faturas (Fonte: Sommerville, 2007). 3.2.3 Arquiteturas de referência Os modelos de arquitetura descritos anteriormente são modelos gerais e podem ser aplicados em muitas classes de aplicações. Assim como esses modelos gerais, modelos de arquitetura específicos a determinado domínio de aplicação podem ser usados. Embora as instâncias desses sistemas sejam diferentes em detalhes, a estrutura comum de arquitetura pode ser reusada no desenvolvimento de novos sistemas. Esses modelos de arquitetura 153 são chamados de arquiteturas de domínio específico e são divididos em dois tipos: ● Modelos genéricos: são abstrações de uma série de sistemas reais e englobam as características principais desses sistemas. Por exemplo, em sistemas de tempo real, pode haver modelos genéricos de arquitetura de tipos de sistemas diferentes, como sistemas de coleta de dados ou sistemas de monitoração. ● Modelos de referência: são mais abstratos e descrevem uma classe maior de sistemas. Fornecem informações aos projetistas sobre a estrutura geral dessa classe de sistema. Os modelos de referência são geralmente derivados de um estudo do domínio de aplicação. Representam uma arquitetura idealizada que inclui todas as características que esses sistemas podem incorporar. As arquiteturas de referência geralmente não são consideradas um roteiro de implementação. Em vez disso, sua principal função é ser um meio de discussão de arquiteturas de domínio específico e de comparação de sistemas diferentes em um domínio. Um modelo de referência forneceum vocabulário para comparação e atua como uma base, em relação à qual os sistemas podem ser avaliados. O modelo OSI é um exemplo de arquitetura de modelo de referência. 3.3 Projeto de interface O projeto de interface descreve como o software se comunica com os sistemas que operam com ele e com as pessoas que o utilizam. Uma interface implica um fluxo de informação (dados e/ou 154 controle) e um tipo de comportamento específico. Assim, os cenários de uso e modelos comportamentais fornecem muito da informação necessária para o projeto da interface. Os elementos do projeto de interface de software “contam-nos” como a informação flui para dentro e para fora do sistema e como ela é disseminada entre os componentes definidos como parte da arquitetura. Há três importantes elementos do projeto de interface: a) interfaces internas entre vários componentes de projeto; b) interfaces externas com outros sistemas, dispositivos, redes ou outros produtores ou consumidores de informação; e c) a interface com o usuário (IU); Esses elementos do projeto de interface permitem ao software comunicar-se externamente e possibilitam comunicação interna e colaboração entre os componentes que compõem a arquitetura do software. O projeto de interfaces internas é alinhado juntamente com o projeto de componentes. As realizações de projeto das classes de análise representam todas as operações e esquemas de mensagem necessários para permitir comunicação e colaboração entre operações de várias classes. Cada mensagem deve ser projetada para acomodar a transferência de informação necessária e os requisitos funcionais específicos da operação solicitada. O projeto de interfaces externas requer informação definitiva sobre a entidade para qual a informação é enviada ou recebida. Em todo caso, essa informação deveria ser coletada durante a engenharia de requisitos e verificada quando o projeto de interface começa. O projeto de interfaces externas deve incorporar verificação de erros e (quando necessário) características de segurança adequadas. O projeto de IU é uma ação importante de engenharia de software, pois incorpora elementos estéticos (layout, cor, gráficos, 155 mecanismos de interação), elementos ergonômicos (disposição e localização da informação, metáforas, navegação pela IU) e elementos técnicos (padrões de IU, componentes reusáveis). A interface com o usuário é um processo iterativo no qual os usuários interagem com os projetistas e os protótipos de interface para decidir sobre as características, a organização e a aparência da interface com o usuário do sistema. Algumas vezes, o protótipo da interface é desenvolvido separadamente, em paralelo, com outras atividades de engenharia de software. Mais comumente, em especial quando o desenvolvimento iterativo é usado, o projeto de interface com o usuário prossegue incrementando-se, à medida que o software é desenvolvido. Em ambos os casos, contudo, antes de iniciar a programação, devemos ter desenvolvido e testado alguns projetos baseados em papel. O processo geral de IU é ilustrado na Figura 4.9 Figura 4.9–Processo de projeto de Interface do usuário (Fonte: Sommerville, 2007). Entre as atividades do processo de projeto de interface, destacamos três principais: 1) Análise de usuário: no processo de análise de usuário, 156 devemos desenvolver uma compreensão das tarefas que os usuários realizam, seu ambiente de trabalho, os outros sistemas que eles usam, como eles interagem com outras pessoas em seu trabalho, etc. Para produtos com vários usuários, devemos tentar desenvolver essa compreensão por meio do foco em grupos, ensaios com usuários potenciais e exercícios similares. 2) Prototipação de sistema: o projeto e desenvolvimento da interface com o usuário é um processo iterativo. Embora os usuários possam informar sobre os recursos de interface de que necessitam, é muito difícil para eles serem específicos até que vejam algo tangível. Portanto, devemos desenvolver de protótipos do sistema e expô-los aos usuários, que poderão, então, guiar a evolução da interface. 3) Avaliação de interface: além das discussões com os usuários durante o processo de prototipação, devemos ter também uma atividade de avaliação mais formalizada, na qual sejam coletadas informações sobre a experiência do usuário com a interface. Uma interface com o usuário deve integrar a interação do usuário e apresentação de informações mais apropriadas para a aplicação, os conhecimentos e as experiências dos usuários do sistema, e o equipamento disponível. 3.3.1 Interação do usuário A interação do usuário significa emitir comandos e dados associados ao sistema de computador. Nos primeiros computadores, a única forma de fazer isso era por meio de uma interface de linha de comando, e uma linguagem de propósito especial era usada para 157 se comunicar com a máquina. Entretanto, isso era utilizado por usuários especialistas e uma serie de abordagens desenvolvidas são atualmente mais fáceis de usar. Podemos classificar essas formas de interação em cinco estilos primários: 1) Manipulação direta: o usuário interage diretamente com os objetos da tela. A manipulação direta envolve, geralmente, um dispositivo apontador (um mouse ou o próprio dedo sobre telas sensíveis a toque), que indica o objeto a ser manipulado, e a ação, que especifica o que deve ser feito com esse objeto. Por exemplo, para excluir um arquivo, podemos clicar sobre um ícone que representa esse arquivo e arrastá-lo para um ícone de lixeira. 2) Seleção de menu: o usuário seleciona um comando de uma lista de possibilidades (um menu). O usuário pode também selecionar um outro objeto da tela por manipulação direta e o comando opera sobre esse objeto. Nessa abordagem, para excluir um arquivo, devemos selecionar o ícone de arquivo e selecionar o comando de exclusão. 3) Preenchimento de formulários: o usuário preenche os campos de um formulário. Alguns campos podem ter menus associados e o formulário pode ter botões de ação que, quando pressionados, causam o inicio de alguma ação. Não é aconselhável usar normalmente essa abordagem para implementar a interface de operações, como excluir um arquivo. Se fizermos dessa forma, isso envolverá o preenchimento do nome do arquivo no formulário e, depois, pressionar um botão para excluir. 4) Linguagem de comando: o usuário emite um comando especial e parâmetros associados para instruir o sistema sobre o que fazer. Para excluir um arquivo, devemos digitar um comando 158 para excluir com o nome do arquivo como parâmetro. 5) Linguagem natural: o usuário emite um comando em linguagem natural. Esse geralmente é o estágio inicial de uma linguagem de comando; a linguagem natural é analisada e traduzida em comandos de sistema. Para excluir um arquivo, podemos digitar “excluir o arquivo denominado xxx”. Cada um desses estilos de interação tem vantagens e desvantagens e é mais adequado a determinado tipo de aplicação eusuário. A Tabela 4.1 mostra as principais vantagens e desvantagens desses estilos e sugere tipos de aplicações em que eles poderiam ser usados. Estilo de interação Principais vantagens Principais desvantagens Exemplos de aplicação Manipulação direta Interação rápida e intuitiva; Facilidade de aprendizado Pode ser difícil implementar; É adequado somente quando houver uma metáfora visual para tarefas e objetos Jogos de vídeo; Sistemas CAD Seleção de menu Evita erros do usuário; É necessária pouca digitação Lento para usuários experientes; Pode tornar-se complexo se houver muitas opções de menus A maioria dos sistemas de propósito geral Preenchimento de formulários; Facilidade de aprendizado verificável Entrada de dados simples Ocupa grande quantidade de espaço de tela; Causa problemas quando as opções de usuário não combinam com os campos de formulário Controle de estoque; Processamento de empréstimos pessoais 159 Linguagem de comando Poderosa e flexível Dificuldade de aprendizado; Gerenciamento inadequado de erros Sistemas operacionais; Sistemas de comando e controle Linguagem natural Acessível a usuários casuais; Facilmente estendido Requer muita digitação; Não são confiáveis Sistemas de recuperação de informações Tabela 4.1–Vantagens e desvantagens de estilos de interação. Para ilustrar o projeto de interação com o usuário utilizamos, como exemplo, um sistema de controle de livros de uma biblioteca na qual os usuários podem acessar documentos de outras bibliotecas. A interface com o usuário do sistema é implementada por meio de um navegador web e, assim, considerando que os usuários devem fornecer informações ao sistema, como o identificador do documento, seu nome e seus detalhes de autorização, faz sentido usar uma interface baseada em formulários. A Figura 4.10 ilustra um possível projeto de interface para o componente de busca do sistema. Figura 4.10–Interface baseada em formulários (Fonte: Sommerville, 2007). 160 3.3.2 Apresentação de informações Todos os sistemas interativos têm de fornecer algum modo de apresentação de informações aos usuários. A apresentação de informações pode ser simplesmente uma representação direta de informações de entrada (por exemplo, texto em um processador de texto) ou pode apresentar as informações graficamente. Uma boa diretriz de projeto é manter o software necessário para apresentação de informações separado das informações em si. A separação do sistema de apresentação dos dados permite alterar a representação na tela do usuário sem ter de alterar a base do sistema computacional, como ilustra a Figura 4.11. Figura 4.11–Apresentação de informações (Fonte: Sommerville, 2007). A abordagem Modelo-Visão-Controle (MVC) ilustrada na Figura 4.12 é uma maneira eficiente de apoiar as várias apresentações de dados. Os usuários podem interagir com cada apresentação em um estilo apropriado à apresentação. Os dados a serem exibidos são encapsulados por um objeto de modelo. Cada objeto de modelo pode ter uma série de objetos de visualização separados, associados a ele, sendo cada visualização uma apresentação de display diferente do modelo. 161 Figura 4.12–Modelo MVC de interação com o usuário (Fonte: Sommerville, 2007). Por exemplo, considere um sistema que registra e resume os valores de vendas mensais de uma empresa. A Figura 4.13 ilustra como as mesmas informações podem ser apresentadas em forma de texto ou graficamente. Os gerentes que estudam os valores de vendas estão, geralmente, mais interessados nas tendências ou números anômalos em vez de em valores precisos. A apresentação gráfica dessas informações como um histograma destaca os números anômalos, em março e maio, dos outros. A Figura 4.13. Ilustra também como a apresentação textual ocupa menos espaço do que uma representação gráfica das mesmas informações. 162 Figura 4.13–Apresentações alternativas de informações (Fonte: Sommerville, 2007). 3.4 Projeto em nível de componentes Definido de forma geral, o componente é um bloco construtivo modular para software de computador que encapsula implementação e exibe conjunto de interfaces. O projeto em nível de componente transforma elementos estruturais da arquitetura de software em uma descrição procedural dos componentes de software. A informação obtida do modelo baseado em classes, modelos de fluxo e modelos comportamentais serve de base para o projeto de componentes. O projeto em nível de componente do software descreve completamente os detalhes internos de cada componente de software. Para tanto, o projeto define estruturas de dados para todos os objetos de dados locais e detalhes algorítmicos para todo o processamento que ocorre em um componente e em uma interface que dá acesso a todas as operações do componente 163 (comportamentos). Os detalhes de projeto de um componente podem ser modelados em muitos níveis diferentes de abstração. Um diagrama de atividade pode ser usado para representar a lógica de processamento. O fluxo procedural detalhado de um componente pode ser representado por meio de pseudocódigo ou de algumas formas diagramáticas (diagrama de atividade ou fluxograma). 3.5 Projeto em nível de implantação Elementos de projeto em nível de implantação indicam como a funcionalidade e os subsistemas do software serão alocados no ambiente computacional físico que vai apoiar o software. Durante o projeto, um diagrama de implantação UML é desenvolvido e refinado como mostra a Figura 4.14, onde três ambientes computacionais são apresentados. Os subsistemas (funcionalidade) alojados em cada elemento computacional são indicados. Por exemplo, o “computador pessoal” aloja subsistemas que implementam segurança, vigilância, gestão residencial e características de comunicação. Além disso, um subsistema de acesso externo foi projetado para gerir todas as tentativas de acesso ao sistema de uma fonte externa. Cada subsistema seria elaborado parta indicar os componentes que ele implementa. 164 Figura 4.14–Diagrama de implantação UML (Fonte: Pressman, 2006). O diagrama acima ilustrado está na forma de descritor, ou seja, ele mostra o ambiente computacional, mas não indica explicitamente detalhes de configuração. Por exemplo, o “computador pessoal” não é melhor identificado. Ele poderia ser um PC Windows ou um Macintosh, uma estação de trabalho Sun ou Linux. Esses detalhes são fornecidos quando o diagrama de implantação é revisitado na forma de instância durante estágios posteriores do projeto ou quando a construção começa. Cada instância da implantação (uma configuração de hardware específica, a qual é atribuído um nome) é identificada. Veremos um pouco mais sobre diagramas de implantação na Seção 5 desta Unidade. 4. Modelagem de projeto utilizando o RUP O propósito do projeto é adaptar os resultados da análise às restrições impostas pelos requisitos não funcionais, o ambiente de implementação, os requisitos de desempenho e assim 165 sucessivamente. O projeto é um refinamento da análise e objetiva assegurar a coberturacompleta dos requisitos. 4.1 Atividades Nas iterações ocorridas durante a fase de projeto, a plataforma arquitetônica do sistema está definida e estabilizada, e a ênfase agora está na adição de mais funcionalidades da aplicação. A Figura 4.15 ilustra o fluxo de atividades relacionadas à Análise e Projeto, consideradas como uma disciplina única pelo RUP, mas cuja abordagem é feita separadamente nesta Unidade 4. Figura 4.15 – Fluxo de Atividades de Projeto, em destaque (Fonte: adaptado de www.funpar.ufpr.br). ● Refinar a arquitetura: este detalhe de fluxo é composto de atividades como identificar mecanismos de projeto, identificar elementos de projeto existentes, descrever arquitetura de 166 execução e descrever distribuição, todas executadas pelo arquiteto, e a revisão da arquitetura, executada pelo revisor de arquitetura. O propósito deste detalhe de fluxo é: ➢ Fornecer a transição natural das atividades de análise para as atividades de projeto, identificando: a) os elementos de projeto apropriados dos elementos de análise e b) os mecanismos de projeto apropriados dos mecanismos de análise relacionados. ➢ Manter a consistência e integridade da arquitetura, assegurando que: a) os novos elementos de projeto identificados para a iteração atual estejam integrados com os elementos de projeto preexistentes e b) a reutilização máxima de componentes de componentes disponíveis e de elementos de projeto seja alcançada, assim que possível, no trabalho de projeto. ➢ Descrever a organização da execução do sistema e a arquitetura de distribuição. ➢ Organizar o modelo de implementação para fazer a transição entre o projeto e a implementação sem interrupções. ● Projetar componentes: este detalhe do fluxo é composto das atividades análise de caso de uso, executada pelo projetista, identificar elementos do projeto, executada pelo arquiteto, e revisão do projeto, executada pelo revisor do projeto. O propósito deste detalhe do fluxo é: ➢ Refinar as definições dos elementos de projeto, resultando nos detalhes de como os elementos de projeto implementam o comportamento requerido. ➢ Refinar e atualizar as realizações de caso de uso 167 baseando-se em novos elementos de projetos introduzidos, mantendo assim atualizadas as realizações de caso de uso. ➢ Revisar o projeto quanto à sua evolução. Neste detalhe do fluxo, as características e relações de classe, as interfaces de subsistema e suas realizações pelas classes contidas e as realizações de caso de uso em termos de colaborações, são todas completamente especificadas. ● Projetar banco de dados: este detalhe do fluxo é opcional, invocado quando o sistema envolve uma quantidade grande de dados em um banco de dados. É composto das atividades projetar banco de dados, executada pelo projetista de banco de dados, projetar classe, executada pelo projetista e revisar o projeto, executada pelo revisor de projeto. O propósito deste detalhe do fluxo é: ➢ Identificar as classes persistentes no projeto. ➢ Projetar a estrutura de banco de dados apropriada para armazenar as classes persistentes. ➢ Definir os mecanismos e estratégias para a armazenagem e restauração dos dados persistentes, de tal modo que sejam satisfeitos os critérios para o desempenho do sistema. Podemos observar, na Figura 4.15, que o projeto de componente e o de banco de dados ocorrem em paralelo: pode haver muitas interações entre desenvolvedores executando estes fluxos. Por exemplo, a descoberta de uma nova classe pode exigir ajuste na arquitetura. O refinamento da arquitetura por razões de desempenho também pode impactar o projeto de classes persistentes. 168 4.2 Papéis O RUP expressa o processo de projeto de sistemas em termos de atividades (como já visto), papéis e artefatos. A Figura 4.16 ilustra os papéis e os artefatos envolvidos nesta fase. Os papéis principais envolvidos no projeto são: ● Projetista: define as responsabilidades, operações, atributos e relações de uma ou várias classes, e determina como elas devem ser ajustadas ao ambiente de implementação. Além disso, o projetista pode ter responsabilidade por um ou mais pacotes de projeto ou subsistemas de projeto, inclusive sobre quaisquer classes contidas nos pacotes ou subsistemas. ● Projetista de banco de dados (opcional): é requisitado quando o sistema que estiver sendo projetado incluir um banco de dados. ● Projetista de cápsula (para sistemas em tempo real): se concentra em assegurar que o sistema possa responder a eventos de maneira pontual, por meio da utilização apropriada de técnicas coordenadas de projeto. ● Revisor de arquitetura e de projeto: estes especialistas revisam os artefatos fundamentais produzidos por este fluxo. Figura 4.16 – Papéis e artefatos do Projeto (Fonte: www.funpar.ufpr.br). 4.3 Artefatos ● Realização de casos de uso: descreve como determinado caso de uso é realizado no modelo de design em termos de objetos de colaboração. 169 ● Subsistema de projeto: é um elemento de modelo que tem a semântica de um pacote (pode conter outros elementos de modelo) e a uma classe (apresenta um comportamento). O comportamento do subsistema é definido por classes ou outros subsistemas contidos nele. Um subsistema realiza uma ou mais interfaces, que definem o comportamento que ele pode apresentar. ● Pacote do projeto: é um conjunto de classes, relacionamentos, realizações de casos de uso, diagramas e outros pacotes. Ele é usado para estruturar o modelo de design, dividindo-o em partes menores. ● Classe do projeto: é uma descrição de um conjunto de objetos que compartilham as mesmas responsabilidades, relacionamentos, operações, atributos e semântica. ● Classe de análise: representa um primeiro modelo conceitual para "elementos no sistema que possuam responsabilidades e comportamento". ● Modelo de dados: é um subconjunto do modelo de implementação que descreve a representação lógica e física dos dados persistentes no sistema. Também abrange qualquer comportamento definido no banco de dados, como procedimentos armazenados, triggers, restrições etc. ● Cápsula: é um padrão de design específico que representa um thread de controle encapsulado no sistema. 170 5. Modelagem de projeto utilizando diagramas UML Quando deixamos de ter uma visão conceitual da construção de classes e de diagramas de seqüência em uma determinada abstração, começamos a focar o workflow de projeto de sistemas. Por vezes os dois workflows (análise e projeto) são abordados como um único (RUP, por exemplo). No entanto, para fins didáticos, abordamos essas duas etapas separadamente. Nesta Seção, que trata a etapa de projeto por meio da UML, nosso foco está nos diagramas de componentes, implantação e colaboração. 5.1 Diagrama de componentes Os componentes são um importante bloco de construção para a modelagem de aspectos físicos de um sistema. Um componente é a parte física e substituível de um sistema ao qual se adapta e fornece a realização de um conjunto de interfaces. Graficamente, é representadocomo um retângulo com abas, como ilustrado na Figura 4.17. Figura 4.17–Ilustração de componente (Fonte: BOOCH et. al.,2000). Em muitos aspectos, os componentes são semelhantes às classes: ambos têm nomes; ambos podem realizar um conjunto de interfaces; ambos podem participar de um relacionamento de 171 dependência, generalização e associação; ambos admitem instâncias; ambos podem ser participantes de interações. Entretanto, existem algumas diferenças significativas entre componentes e classes: ● As classes representam abstrações lógicas; os componentes representam coisas físicas que vivem no mundo dos bits. Em resumo, os componentes podem viver em nós, as classes não. ● Os componentes representam o pacote físico de componentes lógicos e se encontram em um nível diferente de abstração. ● As classes podem ter atributos e operações diretamente. Em geral, os componentes somente têm operações que são alcançadas por meio de suas interfaces. (BOOCH,344) Três tipos de componentes podem ser diferenciados: Primeiro, existem componentes de implantação. São os componentes necessários e suficientes para formar um sistema executável, como as bibliotecas dinâmicas (DLLs) e os executáveis (EXEs). Segundo, existem os componentes do produto de trabalho, que são essencialmente o resíduo do processo de desenvolvimento, formados por coisas como arquivos de código-fonte e arquivos de dados a partir dos quais os componentes de implantação são criados. Terceiro, existem os componentes de execução, criados como uma consequência de um sistema de execução, como um objeto COM+, que é instanciado a partir de uma DLL. Os diagramas de componentes são empregados para a modelagem da visão estática de implementação de um sistema. Isso envolve a modelagem de itens físicos que residem em um nó, 172 como executáveis, bibliotecas, tabelas, arquivos e documentos. Os diagramas de componentes são essencialmente diagramas de classes que focalizam os componentes de um sistema, conforme ilustra a Figura 4.18. Figura 4.18–Diagrama de componentes (Fonte: BOOCH et. al.,2000). Ao criarmos diagramas de componentes na UML, devemos lembrar que todo diagrama de componentes é apenas uma apresentação gráfica da visão estática de implementação de um sistema. Isso significa que um único diagrama de componentes não precisará capturar tudo sobre a visão de implementação do sistema. Coletivamente, todos os diagramas de componentes representam a visão estática de implementação completa; individualmente, cada diagrama representa apenas um único aspecto. Um diagrama de componentes bem estruturado: ● Tem como foco comunicar um aspecto da visão estática de implementação do sistema. ● Contém somente os elementos essenciais à 173 compreensão desse aspecto. ● Fornece detalhes consistentes com seu nível de abstração, mostrando somente os adornos essenciais à compreensão do que é apresentado. ● Não é tão minimalista que informa mal o leitor sobre a semântica importante. Ao definir um diagrama de componentes: ● Dê-lhe um nome capaz de comunicar seu propósito. ● Distribua seus elementos para minimizar o cruzamento de linhas. ● Organize seus elementos espacialmente, de modo que os itens semanticamente afins fiquem próximos fisicamente. ● Use notas e cores como indicações visuais com a finalidade de chamar a atenção para características importantes de seu diagrama. ● Use elementos estereotipados com cuidado. Escolha um pequeno conjunto de ícones comuns para seu projeto ou organização e utilize-os de maneira consistente. 5.2 Diagrama de implantação Assim como os componentes, os nós vivem no mundo material e são um bloco de construção importante para a modelagem dos aspectos físicos de um sistema. Um nó é um elemento físico que existe em tempo de execução e representa um recurso computacional, geralmente tendo pelo menos alguma memória e, frequentemente, capacidade de processamento. Graficamente, um nó é representado por um cubo, como ilustra a Figura 4.19. 174 Figura 4.19–Ilustração de um nó (Fonte: BOOCH et. al.,2000). Os diagramas de implantação são empregados para a modelagem da visão estática da implementação de um sistema. Na maior parte, isso envolve a modelagem da topologia do hardware em que o sistema é executado. Os diagramas de implantação são essencialmente diagramas de classes que focalizam os nós do sistema, como ilustra a Figura 4.20. No limite do software e do hardware, eles são utilizados para analisar a topologia dos processadores e dispositivos nos quais o software é executado. Figura 4.20–Diagrama de implantação (Fonte: BOOCH et. al.,2000). Os diagramas de implantação são úteis por facilitarem a comunicação entre os engenheiros de hardware e os 175 desenvolvedores de software do projeto. Com a utilização de nós estereotipados para se parecerem com dispositivos familiares, podemos criar diagramas compreensíveis pelos dois grupos. Os diagramas de implantação também são úteis para a análise de compatibilidade de hardware e software. Podendo ser utilizados para visualizar, especificar, construir e documentar as decisões de engenharia de sistema. Existem alguns tipos de sistemas para os quais os diagramas de funcionamento são desnecessários. Se estivermos desenvolvendo um trecho de software que reside em uma única máquina e interage somente com dispositivos padrão dessa máquina, que já são gerenciados pelo sistema operacional host (por exemplo, o teclado, o monitor e o modem de um computador pessoal), podemos ignorar os diagramas de implantação. Por outro lado, se estivermos desenvolvendo um trecho de software que interage com dispositivos que o sistema operacional host tipicamente não gerencia ou que é distribuído fisicamente por vários processadores, então o uso de diagramas de implantação ajudará a analisarmos o mapeamento de software-para-hardware do sistema. Ao fazermos a modelagem da visão estática de implantação de um sistema, geralmente utilizaremos os diagramas de implantação em uma das três maneiras: ● Para fazer a modelagem de sistemas embarcados. ● Para fazer a modelagem de sistemas cliente / servidor. ● Para fazer a modelagem de sistemas totalmente distribuídos. 5.2.1 Modelagem de um sistema embarcado O desenvolvimento de um sistema embarcado é bem mais do que um problema de software. É preciso gerenciar o mundo físico 176 onde se encontram as partes móveis em que ele se divide, os sinais têm ruídos e o comportamento não é linear. Ao fazer a modelagem de um desses sistemas, é necessário levar em consideração sua interface com o mundo real e isso significa analisar dispositivos pouco usuais, além dos nós. Por exemplo, a Figura 4.21 ilustra o hardware para um robô autônomo simples. Existe um nó (Pentium motherboard) estereotipado como um processador. Ao redor desse nó existem oito dispositivos, cada um estereotipado como um dispositivo e representado por um ícone que oferece uma clara indicação visual ao seu equivalente do mundo real. Figura 4.21–Modelagem de um sistema embarcado(Fonte: BOOCH et. al.,2000). 5.2.2 Modelagem de um sistema cliente / servidor A divisão de um sistema em partes cliente e servidor envolve a tomada de algumas decisões difíceis a respeito do local em que 177 serão colocados fisicamente seus componentes de software e como uma distribuição equilibrada de responsabilidades entre esses componentes. Por exemplo, a maioria dos sistemas de informações de gerenciamento são essencialmente arquiteturas tripartidas, significando que a GUI, a lógica do negócio e o banco de dados do sistema são distribuídos fisicamente. Costuma ser óbvio decidir onde colocar a GUI e o banco de dados; portanto, a parte mais difícil é a decisão de onde a lógica do negócio ficará. A Figura 4.22 ilustra a topologia de um sistema de recursos humanos, que segue uma arquitetura cliente/ servidor clássica. O pacote cliente contém dois nós (console e kiosk), ambos estereotipados e visualmente diferenciados. O pacote servidor contém dois tipos de nós (caching server e server) e ambos têm, como adornos, alguns dos componentes que residem em cada um deles. Observe também que caching server e server estão marcados com multiplicidades explícitas, especificando quantas instâncias de cada um são esperadas em uma determinada configuração de instalação. Figura 4.22–Modelagem de um sistema cliente/ servidor (Fonte: BOOCH et. al.,2000). 5.2.3 Modelagem de um sistema totalmente distribuído Os sistemas distribuídos aparecem de muitas formas, desde 178 sistemas simples com dois processadores até os que estão em muitos nós dispersos geograficamente. Os nós são adicionados e removidos, à medida que o tráfego da rede se modifica e os processadores falham; novos e mais rápidos caminhos de comunicação podem ser estabelecidos em paralelo com os canais anteriores e mais lentos, que eventualmente são desativados. Não apenas a topologia desses sistemas poderá mudar, mas a distribuição de seus componentes de software também poderá ser alterada. A Figura 4.23 ilustra a topologia de um sistema totalmente distribuído. Existem três consoles (instâncias anônimas do nó estereotipado console), que estão vinculados à Internet (claramente um nó de uma única função). Por sua vez, existem três instâncias de servidores regionais, que servem como front-ends de servidores nacionais, somente um dos quais é mostrado. Figura 4.23–Modelagem de um sistema totalmente distribuído (Fonte: BOOCH et. al.,2000). 5.2.4 Recomendações para diagramação de implantação Um diagrama de implantação bem estruturado: ● Tem como foco a comunicação de um aspecto da visão 179 estática de implantação do sistema. ● Contém somente os elementos essenciais à compreensão desse aspecto. ● Fornece detalhes consistentes com seu nível de abstração; exibe somente os adornos essenciais à compreensão. ● Não é tão minimalista que acabe informando mal o leitor sobre a semântica importante. Ao definir um diagrama de implantação: ● Dê-lhe um nome capaz de comunicar seu propósito. ● Distribua os elementos de forma a minimizar o cruzamento de linhas. ● Organize seus elementos espacialmente, de modo que os itens que são semanticamente afins fiquem próximos fisicamente. ● Use notas e cores como indicações visuais com a finalidade de chamar atenção para características importantes de seu diagrama. ● Use elementos estereotipados com cuida. Escolha um pequeno conjunto de ícones comuns para seu projeto ou organização e use-os de forma consistente. 5.3 Diagrama de colaboração Um diagrama de colaboração é um diagrama de interação que dá ênfase à organização estrutural dos objetos que enviam e recebem mensagens. Graficamente, um diagrama de colaboração é uma coleção de vértices e arcos. Conforme ilustra a Figura 4.24, um diagrama de colaboração é formado colocando primeiro os objetos 180 que participam da interação como os vértices de um gráfico. A seguir, representa os vínculos que conectam esses objetos como os arcos do gráfico. Por fim, adorna esses vínculos com as mensagens que os objetos enviam e recebem. Isso proporciona ao leitor uma clara indicação visual do fluxo de controle no contexto da organização estrutural dos objetos que colaboram. Figura 4.24–Diagrama de colaboração (Fonte: BOOCH et. al.,2000). Os diagramas de colaboração têm duas características que os diferenciam dos diagramas de sequência. Primeiro, existe o caminho, e para indicar como um objeto está vinculado a outro, podemos anexar um estereótipo de caminho à extremidade contrária de um vínculo. Segundo, existe o número de sequência. Para indicar a ordem temporal de uma mensagem, use um número como prefixo da mensagem, aumentando unitariamente para cada nova mensagem no fluxo de controle. Devemos observar também que, no mesmo vínculo, é possível exibir muitas mensagens e cada uma terá um número de sequência único. Um diagrama de colaboração bem estruturado: 181 ● Está voltado para comunicar um único aspecto da dinâmica do sistema. ● Contém somente os elementos essenciais à compreensão desses aspectos. ● Fornece detalhes consistentes com seu nível de abstração e expõe somente os adornos essenciais à compreensão. ● Não é tão minimalista, que informe mal ao leitor sobre a semântica que é importante. Ao definir um diagrama de colaboração: ● Dê-lhe um nome capaz de comunicar seu propósito. ● Dê ênfase à ordenação temporal das mensagens. ● Distribua seus elementos para minimizar o cruzamento de linhas. ● Use notas e cores como indicações visuais para chamar atenção para características importantes do diagrama. ● Use a ramificação com cautela; você pode representar bem melhor as ramificações complexas, utilizando os diagramas de atividades. 6. Ferramentas para modelagem de projeto 6.1 Projeto arquitetural Ferramentas de projeto arquitetural modelam a estrutura de software pela representação dos componentes de interface, dependências e relacionamentos, e interações. A mecânica da ferramenta varia e, na maioria dos casos, a capacidade do projeto arquitetural é parte da funcionalidade fornecida por ferramentas automatizadas para modelagem de análise e de projeto. 182 As seguintes ferramentas suportam a modelagem estrutural do software: ● Adalon: é uma ferramenta de projeto especializada para projeto e construção de arquiteturas específicas de componentes baseados na web. ● ObjectIF: é uma ferramenta de projeto baseada na UML que leva as arquiteturas (por exemplo, Coldfusion, J2EE, Fusebox) de uso fácil para engenharia de software baseada em componentes. ● Rational Rose: é uma ferramenta de projeto baseada na UML que suporta todos os aspectos do projeto arquitetural. 6.2 Projeto em nível de componentes Um dos elementos-chave que conduz ao sucesso ou falha do desenvolvimento do software baseado em componentes é a disponibilidade de middleware. Middleware é uma coleção de componentes de infraestrutura que permitem aos componentes do domínio do problema comunicarem-se entre eles mesmos, em uma rede ou dentro de um sistema complexo. Três normas concorrentesestão disponíveis aos engenheiros de software que querem usar engenharia de software baseada em componentes como seu processo de software: ● OMG CORBA (http://www.corba.org) ● Microsoft COM (http://www.microsoft.com/com/tech/complus.asp) ● Sun JavaBeans (http://java.sun.com/products/ejb/) Os sites mencionados apresentam grande quantidade de 183 http://www.google.com/url?q=http%3A%2F%2Fwww.corba.org&sa=D&sntz=1&usg=AFQjCNGxJuCNMSZRgwfzZgOmuyR0tik5MA http://www.google.com/url?q=http%3A%2F%2Fwww.microsoft.com%2Fcom%2Ftech%2Fcomplus.asp&sa=D&sntz=1&usg=AFQjCNHK7CuS-GBZTUsWw_jZ3PXTDRllKg http://www.google.com/url?q=http%3A%2F%2Fjava.sun.com%2Fproducts%2Fejb%2F&sa=D&sntz=1&usg=AFQjCNE9T7QYoEeuwbvgpII6_m5xg5Xwzw tutoriais,papers, ferramentas e recursos gerais sobre essas importantes normas de middleware (PRESSMAN, 243). Uma grande variedade de ferramentas UML está disponível para apoiar o projetista em todos os níveis de projeto. Algumas delas fornecem suporte à Linguagem de Restrição de Objetos (OCL): ● ArgoUML: suporta UML completa e OCL e inclui uma variedade de ferramentas de apoio a projetos que vai além da geração de diagramas UML e expressões OCL. ● Dresden OCL toolkit: é um conjunto de ferramentas baseado em um compilador OCL que abrange vários módulos, os quais interpretam, verificam tipo e normalizam as restrições OCL. ● OCL parser: é escrita em Java e está disponível livremente para a comunidade orientada a objetos, para encorajar o uso de OCL com modeladores UML. 6.3 Projeto de interface Essas ferramentas de projeto o engenheiro de software a criar uma interface com, relativamente pouco desenvolvimento de software personalizado. As ferramentas fornecem acesso a componentes reusáveis e tornam a criação de uma interface uma questão selecionar dentre capacidades definidas, montadas usando-se a ferramenta. A maioria das ferramentas de desenvolvimento de interface com o usuário habilita um engenheiro de software a criá-la por meio da capacidade de “arrastar e soltar”. O desenvolvedor seleciona dentre várias capacidades predefinidas (construtores de formulários, 184 mecanismos de interação, capacidade de processamento de comando) e coloca essas capacidades no contexto da interface a ser criada. Algumas dessas ferramentas são: ● Macromedia Authorware: projetada para a criação de interfaces e ambientes de ensino a distância. Faz uso de capacidades sofisticadas de construção. ● Motif Common Desktop Environment: é uma interface gráfica com o usuário integrada para sistemas abertos de computadores pessoais. Ela entrega uma única interface gráfica padronizada para a gestão de dados, arquivos e aplicações. ● PowerDesigner/ PowerBuilder: é um conjunto abrangente de ferramentas CASE que incluem muitas capacidades para projetar e construir interfaces. 185 Referências SOMMERVILLE, I. Engenharia de software. 8.ed. São Paulo: Pearson Addison-Wesley, 2007. 552 p. PRESSMAN, R. S. Engenharia de Software. São Paulo: McGraw-Hill, 2006, 720 p. BOOCH, G.; RUMBAUGH, J.; JACOBSON, I. UML – Guia do usuário. Rio de Janeiro: Editora Campus, 2000. 472 p. KRUCHTEN, P. Introdução ao RUP – Rational Unified Process. Rio de Janeiro : Editora Ciência Moderna, 2003. 255p. MEDEIROS, E. Desenvolvendo software com UML 2.0. São Paulo: Pearson Makron Books, 2004. 264p. Rational Unified Process: Disciplinas. Fundação da Universidade Federal do Paraná (FUNPAR). Setembro, 2013. Disponível em: http://www.funpar.ufpr.br:8080/rup/process/workflow/ovu_core.htm 186 http://www.google.com/url?q=http%3A%2F%2Fwww.funpar.ufpr.br%3A8080%2Frup%2Fprocess%2Fworkflow%2Fovu_core.htm&sa=D&sntz=1&usg=AFQjCNGuRVp3UUOJXLAQz82q1cHh-UVsKQ
Compartilhar