- França.pro.br
Transcrição
- França.pro.br
FUNDAÇÃO DE APOIO À ESCOLA TÉCNICA DO ESTADO DO RIO DE JANEIRO - FAETEC Nome da Disciplina Período Carga Horária MODELAGEM DE DADOS 3 – MD3 2º 2 aulas/semana Notas de Aula – v1.0 Fevereiro de 2012 Professor M. França [email protected] http://www.franca.pro.br/prof FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 1 Esta página foi deixada propositadamente em branco. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 2 O Autor Marcelo França é técnico em Processamento de Dados, tecnólogo em Processamento de Dados, analista de sistemas pós-graduado pela PUC-Rio, bacharel em Administração de Sistemas de Informação, licenciado em Informática pelo Instituto Superior de Educação do Rio de Janeiro – ISERJ, mestre em Informática pela Universidade Federal do Estado do Rio de Janeiro – UNIRIO, aluno do MBA em gerenciamento de projetos da Fundação Getúlio Vargas, certificado MCAD pela Microsoft, certificado SCJA pela Sun, certificado RAD Associate pela IBM, certificado OCJP 6 (SCJP) pela Oracle, professor de Informática da FAETEC e da Faculdade de Informática Lemos de Castro, e especialista de sistemas da IBM Brasil. Estuda Informática desde 1990 e trabalha com Informática desde 1994. Dedicatória Dedico este trabalho a todos os meus alunos e ex-alunos. Desejo a todos vocês muito sucesso profissional. Que seus objetivos sejam alcançados e que vocês sempre perseverem, mantendo o foco! Agradecimentos Agradeço a Deus pela iluminação e por ter sido tão feliz na escolha desta profissão. Obrigado, Senhor! FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 3 Esta página foi deixada propositadamente em branco. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 4 Índice 1. Introdução ao Paradigma OO ..................................................................................... 7 Motivação.................................................................................................................... 7 Técnicas de Programação Tradicionais ............................................................................ 9 Histórico da Orientação a Objetos................................................................................. 10 Princípios Básicos ....................................................................................................... 13 Introdução à UML ....................................................................................................... 19 Exercícios .................................................................................................................. 20 2. Diagrama de Casos de Uso ...................................................................................... 23 Introdução ................................................................................................................ 23 O que são atores, cenários e casos de uso? ................................................................... 25 Como identificar atores e casos de uso? ........................................................................ 28 Aplicação de UML: diagramas de casos de uso ............................................................... 37 Relacionamentos entre Casos de Uso ............................................................................ 38 Sugestões de ferramentas de Modelagem: .................................................................... 41 Exercícios .................................................................................................................. 42 3. Diagrama de Classes ............................................................................................... 45 Diagrama de Classes .................................................................................................. 45 Associações ............................................................................................................... 47 Agregação e Composição ............................................................................................ 49 Generalizações........................................................................................................... 50 Dependências e Refinamentos ..................................................................................... 51 Exercícios .................................................................................................................. 52 4. Diagrama de Atividades e de Sequência .................................................................... 53 Diagrama de Atividades .............................................................................................. 53 Diagramas de Sequência ............................................................................................. 60 Exercícios .................................................................................................................. 70 6. Apêndice A – Questionário de Avaliação do Curso ....................................................... 77 FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 5 Esta página foi deixada propositadamente em branco. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 6 1. Introdução ao Paradigma OO Motivação Crise do Software A crise do software foi um termo utilizado nos anos 70, quando a engenharia de software era praticamente inexistente. O termo expressava as dificuldades do desenvolvimento de software frente ao rápido crescimento da demanda por software, da complexidade dos problemas a serem resolvidos e da inexistência de técnicas estabelecidas para o desenvolvimento de sistemas que funcionassem adequadamente ou pudessem ser validados. A noção da crise do software emergiu no final dos anos 60. Uma das primeiras e mais conhecidas referências ao termo foi feita por Edsger Dijkstra, na apresentação feita em 1972 na Association for Computing Machinery Turing Award, intitulada "The Humble Programmer" (EWD340), publicada no periódico Communications of the ACM. Logo que o desenvolvimento de software começou a caminhar com o advento das linguagens estruturadas e modulares, uma situação tornou-se clara diante de todos: a indústria de software estava falhando repetidamente na entrega de resultados dentro dos prazos, quase sempre estourando os orçamentos e apresentando um grau de qualidade duvidoso ou insatisfatório. Em um relatório de 1969 [Naur, 1969], esse problema já havia sido reconhecido. Conforme foi observado, cerca de 50 a 80% dos projetos nunca foram concluídos ou estavam tão longe de seus objetivos que foram considerados fracassados. Dos sistemas que foram finalizados, 90% haviam terminado 150 a 400% acima do orçamento e dos prazos predeterminados [Wallnau, 2002]. Os problemas que originaram essa crise tinham relacionamento direto com a forma de trabalho das equipes. Eram problemas que não se limitavam a "sistemas que não funcionam corretamente", mas envolviam também dúvidas sobre como desenvolver e manter um volume crescente de software e ainda estar preparado para as futuras demandas. Essencialmente, eram sintomas provenientes do pouco entendimento dos requisitos por parte dos desenvolvedores, somados às técnicas e medidas pobres aplicadas sobre o processo e o produto, além dos poucos critérios de qualidade estabelecidos até então [Pressman, 2004]. A palavra “crise” já tem sido discutida por não descrever exatamente o problema em questão. Uma definição mais precisa talvez seja “aflição crônica”, pelas características de continuidade e intermitência dos sintomas [Pressman, 2004]. Todos esses fatores exigiram respostas e métodos que foram sendo aprimorados e documentados, dando início à área de Engenharia de Software. A busca por eficiência e competência revelou oportunidades, desafios e perigos que guiaram as tecnologias e apontaram novos rumos para as pesquisas. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 7 A Crise do Software e a Idade Média Para compreender melhor as origens da Crise de Software, podemos fazer uma comparação muito interessante com a história das outras indústrias. Por exemplo, antes da revolução industrial, os sapatos eram feitos de forma muito individual. Nesses tempos mais remotos, os sapateiros faziam cada par de sapatos de forma única para cada cliente, desde a obtenção da matéria prima até o produto final. As semelhanças com a indústria de software começam logo aí. Primeiro, porque as técnicas de desenvolvimento de software ainda não estão totalmente maduras e consolidadas. Afinal, a variedade de técnicas que surgiram nas últimas décadas é enorme. Em segundo lugar, existe uma tendência muito forte em desenvolver software sem aproveitar o material produzido no passado. E para piorar, além de entregá-lo quase sempre mal documentado, a maior parte do conhecimento envolvido na sua construção permanece apenas na cabeça dos desenvolvedores, o que deixa a situação muito parecida com a do sapateiro do exemplo. Causas da Crise do Software As causas da crise do software estão ligadas a complexidade do processo de software e a relativa imaturidade da engenharia de software como profissão: As estimativas de prazo e de custo frequentemente são imprecisas; Não dedicamos tempo para coletar dados sobre o processo de desenvolvimento de software; Com poucos dados históricos como guia, as estimativas tem sido “a olho”, com resultados notadamente ruins; A produtividade das pessoas da área de software não tem acompanhado a demanda por seus serviços; Os projetos de desenvolvimento de software normalmente são efetuados apenas com um vago indício das exigências do cliente; A qualidade de software às vezes é menos que adequada e só recentemente começam a surgir conceitos quantitativos sólidos de garantia de qualidade de software; O software existente é muito difícil de manter e a tarefa de manutenção devora o orçamento destinado ao software; e a facilidade de manutenção não foi enfatizada como um critério importante. A crise se manifesta de varias formas: • Projetos estourando o orçamento; • Projetos estourando o prazo; • Software de baixa qualidade; • Software muitas vezes não atinge os requisitos; • Projetos não gerenciáveis (escopo e prazo estourados) e o código difícil de manter. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 8 A maior parte dos projetos, hoje, continua com estes problemas. Assim, pode se dizer que a crise continua vigente ainda na atualidade. As possíveis soluções para a crise de software: • O uso de melhores técnicas, métodos e ferramentas; • Mais treinamento e educação: Atualmente não se investe o suficiente; • A mudança de paradigma sobre o que é desenvolver software e como deveria ser feito. Técnicas de Programação Tradicionais Introdução As técnicas de programação tradicionais, como por exemplo a “decomposição funcional”, leva o desenvolvedor a decompor o sistema em partes menores (funções), criando um emaranhado de inúmeras funções que chamam umas às outras. Geralmente não há separação de conceitos e responsabilidades, causando dependências enormes no sistema, dificultando futuras manutenções no código do programa. Não existe muito reaproveitamento de código, ao contrário, muitas vezes se tem muito código duplicado (mesmo trabalhando-se com “tecnologia OO”). Programação Orientada a Eventos Uma linguagem pode ser OO e não ser OE (Pascal), bem como pode ser OE (Visual Basic 6, Javascript) e não suportar totalmente a OO. Outras linguagens (Visual Basic.NET, Java, Delphi) podem ser tanto orientadas a objetos como orientadas a eventos. Uma boa IDE (Integrated Development Environment) pode facilitar muito a programação orientada a eventos – Microsoft Visual Studio, por exemplo. É bom salientar que o fato de uma linguagem ser considerada OO, não implica em que a mesma não seja (também) uma linguagem estruturada – suportando as instruções básicas de “seqüência, repetição e seleção”. Em suma, a programação orientada a eventos, somada a componentização (ferramentas baseadas em componentes como text box, combo, button, form, etc., que agilizavam o desenvolvimento de interfaces), tornou a programação para Windows uma tarefa relativamente fácil. A geração anterior de programadores trabalhava com linguagens como o Clipper, essencialmente orientadas ao console/texto. Com o advento do Windows, surgiu um novo padrão de interface com o usuário. E a componentização (Delphi e Visual Basic 5) e o conceito do RAD (Rapid Application Development) proporcionaram que aplicações inteiras fossem escritas em um tempo bastante reduzido, em comparação com a geração anterior. Nota: Rapid application development (RAD) is a software development methodology that uses minimal planning in favor of rapid prototyping. The "planning" of software developed using RAD is interleaved with writing the software itself. The lack of extensive pre-planning generally allows software to be written much faster, and makes it easier to change requirements. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 9 Histórico da Orientação a Objetos Origens A Programação Orientada ao Objeto (Object-Oriented Programming) pode ser considerada como uma extensão quase natural da Programação Modular; entretanto a sigla OOP tem causado um certo "frisson" na comunidade de computação, nos últimos anos. Na verdade, isto não deveria acontecer, uma vez que a OOP foi concebida há muito tempo atrás (no inicio da década de 70). A sua origem vem da linguagem Simula (Simula Language), concebida na Noruega no início da década de 60, e como o nome indica, foi criada para fazer simulações. Entretanto, seu uso alavancou um conceito que até então passava "despercebido" pela maioria dos projetistas: a similaridade com o mundo real. A primeira linguagem de programação a implementar sistematicamente os conceitos de OOP foi a linguagem SIMULA-68; em seguida surgiu a linguagem Smalltalk -criada pela Xerox -, que pode ser considerada a linguagem que popularizou e incentivou o emprego da OOP. Atualmente podemos encontrar versões de Smalltalk para microcomputadores, o que facilitou enormemente o seu uso, tirando-a dos ambientes privativos das Universidades. O resultado foi uma linguagem de pura linhagem OO, poderosíssima, que implementa todos os conceitos de OO, o que não acontece com as chamadas linguagens OO híbridas que implementam apenas alguns conceitos de orientação ao objeto. Com o aparecimento da famosa "crise do software", o emprego da OOP foi a saída protagonizada pelos desenvolvedores para minimizar os custos dos sistemas, em particular os custos relativos às manutenções corretivas, uma vez que cerca de 75% dos custos dos programas referem-se ao indesejável expediente de alterar e/ou remendar códigos dos sistemas já implantados e em operação. É notório que um dos grandes benefícios da OO é a reutilização (reuso de código/classes), além do que, um bom projeto OO resulta em classes com alta coesão e baixo acoplamento – o que facilita a manutenção. Basicamente, a OOP utiliza os mesmos princípios da engenharia de hardware que projeta novos equipamentos usando os mesmos componentes básicos como transistores, resistores, fusíveis, diodos, chips, etc. Os "objetos" já existentes são utilizados para produzir novos "objetos", tornando essa metodologia mais poderosa que as metodologias tradicionais de desenvolvimento de sistemas. Se consideramos a Orientação ao Objeto como um novo paradigma de desenho de software, devemos considerar, também, uma nova maneira de pensar, porque apesar de a escrita do código continuar sendo procedural, alguns conceitos mudam radicalmente: a estruturação e o modelo computacional. Fundamentalmente o que se deseja com esta metodologia são basicamente duas características: reutilização de código e modularidade de escrita; e nisto a OOP é imbatível quando comparada com as metodologias antigas. Em termos de modelo computacional podemos dizer que enquanto as metodologias tradicionais utilizam o conceito de um processador, uma memória e dispositivos de I/O para processar, armazenar e exibir as informações, a OOP emprega um conceito mais real, mais concreto, que é o de Objeto. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 10 O que é Orientação a Objetos? É um paradigma para o desenvolvimento de software que baseia-se na utilização de componentes individuais (objetos) que colaboram para construir sistemas mais complexos. A colaboração entre os objetos é feita através do envio de mensagens. Um paradigma é um conjunto de regras que estabelecem fronteiras e descrevem como resolver problemas dentro desta fronteira. Um paradigma ajuda-nos a organizar a e coordenar a maneira como olhamos o mundo. Dentre as vantagens podemos citar: • Facilita a reutilização de código; • Os modelos refletem o mundo real de maneira mais aproximada: Descrevem de maneira mais precisa os dados; A decomposição é baseada em um particionamento natural; e são mais fáceis de entender e manter; • Pequenas mudanças nos requisitos não implicam em alterações massivas no sistema em desenvolvimento; • Implementação de tipos abstratos de dados (tipos que não serão implementados, mas que servem ao projeto, pensando-se em “herança”). Classes e Objetos A OO é um mecanismo moderno que ajuda a definir a estrutura de programas baseada nos conceitos do mundo real, sejam eles reais ou abstratos. A OO permite criar programas componentizados, separando as partes do sistema por responsabilidades e fazendo com que essas partes se comuniquem entre si, por meio de mensagens. Essas partes do sistemas são chamadas OBJETOS – criados a partir de CLASSES. Uma classe é a descrição de um grupo de objetos com propriedades similares (atributos), comportamento comum (operações), relacionamentos com outros objetos e semânticas idênticas. Todo objeto é instância de uma classe. Enquanto um objeto individual é uma entidade concreta que executa algum papel no sistema, uma classe captura a estrutura e comportamento comum a todos os objetos que estão relacionados. Uma classe define a estrutura e o comportamento de qualquer objeto da classe, atuando como um padrão para a construção de objetos. Objetos podem ser agrupados em classes. A definição da classe consiste na definição dos atributos e operações dos objetos desta classe; Um atributo é uma característica de uma classe. Atributos não apresentam comportamento, eles definem a estrutura da classe; Operações caracterizam o comportamento de um objeto, e são o único meio de acessar, manipular e modificar os atributos de um objeto. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 11 Figura 1: relação entre classe e objeto Exemplo: Programação Estruturada vs. OO Vamos considerar o mesmo problema sendo resolvido, usando-se pseudo-código, primeiro na programação estruturada, e depois na programação orientada a objetos. Ler 2 números e exibir sua soma (Como?): PROGRAMA SOMA VARIÁVEIS N1, N2: REAL INÍCIO LOC = 8 ESCREVA “ENTRE COM DOIS NÚMEROS:” LEIA N1, N2 ESCREVA “A SOMA É:”, N1+N2 FIM Note que a ênfase neste caso está nas operações que devem ser desempenhadas para a solução do problema. Neste caso a solução fica muito presa ao problema, sendo mais difícil podermos aproveitar este código num outro cenário. Alguns poderiam afirmar que este código poderia ser utilizado através do “famoso” Copy & Paste. Porém, esta “técnica” não deve ser considerada quando falamos de reuso, pois pode levar à situações de redundância (o que dificulta e encarece a manutenção do código), bem como a situações de inconsistência (no caso de uma alteração ser necessária mas nem todas as ocorrências do código foram atualizadas, logo, o código terá cópias atualizadas e outras não – Find & Replace). Por fim, note que foram necessárias apenas 8 linhas de código para a solução no paradigma estruturado (seqüência, seleção e repetição). FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 12 Ler 2 números e exibir sua soma (Com o quê?): CLASSE CALCULADORA ATRIBUTOS N1, N2: REAL MÉTODOS INFORMAR_N1(N: REAL) N1 N FIM-INFORMAR_N1 INFORMAR_N2(N: REAL) N2 N FIM-INFORMAR_N2 RETORNAR_SOMA(): REAL RETORNO (N1+N2) FIM-RETORNAR_SOMA FIM-CLASSE LOC = 27 PROGRAMA SOMA VARIÁVEIS C: CALCULADORA N: REAL INÍCIO C NOVO CALCULADORA ESCREVA “ENTRE COM DOIS NÚMEROS:” LEIA N C.INFORMAR_N1(N) LEIA N C.INFORMAR_N2(N) ESCREVA “A SOMA É:”, C.RETORNAR_SOMA() FIM Princípios Básicos Abstração Informalmente um objeto representa uma entidade, tanto física quanto conceitual ou de software. Exemplos: • Entidade Física: caminhão, carro, bicicleta, etc. • Entidade Conceitual: processo químico, matrícula, etc • Entidade de Software: lista encadeada, arquivo, etc. Podemos afirmar que um objeto é um conceito, abstração, ou entidade com limites bem definidos e um significado para a aplicação. Quando modelamos um objeto (classe), só consideramos o FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 13 que for relevante. O “time de futebol do coração” pode não ser um atributo relevante para um sistema de informação escolar, por exemplo. Abstração é considerada como a habilidade de modelar características do mundo real do problema que o programador esteja tentando resolver. Por exemplo, se o programador estiver interessado em controlar dados dos clientes de uma empresa, é muito mais fácil lidar com uma linguagem que ofereça recursos em que ele possa criar algo chamado "Cliente" ao invés de recorrer à estruturas de dados tipo array ou record. Nesse contexto a abstração refere-se à capacidade de modelar o mundo real, e por outro lado, podemos considerá-la como um mecanismo pelo qual restringimos o nosso universo de análise e as variáveis e constantes que compõem esse universo, desprezando os dados que não nos interessa na análise. Podemos demonstrar o uso de abstração facilmente, quando fechamos os olhos e pensamos em uma mesa; esta mesa imaginária provavelmente não vai ser igual à uma outra imaginada por outras pessoas, mas o que importa é que todos as pessoas que imaginaram uma mesa, colocaram nessa as informações que para elas são necessárias para a sua função (de ser uma mesa). Não importa se a mesa é de três pés ou quatro, ou se o tampão é de vidro, madeira ou mármore; o que importa é que a imagem que idealizamos em nossa cabeça é de uma mesa e tenha as informações necessárias para cumprir sua função. Encapsulamento Information Hiding: segurança, simplicidade, coesão. “Esconder” os detalhes da implementação de um objeto é chamado encapsulamento. A capacidade de um objeto possuir uma parte privada, acessível somente através dos métodos definidos na sua interface pública; Não se deve permitir acesso direto aos atributos de uma classe; Benefícios: O código cliente pode usar apenas a interface para a operação; A implementação do objeto pode mudar, para corrigir erros, aumentar performance, etc. sem que seja necessário modificar o código do cliente; A manutenção é mais fácil e menos custosa; e cria um programa legível e bem estruturado. Na prática, tendemos a diminuir o acoplamento, a dependência externa (de outras classes). Normalmente, para respeitarmos o princípio do encapsulamento, todos os atributos de uma classe devem ser “private” ou, no máximo, “protected”. Observação: A linguagem Java não “respeita” totalmente o conceito do encapsulamento posto que o escopo “protected” em Java permite que outras classes, que não filhas, consigam acessar o item (atributo ou método), apenas por fazer parte do mesmo pacote. Encapsulamento é a base de toda a abordagem da Programação Orientada ao Objeto; isto porque contribui fundamentalmente para diminuir os malefícios causados pela interferência externa sobre os dados. Partindo desse princípio, toda e qualquer transação feita com esses dados só pode ser feita através de procedimentos colocados "dentro" desse objeto, pelo envio de mensagens. Desta maneira, dizemos que um dado está encapsulado quando envolvido por código de forma que só é visível na rotina onde foi criado; o mesmo acontece com uma rotina, que sendo encapsulada, suas operações internas são invisíveis às outras rotinas. E até mesmo em linguagens consideradas não OO, FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 14 como no caso do Clipper 5.xx, segundo FERREIRA & JARABECK, pode-se observar um certo encapsulamento nas rotinas em que as variáveis são declaradas como LOCAL. Nesses casos tais variáveis são visíveis somente dentro dessas rotinas aonde foram declaradas, o que permite ao programador certa segurança quanto aos acessos indevidos por parte de outras rotinas, o que não acontece com variáveis PRIVATE ou PUBLIC, no contexto dessa linguagem. Podemos visualizar a utilidade do encapsulamento pensando em um dvd, onde temos os botões de liga-desliga, para frente, para traz, etc. Estes botões executam uma série de operações existentes no aparelho, onde são executadas pelos componentes existentes dentro do aparelho (transistores, cabos, motores, etc.) Não interessa ao operador saber como é o funcionamento interno do equipamento; esta informação só é relevante para os projetistas do aparelho (Encapsulamento = Simplicidade). As informações pertinentes ao usuário do equipamento são as existentes no meio externo (botões, controle remoto) que ativam as operações internas do equipamento. Desta maneira o aparelho de dvd pode evoluir com os avanços tecnológicos, e as pessoas que o utilizam continuam sabendo utilizar o equipamento, sem a necessidade de um novo treinamento. Na área de software acontece o mesmo: as classes podem continuar evoluindo, com aumento de tecnologia, e os programas que utilizam essas classe continuam compatíveis. Isto ocorre porque a esses programas não interessa saber como é o funcionamento interno da classe e sim sua função, para que ele possa executar, conforme ela evolui, novas funções colocadas à sua disposição. A única coisa que interessa aos “consumidores” é a API da classe (operações públicas). Herança Herança é um mecanismo que, se for bem empregado, permite altos graus de reutilização de código. Do ponto de vista prático, pode ser entendido como sendo um conjunto de instâncias criadas a partir de um outro conjunto de instâncias com características semelhantes, e os elementos desse subconjunto herdam todas as características (se aplica a atributos e métodos.) do conjunto original. A ideia é fornecer um mecanismo simples (mas muito poderoso) para que se defina novas classes a partir de uma já existente. Assim sendo, dizemos que essas novas classes herdam todos os membros (propriedades + métodos) da classe-mãe (ou super classe); isto torna o mecanismo de herança uma técnica muito eficiente para construir, organizar e reutilizar código. Por isso, nas linguagens que não suportam esse mecanismo, as classes são criadas como unidades independentes: cada uma com seus membros concebidos do zero (sem vínculo direto com outras classes), o que torna o processo mais demorado e com códigos, às vezes, redundantes. Um exemplo de linguagem que não implementa herança na sua forma clássica é o Visual Basic® (até a atual versão desktop 6.0); neste caso o desenvolvedor tem que simular esse mecanismo, usando a “criatividade”. A herança possibilita a criação de uma nova classe de modo que essa classe (denominada subclasse, classe-filha ou classe derivada) herda TODAS as características da classe-mãe (denominada superclasse, classe base ou classe primitiva); podendo ainda, a classe-filha, possuir propriedades e métodos próprios. No processo de herança podemos imaginar um ser humano, que nasce com todas as características de um ser humano sadio; agora, coloquemos nele uma roupa e um relógio. A roupa e o relógio não faz parte do ser humano, mas quando "pegamos" este ser, vestido e com um relógio, e FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 15 realizamos o processo de herança é gerada uma copia idêntica da matriz. Se colocarmos um sapato preto no ser humano original a sua copia também ficará calçada, e se trocarmos a camisa do ser humano original a sua cópia também vai receber a nova camisa; isto demonstra que a copia continua vinculada à matriz de origem. Podemos tirar quantas cópias que desejarmos da matriz original e todas estas cópias manterão o seu vínculo. Podemos, até, tirar cópias das cópias, mas o processo de modificarmos a matriz original implicará numa mudança em todas as outras que estão abaixo dela. Nunca uma modificação feita nas copias altera a matriz de origem, e nunca podemos remover um item que tenha sido recebido por intermédio da herança, isto que dizer que nenhuma das cópias (humanas) poderá se dar ao luxo de não ter o relógio. Polimorfismo O termo polimorfismo, etimologicamente, quer dizer "várias formas"; todavia, na Informática, e em particular no universo da OOP, é definido como sendo um código que possui "vários comportamentos" ou que produz "vários comportamentos"; em outras palavras, é um código que pode ser aplicado à várias classes de objetos (se aplica a métodos). De maneira prática isto quer dizer que a operação em questão mantém seu comportamento transparente para quaisquer tipos de argumentos; isto é, a mesma mensagem é enviada a objetos de classes distintas e eles poderão reagir de maneiras diferentes. Um método polimórfico é aquele que pode ser aplicado à várias classes de objetos sem que haja qualquer inconveniente. É o caso por exemplo, do método Clear em Delphi®, que pode ser aplicado tanto à classe TEdit como à classe TListBox; nas duas situações o conteúdo desse objetos são limpos, mesmo pertencendo, ambos, à classes distintas, LEITE. Segundo FERREIRA & JARABECK, um exemplo bem didático para o polimorfismo é dado por um simples moedor de carne. Esse equipamento tem a função de moer carne, produzindo carne moída para fazer bolinhos. Desse modo, não importa o tipo (classe) de carne alimentada; o resultado será sempre carne moída, não importa se de boi, de frango ou de qualquer outro tipo. As restrições impostas pelo processo estão no próprio objeto, definidas pelo seu fabricante e não pelo usuário do produto. É comum a definição de que, para haver polimorfismo, é preciso primeiro haver herança. Polimorfismo se refere a métodos, e nunca a atributos. Um método herdado pode ser sobrescrito na classe-filha, ou seja, apresentará um comportamento diferente do comportamento original da classemãe. É importante salientar que existe o chamado “Polimorfismo de Interface”, onde classes diferentes (de hierarquias diferentes) implementam um mesmo conjunto de métodos, cada qual à sua maneira. Classicamente isto não deve ser considerado polimorfismo posto que não existe herança, nem ligação hierárquica neste caso. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 16 Binding Dinâmico O acoplamento (binding) é uma associação feita pelo compilador (interpretador) entre um atributo e uma entidade. Exemplo: acoplamento entre tipos e variáveis. O acoplamento pode ser: • Estático: se ocorre antes do tempo de execução e permanece inalterado durante a execução do programa. Exemplo: quando você declara em Pascal que uma variável é do tipo integer; • Dinâmico ou Atrasado: se ocorre durante o tempo de execução ou muda durante a execução do programa. Normalmente associado à linguagens orientadas a objetos; Exemplo (Java): 1 Elipse e; 2 Circulo c; 3 e := c; 4 e.calcularArea( ); A atribuição da linha 3 é dinamicamente acoplada, pois acopla o objeto e a um tipo diferente de seu tipo originalmente declarado. Em princípio, seria uma violação atribuir um objeto de um tipo diferente do tipo da variável e, no entanto, como c (Circulo) é subclasse de e (Elipse) essa atribuição é válida. Qual o método executado? O de Círculo ou de Elipse? Note que executamos o método da instância e não da referência. A operação executada é a de Circulo, porque o compilador em tempo de execução verifica que a variável aponta para um objeto desta classe. Em algumas linguagens o programador deve pedir explicitamente o acoplamento dinâmico para uma mensagem em particular. Por exemplo, em C++ a operação deve ser declarada virtual na superclasse e redefinida na subclasse. Importante: Todas as operações sobrescritas na classe derivada devem proporcionar semanticamente os mesmos serviços oferecidos pela superclasse. Classes Abstratas Uma classe abstrata é uma classe que não tem instâncias diretas. Uma classe concreta é uma classe que pode ter instâncias. Em outras palavras se X é uma classe abstrata o código a seguir não pode ser executado: X objeto = new X(); Apesar disso, você pode criar construtores de uma classe abstrata para que eles sejam chamados pelos construtores das subclasses (Reutilização). Em Java utiliza-se a palavra “abstract” para indicar uma classe abstrata: public abstract class Figure { .... O objetivo de criarmos classes abstratas é encapsular outras classes com comportamento comum. Elas podem surgir naturalmente na modelagem ou serem criadas para promover o reuso. Além disso, uma classe abstrata pode definir um protocolo para uma operação sem definir a implementação do método. public abstract class Figure { // inicio da class Figure FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 17 public abstract double area(); public abstract double perimetro(); }// fim da class Figure Assim, você pode declarar métodos abstratos em uma classe abstrata apenas para especificar um protocolo comum de operações. Toda subclasse concreta da classe abstrata deve fornecer uma implementação para TODOS os métodos abstratos: class Circle extends Figure { protected double raio; public Circle(double r) { raio = r;} public double area() { return PI*raio*raio;} public double perimetro() { return 2*PI*raio;} } Se uma subclasse de uma classe abstrata não implementa todos os métodos abstratos então ela também é abstrata; e Uma classe abstrata também pode ter métodos concretos. Frequentemente, faz sentido mover o máximo de funcionalidade possível para uma superclasse, seja ela abstrata ou não. Interfaces Interface é um contrato entre a classe e o mundo externo. Quando uma classe implementa uma interface, ela está comprometida a fornecer o comportamento publicado pela interface. What Is an Interface? As you've already learned, objects define their interaction with the outside world through the methods that they expose. Methods form the object's interface with the outside world; the buttons on the front of your television set, for example, are the interface between you and the electrical wiring on the other side of its plastic casing. You press the "power" button to turn the television on and off. In its most common form, an interface is a group of related methods with empty bodies. A bicycle's behavior, if specified as an interface, might appear as follows: interface Bicycle { void changeCadence(int newValue); // wheel revolutions per minute void changeGear(int newValue); void speedUp(int increment); void applyBrakes(int decrement); } To implement this interface, the name of your class would change (to a particular brand of bicycle, for example, such as ACMEBicycle), and you'd use the implements keyword in the class declaration: class ACMEBicycle implements Bicycle { // remainder of this class implemented as before } Implementing an interface allows a class to become more formal about the behavior it promises to provide. Interfaces form a contract between the class and the outside world, and this contract is FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 18 enforced at build time by the compiler. If your class claims to implement an interface, all methods defined by that interface must appear in its source code before the class will successfully compile. Note: To actually compile the ACMEBicycle class, you'll need to add the public keyword to the beginning of the implemented interface methods. A API (Application Program Interface) pública de uma classe, ou a “interface” de uma classe é o conjunto de todos os métodos públicos da classe. Introdução à UML Motivação O grande problema do desenvolvimento de novos sistemas utilizando a orientação a objetos nas fases de análise de requisitos, análise de sistemas e design é que não existe (ou existia) uma notação padronizada e realmente eficaz que abranja qualquer tipo de aplicação que se deseje. Cada simbologia existente possui seus próprios conceitos, gráficos e terminologias, resultando numa grande confusão, especialmente para aqueles que querem utilizar a orientação a objetos não só sabendo para que lado aponta a seta de um relacionamento, mas sabendo criar modelos de qualidade para ajudá-los a construir e manter sistemas cada vez mais eficazes. Quando a "Unified Modeling Language" (UML) foi lançada, muitos desenvolvedores da área da orientação a objetos ficaram entusiasmados já que essa padronização proposta pela UML era o tipo de força que eles sempre esperaram. A UML é muito mais que a padronização de uma notação. É também o desenvolvimento de novos conceitos não normalmente usados. Por isso e muitas outras razões, o bom entendimento da UML não é apenas aprender a simbologia e o seu significado, mas também significa aprender a modelar orientado a objetos no estado da arte. UML foi desenvolvida por Grady Booch, James Rumbaugh, e Ivar Jacobson que são conhecidos como "os três amigos". Eles possuem um extenso conhecimento na área de modelagem orientado a objetos já que as três mais conceituadas metodologias de modelagem orientada a objetos foram desenvolvidas por eles, e a UML é a junção do que havia de melhor nestas três metodologias adicionado novos conceitos e visões da linguagem. Veremos como a UML aborda o caráter estático e dinâmico do sistema a ser analisado levando em consideração, já no período de modelagem, todas as futuras características do sistema em relação à utilização de "packages" próprios da linguagem a ser utilizada, utilização do banco de dados bem como as diversas especificações do sistema a ser desenvolvido de acordo com as métricas finais do sistema. A versão atual da (especificação) UML pode ser conferida no site http://www.omg.org/spec/UML/. No momento da preparação desta apostila, a versão corrente era a 2.4.1 de agosto de 2011. The Unified Modeling Language™ - UML - is OMG's most-used specification, and the way the world models not only application structure, behavior, and architecture, but also business process and data structure. UML, along with the Meta Object Facility (MOF™), also provides a key foundation for OMG's Model-Driven Architecture®, which unifies every step of development and integration from business FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 19 modeling, through architectural and application modeling, to development, deployment, maintenance, and evolution. OMG is a not-for-profit computer industry specifications consortium; our members define and maintain the UML specification which we publish in the series of documents linked on this page for your free download. Software providers of every kind build tools that conform to these specifications. To model in UML, you'll have to obtain a compliant modeling tool from one of these providers and learn how to use it. Exercícios Responda Baseado no texto o que seria necessário aplicar para evitar a Crise do Software? Em sua opinião, estamos ainda em uma Crise de Software? Comente sua resposta. Em sua opinião, a comparação entre a fabricação de sapatos e de software procede? Comente sua resposta. Qual o objetivo da Engenharia de Software? Segundo a Engenharia de Software, o que é um software de baixa qualidade? O fato de o Software ser feito sob encomenda é um complicador? Torna a construção, de certa forma, artesanal? Comente sua resposta. Em sua opinião, existem outras possíveis soluções para a crise de software além das descritas neste artigo? Exercício de Modelagem O exercício (modelo de funcionários) a seguir tem por objetivo criar um sistema para gerenciar os funcionários do Banco. 1) Modele um funcionário. Ele deve ter o nome do funcionário, o departamento onde trabalha, seu salário (double), a data de entrada no banco (String), seu RG (String) e um valor booleano que indique se o funcionário ainda está ativo na empresa ou se já foi mandado embora. Você deve criar alguns métodos de acordo com sua necessidade. Além deles, crie um método bonifica que aumenta o salário do funcionário de acordo com o parâmetro passado como argumento. Crie, também, um método demite, que não recebe parâmetro algum, só modifica o valor booleano indicando que o funcionário não trabalha mais aqui. A ideia aqui é apenas modelar, isto é, só identifique que informações são importantes e o que um funcionário faz. Desenhe no papel tudo o que um Funcionario tem e tudo que ele faz. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 20 2) Transforme o modelo acima em uma classe Java. Teste-a, usando uma outra classe que tenha o main. Você deve criar a classe do funcionário chamada Funcionario, e a classe de teste você pode nomear como quiser. A de teste deve possuir o método main. Um esboço da classe: class Funcionario { double salario; // seus outros atributos e métodos void bonifica(double aumento) { // o que fazer aqui dentro? } void demite() { // o que fazer aqui dentro? } Figura 2: classe Funcionario } Você pode (e deve) compilar seu arquivo java sem que você ainda tenha terminado sua classe Funcionario. Isso evitará que você receba dezenas de erros de compilação de uma vez só. Crie a classe Funcionario, coloque seus atributos e, antes de colocar qualquer método, compile o arquivo java. Funcionario.class será gerado, não podemos “executá-la” pois não há um main, mas assim verificamos que nossa classe Funcionario já está tomando forma. Esse é um processo incremental. Procure desenvolver assim seus exercícios, para não descobrir só no fim do caminho que algo estava muito errado. Um esboço da classe que possui o main: 1 class TestaFuncionario { 2 3 public static void main(String[] args) { 4 Funcionario f1 = new Funcionario(); 5 6 f1.nome = "Fiodor"; 7 f1.salario = 100; 8 f1.bonifica(50); 9 10 System.out.println("salario atual:" + f1.salario); 11 12 } 13 } Incremente essa classe. Faça outros testes, imprima outros atributos e invoque os métodos que você criou a mais. Lembre-se de seguir a convenção java, isso é importantíssimo. Isto é, nomeDeAtributo, nomeDeMetodo, nomeDeVariavel, NomeDeClasse, etc... (Camel case). FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 21 Exercícios Teóricos 1) Relacione os termos “classe”, “objeto” e “instância”. 2) Defina os princípios/conceitos do paradigma OO. 3) Defina a estrutura de uma classe. 4) Qual a diferença entre programação orientada a eventos e programação orientada a objetos? 5) Defina a classe Java Pessoa com os atributos nome e idade, e seus respectivos métodos getters e setters. 6) Faça um programa que instancie duas Pessoas: João e Maria. O programa deve exibir os dados de ambos os objetos. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 22 2. Diagrama de Casos de Uso Introdução Um caso de uso é uma técnica de modelagem usada para descrever o que um novo sistema deve fazer. Ele é construído através de um processo interativo no qual as discussões entre o cliente e os desenvolvedores do sistema conduzem a uma especificação do sistema da qual todos estão de acordo. Um caso de uso descreve as operações que o sistema deve cumprir para cada usuário. Ele vai ajudar a formalizar as funções que o sistema precisa fazer. Um caso de uso se apresenta como uma lista completa das interações entre um usuário e o sistema para cumprir uma tarefa. Lista completa significa que o caso de uso descreve as interações desde o início da tarefa, até o fim. Casos de uso têm que ser compreensíveis por usuários porque só eles sabem o que o sistema precisa fazer. Os casos de uso permitem verificar se o analista e o usuário concordam sobre o que o sistema deve fazer. Isso é um problema importante no desenvolvimento de software. No mesmo tempo, casos de uso podem servir de “contratos” entre os usuários e a equipe de desenvolvimento. Casos de uso são narrativas em texto, amplamente utilizadas para descobrir e registrar requisitos. Eles influenciam muitos aspectos de um projeto, inclusive a A/POO, e servem de entrada para vários artefatos subseqüentes. Objetivo • Decidir e descrever os requisitos funcionais do sistema; • Fornecer uma descrição clara e consistente do que o sistema deve fazer; • Permitir descobrir os requisitos funcionais das classes e operações do sistema (Casos de uso NÃO são requisitos, mas ajudam a identificá-los). Componentes Podemos dizer que os componentes de um modelo de casos de uso são: • Ator - é um “papel” (role) que tipicamente estimula/solicita ações/eventos do sistema e recebe reações. Cada ator pode participar de vários casos de uso; • Casos de uso - documento narrativo que descreve a seqüência de ações feitas por um ator no uso do sistema; • Sistema - o sistema a ser modelado. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 23 Na UML o modelo de casos de uso consiste de diagramas de casos de uso que mostram os atores , os casos de uso e seus relacionamentos. Os elementos gráficos que representam atores, casos de uso e sistema são mostrados abaixo: Figura 3: casos de uso (UML) Elementos Os elementos principais do diagrama são uma elipse para representar um caso de uso e um pequeno boneco para representar um ator. O nome de um caso de uso pode ser qualquer sentença, mas a UML recomenda usar uma frase ativa curta (verbo + substantivo), por exemplo: “comprar itens’’, “efetuar venda”, etc.. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 24 Exemplo Informalmente, casos de uso são narrativas em texto de algum ator usando um sistema para atingir objetivos. Segue um exemplo de caso de uso no formato resumido: Processar Venda: um cliente chega em um ponto de pagamento com itens que deseja adquirir. O caixa usa o sistema PDV para registrar cada item comprado. O sistema apresenta um total parcial e detalhes de linha de item. O cliente entra com os dados sobre o pagamento, que são validados e, em seguida, registrados pelo sistema. O sistema atualiza o estoque. O cliente recebe um recibo do sistema e sai com os itens comprados. Note que casos de uso não são diagramas, são textos. Enfocar os diagramas de caso de uso UML, de valor secundário, em vez do importante texto do caso de uso, é um erro comum para novatos. Casos de uso frequentemente necessitam ser mais detalhados ou estruturados do que no exemplo, mas o essencial é descobrir e registrar os requisitos funcionais, escrevendo narrativas de uso de um sistema para satisfazer as metas do usuário, ou seja, casos de uso (“caso de utilização”). Não se trata de uma idéia difícil, embora possa ser difícil descobrir o que é necessário e escrevê-lo de forma coerente. O que são atores, cenários e casos de uso? Introdução Primeiro, daremos algumas definições informais: um ator é algo com comportamento, tal como uma pessoa (identificada por seu papel), um sistema de computador ou uma organização; por exemplo, um caixa. Um cenário é uma seqüência específica de ações e interações entre atores e o sistema; é também chamado de instância de caso de uso. É uma história particular de uso de um sistema ou um caminho através do caso de uso; por exemplo, o cenário de efetuar com sucesso a compra de itens em dinheiro, ou o cenário de não consumar a compra de itens por causa da recusa de uma autorização de crédito. Em termos informais, então, um caso de uso é uma coleção de cenários relacionados de sucesso e fracasso, que descrevem um ator usando um sistema como meio para atingir um objetivo. Por exemplo, temos a seguir um caso de uso em um formato informal que inclui alguns cenários alternativos: Tratar Devoluções Cenário de sucesso principal: um cliente chega a um posto de pagamento com itens a serem devolvidos. O caixa usa o sistema PDV para registrar cada item devolvido... Cenários alternativos: Se o cliente pagou a crédito e a transação de reembolso para estorno em sua conta de crédito é rejeitada, informe o cliente e o reembolse com dinheiro. Se o identificador do item não for encontrado no sistema, este notifica o caixa e sugere que entre manualmente o código do produto (talvez ele esteja corrompido). FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 25 Se o sistema detecta uma falha para se comunicar com o sistema externo de contabilidade... Agora que cenários (instâncias de casos de uso) estão definidos, uma definição alternativa, porém similar, de “caso de uso” fornecida pelo RUP (Rational Unified Process) vai fazer mais sentido: Um conjunto de instâncias de casos de uso, no qual cada instância é uma sequencia de ações que um sistema executa e que fornece um resultado observável com valor para um determinado ator [RUP]. Casos de uso e o modelo de casos de uso O PU (Processo Unificado) define o Modelo de Casos de Uso dentro da disciplina Requisitos. Essencialmente, trata-se do conjunto de todos os casos de uso escritos; é um modelo da funcionalidade e ambiente do sistema. Casos de uso são documentos de texto e não diagramas. Portanto, a modelagem de caso de uso é essencialmente uma ação de redigir texto e não de desenhar diagramas. O Modelo de Casos de Uso não é o único artefato de requisitos no PU. Existem também: Especificação Suplementar, Glossário, Visão e Regras de Negócio. São todos úteis para análise de requisitos, mas secundários neste ponto. O Modelo de Casos de Uso pode opcionalmente incluir um diagrama de caso de uso UML para mostrar os nomes de casos de uso, atores e seus relacionamentos. Isso dá um belo diagrama de contexto de um sistema e do seu ambiente. Fornece também um modo rápido de listar os casos de uso por nome. Não há nada orientado a objetos em casos de uso; não estamos fazendo análise OO quando os escrevemos. Isso não é problema – casos de uso são amplamente aplicáveis, o que aumenta sua utilidade. Dito isso, casos de uso são considerados uma entrada de requisitos chave para a A/POO clássica. Motivação: por que casos de uso? Nós temos objetivos e desejamos que os computadores nos ajudem a atingi-los. Os objetivos vão desde o registro de vendas até o uso de jogos e programas para estimar o fluxo de petróleo de futuros poços. Analistas experientes inventaram muitos modos de descobrir objetivos, mas os melhores são simples e familiares. Por quê? Isso torna mais fácil – especialmente para clientes – contribuir para sua definição e revisão. Isso diminui o risco de perder a referência. Este pode parecer um comentário inoportuno, mas é importante. Pesquisadores apresentaram métodos complexos de análise que eles entendem, mas que levam uma pessoa de negócios a entrar em coma! Falta de envolvimento do usuário em projetos de software está perto do topo da lista de razões para fracassos de projetos [Larman 03], assim, qualquer coisa que ajude a mantê-los envolvidos é realmente desejável. Casos de uso são uma boa maneira de manter a coisa simples e de tornar possível a especialistas no domínio ou fornecedores de requisitos escrever eles mesmos (ou participar da escrita de) casos de uso. Outro valor dos casos de uso é que eles enfatizam os objetivos e perspectivas do usuário; formulamos a questão “quem está usando o sistema, quais são seus típicos cenários de uso e quais são FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 26 os seus objetivos?” Essa é uma ênfase mais centrada no usuário, comparada a simplesmente solicitar uma lista de características do sistema. Muito tem sido escrito sobre casos de uso e, apesar de valer a pena, pessoas criativas frequentemente obscurecem uma ideia simples com camadas de sofisticação ou supercomplicação. Geralmente, é possível encontrar um modelador de casos de uso novato (ou um analista sério tipo A) que se preocupa em excesso com problemas secundários, como diagramas de casos de uso, relacionamento entre casos de uso, pacotes de casos de uso e etc., em vez de se concentrar no trabalho árduo de simplesmente escrever as narrativas em texto. Dito isso, um dos pontos fortes do mecanismo de casos de uso é a sua capacidade de escalabilidade para cima ou para baixo em termos de sofisticação e formalidade. Guia Sugerido para Preparar Casos de Uso Nome do Caso de Uso (Começar com um verbo.) Descrição do caso de uso (um parágrafo). Escopo (O sistema em projeto.). Atores Ator principal – chama o sistema para fornecer os serviços. Lista dos nomes dos atores com descrição curta. Prioridade Este caso de uso é muito importante no projeto ou é acessório? Pré-Condições Lista de condições que têm que ser verificadas antes que o caso de uso começa. Fluxo de Eventos / Fluxo Principal 1. Primeiro passo no caso de uso – resposta do sistema. 2. Segundo passo no caso de uso – resposta do sistema. 3. ... Fluxos Alternativos Descrever os fluxos alternativos ou extensões. Pós-Condições (garantias de sucesso) Lista de condições que têm que ser verificadas depois do fim do caso de uso. Pontos de extensão Lista dos pontos de extensão no caso de uso. Casos de uso incluídos Lista dos nomes dos casos de usos incluídos. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 27 Como identificar atores e casos de uso? Introdução Nos primeiros contatos com os modelos de casos de uso surgem com frequência perguntas para as quais não existe uma resposta absoluta. São elas: Como identificar atores? Como identificar casos de uso? Para identificar os atores que vão participar do modelo devemos perguntar: • Quem usa o sistema? • Quem inicia o sistema? • Quem fornece os dados? • Quem usa as informações? Descrição de Atores Geralmente descreve atores usando: • Nome do caso de uso; • Tipo de uso (frequente, ocasional , etc.); • Descrição de seu papel no sistema. Tipos de Atores Um ator é qualquer coisa com um comportamento, inclusive o próprio sistema em discussão quando invoca os serviços de outros sistemas. Atores principais e de suporte aparecerão nos passos de ação do texto do caso de uso. Atores não são somente papéis desempenhados por pessoas, mas também por organizações, software e máquinas. Há três tipos de atores externos em relação ao sistema: • Ator Principal (Primary) – tem objetivos de usuário satisfeitos por meio do uso dos serviços do sistema. Por exemplo, o caixa. o Por que identificar? Para encontrar objetivos de usuário, que guiam os casos de uso. • Ator de Suporte (Supporting) – fornece um serviço (por exemplo, informações) para o sistema. O serviço automatizado de autorização de pagamento é um exemplo. Frequentemente é um sistema de computador, mas pode ser uma organização ou pessoa. o Por que identificar? Para esclarecer interfaces externas e protocolos. • Ator de Bastidor (Offstage) – tem interesse no comportamento do caso de uso, mas não é um ator principal ou de suporte; por exemplo, um órgão governamental responsável por impostos. o Por que identificar? Para garantir que todos os interesses necessários estejam identificados e satisfeitos. Os interesses de atores de bastidor são, às vezes, sutis ou de fácil esquecimento, a menos que esses atores sejam explicitamente nomeados. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 28 Formatos Comuns de Casos de Uso Casos de uso podem ser escritos em diferentes formatos e níveis de formalidade: • Resumido (brief) – resumo sucinto de um parágrafo, geralmente o cenário de sucesso principal. O exemplo precedente Processar Venda foi resumido. o Quando? Durante a análise de requisitos inicial, para obter uma rápida ideia do assunto e escopo. Pode levar apenas alguns minutos para criar. • Informal (casual) – formato informal de parágrafos. Múltiplos parágrafos que cobrem vários cenários. O exemplo precedente Tratar Devoluções foi informal. o Quando? Como acima. • Completo (fully dressed) – Todos os passos e variantes são escritos em detalhe, e há seções de suporte, como pré-condições e garantias de sucesso. o Quando? Depois que muitos casos de uso tiverem sido identificados e escritos em formato resumido, então durante o primeiro workshop de requisitos, alguns (como por exemplo, 10%) dos casos de uso arquiteturalmente significativos e de alto valor, são escritos em detalhe. Exemplo – Caso de Uso Completo Use Case UC1: Process Sale Scope: NextGen POS application Level: user goal Primary Actor: Cashier Stakeholders and Interests: • Cashier: Wants accurate, fast entry, and no payment errors, as cash drawer shortages are deducted from his/her salary. • Salesperson: Wants sales commissions updated. • Customer: Wants purchase and fast service with minimal effort. Wants easily visible display of entered items and prices. Wants proof of purchase to support returns. • Company: Wants to accurately record transactions and satisfy customer interests. Wants to ensure that Payment Authorization Service payment receivables are recorded. Wants some fault tolerance to allow sales capture even if server components (e.g., remote credit validation) are unavailable. Wants automatic and fast update of accounting and inventory. • Manager: Wants to be able to quickly perform override operations, and easily debug Cashier problems. • Government Tax Agencies: Want to collect tax from every sale. May be multiple agencies, such as national, state, and county. • Payment Authorization Service: Wants to receive digital authorization requests in the correct format and protocol. Wants to accurately account for their payables to the store. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 29 Preconditions: Cashier is identified and authenticated. Success Guarantee (or Postconditions): Sale is saved. Tax is correctly calculated. Accounting and Inventory are updated. Commissions recorded. Receipt is generated. Payment authorization approvals are recorded. Main Success Scenario (or Basic Flow): 1. Customer arrives at POS checkout with goods and/or services to purchase. 2. Cashier starts a new sale. 3. Cashier enters item identifier. 4. System records sale line item and presents item description, price, and running total. Price calculated from a set of price rules. Cashier repeats steps 3-4 until indicates done. 5. System presents total with taxes calculated. 6. Cashier tells Customer the total, and asks for payment. 7. Customer pays and System handles payment. 8. System logs completed sale and sends sale and payment information to the external Accounting system (for accounting and commissions) and Inventory system (to update inventory). 9. System presents receipt. 10. Customer leaves with receipt and goods (if any). Extensions (or Alternative Flows): *a. At any time, Manager requests an override operation: 1. System enters Manager-authorized mode. 2. Manager or Cashier performs one Manager-mode operation. e.g., cash balance change, resume a suspended sale on another register, void a sale, etc. 3. System reverts to Cashier-authorized mode. *b. At any time, System fails: To support recovery and correct accounting, ensure all transaction sensitive state and events can be recovered from any step of the scenario. 1. Cashier restarts System, logs in, and requests recovery of prior state. 2. System reconstructs prior state. 2a. System detects anomalies preventing recovery: 1. System signals error to the Cashier, records the error, and enters a clean state. 2. Cashier starts a new sale. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 30 1a. Customer or Manager indicate to resume a suspended sale. 1. Cashier performs resume operation, and enters the ID to retrieve the sale. 2. System displays the state of the resumed sale, with subtotal. 2a. Sale not found. 1. System signals error to the Cashier. 2. Cashier probably starts new sale and re-enters all items. 3. Cashier continues with sale (probably entering more items or handling payment). 2-4a. Customer tells Cashier they have a tax-exempt status (e.g., seniors, native peoples) 1. Cashier verifies, and then enters tax-exempt status code. 2. System records status (which it will use during tax calculations) 3a. Invalid item ID (not found in system): 1. System signals error and rejects entry. 2. Cashier responds to the error: 2a. There is a human-readable item ID (e.g., a numeric UPC): 1. Cashier manually enters the item ID. 2. System displays description and price. 2a. Invalid item ID: System signals error. Cashier tries alternate method. 2b. There is no item ID, but there is a price on the tag: 1. Cashier asks Manager to perform an override operation. 2. Managers performs override. 3. Cashier indicates manual price entry, enters price, and requests standard taxation for this amount (because there is no product information, the tax engine can’t otherwise deduce how to tax it) 2c. Cashier performs Find Product Help to obtain true item ID and price. 2d. Otherwise, Cashier asks an employee for the true item ID or price, and does either manual ID or manual price entry (see above). 3b. There are multiple of same item category and tracking unique item identity not important (e.g., 5 packages of veggie-burgers): 1. Cashier can enter item category identifier and the quantity. 3c. Item requires manual category and price entry (such as flowers or cards with a price on them): 1. Cashier enters special manual category code, plus the price. 3-6a: Customer asks Cashier to remove (i.e., void) an item from the purchase: This is only legal if the item value is less than the void limit for Cashiers, otherwise a Manager override is needed. 1. Cashier enters item identifier for removal from sale. 2. System removes item and displays updated running total. 2a. Item price exceeds void limit for Cashiers: 1. System signals error, and suggests Manager override. 2. Cashier requests Manager override, gets it, and repeats operation. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 31 3-6b. Customer tells Cashier to cancel sale: 1. Cashier cancels sale on System. 3-6c. Cashier suspends the sale: 1. System records sale so that it is available for retrieval on any POS register. 2. System presents a “suspend receipt” that includes the line items, and a sale ID used to retrieve and resume the sale. 4a. The system supplied item price is not wanted (e.g., Customer complained about something and is offered a lower price): 1. Cashier requests approval from Manager. 2. Manager performs override operation. 3. Cashier enters manual override price. 4. System presents new price. 5a. System detects failure to communicate with external tax calculation system service: 1. System restarts the service on the POS node, and continues. 1a. System detects that the service does not restart. 1. System signals error. 2. Cashier may manually calculate and enter the tax, or cancel the sale. 5b. Customer says they are eligible for a discount (e.g., employee, preferred customer): 1. Cashier signals discount request. 2. Cashier enters Customer identification. 3. System presents discount total, based on discount rules. 5c. Customer says they have credit in their account, to apply to the sale: 1. Cashier signals credit request. 2. Cashier enters Customer identification. 3. Systems applies credit up to price=0, and reduces remaining credit. 6a. Customer says they intended to pay by cash but don’t have enough cash: 1. Cashier asks for alternate payment method. 1a. Customer tells Cashier to cancel sale. Cashier cancels sale on System. 7a. Paying by cash: 1. Cashier enters the cash amount tendered. 2. System presents the balance due, and releases the cash drawer. 3. Cashier deposits cash tendered and returns balance in cash to Customer. 4. System records the cash payment. 7b. Paying by credit: 1. Customer enters their credit account information. 2. System displays their payment for verification. 3. Cashier confirms. 3a. Cashier cancels payment step: 1. System reverts to “item entry” mode. 4. System sends payment authorization request to an external Payment Authorization Service System, and requests payment approval. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 32 4a. System detects failure to collaborate with external system: 1. System signals error to Cashier. 2. Cashier asks Customer for alternate payment. 5. System receives payment approval, signals approval to Cashier, and releases cash drawer (to insert signed credit payment receipt). 5a. System receives payment denial: 1. System signals denial to Cashier. 2. Cashier asks Customer for alternate payment. 5b. Timeout waiting for response. 1. System signals timeout to Cashier. 2. Cashier may try again, or ask Customer for alternate payment. 6. System records the credit payment, which includes the payment approval. 7. System presents credit payment signature input mechanism. 8. Cashier asks Customer for a credit payment signature. Customer enters signature. 9. If signature on paper receipt, Cashier places receipt in cash drawer and closes it. 7c. Paying by check… 7d. Paying by debit… 7e. Cashier cancels payment step: 1. System reverts to “item entry” mode. 7f. Customer presents coupons: 1. Before handling payment, Cashier records each coupon and System reduces price as appropriate. System records the used coupons for accounting reasons. 1a. Coupon entered is not for any purchased item: 1. System signals error to Cashier. 9a. There are product rebates: 1. System presents the rebate forms and rebate receipts for each item with a rebate. 9b. Customer requests gift receipt (no prices visible): 1. Cashier requests gift receipt and System presents it. 9c. Printer out of paper. 1. If System can detect the fault, will signal the problem. 2. Cashier replaces paper. 3. Cashier requests another receipt. Special Requirements: • Touch screen UI on a large flat panel monitor. Text must be visible from 1 meter. • Credit authorization response within 30 seconds 90% of the time. • Somehow, we want robust recovery when access to remote services such the inventory system is failing. • Language internationalization on the text displayed. • Pluggable business rules to be insertable at steps 3 and 7. • ... FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 33 Technology and Data Variations List: *a. Manager override entered by swiping an override card through a card reader, or entering an authorization code via the keyboard. 3a. Item identifier entered by bar code laser scanner (if bar code is present) or keyboard. 3b. Item identifier may be any UPC, EAN, JAN, or SKU coding scheme. 7a. Credit account information entered by card reader or keyboard. 7b. Credit payment signature captured on paper receipt. But within two years, we predict many customers will want digital signature capture. Frequency of Occurrence: Could be nearly continuous. Open Issues: • What are the tax law variations? • Explore the remote service recovery issue. • What customization is needed for different businesses? • Must a cashier take their cash drawer when they log out? • Can the customer directly use the card reader, or does the cashier have to do it? Este caso de uso é ilustrativo e não pretende ser exaustivo (embora seja baseado nos requisitos de um sistema PDV real – desenvolvido com projeto OO em Java). No entanto, é suficientemente detalhado e complexo para oferecer um senso de realismo, de modo que um caso de uso completo possa registrar muitos detalhes de requisitos. Este exemplo servirá de modelo para muitos problemas de casos de uso. Como encontrar Casos de Uso Os casos de uso são interações entre os atores e o sistema. Temos então ações do ator e ações do sistema, sendo que os atores sempre iniciam a ação. Casos de uso são definidos para satisfazer aos objetivos dos atores principais. Assim, o procedimento básico é: 1. Escolher a fronteira do sistema. Ele é somente uma aplicação de software, é o hardware e a aplicação como uma unidade, é isso e mais uma pessoa usando o sistema, ou é toda uma organização? 2. Identificar os atores principais – aqueles que têm objetivos satisfeitos por meio do uso dos serviços do sistema. 3. Identificar os objetivos para cada ator principal. 4. Definir casos de uso que satisfaçam os objetivos dos usuários; nomeie-os de acordo com o objetivo. Geralmente, os casos de uso no nível de objetivo do usuário estarão em uma relação de um-para-um com os objetivos dos usuários, mas existe pelo menos uma exceção que será examinada. Certamente, em um desenvolvimento iterativo e evolutivo, nem todos os objetivos ou casos de uso vão estar total ou corretamente identificados logo no início. Trata-se de uma descoberta evolutiva. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 34 Recomendações Nomeie um caso de uso começando com um verbo, para enfatizar que ele é um processo. Ex: Cadastrar Cliente , Comprar Item, etc.. Para identificar claramente um ator iniciador e um evento, comece a descrição da sequência de um caso de uso usando o seguinte esquema: “Este caso de uso começa quando o <Ator> <Evento que inicia o caso de uso>...” Exemplo: Este caso de uso começa quando um cliente chega com vários itens para efetuar uma compra. Vamos a outro exemplo: Suponha que você tenha um almoxarifado de peças onde clientes façam pedidos e onde um operador receba tarefas do sistema para buscar peças para os pedidos dos clientes e distribuir peças do setor de compras para o almoxarifado. Como poderíamos identificar os atores e os casos de uso para este exemplo? Vamos identificar os atores. Eles são: Cliente, Operador, Sistema e Setor de Compras. Certo? Não, errado! No exemplo acima “Sistema” não pode ser um ator pois ele não se ajusta ao conceito dado a um ator: Um agente externo ao sistema. Lembre-se que um ator é um papel que interage com o sistema mas não faz parte do sistema. Então, no lugar de Sistema, poderíamos sugerir um administrador ou gerente. Então os atores seriam: Cliente, Operador, Administrador e Compras. Note ainda que podem existir subsistemas que interajam com o sistema. Neste caso eles seriam considerados atores. E os casos de usos, quais seriam? • solicita peças (ator Cliente) • entrega peças (ator Compras) • buscar pedidos (ator operador) • distribuir pedidos (ator operador) • cadastrar Tarefas (administrador) FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 35 Certo? Errado! No caso do ator operador, ele não atua sobre o sistema nos casos de uso buscar pedidos e distribuir pedidos. Ele atua sobre o sistema realizando Tarefa. Então o correto seria: • solicita peças (ator Cliente) • entrega peças (ator Compras) • realiza Tarefa (ator operador) Figura 4: atores e fronteira do sistema • cadastrar Tarefas (administrador) O caixa ou o cliente é o ator principal? Por que é o caixa, e não o cliente, o ator principal no caso de uso Processar Venda? A resposta depende da fronteira do sistema em projeto e para quem o sistema está sendo principalmente projetado, conforme ilustrado na figura 4. Se enxergarmos a empresa ou o serviço de conclusão da venda (checkout) como um sistema agregado, o cliente é um ator principal, com o objetivo de obter bens ou serviços e ir embora. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 36 Aplicação de UML: diagramas de casos de uso Introdução A UML fornece a notação de diagramas de casos de uso para ilustrar os nomes dos casos de uso e dos atores, bem como os relacionamentos entre eles (ver figura 5). Figura 5: diagrama parcial de contexto dos casos de uso. Um sinal típico de modeladores de casos de uso iniciantes (ou acadêmicos) é a preocupação com diagramas de casos de uso e seus relacionamentos, em vez de escrever texto. Especialistas em casos de uso mundialmente reconhecidos, como Fowler e Cockburn, entre outros, não se preocupam com os diagramas de casos de uso e seus relacionamentos, concentrando-se, em vez disso, em sua redação. Tendo isso como um alerta, um simples diagrama de caso de uso oferece um diagrama de contexto visual sucinto para o sistema, que ilustra os atores externos e como eles usam o sistema. Um diagrama de caso de uso é uma excelente imagem do contexto do sistema; ele é um bom diagrama de contexto, ou seja, mostra a fronteira de um sistema, o que está fora dele e como o sistema é usado. Serve como uma ferramenta de comunicação que resume o comportamento do sistema e seus atores. A figura 5 é uma amostra de um diagrama de caso de uso de contexto parcial para o sistema ProxGer. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 37 Diretriz: diagramação A figura 6 oferece algumas sugestões sobre o diagrama. Note a caixa de ator com o símbolo «ator». Este símbolo é usado para as palavras-chave e estereótipos UML e incluem aspas horizontais – guillemets – colchetes especiais de um único caractere («ator» e não “<<ator>>”), mais comumente usados na tipografia francesa para indicar uma citação. Figura 6: Sugestão de notação. Para maior clareza, alguns preferem destacar os atores externos ao sistema de computador com uma notação alternativa, como mostrado na figura 7. Figura 7: Notação alternativa para ator. Relacionamentos entre Casos de Uso Introdução A partir do diagrama de casos de uso preliminar, muitas vezes temos que definir casos de usos adicionais, separadamente, pois as operações se encontram duplicadas em outros casos de uso ou são complexas e longas e a separação nos ajuda a compreendê-las. Os relacionamentos possíveis são: Inclusão, Extensão e Generalização. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 38 Inclusão Se um caso de uso inicia ou inclui o comportamento de outro, dizemos que ele usa o outro. Exemplo: No caso de uso Comprar Item, se o pagamento for feito com dinheiro, podemos ter a inclusão PagarComDinheiro. O relacionamento de inclusão em UML é ilustrado com uma linha de generalização com o rótulo «include». Figura 8: Inclui Então, para o exemplo do cliente, com o use case Solicitar Pedidos de peças, teríamos como propriedades básicas da inclusão: • Realizar uma decomposição funcional; • Reduzir a complexidade de um caso de uso; • O caso de uso básico não pode executar sem a inclusão. • Comportamento comum. Extensão Define pontos de extensão (opcionais) que adicionam comportamento a um caso de uso base, descrevendo uma variação do comportamento normal. O caso de uso base pode ser executado mesmo sem a extensão. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 39 Exemplo: O caso de uso Comprar Produto pode apresentar a extensão Compra por um Cliente Regular. Os pontos de extensão são indicados na linha entre os casos de uso do sistema. Abaixo temos diagramas UML exemplificando estes conceitos. Figura 9: Estende Dica: note que a seta sempre aponta para o “ido” (estendido, ou incluído). Figura 10: Relacionamento de inclusão e extensão. Generalização Indica um caso de base que possui diferentes especializações, e inclui comportamento ou sobrescreve o caso de uso base. O caso de uso Pagar fatura apresenta as especializações: Pagamento com cartão e Pagamento com Cheque, conforme o diagrama a seguir: FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 40 Figura 11: generalização do caso de uso. Além disto temos também os relacionamentos entre atores onde um ator especializado pode acessar os casos de uso de um Ator base. A seguir temos um exemplo onde o Ator gerente acessa os casos de uso do ator funcionário: Figura 12: generalização de atores. Sugestões de ferramentas de Modelagem: Introdução Recomendamos as seguintes ferramentas: • Rational Rose (IBM RSA – Rational Software Architect). • Free: Jude/Community • Poseidon/Community • Visual Paradigm – Community Edition Note que algumas empresas adotam o Microsoft Visio. Porém, ele não é considerado uma ferramenta específica para UML – ao contrário do Visual Paradigm, por exemplo. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 41 Exercícios Faça os diagramas de caso de uso Fazer Pedido - versão 1 Cenário informal O caso de uso começa quando o cliente seleciona "fazer pedido". O cliente fornece seu nome e endereço. Se o cliente fornece apenas o CEP, o sistema coloca automaticamente a cidade e o estado. O cliente fornece os códigos do produto. O sistema devolve as descrições e o preço de cada produto. O sistema calculará os valores totais para cada produto fornecido. O cliente fornece as informações sobre cartão de crédito. Em seguida, ele submete os dados ao sistema. O sistema verifica as informações fornecidas, marca o pedido como "pendente" e envia as informações de pagamento para o sistema de contabilidade e pagamento. Quando o pagamento é confirmado, o pedido é marcado como "confirmado" e o número de pedido (NP) é dado ao cliente. Desenhe o caso de uso Cenário: José resolveu desenvolver uma aplicação para controlar as ligações telefônicas de sua casa, a fim de checar se o valor que paga mensalmente está correto. Assim, sempre que desejar poderá listar as ligações efetuadas num determinado período, contabilizando o valor a pagar. Para que isso seja possível, toda ligação será feita pelo computador. A cada solicitação de ligação, a aplicação deverá registrar: a data da ligação, a hora da ligação, quantidade de minutos gastos (que deve ser registrado no momento que a ligação for encerrada), o número de pulsos (que deve ser calculado pela aplicação) e o telefone para onde se discou. A aplicação permitirá o controle de uma agenda de telefones, com número do telefone e nome da pessoa de contato. O usuário poderá escolher no momento da ligação, se deseja um dos registros da agenda ou se digitará diretamente o número do telefone. A forma de cálculo dos pulsos considera os seguintes critérios: - A ligação ao ser completada já conta um pulso. A partir daí, a cada quatro minutos de conversação concluída, cobra-se mais um pulso. - Cada pulso custa R$ 0,08 para ligações locais. Exemplo: Ligação de 2 minutos - 1 pulso Ligação de 4m30s - 2 pulsos Ligação de 8 minutos - 3 pulsos - Os finais de semana possuem uma promoção. Cada ligação contabiliza somente um pulso, independente do número de minutos de conversação. Desenhe o diagrama de casos de uso Carlos aposta toda semana na Loteria, em jogos como quina, megasena, fotomania, etc. São vários cartões por semana. Na hora de conferir é uma loucura. Certa vez, quase que ele confere o cartão errado. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 42 Para resolver isso, ele quer desenvolver uma aplicação que cadastre os cartões apostados e o resultado de um concurso, apresentando o relatório final com os números acertados por cartão e o valor do prêmio, se houver. Exercício (Biblioteca) Identifique os atores e elabore o diagrama de casos de uso para o sistema de controle de uma biblioteca descrito a seguir: É um sistema de suporte para uma biblioteca A biblioteca empresta livros e revistas para clientes, que são registrados no sistema, no qual também estão registrados os livros e as revistas. A biblioteca controla a compra de novos títulos. De títulos populares compra-se várias cópias. Livros antigos e revistas são removidos quando estão ultrapassados ou deteriorados. Bibliotecário é um funcionário da biblioteca que interage com os clientes e seu trabalho é auxiliado pelo sistema. Um cliente pode reservar um livro ou revista que não está disponível no momento na biblioteca, de forma que quando ele for devolvido ou comprado pela biblioteca, o cliente é avisado. A reserva é cancelada quando o cliente retira o livro ou revista, ou através de um processo exclusivo de cancelamento. A biblioteca pode facilmente criar, atualizar, e apagar informações sobre seus títulos, clientes, empréstimos, e reservas no sistema. O sistema pode rodar em todos os ambientes populares (UNIX, Linux, windows, etc) e tem uma interface gráfica (GUI) moderna. O sistema deve ser facilmente estendido com novas funcionalidades O sistema deve lidar com a mensagem que é enviada ao cliente quando um título reservado torna-se disponível, e precisa checar se um determinado título está ultrapassado ou deteriorado. Exercício (Coca-Cola) Identifique os atores e elabore o diagrama de casos de uso para um sistema de controle de uma máquina que vende Coca-Cola, descrito a seguir: É um sistema de venda de Coca-cola em máquina automatizada. O sistema deve estar preparado para receber e conferir o dinheiro colocado pelo Cliente, inclusive para dar o troco. Deve controlar a recarga de refrigerantes pelo Técnico, bem como o recolhimento do dinheiro da máquina. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 43 Esta página foi deixada propositadamente em branco. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 44 3. Diagrama de Classes Diagrama de Classes Introdução O diagrama de classes demonstra a estrutura estática das classes de um sistema onde estas representam as "coisas" que são gerenciadas pela aplicação modelada. Classes podem se relacionar com outras através de diversas maneiras: associação (conectadas entre si), dependência (uma classe depende ou usa outra classe), especialização (uma classe é uma especialização de outra classe), ou em pacotes (classes agrupadas por características similares). Todos estes relacionamentos são mostrados no diagrama de classes juntamente com as suas estruturas internas, que são os atributos e operações. O diagrama de classes é considerado estático já que a estrutura descrita é sempre válida em qualquer ponto do ciclo de vida do sistema. Um sistema normalmente possui alguns diagramas de classes, já que não são todas as classes que estão inseridas em um único diagrama e uma certa classes pode participar de vários diagramas de classes. Escopo ou Visibilidade +, -, # (protected), ~ (friend/pacote). Visibilidade do elemento. Figura 3.1: diagrama de classes. Em UML as classes são representadas por um retângulo dividido em três compartimentos: o compartimento de nome, que conterá apenas o nome da classe modelada, o de atributos, que possuirá a relação de atributos que a classe possui em sua estrutura interna, e o compartimento de operações, que serão o métodos de manipulação de dados e de comunicação de uma classe com outras do sistema. A sintaxe usada em cada um destes compartimentos é independente de qualquer linguagem de programação, embora pode ser usadas outras sintaxes como a do C++, Java, e etc. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 45 Pacotes Pacote é um mecanismo de agrupamento, onde todos os modelos de elementos podem ser agrupados. Em UML, um pacote é definido como: "Um mecanismo de propósito geral para organizar elementos semanticamente relacionados em grupos." Todos os modelos de referenciados elementos por um que pacote são são ligados chamados ou de "Conteúdo do pacote". Um pacote possui vários modelos de elementos, e isto significa que estes não podem ser incluídos em outros pacotes. Pacotes podem importar modelos de elementos Figura 3.2: pacotes. de outros pacotes. Quando um modelo de elemento é importado, refere-se apenas ao pacote que possui o elemento. Na grande maioria dos casos, os pacotes possuem relacionamentos com outros pacotes. Embora estes não possuam semânticas definidas para suas instâncias. Os relacionamentos permitidos entre pacotes são de dependência, refinamento e generalização (herança). O pacote tem uma grande similaridade com a agregação (relacionamento que será tratado em seguida). O fato de um pacote ser composto de modelos de elementos cria uma agregação de composição. Se este for destruído, todo o seu conteúdo também será. Relacionamentos Os relacionamentos ligam as classes/objetos entre si criando relações lógicas entre estas entidades. Os relacionamentos podem ser dos seguintes tipos: • Associação: É uma conexão entre classes, e também significa que é uma conexão entre objetos daquelas classes. Em UML, uma associação é definida com um relacionamento que descreve uma série de ligações, onde a ligação é definida como a semântica entre as duplas de objetos ligados. • Generalização: É um relacionamento de um elemento mais geral e outro mais específico. O elemento mais específico pode conter apenas informações adicionais. Uma instância (um objeto é uma instância de uma classe) do elemento mais específico pode ser usada onde o elemento mais geral seja permitido. • Dependência e Refinamentos: Dependência é um relacionamento entre elementos, um independente e outro dependente. Uma modificação é um elemento independente afetará diretamente elementos dependentes do anterior. Refinamento é um relacionamento entre duas descrições de uma mesma entidade, mas em níveis diferentes de abstração. Abordaremos agora cada tipo de relacionamento e suas respectivas sub-divisões: FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 46 Associações Uma associação representa que duas classes possuem uma ligação (link) entre elas, significando por exemplo que elas "conhecem uma a outra", "estão conectadas com", "para cada X existe um Y" e assim por diante. Classes e associações são muito poderosas quando modeladas em sistemas complexos. Associações Normais O tipo mais comum de associação é apenas uma conexão entre classes. É representada por uma linha sólida entre duas classes. A associação possui um nome (junto à linha que representa a associação), normalmente um verbo, mas substantivos também são permitidos. Pode-se também colocar uma seta no final da associação indicando que esta só pode ser usada para o lado onde a seta aponta. Mas associações também podem possuir dois nomes, significando um nome para cada sentido da associação. Para expressar a multiplicidade entre os relacionamentos, um intervalo indica quantos objetos estão relacionados no link. O intervalo pode ser de zero para um (0..1), zero para vários (0..* ou apenas *), um para vários (1..*), dois (2), cinco para 11 (5..11) e assim por diante. É também possível expressar uma série de números como (1, 4, 6..12). Se não for descrito nenhuma multiplicidade, então é considerado o padrão de um para um (1..1 ou apenas 1). Figura 3.3: associação. No exemplo acima vemos um relacionamento entre as classes Cliente e Conta Corrente se relacionam por associação. Associação Recursiva É possível conectar uma classe a ela mesma através de uma associação e que ainda representa semanticamente a conexão entre dois objetos, mas os objetos conectados são da mesma classe. Uma associação deste tipo é chamada de associação recursiva. Figura 3.4: associação recursiva. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 47 Associação Qualificada Associações qualificadas são usadas com associações de um para vários (1..*) ou vários para vários (*). Figura 3.5: associação qualificada. O "qualificador" (identificador da associação qualificada) especifica como um determinado objeto no final da associação "n" é identificado, e pode ser visto como um tipo de chave para separar todos os objetos na associação. O identificador é desenhado como uma pequena caixa no final da associação junto à classe de onde a navegação deve ser feita. Associação Exclusiva Em alguns modelos nem todas as combinações são válidas, e isto pode causar problemas que devem ser tratados. Uma associação exclusiva é uma restrição em duas ou mais associações. Ela especifica que objetos de uma classe podem participar de no máximo uma das associações em um dado momento. Uma associação exclusiva é representada por uma linha tracejada entre as associações que são parte da associação exclusiva, com a especificação "{ou}" sobre a linha tracejada. Figura 3.6: associação exclusiva. No diagrama acima um contrato não pode se referir a uma pessoa e a uma empresa ao mesmo tempo, significando que o relacionamento é exclusivo a somente uma das duas classes. Associação de Classe Uma classe pode ser associada a uma outra associação. Este tipo de associação não é conectado a nenhuma das extremidades da associação já existente, mas na própria linha da associação. Esta associação serve para se adicionar informações extras a associação já existente. A associação da classe Fila com a associação Figura 3.7: associação de classe. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 48 das classes Cliente e Processo pode ser estendida com operações de adicionar processos na fila, para ler e remover da fila e de ler o seu tamanho. Se operações ou atributos são adicionados a associação, ela deve ser mostrada como uma classe. Agregação e Composição Agregação A agregação é um caso particular da associação. A agregação indica que uma das classes do relacionamento é uma parte, ou está contida em outra classe. As palavras chaves usadas para identificar uma agregação são: "consiste em", "contém", "é parte de". Figura 3.8: agregação. Existem tipos especiais de agregação que são as agregações compartilhadas e as compostas. Agregação Compartilhada: É dita compartilhada quando uma das classes é uma parte, ou está contida na outra, mas esta parte pode fazer estar contida na outra várias vezes em um mesmo momento. Figura 3.9: agregação compartilhada. No exemplo acima uma pessoa pode ser membro de um time ou vários times e em determinado momento. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 49 Composição Agregação de Composição: É uma agregação onde uma classe que está contida na outra "vive" e constitui a outra. Se o objeto da classe que contém for destruído, as classes da agregação de composição serão destruídas juntamente já que as mesmas fazem parte da outra. Figura 3.10: agregação de composição. Generalizações Definição A generalização é um relacionamento entre um elemento geral e um outro mais específico. O elemento mais específico possui todas as características do elemento geral e contém ainda mais particularidades. Um objeto mais específico pode ser usado como uma instância do elemento mais geral. A generalização, também chamada de herança, permite a criação de elementos especializados em outros. Existem alguns tipos de generalizações que variam em sua utilização a partir da situação. São elas: generalização normal e restrita. As generalizações restritas se dividem em generalização de sobreposição, disjuntiva, completa e incompleta. Generalização Normal Na generalização normal a classe mais específica, chamada de subclasse, herda tudo da classe mais geral, chamada de superclasse. Os atributos, operações e todas as associações são herdadas. Figura 3.11: generalização normal. Uma classe pode ser tanto uma subclasse quanto uma superclasse, se ela estiver numa hierarquia de classes que é um gráfico onde as classes estão ligadas através de generalizações. A generalização normal é representada por uma linha entre as duas classes que fazem o relacionamento, sendo que coloca-se um seta no lado da linha onde encontra-se a superclasse indicando a generalização. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 50 Observação: a herança deve ser “natural”. Ao criar uma girafa, nenhum programador deveria estender elefante só porque precisa de “algo com quatro patas”. Senão, no futuro, podemos acabar tendo uma “girafa com tromba”... Dependências e Refinamentos Definição Além das associações e generalizações, existem ainda dois tipos de relacionamentos em UML. O relacionamento de dependência é uma conexão semântica entre dois modelos de elementos, um independente e outro dependente. Uma mudança no elemento independente irá afetar o modelo dependente. Como no caso anterior com generalizações, os modelos de elementos podem ser uma classe, um pacote, um use-case e assim por diante. Quando uma classe recebe um objeto de outra classe como parâmetro, uma classe acessa o objeto global da outra. Nesse caso existe uma dependência entre estas duas classes, apesar de não ser explícita. Uma relação de dependência é simbolizada por uma linha tracejada com uma seta no final de um dos lados do relacionamento. E sobre essa linha o tipo de dependência que existe entre as duas classes. As classes "Amigas" provenientes do C++ são um exemplo de um relacionamento de dependência. Figura 3.12: dependência. Os refinamentos são um tipo de relacionamento entre duas descrições de uma mesma coisa, mas em níveis de abstração diferentes e podem ser usados para modelar diferentes implementações de uma mesma coisa (uma implementação simples e outra mais complexa, mas também mais eficiente). Os refinamentos são simbolizados por uma linha tracejada com um triângulo no final de um dos lados do relacionamento e são usados em modelos de coordenação. Em grandes projetos, todos os modelos que são feitos devem ser coordenados. Coordenação de modelos pode ser usada para mostrar modelos em diferentes níveis de abstração que se relacionam e mostram também como modelos em diferentes fases de desenvolvimento se relacionam. Figura 3.13: refinamento. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 51 Exercícios Um estudo de caso em UML Diante do apresentado no decorrer do trabalho, aplicaremos aqui grande parte dos conceitos abordados diante de uma aplicação da UML num problema fictício que poderá ser de grande ajuda no melhor entendimento das potencialidades da linguagem de modelagem unificada. O estudo de caso dará mais ênfase na fases de análise de requisitos, análise e design, já que as principais abstrações dos modelos do sistema se encontram nestas fases do desenvolvimento. Desenvolveremos uma modelagem em UML para criarmos um sistema de manutenção e controle de contas correntes e aplicações financeiras de um banco fictício. Antes de dar início à primeira fase da modelagem, faremos algumas considerações sobre o que o sistema se propõe a fazer e outras observações que consideramos de suma importância para o bom entendimento do problema. • O sistema suportará um cadastro de clientes, onde cada cliente cadastrado poderá ter várias contas correntes, vários dependentes ligados a ele, e várias contas de poupança. • Cada dependente poderá possuir várias contas de poupança, mas não poderão ter uma conta corrente própria. • Entendemos poupança como uma conta que possui um valor, um prazo de aplicação a uma taxa de juros (definida no vencimento da poupança). • Entendemos Aplicações Pré-fixadas como uma aplicação de um valor, em um prazo predeterminado a uma taxa de juros previamente definida. • Tanto a conta corrente quanto a poupança deverão manter um histórico de todas as movimentações de crédito, débito, transferências e aplicações de pré-fixados (préfixados apenas para conta corrente). • Uma conta corrente poderá ter várias aplicações pré-fixadas ligadas a ela. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 52 4. Diagrama de Atividades e de Sequência Diagrama de Atividades Introdução Um diagrama de atividades UML mostra atividades sequenciais e paralelas em um processo. Eles são úteis para modelagem de processos de negócios, fluxos de trabalho (workflows), fluxos de dados e algoritmos complexos. Uma atividade é o estado de estar fazendo uma ação: tanto um processo de mundo real, como realizar um exercício, ou a execução de uma rotina de software, tal como um método em uma classe. O diagrama de atividades descreve a sequência de atividades, com suporte para comportamento condicional e paralelo. Um diagrama de atividades é uma variante de um diagrama de estados no qual a maioria, se não todos, dos estados é estado de atividade. Portanto, muito da terminologia segue a mesma terminologia de estados. Na figura 1 o símbolo central é o estado de atividade, ou simplesmente atividade. Início Receber o Pedido Separação Atividade Preencher o Pedido Guarda Envia a Fatura Desvio [Senão] [Pedido Urgente] Entrega Durante a Noite Entrega Regular Recebe o Pagamento Intercalação Junção Fechar o Pedido Fim Fig. 1: Diagrama de Atividades Como aplicar os diagramas de atividade? Um diagrama de atividades da UML oferece uma notação rica para mostrar uma sequência de atividades, inclusive atividades paralelas. Ele pode ser aplicado em qualquer perspectiva ou propósito, mas é mais popular para visualizar fluxos de trabalho e processos de negócios, além de casos de uso. Modelagem de processo de negócios: Um de meus clientes está no negócio de entrega expressa de mercadorias. O processo de despachar um pacote é bastante não trivial; existem muitas partes FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 53 envolvidas (cliente, motorista, ...) e muitos passos. Embora este processo possa ser capturado por um texto (no texto do caso de uso), neste caso os diagramas de atividades representam um excelente exemplo de que figuras valem por mil palavras. Meu cliente usa diagramas de atividades para entender seus atuais e complexos processos de negócio por meio de sua visualização. As partições são úteis para ver as várias partes envolvidas e as ações paralelas envolvidas no processo de despacho. Os nós de objetos ilustram o que está sendo movimentado de um lado para outro. Depois de modelar seus processos atuais, eles exploram visualmente mudanças e otimizações. Modelagem de fluxo de dados: A partir dos anos 70, diagramas de fluxos de dados (DFD) tornaram-se uma forma popular de visualizar os principais passos e dados envolvidos em processos de sistemas de software. Isso não equivale à modelagem de processos de negócios; em vez disso, DFDs eram geralmente usados para mostrar fluxos de dados em um sistema computacional, embora teoricamente pudessem ser aplicados à modelagem de processos de negócios. DFDs eram úteis para documentar os principais fluxos de dados ou para explorar um novo projeto de alto nível em termos de fluxo de dados. Veja a figura 13 para um exemplo de um DFD na notação clássica de Gane-Sarson. Observe que os passos do processo são numerados, para indicar a ordem. Figura 13: DFD Clássico, na notação Gane-Sarson. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 54 A informação modelada em um DFD é útil, tanto para documentação quanto para descoberta, mas a UML não inclui a notação para DFD. Felizmente, os diagramas de atividade da UML podem satisfazer os mesmos propósitos – eles podem ser usados para modelagem de fluxo de dados, substituindo a notação tradicional dos DFDs. A Figura 14 ilustra a mesma informação do DFD da Figura 13, mas usando um diagrama de atividades da UML. Note que além de podermos usar os nós de objeto para mostrar os fluxos de dados, os nós dos armazéns de dados (datastore nodes) da UML podem ser usados. Figura 14: Aplicação da notação de diagramas de atividades para mostrar um modelo de fluxo de dados. Programação concorrente e modelagem de algoritmos paralelos: Embora os detalhes estejam fora do escopo desta introdução, algoritmos paralelos em problemas de programação concorrente envolvem partições múltiplas e comportamento de fork e junção. Por exemplo, tais algoritmos são usados em simulações 3D com elementos finitos ou modelagem por diferenças finitas, sendo aplicados para modelagem de reservas de petróleo, análise de resistência de materiais e modelagem do tempo. O espaço físico global é dividido em blocos grandes e muitas linhas de execução (ou processos) paralelas executam, uma para cada sub-bloco. Nesses casos, as partições dos diagramas de atividade UML podem ser usadas para representar diferentes linhas ou processos do sistema em operação. Os nós de objeto podem ser usados para modelar os dados e objetos compartilhados. E, é claro, forking pode ser usado para modelar a criação e execução paralela de múltiplas linhas ou processos, um por partição. Comportamento Condicional Comportamento condicional é delineado por desvios (branches) e intercalações (merges). Um desvio (branch) é uma transição de entrada única e várias transições de saída guardadas. Somente uma transição de saída pode ser tomada, de modo que os guardas devem ser mutuamente exclusivos. A utilização de [else] como um guarda indica que a transição “else” deverá ser usada se todos os outros guardas do desvio forem falsos. Uma intercalação (merge) tem múltiplas transições de FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 55 entrada e uma única saída. Um merge marca o final de um comportamento condicional iniciado por um branch. Comportamento paralelo é indicado por separações (forks) e junções (joins). Uma separação (fork) tem uma transição de entrada e várias transições de saída. Quando uma transição de entrada é acionada (triggered) todas as transições de saída são executadas em paralelo. Quando temos comportamento paralelo, precisamos sincronizar. Com a junção (join) a transição seguinte é efetuada somente quando todos os estados nas transições de entrada tenham completado suas atividades. O diagrama de atividades permite escolher a ordem em que as coisas vão ser feitas. Ele simplesmente determina as regras essenciais de sequências que devem ser seguidas. Esta é a diferença-chave entre um diagrama de atividades e um fluxograma: os fluxogramas são normalmente limitados a processos sequenciais, enquanto que os diagramas de atividades podem lidar com processos paralelos. Os diagramas de atividades também são úteis para programas concorrentes, uma vez que é possível projetar graficamente quais caminhos (threads) temos e quando eles precisam ser sincronizados. Separação e junção devem se completar. Isso significa que toda vez que tiver uma separação deve haver uma junção que una as threads iniciadas por aquelas separações. Entretanto, existem várias extensões para esta regra: • Um thread que sai de uma separação pode abrir-se em uma nova separação, com os novos threads juntando-se antes de alcançar a junção da primeira separação. • Se um thread saindo de uma separação vai direto para outra separação, podemos remover a segunda separação e somente ter os threads da segunda separação saindo da primeira separação. De modo semelhante, se uma junção vai direto para outra junção, podemos eliminar a primeira junção e ter as threads indo direto para a segunda. • Uma construção avançada chamada de estado de sincronia permite que façamos sincronia em lugares onde a regra de encaixe de separação e junção impediria que fizéssemos isso. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 56 Existe uma exceção para regra de que todos os estados de entrada em uma junção devem ter terminado suas atividades, antes que a junção possa ser efetuada. Podemos acrescentar uma condição para um thread saindo de uma separação. O resultado é um thread condicional. Durante a execução, se a condição de um thread condicional for falsa, este thread é considerado completado no que diz respeito à junção. Separação removida do diagrama [a fim de vinho] Cozinhar Espaguete Misturar Molho Carbonara Thread Condicional Abrir Vinho Tinto Combinar Fig 2: Separações, Junções e Thread Condicionais Decompondo uma Atividade Uma atividade pode ser dividida em subatividades. Isso funciona mais ou menos como superestados e subestados em um diagrama de estados. Você pode somente mostrar o superestado no diagrama-pai, ou pode mostrar o superestado no seu comportamento externo dentro dele. As vantagens dos estados de fim e início explícitos são que uma atividade de entrega pode ser usada em outros contextos, e o diagrama-pai é desacoplado dos conteúdos do diagrama subsidiário. Como podemos mostrar que uma atividade é expandida em outro diagrama de atividades? As figuras 15 e 16 ilustram isso, usando o símbolo de um ancinho. Como podemos mostrar ramos condicionais? Veja o símbolo de decisão usado na Figura 16. O símbolo correspondente para junção mostra como os fluxos podem voltar a ficar juntos. Figura 15: Uma atividade será expandida em outro diagrama. Sinais são mostrados na Figura 17. Eles são úteis, por exemplo, quando você precisa modelar eventos como o disparo de uma ação, ou uma solicitação de cancelamento. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 57 Figura 16: A expansão de uma atividade. Existe muito mais notação UML disponível para diagramas de atividades. Esta pequena introdução destaca meramente alguns dos elementos mais comuns. Figura 17: Sinais. Concorrência Dinâmica Concorrência dinâmica permite que você mostre iterações sem que tenha que construir um ciclo. Ou seja, permite representar a repetição de uma atividade. Concorrência Dinâmica Receber o Pedido * Preencher Linha de Item Entregar Pedido Fig 4: Concorrência Dinâmica Raias (Swimlanes) Para usar raias, você deve organizar seus diagramas de atividade em zonas verticais separadas por linhas. Cada zona representa as responsabilidades de uma classe específica ou, um departamento específico. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 58 As raias são úteis porque combinam a descrição de lógica do diagrama de atividades com a descrição de responsabilidade do diagrama de interação. Figura 18: Modelagem do caso de uso Processar Venda com um diagrama de atividades. Quando utilizar Diagramas de Atividades? Os diagramas de atividades têm qualidades e fraquezas definidas, por isso a melhor maneira de usá-los é em combinação com outras técnicas. A maior qualidade dos diagramas de atividades está no fato de que eles suportam e encorajam comportamento paralelo. A maior desvantagem destes diagramas é que eles não deixam muito claras as ligações entre ações e objetos. Você pode definir uma ligação para um objeto rotulando uma atividade com um nome de objeto ou usando raias que dividem um diagrama de atividades em base em responsabilidades, mas isso não tem a clareza simples de diagramas de interação. Por esta razão, algumas pessoas sentem que diagramas de atividades não são orientados a objetos e, portanto, são maus. Devemos utilizar diagramas de atividades nas seguintes situações: • Analisando um caso de uso. • Compreendendo workflow • Descrevendo um algoritmo sequencial complicado • Lidando com aplicações de processamento paralelo. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 59 Não devemos usar diagramas de atividades nas seguintes situações: • Tentando ver como os objetos colaboram. • Tentando ver como um objeto se comporta durante o seu ciclo de vida. • Representando lógica condicional existente. O diagrama de estados e diagramas de atividades faz com que exista uma base mais estável para os desenvolvedores de ferramentas construírem as que executarão estes diagramas. Diagramas de Sequência Introdução A UML inclui diagramas de interação para ilustrar como os objetos interagem por meio de mensagens. Eles são usados para modelagem de objetos dinâmica. Há dois tipos comuns de diagramas de interação: diagramas de sequência e de comunicação. O termo diagrama de interação é uma generalização de dois tipos de diagramas especializados da UML: diagramas de sequência e diagramas de comunicação. Ambos podem expressar interações semelhantes. Diagramas de sequência são os mais ricos dos dois tipos em termos de notação, mas diagramas de comunicação também têm sua utilidade, especialmente para rascunho na parede. Os diagramas de sequência ilustram as interações em um formato semelhante a cercas, nas quais cada objeto novo é acrescentado à direita, conforme mostrado na Figura 19. Figura 19: Diagrama de sequência. O que isso poderia representar em código? Provavelmente, que a classe A tem um método denominado fazerUm e um atributo do tipo B. Também que a classe B tem métodos chamados fazerDois e fazerTres. Talvez a definição parcial da classe A seja: public class A { private B meuB = new B(); public void fazerUm() { meuB.fazerDois(); meuB.fazerTres(); } ... } FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 60 Um diagrama de sequência do sistema é um artefato criado rápida e facilmente que ilustra os eventos de entrada e saída relacionados com o sistema em discussão. Eles são entradas para contratos de operação e – mais importante – projeto de objetos. A UML contém notação na forma de diagramas de sequência para ilustrar eventos provenientes de atores externos ao sistema. A influência dos artefatos do PU enfatizando diagramas de sequência de sistema é mostrada na Figura 20. O texto do caso de uso e seus eventos implícitos no sistema são entradas para a criação do DSS. As operações do DSS (tais como entrarItem) podem, por sua vez, ser analisadas nos contratos de operação, detalhadas no Glossário, e – mais importante – servir como ponto de partida para projetar objetos de colaboração. Figura 20: Amostra da influência dos artefatos no PU. Diagramas de Sequência Na maioria dos casos, usamos um diagrama de sequência para ilustrar as realizações de casos de uso, isto é, para mostrar como os objetos interagem para executar o comportamento total ou parcial de um caso de uso. Um ou mais diagramas de sequência podem ilustrar as interações de objetos que constituem um caso de uso. Uma organização típica deve ter um diagrama de sequência para o fluxo principal de eventos e um diagrama de sequência para cada subfluxo independente do caso de uso. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 61 Os diagramas de sequência ência são muito importantes para designers porque eles esclarecem os papéis dos objetos em um fluxo e, portanto, fornecem entrada básica para determinar responsabilidades bilidades de classe e interfaces. Diferentemente de um diagrama de colaboração, um diagrama de sequ sequência inclui sequências, mas não inclui relacionamentos de objetos. Ambos expressam informações semelhantes; o que muda é a forma como elas são mostradas. Os diagramas de sequência ência mostram a sequência seq explícita de mensagens e são melhores quando é importante visualizar a ordenação temporal das mensagens. Quando você estiver interessado nos relacionamentos estruturais entre as instâncias de uma interação, use um diagrama de colaboração. Conteúdo de Diagrama de Sequência Você pode ter objetos e instâncias de ator em diagramas de sequ seq ência, juntamente com mensagens que descrevem como eles interagem. O diagrama descreve o que ocorre nos objetos participantes, em termos de ativações, e como os objetos se comunicam enviando mensagens uns aos outros. É possível fazer um diagrama de sequência para cada variante do fluxo de eventos de um caso de uso. Figura 21: Um diagrama de seqüência que descreve parte do fluxo de eventos do caso de uso Colocar Ligação Local em uma Central Telefônica simples. Objetos Um objeto é mostrado como uma linha tracejada vertical denominada denominada "linha de vida". A linha de vida representa a existência do objeto em um momento específico. Um símbolo de objeto foi desenhado no alto da linha de vida e mostra o nome do objeto e sua classe sublinhada e separada por dois-pontos: objectname : classname FAETEC 2012 12 - Notas de Aula de MD3 – Prof. M. França – Página: 62 Você pode usar objetos em diagramas de sequência das seguintes formas: a) Uma linha de vida pode representar um objeto ou sua classe. Portanto, a linha de vida pode ser usada para modelar tanto o comportamento da classe quanto do objeto. Contudo, em geral, uma linha de vida representa todos os objetos de uma determinada classe. b) Uma classe de objeto pode não estar especificada. Geralmente, você cria primeiro um diagrama de sequência com objetos e mais tarde especifica as suas classes. c) Os objetos podem não ter nome, mas é recomendável nomeá-los se você quiser diferenciar os diversos objetos da mesma classe. d) Várias linhas de vida no mesmo diagrama podem representar objetos diferentes da mesma classe; mas, como foi dito anteriormente, os objetos devem ser nomeados para que você possa estabelecer a diferença entre os dois objetos. e) Uma linha de vida que representa uma classe pode existir paralelamente a linhas de vida que representam objetos daquela classe. O nome do objeto da linha de vida que representa a classe pode ser definido com o nome da classe. Atores Geralmente, uma instância de ator é representada pela primeira (mais à esquerda) linha de vida no diagrama de sequência, como o disparador da interação. Se houver várias instâncias de atores no mesmo diagrama, tente mantê-las na linha de vida mais à esquerda ou na linha mais à direita. Mensagens Uma mensagem é uma comunicação entre objetos que leva informações na expectativa de que resulte uma atividade; nos diagramas de sequência, uma mensagem é mostrada como uma seta sólida horizontal partindo da linha de vida de um objeto para a linha de vida de outro objeto. No caso de uma mensagem de um objeto para si mesmo, a seta pode iniciar e terminar na mesma linha de vida. A seta é rotulada com o nome da mensagem e seus parâmetros. Ela também pode ser rotulada com um número que indique a sequência da mensagem no processo geral de interação. Os números sequenciais em geral são omitidos em diagramas de sequência, nos quais a localização física da seta mostra a sequência relativa. Uma mensagem pode ser não-atribuída, o que significa que seu nome é uma sequência de caracteres temporária que descreve o sentido geral da mensagem e não é o nome de uma operação do objeto recebedor. Mais tarde, você poderá atribuir à mensagem especificando a operação do objeto de destino da mensagem. A operação especificada substituirá então o nome da mensagem. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 63 Tipos de Mensagem Mensagem de Criação – Aponta diretamente para o objeto e é marcada com «create» Mensagem de Retorno – Opcional, e normalmente é omitida – Usa seta tracejada Marca de Destruição – Indica o término da vida de um objeto com um “X” Figura 22: Mensagens. Mensagem Síncrona x Assíncrona É possível utilizar dois tipos de mensagem de métodos no diagrama de sequência: – Mensagem síncrona (seta cheia): a execução fica bloqueada até o retorno do método. – Mensagem assíncrona (seta vazia): a execução continua em paralelo ao método que foi chamado (fork implícito). FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 64 Figura 23: Mensagens Síncronas e Assíncronas. Scripts Os scripts descrevem o fluxo de eventos textualmente em um diagrama de sequência. Você deve posicionar os scripts à esquerda das linhas de vida para poder ler o fluxo completo de cima para baixo (consulte a Figura 21). Você pode anexar scripts a uma determinada mensagem assegurando, assim, que o script se mova com a mensagem. Distribuição de Fluxo de Controle O controle centralizado de um fluxo de eventos ou de parte do fluxo de eventos significa que poucos objetos guiam o fluxo trocando mensagens com outros objetos. Esses objetos controladores decidem a ordem em que outros objetos serão ativados no caso de uso. A interação entre os objetos restantes é mínima ou inexistente. Exemplo: No Sistema da Máquina de Reciclagem, o caso de uso Imprimir Relatório Diário controla, entre outros, o número e o tipo de objetos retornados, e escreve a contagem em um recibo. O objeto de controle Gerador de Relatório decide a ordem em que os totais serão extraídos e escritos. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 65 Figura 24: A estrutura de comportamento do caso de uso Imprimir Relatório Diário é centralizada no objeto de controle Gerador de Relatório. Esse é um exemplo de comportamento centralizado. A estrutura de controle é centralizada principalmente porque as diferentes fases de subeventos do fluxo de eventos não dependem umas das outras. A principal vantagem desse método é que cada objeto não precisa controlar a contagem do objeto seguinte. Para mudar a ordem das fases de subeventos, basta fazer a mudança no objeto de controle. Ainda será possível adicionar facilmente outra fase de subevento se, por exemplo, for incluído um novo tipo de item retornável. Outra vantagem dessa estrutura é que você pode facilmente reutilizar as várias fases de subeventos em outros casos de uso, porque a ordem de comportamento não está embutida nos objetos. O controle descentralizado surge quando os objetos participantes se comunicam diretamente entre si, e não através de um ou mais objetos controladores. Exemplo: No caso de uso Enviar Carta alguém remete uma carta para outro país através de uma agência de correio. Primeiro, a carta é enviada para o país do destinatário. No país, a carta é enviada para uma cidade específica. A cidade, por sua vez, envia a carta para a residência do destinatário. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 66 Figura 25: A estrutura de comportamento do caso de uso Enviar Carta é descentralizada. O comportamento do caso de uso é um fluxo de eventos descentralizado. As fases de subeventos integram o conjunto. O remetente da carta fala em "enviar uma carta a alguém". Ele não precisa nem deseja saber os detalhes de como as cartas são enviadas em países ou cidades. (Provavelmente, se alguém remetesse uma carta dentro do mesmo país, nem todas as ações ocorreriam.) O tipo de controle usado depende do aplicativo. Geralmente, você deve tentar conseguir objetos independentes, isto é, delegar várias tarefas aos objetos naturalmente mais apropriados a executá-las. Figura 26: Uma estrutura de controle centralizada "em forma de forquilha". Uma estrutura de controle descentralizada "em forma de escada". FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 67 Um fluxo de eventos com controle centralizado terá um diagrama de sequência "em forma de forquilha". Por outro lado, um diagrama de sequência "em forma de escada" ilustra que a estrutura de controle foi descentralizada para os objetos participantes. A estrutura de comportamento da realização de um caso de uso frequentemente consiste em uma mistura de comportamento centralizado e descentralizado. Uma estrutura descentralizada será adequada: • Se as fases de subevento estiverem intrinsecamente acopladas. Esse será o caso se os objetos participantes: o Formarem uma hierarquia de partes ou constituintes, como País - Estado - Cidade; o Formarem uma hierarquia de informações, como CEO - Gerente de Divisão - Gerente de Seção; • Representarem uma progressão cronológica fixa (a sequência de fases de subeventos será sempre realizada na mesma ordem), como Anúncio - Pedido - Fatura -Remessa - Pagamento; ou • Formarem uma hierarquia de herança conceitual, como Animal - Mamífero - Gato. Se você desejar encapsular a funcionalidade e, portanto, fazer abstrações dela. Isso é bom para alguém que deseje utilizar sempre a funcionalidade inteira, porque a funcionalidade pode se tornar desnecessariamente de difícil compreensão caso a estrutura de comportamento seja centralizada. Uma estrutura centralizada será adequada: • Se a ordem em que as fases de subeventos serão executadas puder ser mudada. • Se você espera inserir novas fases de subeventos. • Se você deseja manter partes da funcionalidade reutilizáveis como peças separadas. Repetições O diagrama de sequência permite que repetições sejam feitas durante o fluxo. Para isso são utilizados quadros (frames) do tipo loop. Decisões O diagrama de sequência permite que decisões sejam tomadas durante o fluxo FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 68 Para isso são utilizados quadros (frames) do tipo alt ou opt com condições de guarda Exemplo: Motivação: por que desenhar um DSS? Uma questão interessante é útil no projeto de software é a seguinte: que eventos estão entrando no nosso sistema? Por quê? Porque temos que projetar o software para tratar esses eventos (desde o mouse, teclado, outro sistema, ...) e executar uma resposta. Basicamente, um sistema de software reage a três coisas: (1) eventos externos de atores (seres humanos ou computadores), (2) eventos de tempo e (3) falhas ou exceções (que frequentemente são de fontes externas). Portanto, é útil saber quais, precisamente, são os eventos externos de entrada – os eventos do sistema. Eles são uma parte importante da análise do comportamento do sistema. Você pode estar familiarizado com a ideia de identificar as mensagens que entram em um objeto de software. Mas esse conceito é útil em um nível mais alto de componentes, inclusive todo o sistema visto (abstratamente) como uma coisa ou objeto. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 69 Antes de prosseguir para um projeto detalhado de como uma aplicação de software vai funcionar, é útil investigar e definir seu comportamento como uma “caixa-preta”. Comportamento do sistema é uma descrição do que um sistema faz, sem explicar como o faz. Uma parte dessa descrição é um diagrama de sequência do sistema. Outras partes incluem os casos de uso e os contratos de operação do sistema. Exemplo: Figura 27: Escolher os nomes de eventos e de operações no nível abstrato. Exercícios Diagramas de Atividades 1. Qual a finalidade do Diagrama de Atividades? 2. Quando é recomendado utilizar “raias” na descrição do diagrama de atividades? 3. Compare barra de Junção x Barra de Bifurcação 4. Construa o diagrama de atividades que descreva o processo de compras on-line (Ex.Submarino, Americanas) 5. Construa o diagrama de atividades que modele as regras de negócio das avaliações do semestre, considerando o seguinte mini-mundo: • Faltas (25%) • Avaliações das unidades (Três) • Prova final (média 5,0) • Media final=Media unidade (Peso 7) e prova final (Peso 3) FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 70 Diagramas de Sequência 1 - Construa os Diagramas de Sequência para o Caso de Uso – “Reservar Carro”: Nota: somente clientes já cadastrados poderão fazer a reserva do veículo on-line. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 71 2 - Sistema de Vendas de Livros On-Line Criar o Diagrama de Sequência para o Caso de Uso Cadastrar Livro, tendo como referência a tela de cadastramento apresentada abaixo. Observe que esta mesma tela deverá ser preenchida por dois atores diferentes. Primeiro o Funcionário, depois o Gerente registrando os preços de compra e venda. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 72 3. Construa um Diagrama de Seqüência para abrir uma conta, conforme a descrição abaixo: O cliente que deseja abrir uma conta no banco, encaminha um pedido de abertura de conta, com a documentação necessária. O funcionário do banco, então irá consultar o cadastro do cliente por meio do seu CPF, para determinar se o solicitante já se encontra cadastrado. Se o cliente já estiver cadastrado, a consulta retornará as informações do cliente, caso contrário retornará um valor significando que o cliente ainda não possui cadastro na instituição. Em seguida, o cadastro do cliente poderá ser atualizado, caso necessário, podendo gerar uma nova instância da classe Cliente, se o solicitante ainda não estiver registrado, ou simplesmente atualizar os dados do mesmo, se houver necessidade de alguma atualização. Antes de finalizar a atualização do cliente, algumas inconsistências devem ser levadas a efeito, uma delas é o disparo do método para validação do CPF pelo próprio objeto da classe Cliente. Após o término da atualização, o objeto da classe cliente retornará algum sinal para o funcionário do banco, para indicar que o cliente foi atualizado com sucesso ou se ocorreu algum erro. O banco então irá informar ao cliente se o seu pedido foi ou não aprovado. Em caso de aprovação, o cliente irá fornecer o valor inicial necessário para a abertura da conta e escolherá a senha. O funcionário irá disparar o método de abertura na classe ContaComum, ou seja, criará um novo objeto ContaComum. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 73 Após ter sido criado pela chamada do método abertura, o objeto de ContaComum irá disparar o método gravar para gerar uma nova instância da classe Historico, registrando o movimento gerado pela abertura da conta, pois, para abrir uma conta, a instituição exige que o cliente deposite algum valor na mesma. O método gravar retornará um sinal indicando que o movimento foi registrado com sucesso e o método abertura disparado na classe ContaComum, por sua vez, retornará o número da conta gerado, indicando que a conta foi criada com sucesso e finalizando o processo de abertura de conta. 4. Construa um Diagrama de Seqüência encerrar uma conta, conforme a descrição abaixo: Primeiramente um cliente se encaminha ao caixa do banco, representado pelo ator Funcionario e solicita o encerramento de uma determinada conta comum. O caixa então irá verificar se a conta informada realmente existe e se a senha informada é verdadeira, por meio do disparo do método consulta. Caso a conta realmente exista, o próprio método irá chamar o método de validação de senha para verificar se a senha informada pelo usuário está correta. Em caso positivo, será verificado o saldo da conta. Se o saldo retornado for positivo, então o caixa irá retirar o dinheiro da conta, o saque efetuado deverá ser registrado no histórico das movimentações. Em seguida o objeto de ContaComum retornará o valor do saldo para o atendente que deverá ser igual a zero se o método for executado com sucesso. Finalmente o atendente irá chamar o método encerramento para fechar a conta do cliente no objeto de ContaComum. Antes de concluir a execução, esse método pode, caso a conta a ser encerrada seja a única possuída pelo cliente, atualizar o cadastro do mesmo, definindo o seu status como inativo, por meio do método gravar no objeto de Fisica. Caso tenha sido possível atualizar a instância da classe Física, então o método gravar retornará um valor indicando que o cliente foi atualizado. A conta retornará um valor que instruirá o software mostrar ao atendente a mensagem: “Conta Encerrada com Sucesso”, finalizando o processo de encerramento de conta. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 74 Referências • “Crise do Software” - Alanderson (FNM, Engenharia da Computação) • “Programação Orientada ao Objeto: uma abordagem didática” - UNICAMP • “Conceitos de OO” – Prof. Cleidson Souza - Universidade Federal do Pará • Apostila de “Java e OO” da CAELUM • “Java Help” da Oracle (em inglês) • “Linguagem de Modelagem Unificada” • Utilizando UML e Padrões – 3ª edição – Craig Larman • Object Management Group website at www.omg.org FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 75 Esta página foi deixada propositadamente em branco. FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 76 6. Apêndice A – Questionário de Avaliação do Curso FAETEC – Rio de Janeiro Professor M. França Disciplina: Aluno: __________ _______________________________________________ Data: ________ Período/Turma: ________ Observação: Solicite ao professor o endereço para preenchimento eletrônico. Atenção: Procure dar respostas completas, evitando monossílabos: “sim”, “não”, “é”, “fui” etc.. E não se esqueça de perguntar ao professor sobre o 0,5 ponto relativo ao preenchimento deste. 1) O curso: O curso Técnico em Informática da Escola Técnica Estadual República possui um bom nível? As matérias são atuais e relevantes? Ele proporciona um ambiente para que alunos interessados possam adquirir conhecimentos aplicáveis profissionalmente? 2) A disciplina: A disciplina em questão (MD3) possui um conteúdo atual? O programa foi totalmente coberto? A carga horária semanal foi suficiente para explanação e resolução de exercícios? As aulas práticas (se for o caso) foram suficientes e em condições adequadas (máquinas)? 3) O professor: O professor possuía domínio da disciplina (conhecimento)? Ele explica bem (didático)? Ele é cordial e atencioso para com os alunos? Ele estava sempre disposto a explicar novamente algum conceito mal compreendido? Existe algum ponto positivo e/ou negativo no professor? 4) O aluno: Você freqüenta as aulas assiduamente? Você faz os exercícios/estuda em casa? Você presta atenção na explicação do professor? Você se considera um aluno agitado/disperso? Você conseguiu aprender os principais conceitos da disciplina? Você tentou tirar suas dúvidas com o professor? 5) Livre: Que sugestões, ou críticas, você gostaria de fornecer para a melhoria do processo? 6) Nota: Dê uma nota para a disciplina (MD3), de 0 (muito insatisfeito) a 10 (muito satisfeito): ______ Muito obrigado. Desejo a todos muito sucesso profissional e boas férias; Sem radicalismos! “Teu coração é livre. Tenha coragem para segui-lo!” Brave Heart FAETEC 2012 - Notas de Aula de MD3 – Prof. M. França – Página: 77