Академический Документы
Профессиональный Документы
Культура Документы
LtIiJML Essencial
MARTIN FOWLER
e KENDALL SCOTT
L Essencial Um breve guia para a linguagem-padrão
de modelagem de objetos
2’Edição
Tradução:
Vera Pezerico e Christian Thomas Price
Consultoria, Supervisão e Revisão Técnica desta edição:
Roberto Tom Price
Professor do Instituto de Informática da UFRGS
Reimpressão 2003
Li4
Boonan
Porto Alegre, 2000
Apresentação
1 1’
Quando começamos a moldar UML. (Unified Modeling LaÃguage); perávamos poder
produzir um meio-padrão de expressar projetos que não somente refletisse as
melhores práticas da indústria, mas que também ajudass a desmistificar o processo
de modelagem de sistemas de software. Acreditávamos que a disponibilidade de
uma linguagem de modelagem-padrão encorajaria mais desenvolvedores a modelar
os seus sistemas de softzvare, antes de construí-los. A adoção rápida e muito
difundida de UML demonstra que os benefícios da modelagem são, de fato, bem
conhecidos da comunidade de desenvolvedores de software.
A criação de UML foi por si só um processo iterativo e incremental muito semelhante
à modelagem de um grande sistema de software. O resultado final é um padrão
baseado nas muitas idéias e contribuições feitas por diversas pessoas e empresas da
comunidade. Começamos o trabalho de UML mas muitos outros contribuíram para
uma conclusão de sucesso; somos muito gratos pelas suas contribuições.
Criar e entrar em acordo sobre uma linguagem de modelagem-padrão por si só já é
um grande desafio. Educar a comunidade de desenvolvedores, e para ela apresentar
UML de uma forma acessível e no contexto do processo de desenvolvimento de
software, também é um grande desafio. Neste livro aparentemente curto, atualizado
para refletir as mais recentes mudanças em UML, Martin Fowler superou, certamente,
este desafio.
Com um estilo claro e acessível, Martin não somente introduz aspectos-chave de
UML, mas também demonstra claramente o papel que UML desempenha no processo
de desenvolvimento. Ao longo da leitura, recebemos grandes doses de sabedoria e
conhecimento de modelagem decorrentes dos mais de 12 anos de experiência que o
autor acumulou em projeto e em modelagem. Como resultado,
APRESENTAÇÃO
temos um livro que apresenta a linguagem a milhares de desenvolvedores, aguçando
seus interesses para melhor explorar os vários benefícios da modelagem utilizando
UML, agora um padrão. Recomendamos o livro para qualquer modelador ou
desenvolvedor interessado em conhecê-la e em obter uma visão da função-chave
que ela desempenha no processo de desenvolvimento.
Grady Booch
Ivar Jacobson
Jarnes Rurnbaugh
Prefácio
Há dois anos, Addison-Wesley entrou em contato comigo para que eu escrevesse um
livro sobre a então nova UML. Naquela época, havia muito interesse em UML, mas
existiam apenas documentos de padronização para estudo. Quebramos muitos
recordes para produzir um curto guia introdutório da nova linguagem, algo que daria
uma certa orientação até que livros mais detalhados viessem a aparecer, mais tarde
naquele ano.
Não esperávamos que este livro permanecesse depois que textos detalhados fossem
publicados. Muitas pessoas acreditam que se tendo a escolha entre uma pequena
visão geral e um livro detalhado, todos escolherão o livro detalhado. Embora esta
fosse a visão geral, eu acreditava que mesmo na presença de livros detalhados havia
ainda espaço para um resumo conciso.
Dois anos mais tarde, as minhas esperanças foram além do esperado. O LJML
Essencial é, em termos da indústria da computação, um best-seller. Mesmo que bons
livros detalhados sobre UML tenham sido publicados, o livro ainda vende bem. Melhor
do que isto, mais livros curtos surgiram, confirmando a minha crença de que, em um
mundo com tanta informação, a brevidade bem escolhida tem o seu valor.
Tudo bem, mas você deve comprar este livro?
Eu vou partir do princípio que você já ouviu algo sobre UML, pois tornou-se o modo-
padrão para desenhar diagramas de projetos orientado a objetos, e também se
espalhou em campos não-orientados a objetos. Todos os maiores métodos pré-UML já
desapareceram. UML chegou e está aqui para ficar.
Se você quer aprender sobre UML, este livro pode ajudá-lo. A maior razão para você
começar com este livro é que ele é um livro pequeno. Comprar um livro grande pode
dar a você mais informação, mas você levará mais tempo para lê-lo. Selecionei as
partes mais importantes de UML para lhe poupar trabalho. Com
\v7 PREFÁCIO
este livro, você aprenderá os elementos-chave da notação bem como seus
significados. Se você quer ir mais além, pode passar para um livro mais detalhado
mais tarde.
Se você quer um tutorial mais detalhado sobre UML, sugiro Unzfled Modeling
Language LJser Guide (Booch, Rumbaugh e Jacobson, 1999). O tJser Guide cobre mais
terreno. Ele é bem escrito e organizado, de forma que explica como aplicar UML a
vários problemas de modelagem.
Tanto este livro como o LJser Guide partem do princípio de que você já conhece algo
sobre o desenvolvimento em 00. Muitas pessoas me disseram que este livro é uma
boa introdução a objetos, mas não o escrevi tendo isto em mente. Se você está
procurando por uma introdução a objetos com UML, você deveria também considerar
o livro de Craig Larman (Larman, 1998).
Embora o ponto principal desse livro seja UML, também acrescentei materiai que
complementa UML. UML é uma parte re1ativament pequena do que você precisa
saber para ter sucesso com objetos, e acredito que é importante salientar algumas
outras coisas.
o mais importante destas outras é o processo de softzvare. UML é projetada para ser
independente de processo. Você pode desenhar tudo o que quiser; o que UML faz é
dizer o que seus diagramas significam. Entretanto, os diagramas não têm muito
sentido sem um processo que lhes dê um contexto. Também acredito que o processo
é importante e que um bom processo não precisa ser complicado.
Por isso, descrevi um esboço de um leve processo de desenvolvimento de
software 00. Ele estabelece um contexto para as técnicas e o ajudará a melhor
utilizar objetos.
Os outros tópicos incluem padrões, refatoração, código de autoteste, projetos por
contrato e cartões CRC. Nenhum deles faz parte de UML, mas são técnicas
de grande valor que utilizo regularmente.
Estrutura do Livro
o Capítulo 1 analisa o que é UML, a história do seu desenvolvimento e as razões
pelas quais você pode querer usá-la.
O Capítulo 2 discute o processo de desenvolvimento orientado a objetos. Embora
UML seja independente de processo, acho difícil discutir técnicas de modelagem sem
falar onde elas se encaixam com o desenvolvimento orientado a objetos.
Dos Capítulos 3 ao 6, as três técnicas mais importantes de UML são discutidas: casos
de uso, diagramas de classes e modelos de interação. UML é um grande monstro,
mas você não precisa dele todo. Estas três técnicas são a essência do que quase
todo mundo precisa. Comece com estas e adicione as outras à medida que for
necessitando (observe que, devido aos diagramas de classes serem tão complicados,
coloquei as partes-chave dos diagramas de classes no Capítulo 4 e os conceitos
avançados no Capítulo 6).
PREFÁCIO
Dos capítulos 7 ao 10, as técnicas remanescentes são exploradas. Todas elas são
valiosas, mas nem todo o projeto precisa de todas as técnicas. Portanto, estes
capítulos fornecem informações suficientes sobre cada técnica se você precisar dela.
Para todas essas técnicas, descrevo a notação, explico o que ela significa, e dou
dicas de como utilizá-las. A minha filosofia é esclarecer o que UML diz, e ao mesmo
tempo dar a minha opinião de como melhor utilizá-la. Também acrescentei
referências a outros livros que fornecem mais detalhes.
O Capítulo 11 dá um pequeno exemplo para mostrar como UML se encaixa em
programação, utilizando Java (é claro).
A contracapa resume a notação de UML. Você pode considerar útil usá-la
como referência, enquanto estiver lendo os capítulos, pois você pode já verificar a
notação para vários conceitos de modelagem.
Se você achar este livro interessante, pode encontrar maiores informações
sobre o meu trabalho relacionado ao uso de UML, padrões e refatoração na minha
homepage (ver página xxi).
Mudanças da Segunda Edição
À medida que UML evoluía e eu recebia feedback sobre a primeira edição desse livro,
eu o atualizava continuamente. A reimpressão do livro ocorria a cada dois ou três
meses; sendo que cada impressão continha atualizações, o que significou um
desgaste considerável para os processos da indústria gráfica.
Com a mudança de UML 1.2 para 1.3, decidimos fazer uma revisão mais detalhada
do livro, o que era suficiente para produzir uma segunda edição. Uma vez que este
livro se tornou tão popular, tentei manter o espírito essencial dele. Tentei não
adicionar muito e verificar se haveria coisas que deveriam ser retiradas.
As maiores mudanças estão no Capítulo 3, sobre casos de uso, e no Capítulo 9 sobre
diagramas de atividade, os quais foram em grande parte reescritos. Também
adicionei uma seção sobre colaborações ao Capítulo 7. Em outras partes, aproveitei
para fazer algumas pequenas modificações baseadas emfeedback de leitores e nas
minhas experiências dos dois últimos anos.
Agradecimentos da Primeira Edição
Publicar um livro com essa rapidez exigiu muita ajuda de pessoas que se superaram
em seus esforços para fazer a produção de forma bem mais rápida.
Kendall Scot teve um papel importante coletando todo material e trabalhando com os
textos e os gráficos. A medida que eu revisava o livro, ele continuava para manter
tudo em ordem, completando uma série de tarefas que surgiam de uma hora para
outra e com prazos de entrega impossíveis de serem cumpridos.
PREFÁCIO
Os três amigos, Grady Booch, Ivar Jacobson e Jim Rumbaugh, deram muito
apoio e conselhos. Investimos muitas horas com ligações internacionais, que
aprimoraram muito o livro (bem como a minha compreensão de UML).
Um grande número de revisores é essencial para se fazer um bom trabalho na
elaboração de um livro. Esses revisores não apenas me deram ofeedback necessário
mas também retornaram seus comentários em menos de uma semana para que
pudéssemos cumprir o nosso curto prazo de entrega. Meus agradecimentos a: Simmi
Kochhar Bhargava, da Netscape Communications Corporation, Eric Evans e Tom
Hadfield, da Evolve Software, mc. , Ronald E. Jeffries e Joshua Kerievsky, da Industrial
Logic, mc. , Helen Klein, da University of Michigan, James Odeli e Vivek Salgar, da
Netscape Communications Corporation. E agradecimento dobrado a Tom Hadfield,
porque ele o fez duas vezes.
Quero agradecer a Jim Odeil por duas coisas: primeiro por coordenar o esforço do
Object Management Group (OMG) para obter um padrão único para UML, o que será
um grande progresso para nossa indústria; segundo por me encorajar a entrar no
campo de análise e projeto 00.
Ah, e obrigado por revisar este livro também!
Obrigado a Cindy por ter suportado minha ausência, mesmo eu estando em
casa.
Não posso imaginar as dificuldades que o meu editor, J. Carter Shanklin e sua
assistente Angela Buenning, tiveram que enfrentar para publicar este livro tão
rapidamente. Quaisquer que tenham sido estas dificuldades, tenho certeza que
Carter e Angela merecem meus agradecimentos. A indústria editorial não é projetada
para lidar com mudanças feitas em um livro a cada dois meses, mas Carter e sua
equipe fizeram um bom trabalho escondendo este fato!
A necessidade de manter este livro atualizado me fez questionar sobre detalhes
específicos de UML. Conrad Bock, Ivar Jacobson, Cris Kobrym, Jim Odeil, Guss
Ramackers e Jim Rumbaugh fizeram o possível para me ajudar a encontrar estas
respostas.
Inúmeras pessoas me mandaram mensagens salientando vários erros e omissões;
são muitos nomes para listar aqui, mas agradeço a todos vocês.
Por fim, agradeço aos meus pais por terem me dado uma boa educação da
qual tudo mais se originou.
Martin Fowler
Melrose, Massachusetts
Fowler@acm.org
http://ourworld.compuserve.com/homepages/Martin_Fozvler
-.
1.
Sumário
Capítulo 1: Introdução 19
OqueéUML’ 19
Como Chegamos até Aqui 20
Notações e Metamodelos 22
Por que Fazer Análise e Projeto7 23
Comunicação 24
Aprendendo 00 24
Comunicação com Especialistas de Domínio 26
Procurando Mais Informação 26
Capítulo 2: Um Esboço de Processo de Desenvolvimento 29
Visão Geral do Processo 30
Concepção 31
Elaboração 31
Lidando com Riscos de Requisitos 32
Lidando com Riscos Tecnológicos 35
Lidando com Riscos de Especialização 36
Lidando com Riscos Políticos 38
Quando Termina a Elaboração’ 38
Planejando a Fase de Construção 38
Construção 40
Box: Software de Autoteste 41
Quando o Plano se Desintegra 41
Box: Refatoração 41
Utilizando UML na Construção 43
Transição 44
Box: Padrões 44
\i37
Colaborações 108
Quando Utilizar Diagramas de Pacotes e Colaborações 111
Onde Encontrar Mais Informação 111
Capítulo 8: Diagramas de Estados 113
Diagramas de Estados Concorrentes 117
Quando Utilizar Diagramas de Estados 119
Onde Encontrar Mais Informação 119
Capítulo 9: Diagramas de Atividades 121
Decompondo uma Atividade 125
Concorrência Dinâmica 125
Raias (Swimlanes) 125
Quando Utilizar Diagramas de Atividades 127
Onde Encontrar Mais Informação 129
Capítulo 10: Diagramas Físicos 131
Diagramas de Utilização 131
Diagramas de Componentes 131
Combinando Componentes com Diagramas de Utilização 133
Quando Utilizar Diagramas Físicos 134
Capítulo 11: UML e Programação 135
Observação de Pacientes: Modelo de Domínio 136
Observação de Pacientes: Modelo de Especificação 139
Passando para Código 142
Apêndice A: Técnicas e Suas Aplicações 151
Apêndice B: Mudanças entre Versões de UML 153
Revisões de UML 153
Cronograma de Revisões Futuras 154
Mudanças em “UML Essencial” 155
Mudanças de UML 1.0 para 1.1 155
Tipo e Classe de Implementação 155
Restrições Discriminadoras Completas e Incompletas 156
Composição 156
Imutabilidade e Congelamento 156
Retornos em Diagramas de Seqüência 157
Uso do Termo “Papel” (Role) 157
Mudanças de UML 1.2 (e 1.1) para 1.3 (e 1.4) 157
Casos de Uso 157
Diagramas de Atividades 158
Bibliografia 159
Índice 163
Figuras
Figura 1.1: Trecho do Metamodelo de UML 23
Figura 2.1: Esboço do Processo de Desenvolvimento 30
Figura 2.2: Estrutura do Padrão de Projeto Proxy 45
Figura 2.3: Padrão de Análise Cenário 46
Figura 3.1: Exemplo de Texto de Caso de Uso 50
Figura 3.2: Diagramas de Casos de Uso 51
Figura 3.3: Associação de Extensão 54
Figura 4.1: Diagrama de Classes 58
Figura 4.2: Diagrama de Classes com Navegabilidades 63
Figura 5.1: Diagrama de Seqüência 72
Figura 5.2: Processos Concorrentes e Ativações 74
Figura 5.3: Diagrama de Seqüência: Verificação de Falha 75
Figura 5.4: Diagrama de Colaboração com Numeração Simples 76
Figura 5.5: Diagrama de Colaboração com Numeração Decimal 77
Figura 5.6: Cartão Classe-Responsabilidade-Colaboração (CRC) 79
Figura 6.1: Diagrama de Classes da Estrutura
de Composição de Grupo 82
Figura 6.2: Diagrama de Objetos Mostrando Exemplo
de Instâncias de Grupo 83
Figura 6.3: Notação de Escopo de Classe 83
Figura 6.4: Classificação Múltipla 84
Figura 6.5: Classificação Dinâmica 85
1
Introdução
O Que é UML?
UML (Unified Modeling Language) é a sucessora da onda de métodos de análise e
projeto orientado a objetos (OOA & D) que surgiu no final dos anos oitenta e no início
dos anos noventa. Mais especificamente, ela unifica os métodos de Booch,
Rumbaugh (OMT) e Jacobson, mas o seu alcance é bem maior. UML passou por um
processo de padronização pela OMG (Object Management Group) e é agora um
padrão OMG.
UML é chamada de linguagem de modelagem; não é um método. A maioria dos
métodos consiste, pelo menos em princípio, de uma linguagem de modelagem e de
um processo. A linguagem de modelagem é a notação (principalmente gráfica)
utilizada por métodos para expressar projetos. O processo é a sugestão de quais
passos a serem seguidos na elaboração de um projeto.
A descrição dos processos em muitos livros de metodologias é um pouco incompleta.
Alem disso, acredito que a maioria das pessoas quando diz que está utilizando um
método usa a linguagem de modelagem, mas raramente segue o processo. Portanto,
em vários aspectos, a linguagem de modelagem é a parte mais importante do
método. Ela é certamente a parte-chave para a comunicação. Se você quer discutir o
seu projeto com alguém, vocês têm que compreender a linguagem de modelagem,
nao o processo que vocês utilizaram para desenvolver o projeto.
Os três amigos também desenvolveram um processo unificado, que eles chamam
RUP (Rational Unified Process). Você não precisa utilizar RUP para usar UML - eles são
distintamente separados. Entretanto, neste livro, abordo um pouco do processo, de
modo a colocar as técnicas de linguagem de modelagem em contexto. Nesta
discussão, uso os passos elementares e os termos da RUP, mas o texto nao é a
descrição de RUP. Utilizo muitos processos diferentes, dependendo
INTRODUÇÃO
do meu cliente e do tipo de software que estou construindo. Embora acredite que
uma linguagem de modelagem-padrão é valiosa, não vejo a mesma necessidade
para o processo-padrão: ainda que alguma harmonização de vocabulário poderia ser
útil.
Como Chegamos Até Aqui
Na década de oitenta, os objetos começaram a sair dos laboratórios de pesquisa e a
dar seus primeiros passos em direção ao mundo “real”. Smaiitaik estabilizou uma
plataforma que as pessoas pudessem usar, e C++ surgiu.
Como muitos desenvolvimentos em softzvare, objetos foram guiados por linguagens
de programação. Muitas pessoas se perguntavam como métodos de projeto se
encaixariam em um mundo orientado a objetos. Métodos de projeto tornaram-se
muito populares em desenvolvimentos industriais nas décadas de setenta e oitenta.
Muitos acreditavam que técnicas para auxiliar as pessoas a fazerem uma boa análise
e projeto eram também muito importantes para desenvolvimento orientado a
objetos.
Os livros essenciais sobre métodos de análise e projeto orientado a objetos
surgiram entre 1988 e 1992:
• Sally Shlaer e Steve Mellor escreveram dois livros (1989 e 1991) sobre análise e
projeto; o material desses livros gerou o seu enfoque de projeto
Recursivo (1997).
• Peter Coad e Ed Yourdon também escreveram livros que estenderam a leve
introdução de Coad orientada a protótipos para métodos. Veja Coad
e Yourdon (1991 a e 1991 b), Coad e Nicola (1993), e Coad et ai. (1995).
• Da comunidade de Smalltalk em Portland, Oregon, sugeriu CRD (Responsibility-
Driven Design) (Wirfs - Brock et ai. 1990) e cartões CRC
(Class-Responsibility-Collaboration) (Beck e Cunningham, 1989).
• Grady Booch fez muitos trabalhos para Rational Software desenvolvendo sistemas
com Ada. Seus livros apresentam vários exemplos (e os melhores cartoons no mundo
de livros de métodos). Veja Booch (1994 e 1996).
• um Rumbaugh liderou uma equipe nos laboratórios de pesquisa da General Electric,
que produziu um livro muito popular do método chamado de OMT (Object Modeling
Technique) veja Rumbaugh et ai. (1991) e Rumbaugh (1996).
• Jim OdelI baseou seus livros (escritos com James Martin) na sua longa experiência
com sistemas de informação comerciais e Engenharia da Informação. O resultado foi
o livro mais conceitual entre estes. Veja Martin e Odell (1994).
• Ivar Jacobson escreveu seus livros sobre suas experiências com sistemas de
chaveamento de telefones para Ericsson e introduziu o conceito de
casos de uso no seu primeiro livro. Veja Jacobson (1992 e 1995).
Quando me preparava para viajar para Portland para a conferência OOPSLA em 1994,
o mercado de métodos estava bastante dividido e competitivo. Cada um dos autores
mencionados acima estava, então, liderando informalmente um gru
22 r INTRODUÇÃO
Notações_e Metamodelos
No seu estado atual, UML define uma notação e um metamodelo.
A notação é a coisa gráfica que você vê nos modelos; ela é a sintaxe da linguagem
de modelagem. Por exemplo, a notação de diagrama de classes define
como itens e conceitos são representados: classe, associação e multiplicidade.
Certamente, isso leva a questão do que queremos dizer exatamente com uma
associação ou multiplicidade ou mesmo uma classe. O uso comum sugere algumas
definições informais, mas algumas pessoas querem mais rigor.
A idéia de linguagem de especificação e projeto mais rigorosa prevalece mais no
campo de métodos formais. Em tais técnicas, projetos e especificações são
representados usando alguns derivativos de cálculos predicativos. Tais definições são
matematicamente rigorosas, não permitindo ambigüidade. Entretanto, o valor dessas
definições não é de forma alguma universal. Mesmo que você possa provar que um
programa satisfaz uma especificação matemática, não há maneira de provar que a
especificação matemática atinja realmente os requisitos reais do sistema.
Projetar envolve a observação de assuntos-chave no desenvolvimento. Métodos
formais freqüentemente levam a paralisação, com tantos detalhes menores Além
disso, métodos formais são difíceis de entender e manipular, freqüentemente mais
difíceis de lidar do que linguagens de programação. E você nem mesmo pode
executá-los.
A maioria das metodologias 00 tem pouco rigor; suas notações apelam para intuição
em vez de definição formal. Em geral, isso parece não ter causado muito estrago.
Estas metodologias podem ser informais, mas muitas pessoas as consideram muito
úteis - e é a utilidade que interessa.
No entanto, as pessoas que trabalham com metodologias 00 estão procurando
maneiras para melhorar o rigor das metodologias, sem sacrificar as suas utilidades.
Uma maneira de fazer isso é definir um metamodelo: um diagrama, geralmente um
diagrama de classes, que define a notação.
A Figura 1-1 é uma pequena parte de um metamodelo UML que mostra a relação
entre associações e generalização. (Este trecho aparece somente para dar uma idéia
do que são os metamodelos. Não vou nem tentar explicá-lo).
Quanto o metamodelo afeta o usuário da notação de modelagem? Bem, ele ajuda a
definir o que é um modelo bem formado - isto é, um modelo sintaticamente correto.
Como tal, um usuário em potencial de uma metodologia deve compreender o
metamodelo. Entretanto, a maioria dos usuários de metodologias não necessita de
tal compreensão para obter algum valor na utilização da notação UML.
Não sou muito rigoroso nesse livro; ao contrário, sigo o caminho das metodologias
tradicionais e apelo para a intuição do leitor. Se você quiser um maior rigor, você
deve ler com atenção o manual de referência ou a documentação oficial de UML.
Quão exigente você deve ser em relação à adesão à linguagem de modelagem? Isso
depende da razão pela qual a está utilizando. Se você tem uma ferramenta CASE que
gera código, deve aderir a interpretação da linguagem de modelagem da ferramenta
CASE para obter código aceitável. Se estiver usando os diagramas para fins de
comunicação, você tem um pouco mais de liberdade.
24 ‘ INTRODUÇÃO
y
Comunicaçao
A razão fundamental para usar UML envolve comunicação. Uso UML porque ela
permite comunicar certos conceitos mais claramente do que as linguagens
alternativas. A linguagem natural é muito imprecisa e ela se complica quando se
trata de conceitos mais complexos. O código é preciso, mas muito detalhado. Então,
utilizo UML quando quero uma certa precisão, mas não quero me perder em
detalhes. Isso não significa evitar detalhes, ao contrário, utilizo UML para salientar
detalhes importantes.
Como consultor, em um projeto complexo, tenho, freqüentemente, que dar uma
olhada rápida e parecer inteligente em um curto período de tempo. Neste caso,
considero UML inestimável porque ela me ajuda a obter uma visão geral do sistema.
Uma análise do diagrama de classes pode rapidamente me dizer que tipos de
abstrações estão presentes no sistema e onde estão as partes questionáveis que
precisam ser mais bem trabalhadas. A medida que examino mais profundamente,
quero ver como as classes colaboram, então peço para ver os diagramas de
interação que ilustram comportamentos-chave do sistema.
Se isso é útil para mim como um estranho, tem a mesma utilidade para a equipe
permanente do projeto. É fácil de esquecer detalhes em um grande projeto. Com
uma pequena escolha de diagramas disponíveis, você pode achar o seu caminho no
software com muito mais facilidade.
Para construir um mapa de um grande sistema, use diagramas de pacotes (veja
Capítulo 7) que mostram as principais partes do sistema e suas interdependências.
Para cada pacote, você pode, então, desenhar um diagrama de classes. Quando você
desenha um diagrama de classes neste contexto, assuma uma perspectiva de
especificação. E importante esconder implementações neste tipo de trabalho. Você
deve também desenhar diagramas de interação para as interações-chaves do
pacote.
Use padrões (veja página 44) para descrever as idéias importantes do sistema que
aparecem em múltiplos lugares. Padrões ajudam a explicar por que o seu projeto se
apresenta da maneira como é. Também é útil descrever alternativas de projetos que
você rejeitou e porquê. Sempre acabo esquecendo por que este tipo de decisão foi
tomada.
Ao seguir estas orientações, você obtém resultados mais rapidamente. Uma parte
importante da comunicação está em salientar as coisas importantes a serem ditas.
Você não precisa mostrar cada característica de cada classe; você deve, ao contrário,
mostrar os detalhes importantes. Um documento breve comunica muito melhor que
um longo; a arte está em saber o que deixar de fora.
Aprendendo 00
Muitas pessoas falam da curva de aprendizado associada com 00 - a maldita troca de
paradigma. Em alguns aspectos, a mudança para 00 é fácil. Em outros aspectos, há
um número de obstáculos em relação ao trabalho com objetos, particularmente a sua
utilização da melhor maneira possível.
Não é o caso se é difícil aprender como programar uma linguagem 00. O problema é
que leva tempo para aprender a explorar as vantagens que as linguagens orientadas
a objetos fornecem. Tom Hadfield diz bem: Linguagens de Objeto permitem
vantagem , não as fornecem. Para utilizar estas vantagens, você tem que fazer a
maldita troca de paradigma. (Assegure-se de estar sentado nesta hora!)
As técnicas de UML foram até certo ponto projetadas para ajudar as pessoas
a fazer boa 00, mas técnicas diferentes têm vantagens diferentes.
Uma das técnicas mais valiosas para o aprendizado de 00 são os cartões CRC (veja
página 78), que não são parte da UML, embora eles possam e devam ser usados com
ela. Eles foram projetados primeiramente para ensinar as pessoas como trabalhar
com objetos. Como tal, os cartões CRC são deliberadamente diferentes das técnicas
de projeto tradicionais. Suas ênfases nas responsabilidades e suas ausências de
notações complexas tornam os cartões CRC particularmente valiosos.
Diagramas de interação (veja Capítulo 5) são muito úteis porque eles tornam a
estrutura da mensagem bastante explícita e, portanto, são úteis para salientar
projetos muito centralizados, nos quais um objeto faz todo trabalho.
Diagramas de classes (veja Capítulos 4 e 6), usados para ilustrar modelos de classe,
são bons e ruins para o aprendizado de objetos. Modelos de classe são bastante
semelhantes a modelos de dados; muitos dos princípios que fazem um bom modelo
de dados também fazem um bom modelo de classe. O maior problema na utilização
de diagrama de classes é que é fácil desenvolver um modelo de classe que seja
orientado a dados, em vez de ser orientado à responsabilidade.
o conceito de padrões (veja página 44) tornou-se vital para o aprendizado de 00
porque a utilização de padrões faz com que você se concentre em bons projetos 00 e
aprenda seguindo um exemplo. Uma vez que você tiver aprendido técnicas de
modelagem básicas, tais como simples diagrama de classes e diagramas de
interação, está na hora de começar a
observar os padrões.
• Outra técnica importante é o desenvolvimento iterativo (veja Capítulo 2). Esta
técnica não o ajuda a aprender 00 diretamente, mas ela é a chave
para uma exploração efetiva da 00. Se você faz desenvolvimento iterativo desde o
começo, você aprenderá, no contexto, o tipo certo de processo e começará a ver
porque os projetistas sugerem que as coisas sejam feitas do modo como eles o
fazem.
Quando você começa a utilizar uma técnica, tende a fazê-lo seguindo pelo livro.
Minha recomendação é começar com as notações simples as quais abordo aqui,
particularmente com diagrama de classes. À medida que se sente familiarizado, você
pode utilizar idéias mais avançadas de acordo com as suas necessidades. Você
também pode achar que quer estender a metodologia.
INTRODUÇÃO
Comunicação com Especialistas de Domínio
Um dos maiores desafios no desenvolvimento é o da construçãq do sistema certo
- um sistema que preencha as necessidades dos usuários a um preço razoável. Isso
se torna mais difícil porque, com o nosso jargão, temos que nos comunicar com
nossos usuários que têm o seu próprio, e ainda mais secreto, jargão. (Fiz muito
trabalho na área de saúde, e nesta área o jargão nem mesmo é em inglês!). Atingir
boa comunicação, com boa compreensão do mundo dos usuários, é a chave para
desenvolver um bom software.
A técnica óbvia a ser utilizada para fazer isso são casos de uso (veja Capítulo 3). Um
caso de uso é um instantâneo de um aspecto do nosso sistema. A soma de todos
esses casos de uso é a imagem externa do nosso sistema, que segue um longo
caminho para explicar o que o sistema fará.
Uma boa coleção de casos de uso é central para compreender o que seu usuário
quer. Esses casos também apresentam um bom veículo para planejamento de
projeto, porque eles controlam o desenvolvimento iterativo que é em si só uma
técnica valiosa, uma vez que fornece umfeedback regular para os usuários sobre o
que está acontecendo com o software.
Embora casos de uso ajudem na comunicação sobre coisas superficiais, também é
crucial olhar as coisas mais profundas. Isso envolve aprender como os seus
especialistas do domínio entendem o mundo deles.
Diagramas de classes (veja Capítulos 4 e 6) podem ser extremamente valiosos aqui,
desde que você os desenhe a partir de uma perspectiva conceitual. Em outras
palavras, você deve tratar cada classe como um conceito na mente de usuário. Os
diagramas de classes que você desenha não são, então, diagramas de dados ou de
classes, mas diagramas da linguagem de seus usuários.
Considero diagramas de atividades (veja Capítulo 9) muito úteis em casos nos quais
os processos de workflow são uma parte importante do mundo dos usuários. Uma
vez que suportam processos paralelos, os diagramas de atividades podem ajudar a
nos livrar de seqüências desnecessárias de processos. O modo de elaborar estes
diagramas desenfatiza as ligações com classes, o que pode ser, mais tarde, um
problema no projeto, mas torna-se uma vantagem durante este estágio mais
conceitual do processo de desenvolvimento.
Procurando Mais Informação
Este livro não é uma referência completa e definitiva para UML, muito menos para
análise e projeto 00. 1-lá muito material publicado e muitas coisas que valem a pena
ser lidas. A medida que discutir tópicos individuais, mencionarei outros livros aos
quais você deve recorrer para informações mais profundas a respeito das idéias de
UML e de OOA&D de modo geral.
Certamente, o seu primeiro passo além deste livro sobre UML deve ser os
livros dos três amigos.
2
Um Esboço de Processo
de Desenvolvimento
UML é uma linguagem de modelagem, não uma metodologia. UML não tem noções
do processo, que é uma parte importante de uma metodologia.
O título deste livro é UML Essencial, portanto eu poderia seguramente ignorar o
processo. Entretanto, não acredito que as técnicas de modelagem tenham algum
sentido sem que se saiba como elas se encaixam no processo. E por isso que eu
decidi discutir primeiro o processo, então você pode ver como um desenvolvimento
orientado a objeto funciona. Eu o chamo esboço de processo porque em vez de
tentar entrar em muitos detalhes, ofereço apenas o suficiente para dar uma noção da
maneira típica na qual um projeto que usa estas técnicas funciona.
Os três amigos desenvolveram um processo unificado chamado Rational
Unfied Process (anteriormante chamado Objectory). Este processo é descrito no
livro de processo dos amigos (Jacobson, Booch e Rumbaugh, 1999).
À medida que discutir o esboço de projeto, utilizarei a terminologia e o esboço do
esquema do Rational Unified Process. (Tenho de usar algo, e este esquema me
parece bom). Entretanto, não tentei descrever o Rational Unified Process; isto está
além do escopo deste livro. Ao invés disto, descrevo um processo leve e sem
formalidade que é consistente com o processo da Rational. Para maiores detalhes
sobre o Rational Unified Process, você deve recorrer ao livro de processo dos três
amigos ou dar uma olhada na visão geral de Kruchten (1999).
Embora o Rational Unified Process contenha detalhes sobre que tipos de modelo
devem ser desenvolvidos nos vários estágios do processo, não entrarei em tais
detalhes. Também não especificarei tarefas a serem realizadas, resultados a serem
entregues e papéis a serem desempenhados. Minha terminologia é mais solta do que
a utilizada no Rational Unified Process - este é o preço que se paga por uma leve
descrição.
Qualquer que seja a discussão do processo, não esqueça que você pode utilizar
qualquer processo com UML. UML é independente de processo. Você deve
Mostrei iterações na fase de construção, mas não nas outras fases. Na verdade, você
pode ter iterações em todas as fases, e é sempre uma boa idéia fazer isso em um
ciclo maior. A construção é a fase-chave para iteração.
Esta é a visão de alto nível. Agora, aprofundaremos os detalhes a fim de ter
informação suficiente para ver onde as técnicas discutidas mais adiante neste livro
se encaixam no esquema maior. Fazendo isso, abordarei um pouco estas técnicas e
quando usá-las. Você pode considerar isso um pouco confuso se você ainda não
estiver familiarizado com as técnicas. Se este for o caso, pule estas partes e volte a
elas mais tarde.
Concepção
A concepção pode ter várias formas. Para alguns projetos, um bate-papo na hora do
café: “Vamos colocar nosso catálogo de serviços na rede”. Para projetos maiores,
pode ser um estudo da viabilidade completo, o que leva meses.
Durante a concepção, você elabora o plano de negócio do projeto - a grosso modo
quanto custará e o quanto terá de retorno. Você também pode necessitar ter uma
idéia do escopo do projeto. Você pode necessitar fazer alguma análise inicial para ter
uma idéia do tamanho do projeto.
Não tenho a tendência de fazer a concepção muito importante. A concepção deve ser
um trabalho de poucos dias para considerar se vale a pena fazer uma investigação
mais profunda de alguns meses durante a elaboração (veja a próxima seção). A esta
altura, o patrocinador do projeto concorda apenas na realização de uma séria análise
do projeto.
Elaboração
Então, você tem o “vá em frente” para iniciar o projeto. Neste estágio, você tem
tipicamente, somente uma vaga idéia dos requisitos. Por exemplo, você pode ser
capaz de dizer:
Construiremos um sistema de próxima gera çao de suporte ao consumidor
para a Watts Galore Utility Company. Pretendemos usar tecnologia orientada
a objetos para construir um sistema mais flexível que é mais ori
E
UM IiSBOÇO DE f’ROCESSo DE DESENVOLVIMENTO
entado ao consumidor - especificamente, uni sistema que suportard o
faturamento integrado do cliente.
Evidentemente, nosso documento de requisitos será mais extenso do que isso, mas
na verdade, ele não pode dizer muito mais.
A esta altura, você quer ter uma melhor compreensão do problema.
• O que é que você realmente irá construir?
• Como você irá construí-lo?
Quando decidir quais itens examinar nesta fase, você precisa levar em consideração,
acima de tudo, os riscos do seu projeto. Que coisas poderiam descarrilhá-lo? Quanto
maior o risco, mais atenção você tem que dar a ele.
Na minha experiência, os riscos podem ser utilmente classificados em quatro
categorias:
1. Riscos de requisitos. Quais são os requisitos do sistema? O grande perigo é você
construir um outro sistema, um sistema que não faz o que o cliente
necessita.
2. Riscos tecnológicos. Quais são os riscos tecnológicos que você tem que enfrentar?
Você está selecionando a tecnologia que realmente fará o serviço
por você? As várias partes se encaixarão?
3. Riscos de habilidades. Você pode encontrar o pessoal e especialistas de que
necessita?
4. Riscos políticos. Existem forças políticas que podem interferir e afetar seriamente
o seu projeto?
O seu caso pode ter mais riscos, mas os riscos que se encaixam nestas quatros
categorias estão quase sempre presentes.
Lidando com Riscos de Requisitos
Requisitos são importantes e são onde as técnicas de LJML podem ser postas mais
obviamente em uso. O ponto inicial são os casos de uso. Casos de uso dirigem todo o
processo de desenvolvimento.
Abordarei em detalhes casos de uso no Capítulo 3; aqui simplesmente farei uma
breve descrição do que são casos de uso.
Um caso de uso é uma interação típica que o usuário tem com o sistema a fim de
atingir um objetivo. Imagine um processador de palavras típico. Um caso de uso seria
“faça a verificação ortográfica”; outro caso seria “crie um índice para o documento”.
O elemento-chave para casos de uso é que cada um indica uma função que o usuário
pode entender e que tem valor para o usuário. Conversando sobre casos de uso, um
desenvolvedor pode responder com detalhes específicos. Por exemplo:
Levarei dois meses para fazer afunção de índice para você. Também tenho um caso
de uso para dar suporte à verificação gramatical; acredito
Não POSSO oferecer conselhos sérios nesta área, porque não sou um político
corporativo experiente. Recomendo que você encontre alguém habilitado para lhe
aconselhar.
Meu princípio básico é que a elaboração leve em torno de um quinto do tempo total
do projeto. Dois fatores são indicadores-chave de que a elaboração foi completada.
1
UML ESSENCIAL: UM BREVE GUIA PARA A LINGUAGEM-PADRÃO DE MODELAGEM DE
OBJETOS
Os desenvolvedores dividem, então, os casos de uso de acordo com o risco
de desenvolvimento. Por exemplo, “alto risco” seria usado para algo que fosse
muito difícil de ser feito, poderia ter um grande impacto no projeto do sistema, ou
é simplesmente mal compreendido.
Depois que isso é feito, os desenvolvedores devem estimar o tempo que cada
caso de uso necessitará, em pessoas/semana. Na realização desta estimativa,
considere
que você necessita fazer análise, projeto, codificação, teste de unidade,
integração e documentação. Também admita que você tenha um desenvolvedor
altamente comprometido, sem outras tarefas ou distrações (acrescentaremos um
fator de carga mais tarde).
Uma vez que suas estimativas estejam prontas, você pode avaliar se está
pronto para fazer o plano. Observe os casos de uso de alto risco. Se muito tempo
do projeto estiver vinculado a estes casos de uso, você deve fazer mais elaboração.
O próximo passo é determinar a duração de suas iterações. Você quer iterações
de duração fixa para todo o projeto, de modo que possa ter um ritmo regular para
o resultado de cada iteração. Uma iteração deve ser longa o suficiente, para você
fazer um punhado de casos de uso. Para Smalltalk, isso pode ser umas duas ou
três semanas; para C++, pode ser algo como seis ou oito semanas.
Agora, você pode considerar o quanto de trabalho você tem para cada iteração.
Observe que você terá feito estas estimativas, considerando um desenvolvedor
que não se distraia. Obviamente, isso nunca é o caso, portanto levo em conta o
coeficiente de carga que é a diferença entre o tempo ideal e o tempo real. Você
deve medir este fator comparando estimativas com os fatos reais.
Agora, você pode calcular com que rapidez pode prosseguir, o que chamo de
velocidade do projeto. Isso é o quanto de desenvolvimento você pode fazer em
uma iteração. Você calcula isso tomando o seu número de desenvolvedores,
multiplicando
pela duração da iteração e, então, dividindo o resultado pelo coeficiente
de carga. Por exemplo, dados 8 desenvolvedores, uma iteração de três semanas
de duração, e um coeficiente de carga de 2, você teria um ideal de 12 semanas de
desenvolvimento (8*3*1/2) de trabalho por iteração.
Some o tempo para todos os casos de uso, divida-o pelo trabalho por iteração,
e acrescente um para sorte. O resultado é a sua primeira estimativa de quantas
iterações você necessitará para o seu projeto.
O próximo passo é assinalar casos de uso para iterações.
Os casos de uso que têm alta prioridade e/ou riscos de desenvolviment
devem ser tratados na fase inicial. Não adie o risco até o final! Você poderá neces
sitar dividir casos de uso grandes e, provavelmente, revisará as estimativas dE
casos de uso devido à ordem em que você estiver fazendo as coisas. Você pode tei
menos trabalho para fazer do que o possível na iteração, mas não deve programai
mais do que o seu esforço permitir.
Para a transição, determine de 10% a 35% do tempo de construção para ajus
te e empacotamento para a entrega final (use um número alto se você foi
inexperiente com ajuste e empacotamento no seu ambiente atual).
Adicione, então, um fator de contingência: de 10% a 20% do tempo de cons
trução, dependendo de quão arriscadas as coisas possam parecer. Acrescente este
fator no final da fase de transição. Você deve planejar a entrega sem usar temp
3
Casos de Uso
Casos de uso são um fenômeno interessante. Por muito tempo, em desenvolvimento
tradicional e orientado a objetos, as pessoas usavam interações típicas para ajudá-
las a compreender os requisitos do sistema. Entretanto, estes cenários eram tratados
muito informalmente - sempre feitos, mas raramente documentados. Ivar Jacobson é
bem conhecido por mudar isso com sua metodologia de objetos e livro associado (o
seu primeiro).
Jacobson levantou a visibilidade de casos de uso até que eles se tornaram um
elemento primário no desenvolvimento e no planejamento do projeto. Desde que
o seu livro foi publicado (1992), a comunidade de objetos adotou casos de uso de
maneira extraordinária. A minha prática certamente melhorou desde que comecei
a utilizar casos de uso desta maneira.
Então, o que é um caso de uso?
Não responderei diretamente a esta pergunta. Em vez disso, vou contornála primeiro
descrevendo cenários.
Um cenário é uma seqüência de passos que descreve uma interação entre
um usuário e um sistema. Portanto, se você tem uma loja on-line baseada na web
(loja virtual), podemos ter um cenário de Compra de um Produto que diria:
O cliente navega no catdlogo de itens e adiciona itens desejados à sua
cesta de compras. Quando o cliente deseja pagar, descreve o endereço de
entrega, fornece as informações do cartao de crédito e confirma a venda.
O sistema verifica a autoriza çao do cartão de crédito e confirma a venda
imediatamente e envia um e-mau logo a seguir.
Este cenário é uma alternativa que pode acontecer. No entanto, a autorização do
cartão de crédito pode falhar, o que seria um outro cenário.
Um caso de uso, então, é um conjunto de cenários amarrados por um objetivo
comum de um usuário. Na situação do exemplo, você teria um caso de uso de
CASOS DE Uso
Compras com uma compra bem-sucedida e uma falha na autorização de cartão de
crédito como dois cenários do caso de uso. Outros caminhos alternativos para
o caso de uso seriam cenários adicionais. Freqüentemente, casos de uso têm um
caso comum em que tudo dá certo, e muitas alternativas que podem incluir situações
de erro e também maneiras alternativas das coisas darem certo.
Um formato simples para capturar um caso de uso consiste na descrição de
seu cenário primário como uma seqüência de passos numerados e as alternativas
como variações naquela seqüência, como mostra a Figura 3-1.
Compra de um Produto
1. O cliente navega pelo catálogo e seleciona itens a serem comprados
2. O cliente vai para o check out
3. O cliente preenche o formulário da remessa (endereço de entrega; opção de
entrega imediata ou em três dias)
4. O sistema apresenta a informação total do faturamento incluindo a remessa, os
preços e os impostos
5. O cliente preenche a informação de cartão de crédito
6. O sistema autoriza a compra
7. O sistema confirma imediatamente a venda
8. O sistema manda uma confirmação para o cliente por e-mail
Alternativa: Falha na Autorização
No item 6, o sistema falha na autorização da compra por crédito
Permite ao cliente resubmeter a informação do cartão de crédito e tentar novamente
Alternativa: Cliente Regular
3a. O sistema mostra a informação atual da remessa, a informação de preço e os
quatro últimos dígitos do cartão de crédito
3b. O cliente pode aceitar ou escrever por cima destas opções por omissão Retorna
para o cenário principal no item 6
Figura 3-1: Exemplo de Texto de Caso de Uso
Existe muita variação no que diz respeito a como você pode descrever os conteúdos
de um caso de uso; UML não especifica padrão algum. Você também pode
acrescentar seções adicionais. Por exemplo, você pode acrescentar uma linha par2
pré-condições, que são coisas que devem ser verdadeiras quando o caso de pode
iniciar. Dê uma olhada nos vários livros que falam em casos de uso e acrescente os
elementos que lhe parecem razoáveis. Não inclua tudo, apenas aquilo que pareça
realmente ajudar.
Um exemplo importante disso é como você divide os casos de uso. Considere outro
cenário para uma compra on-line, uma na qual o comprador já é conhecido do
sistema como cliente regular. Algumas pessoas considerariam isso como sendo um
terceiro cenário, enquanto outras fariam disso um caso de uso separa do. Você
também pode usar uma das associações entre caso de uso, que descre rei mais
adiante.
Nza3
Sistema de Contabilidade
«include»
Comercial
Generalização
include
Vendedor
CASOS DE Uso
Atores
Um ator é um papel que um usuário desempenha em relação ao sistema. Existe
quatro atores na Figura 3-2:0 Gerente Comercial, O Analista Comercial, O Vend dor, e
O Sistema de Contabilidade. (Sim, eu sei que seria melhor usar a palav “papel”, mas,
aparentemente, houve um erro na tradução do sueco).
Certamente, existirão muitos analistas comerciais na dada organização, m no que diz
respeito ao sistema, todos desempenham o mesmo papel. Um usuár também pode
desempenhar mais de um papel. Por exemplo, um analista comc cial mais experiente
pode desempenhar o papel de Gerente de Negócio e també ser um analista
comercial regular; um Analista Comercial também pode ser u Vendedor. Quando você
lidar com atores, é importante pensar nos papéis em v de pensar nas pessoas ou em
cargos.
Os atores desempenham os casos de uso. Um único ator pode desempenh
muitos casos de uso; um caso de uso pode ter reciprocamente vários atores d
sempenhando-o. -
Na prática, considero que os atores são mais úteis quando se está proponc os casos
de uso. Em face de um grande sistema, freqüentemente pode ser difí propor uma
lista de casos de uso. Nestas situações, é mais fácil chegar primeiro lista de atores, e,
então, tentar estabelecer os casos de uso para cada ator.
Os atores não precisam ser humanos, embora sejam representados como b necos
humanos nos diagramas de caso de uso. Um ator também pode ser u sistema
externo que necessita de alguma informação do sistema atual. Na Figu 3-2, podemos
ver a necessidade de atualizar as contas para o Sistema de Contal lidade.
Existem diversas variações no que as pessoas mostram como atores. Alg mas
pessoas mostram cada sistema externo ou agente humano no diagrama caso de uso;
outras preferem mostrar o ativador do caso de uso. Prefiro expor agente que obtém
valor do caso de uso, o qual algumas pessoas chamam de at básico.
Entretanto, não levo isso muito longe. Contento-me em ver o sistema de coi
tabilidade obtendo valor, sem tentar identificar o agente humano que obtém valor do
sistema de contabilidade - isso transmitiria modelagem ao próprio sist ma de
contabilidade. Dito isto, você deve sempre contrapor casos de uso co:
atores do sistema, descubra quais são os objetivos reais do usuário e conside
maneiras alternativas para atingir stes objetivos.
Quando estou trabalhando com atores e casos de uso, não me preocupo mui sobre
qual é a associação exata entre eles. Na maioria das vezes, estou realmen
interessado nos casos de uso; os agentes são simplesmente um meio de chegar 1 A
medida que tenho todos os casos de uso, não me preocupo com os detalhes
d( agentes.
Existem algumas situações nas quais vale a pena descobrir os agentes ma
tarde.
• O sistema pode precisar configuração para vários tipos de usuários. Ne te caso,
cada tipo de usuário é um ator e os casos de uso lhe mostram
que cada ator precisa fazer.
CASOS DE Uso
base, O caso de uso especializado pode sobre-escrever qualquer parte do caso de
uso-base, embora deva ainda satisfazer o mesmo objetivo essencial do usuário.
Uma terceira associação, que não mostrei na Figura 3-2, é chamada de extensão.
Essencialmente, ela é semelhante à generalização mas possui mais regras. Com esta
construção, o caso de uso estendido pode acrescentar comportamento para o caso
de uso-base, mas este tipo de caso deve declarar certos “pontos de extensão”, e o
caso de uso de extensão pode acrescentar comportamento adicional somente
naqueles pontos de extensão. (Veja Figura 3-3).
Comprar um Produto\ ponto de extensão
(info. de pagamento, info. de entrega)
Figura 3-3: Associação de Extensão
Um caso de uso pode ter vários pontos de extensão, e um caso de uso de extensão
pode aumentar um ou mais destes pontos de extensão. Você indica quais deles são
estendidos na linha entre os casos de uso no diagrama.
Tanto a generalização como a extensão permitem que você divida um caso de uso.
Durante a elaboração, geralmente divido um caso de uso que esteja ficando muito
complicado. Faço a divisão durante o estágio de construção se eu achar que não
posso construir todo um caso de uso em uma iteração. Quando divido, gosto de
fazer, primeiro, o caso normal e, posteriormente, as variações.
Aplique as seguintes regras:
• Use inclusão quando você estiver se repetindo em dois ou mais casos de uso
separados e você deseja evitar a repetição.
• Use generalização quando você estiver descrevendo uma variação em
comportamento normal e você deseja descrevê-la sem muito rigor.
• Use extensão quando você çstiver descrevendo uma variação em comportamento
normal e deseja utilizar a forma mais controlada, explicando os
pontos de extensão no caso de uso-base.
Casos de Uso do Negócio e Casos de Uso do Sistema
Um problema comum que pode acontecer com casos de uso é que, concentrandose
na interação entre um usuário e o sistema, você pode negligenciar situações nas
quais uma mudança no processo de negócio pode ser a melhor maneira de lidar com
o problema.
CASOS DE Uso
Onde Encontrar Mais Informação
Um bom livro curto sobre casos de uso é o de Schneider e Winters (1998). A sua
edição atual usa as associações de UML 1.1 -inclusão e extensão- mas ele permanece
sendo o melhor livro que já vi no que diz respeito à aplicação de casos de uso. Minha
outra recomendação favorita éo conjunto de ensaios de Alistair Cockburn no
endereço da Web: <http://members.aol.com/acockburn>.
O primeiro livro de Ivar Jacobson (1994) é o que deu início a tudo, mas ele está um
pouco ultrapassado hoje em dia, O livro seguinte de Jacobson (1995) ainda é útil pela
sua ênfase em casos de uso de negócio.
4
Diagramas de Classes:
Os Elementos Básicos
A técnica de diagrama de classes tornou-se realmente central nas metodologias
orientadas a objetos. Praticamente, cada metodologia incluiu algumas variações
nesta técnica.
O diagrama de classes não é somente amplamente usado, mas também o
receptáculo para o maior escopo de conceitos de modelagem. Embora os elementos
básicos sejam necessários para todos, os conceitos avançados são utilizados com
menos freqüência. Portanto, dividi a minha exposição sobre diagrama de classes em
duas partes: a básica (este capítulo) e a avançada (veja Capítulo 6).
Um diagrama de classes descreve os tipos de objetos no sistema e os vários
tipos de relacionamento estático que existem entre eles. Há dois tipos principais
de relacionamento estático:
• associações (por exemplo, um cliente pode alugar vários vídeos)
• subtipos (uma enfermeira é um tipo de pessoa)
Diagramas de classes também mostram atributos e operações de uma classe e as
restrições à maneira com que os objetos são conectados.
A Figura 4-1 mostra um diagrama de classes típico.
J
{classedeCrédito()
==‘ruim”}
Multiplicidade:
opcional
Pedido
dataRecebida éPré-pago número:String preço: Money
expedir()
encerrar()
Cliente
nome
endereço
classedeCrédito() :String
Navegabilidade
Cliente Pessoal
Cliente Corporativo
nomedecontato classedecrédito limitedecrédito
aviso()
faturamensal(lnterger)
#cartãodeCrédito
linha de Item
*
rep.de venda ••1 Empregado
Linha de Pedido
quantidade: integer preço: Money
estáSatisfeito: Boolean
--fduto
5
Diagramas de Interação
Diagramas de interação são modelos que descrevem como grupos de objetos
colaboram em algum comportamento.
Tipicamente, um diagrama de interação captura o comportamento de um
único caso de uso. O diagrama mostra vários objetos e as mensagens que são
passadas entre estes objetos em um caso de uso.
Ilustrarei o enfoque com um simples caso de uso que exibe o seguinte
comportamento:
• Uma janela de Entrada de Pedido envia uma mensagem “preparar” para um
Pedido.
• O Pedido, então, envia “preparar” para cada Linha de Pedido do Pedido.
• Cada Linha do Pedido verifica o item de Estoque dado.
- Se esta verificação retornar “verdadeira”, a Linha de Pedido subtrai a quantidade
apropriada do estoque e cria um item de entrega.
- Se a quantidade de Estoque caiu abaixo do nível de pedido, este item de Estoque
solicita uma ordem de reposição.
Existem dois tipos de diagramas de interação: diagramas de seqüência e diagramas
de colaboração.
DIAGRAMAS DE INTERAÇÃO
Diagramas de Seqüência
Em um diagrama de seqüência, um objeto é mostrado como uma caixa na
parte superior de uma linha tracejada vertical (veja Figura 5-1).
uma Janela de P dd uma Linha um tem de
[rada de Pedido 1e 1 O de Pedido Estoque
Objeto
prepare O
* prepare O
temEstoque:= verificar o
Condição
precisaReposiçâo:
precisaRepor ()
Autochamada
Remoção
Criação
DIAGRAMAS DE INTERAÇÃO
Mensagem Assíncrona
new
Ativação
Autochamada
Figura 5-2: Processos Concorrentes e Ativações
por uma verificação particular. Este processo facilitaria acrescentar diferentes
processos de verificação, porque cada verificador é chamado de maneira assíncrona
e procede em paralelo.
Quando um Verificador de Transação termina, ele notifica o Coordenador de
Transação. O coordenador olha para ver se todos os verificadores retornaram. Se não
o fizeram, o coordenador não faz nada. Se todos eles retornaram e se todos foram
bem-sucedidos, como neste caso, o coordenador notifica a Transação que tudo está
bem.
As meias cabeças de flecha indicam uma mensagem assíncrona. Uma mensagem
assíncrona não bloqueia o chamador, de modo que ele pode continuar o
seu próprio processo. Uma mensagem assíncrona pode fazer uma de três coisas:
1. Criar um novo Thread (de execução), caso no qual ele liga-se ao topo de uma
ativação
2. Criar um novo objeto
3. Comunicar-se com um Thread que já está funcionando.
sejaVálida
tudo
realizado?
objeto se autodestrói
new
Quando __
uma transação uma Transação é criada...
DIAC,RAMAS DE INTERAÇÃO
Diagramas de Colaboração
A segunda forma de diagrama de interação é o diagrama de colaboração.
Dentro de um diagrama de colaboração, os objetos são mostrados como ícones.
Como em um diagrama de seqüência, flechas indicam as mensagens enviadas
dentro de um dado caso de uso. Desta vez, entretanto, a seqüência é indicada pela
numeração das mensagens.
A numeração de mensagem torna mais difícil ver a seqüência do que a colocação das
linhas de mensagem de cima para baixo na página. Por outro lado, o layout espacial
permite que você mostre outras coisas mais facilmente. Você pode mostrar como os
objetos são ligados entre si e utilizar o layout de diagramas de classes ou de pacotes
para esboçar colaborações entre objetos.
Você pode usar um dos diversos esquemas de numeração para diagramas
de colaboração. O mais simples é ilustrado na Figura 5-4. Outro enfoque envolve
um esquema de numeração decimal, visto na Figura 5-5.
[:Janela rad_ Objeto
4 1: prepare() Mensagem
jfdido 1 Número de Sequência
2*[para todas as linhas 5: precisaReposição:=precisaRepo
de pedido]:prepare()
3: temEstoque := verificar() Autodelegaçao
4: [temEstoque] := remover()
linha Macallan:Linha de Pedido estoque acaan:
6: [precisaReposição]: new
1 7: [temEstoque]: new
tem de Entrega
[ : tem de Reposição
Número de Seqüência
de pedido]:prepare()
DIAGRAMAS DE INTERAÇAO
grama de seqüência porque gosto da ênfase que ele dá à seqüência; é fácil ver a
ordem que as coisas acontecem. Outros preferem diagrama de colaboração porque
podem usar o layout para indicar como os objetos são estaticamente conectados.
Uma das características principais de qualquer forma de um diagrama de interação é
sua simplicidade. Você pode ver facilmente as mensagens observando o diagrama.
Entretanto, se você tentar representar algo além de um processo seqüencial único
sem muito comportamento condicional ou iterativo, a técnica deixa de funcionar tão
bem.
Um dos problemas com diagramas de interação é que seu uso pode ser inadequado
na exploração de alternativas. Ao experimentar alternativas, você tem muito trabalho
apagando e refazendo diagramas. Como resultado, acredito que cartões CRC (veja o
box abaixo) são muito úteis para exploração de comportamento.
Cartões CRC
No final da década de oitenta, um dos maiores centros de tecnologia de objetos
estava nos laboratórios de pesquisa da Tektronix, Portland, Oregon. Estes laboratórios
tinham alguns dos mais importantes usuários de Smalltalk, e muitas idéias-chave
sobre tecnologia de objetos foram desenvolvidas lá. Dois renomados programadores
de Smalltalk que trabalhavam lá eram Ward Cunningham e Kent Beck.
Cunningham e Beck estavam e estão preocupados em como ensinar o profundo
conhecimento de Smalltalk que eles adquiriram. Da questão de como ensinar objetos
surgiu a simples técnica de cartões Class-ResponsibiityCollaboration (CRC).
Em vez de utilizar diagramas para desenvolver modelos, como a maioria dos
metodologistas fazia, Ward representava classes em cartões de índice 4” x 6”. Em
vez de indicar atributos e métodos nos cartões, ele escrevia responsabilidades.
Então, o que é uma responsabilidade? E uma descrição de alto nível do propósito de
uma classe. A idéia é tentar fugir de uma descrição de dados e processo e, em vez
disso, capturar o propósito da classe em poucas sentenças. A escolha de um cartão é
deliberada. Você não pode escrever mais do que cabe em seu exíguo espaço. (veja
Figura 5-6).
O segundo C refere-se aos colaboradores. Estes representam as outras classes com
as quais esta classe precisa trabalhar. Isto dá alguma idéia das
ligações entre classes - ainda de alto nível.
Um dos maiores benefícios dos cartões CRC é que eles encorajam animadas
discussões entre os desenvolvedores. Quando você está trabalhando com um caso
de uso para ver como as classes o implementarão, os diagramas de interação deste
capítulo podem ser lentos de se projetar. Freqüentemente, você precisa considerar
alternativas, e com diagramas, perde-se muito tempo apagando e refazendo as
alternativas. Com cartões
DIAGRAMAS DE IN1EKAÇAO
Muitas pessoas salientam a importância de desempenhar papéis; cada
pessoa de uma equipe desempenha o papel de uma ou mais classes. Nunca
vi Ward ou Kent fazerem isso, e acho que isso atrapalha.
Onde Encontrar Mais Informação
Infelizmente, Cunnigham e Beck nunca escreveram um livro sobre CRC, mas você
pode encontrar seu trabalho original (Beck e Cunnigham, 1989) na web
(<http://c2.com/docloopsla89/paper.html>). No geral, o livro que melhor descreve
esta técnica - e, na verdade, a noção completa sobre o uso de responsabilidades - é
Wirfs-Brock (1990). Este é um livro relativamente antigo pelos padrões 00, mas ele
amadureceu bem.
Quando Utilizar Diagramas de Interação
Você deve utilizar diagramas de interação quando quiser observar o comportamento
de vários objetos dentro de um único caso de uso. Esses diagramas dE interação são
bons para mostrar as colaborações entre objetos; eles não são tãc bons para uma
definição precisa de comportamento.
Se você quer observar o comportamento de um simples objeto através dE muitos
casos de uso, use um diagrama de estados (veja Capítulo 8). Se você quei observar o
comportamento através de muitos casos de uso ou de muitas trilhas dc execução
(threads), considere um diagrama de atividades (veja Capítulo 9).
Diagramas de Classes:
Conceitos Avançados
Estereótipos
1 pai
Você pode dizer que os elementos da Figura 6-3 são instâncias porque os nomes
estão sublinhados. Cada nome assume a forma nome de instância: nome de classe.
As duas partes do nome são opcionais, então John e :Person são nomes legais. Você
pode, então, mostrar valores para atributos e ligações, como na Figura 6-2.
Você também pode considerar um diagrama de objetos como um diagrama
de colaboração sem mensagens.
Operações e Atributos com Escopo de Classe
UML se refere a uma operação ou a um atributo que se aplica a uma classe, em vez
de uma instância, como tendo escopo de classe. Isso equivale aos membros estáticos
em C++ ou Java e às variáveis e método de classe em Smalltalk. As propriedades do
escopo de Classe são sublinhadas em um diagrama de classes (veja Figura 6-3).
83/
Escopo de
Instância
Pedido
obterNúmero
obterPróximoNúmeroNovo
Escopo de Classe
Figura 6-3: Notação de Escopo de Classe
Discriminador
Homem
compIeto}
Uma vez que a Figura 6-8 ilustra um modelo de especificação, ela não afirma qw
Contas não contêm campos para guardar saldos; tal cache pode bem estar presen te,
mas ele é escondido dos clientes da classe Conta.
Posso ilustrar como elementos derivados indicam restrições com a classt
hamada Período de Tempo (veja Figura 6-9)
componentes {hierarchy}
Resumo de Conta
Nota
Observe o seguinte.
Período de Tempo
início:Data
fim:Data
/duração:Quantidade
Figura 6-9: Classe Período de Tempo
Se isso é um diagrama de especificação, embora ele sugira que início efim estejam
armazenados e que a duração seja calculada, um programador pode, na verdade,
implementar esta classe de qualquer maneira que mantenha o comportamento
externo. Por exemplo, é perfeitamente aceitável armazenar início e duração e
calcularfi n.
Em diagramas de implementação, valores derivados são valiosos para campos de
anotação que são usados como cache por razões de desempenho. Marcando-os e
registrando a derivação do cache, é mais fácil ver explicitamente o que o cache esta
fazendo. Freqüentemente reforço isso no código utilizando a palavra “cache” no
nome (por exemplo, Cachesaldo).
Em diagramas conceituais, uso marcadores derivados para lembrar-me onde
estas derivações existem e para confirmar com os especialistas do domínio que
existem. Elas podem ser associadas aos seus usos em diagramas de especificação.
Interfaces e Classes Abstratas
Uma das grandes qualidades do desenvolvimento orientado a objetos é que você
pode variar as interfaces de classes, independentemente da implantação. Muito da
força do desenvolvimento orientado a objetos vem desta propriedade. Entretanto,
poucas pessoas fazem bom uso disso.
As linguagens de programação usam uma construção única, a classe, que contém
tanto a interface quanto a implementação. Quando você faz subclassificação, você
herda as duas. Raramente, faz-se uso de interface como uma construção separada, o
que é uma pena.
Uma interface pura, como em Java, é uma classe sem implementação e, portanto,
tem declarações de operações mas não corpos de métodos e não tem campos. As
interfaces são, freqüentemente, declaradas através de classes abstratas. Tais classes
podem oferecer alguma implementacão. mas, com freqüência, elas
A Figura 6-13 mostra uma maneira de representar a associação entre a classe Pedido
e a classe Linha de Pedido usando um qualificador. O qualificador diz que, em
conexão com um Pedido, pode haver uma Linha de Pedido para cada instância de
Produto.
Conceitualmente, este exemplo indica que você não pode ter duas Linhas de Pedido
dentro de um Pedido para o mesmo Produto. A partir de uma perspectiva de
especificação, esta associação qualificada indicaria uma interface ao longo das linhas
de
Class Pedido {
Public LinhadePedido obterLinha_de_Item
(Produto umProduto)
Public void adicionarLinha_de_Item
(Number quantidade,Produto paraProduto);
Isso significa que todo acesso para uma dada Linha de Item requer um Produto como
argumento. A multiplicidade 1 indicaria que deve haver uma Linha de Item para cada
Produto; * indicaria que você pode ter múltiplas Linhas de Pedido por Produto, mas o
acesso às Linhas de Item ainda está indexada por Produto.
A partir de uma perspectiva de implementação, isto sugere o uso de um
arranjo associativo ou uma estrutura de dados semelhante para conter as linhas
de pedido.
Class Pedido {
Private Map _Linha_de_Item;
da.
o..1
linha de tem
[odo: escopodeDataj
Figura 6-15: Promovendo uma Classe de Associação para uma Classe Plena
Emprego
período:escopodeDatas
Pessoa * * riIidade
Competência
nível
Figura 6-16: Sutilezas de Classes de Associação
Isso é um mecanismo de tipagem derivado porque você não tem que definir um tipo
para o parâmetro; o compilador deriva se a amarração é viável, examinando o código
fonte do modelo. Esta propriedade é central para o uso de classes parametrizadas na
biblioteca de gabaritos-padrão de C++ (STL); estas classes também podem ser
usadas para outros truques interessantes.
O uso de classes parametrizadas tem repercussões — por exemplo, elas podem
causar um excesso considerável de código em C++. Raramente, utilizo classes
parametrizadas em modelagem conceitual, na maioria das vezes porque elas são
usadas principalmente para coleções, que são indicadas por associações (Um caso
em que as uso é no padrão range (escopo); veja Fowler 1997). Utilizo classes
parametrizadas nas perspectivas de modelagem para implementação e
especificação, somente se elas são sustentadas pela linguagem que estou usando.
Visibilidade
Devo confessar ter uma certa ansiedade sobre esta seção.
A visibilidade é um daqueles assuntos que é simples em princípio, mas tem
complexas sutilezas. A idéia básica é que qualquer classe tem elementos públicos
Pacotes e Colaborações
Uma das questões mais antigas nas metodologias de software é: como você quebra
um sistema grande em sistemas pequenos? Fazemos esta pergunta porque à medida
que os sistemas crescem, se torna difícil compreendê-los, bem como as mudanças
que neles fazemos.
Métodos estruturados usam decomposição funcional, no qual todo o sistema foi
mapeado como uma função e quebrado em sub-subfunções, que foram
posteriormente quebradas em sub-subfunções e assim por diante. As funções eram
como os casos de uso em um sistema orientado a objeto no qual as funções
representavam algo que o sistema fazia como um todo.
Aquela era uma época em que o processo e os dados eram separados. Então, além
da decomposição funcional, havia também a estrutura de dados. Isso assumiria um
segundo plano, embora algumas técnicas de Engenharia de Informação agrupassem
registros de dados em áreas de interesse e produzissem matrizes para mostrar como
as funções e os registros de dados interagiam.
E deste ponto de vista que vemos a maior mudança que a orientação a objetos tem
trazido. A separação entre processo e dados já era, a decomposição funcional já era,
mas a velha questão ainda continua.
Uma idéia é agrupar as classes em unidades de nível mais alto. Esta idéia,
aplicada de forma bastante livre, aparece em muitas metodologias orientadas a
objetos. Em UML, este mecanismo de agrupamento é chamado pacote (package).
Pacotes
A idéia de um pacote pode ser aplicada a qualquer elemento do modelo, não
somente a classes. Sem alguma heurística para agrupar as classes, o agrupamento
se torna arbitrário. A dependência é a heurística que considero mais útil e mais
enfatizada em UML.
PACOTES E COLABORAÇÕES
Uso o termo diagrama de pacotes para um diagrama que mostra pacotes de classes
e as dependências entre eles. De modo restrito, um diagrama de pacotes é
simplesmente um diagrama de classes que mostra apenas pacotes e dependências.
Utilizo muito estes diagramas, por isso os chamo de diagramas de pacotes, mas você
deve lembrar que este é um termo meu, não um nome oficial de diagramas da UML.
Existe dependência entre dois elementos se mudanças na definição de um elemento
possam causar mudanças ao outro. Nas classes, as dependências existem por várias
razões: uma classe manda uma mensagem para outra; uma classe tem outra como
parte de seus dados; uma classe menciona uma outra como um parâmetro para uma
operação. Se uma classe muda a sua interface, qualquer mensagem que ela mande
pode não ser mais válida.
De forma ideal, apenas mudanças na interface de uma classe devem afetar qualquer
outra. A arte de projetar em grande escala envolve minimização de dependências;
desta forma, os efeitos da mudança são reduzidos, e o sistema requer menos esforço
para mudar.
UML tem muitas variedades de dependência, cada uma com estereótipos e
semântica particulares. Considero mais fácil começar com a dependência
nãoestereotipada e usar as dependências mais particulares somente se necessário.
Na Figura 7-1, temos domínios de classe que modelam o negócio, agrupados em dois
pacotes: Pedidos e Clientes. Os dois pacotes são parte de um pacote
de domínio completo. A aplicação Processamento de Pedido tem dependências
Aplicação
Processamento de Pedido
Aplicação
L Mala Direta
/
Pacote
Dependência
Quantidade
Valo rMonetário
EscopodeDatas
Como princípio básico, é uma boa idéia remover ciclos da estrutura de dependência.
Não estou convencido de que você deva remover todos os ciclos, mas deve
certamente, minimizá-los. Se você os tem, tente contê-los dentro de um pacote de
contenção maior. Na prática, tenho visto casos nos quais não fui capaz de evitar
ciclos entre pacotes de domínio, mas tento eliminá-los das interações entre o
domínio e as interfaces externas. Generalização de pacote é um elemento-chave
para isso.
Em um sistema existente, as dependências podem ser inferidas através da
observação das classes. Isto é uma tarefa muito útil de ser realizada por uma
ferramenta. Considero isso útil se estou tentando melhorar a estrutura de um
sistema existcnte. Um primeiro passo útil é dividir as classes em pacotes e analisar
as dependências entre os pacotes. Depois, refatoro para reduzir as dependências.
Colaborações
dedor:Grupo
Ufa propaganda
submete proposta
comprador71
L
comDrador 2:
submete proposta
‘\ios / y
Aceita proposta
proposta
N
“ _\
— — Venda
PACOTES E LOIABORAÇOES
Venda
/
/
\
\
E1
— — — comprador, vendedor, lote, oferta
L
\
/
comprador
comprador, vendedor
lote N
8
Diagramas de Estados
Diagramas de estados são uma técnica conhecida para descrever o comportamento
de um sistema. Eles descrevem todos os estados possíveis em que um objeto
particular pode estar e como o estado do objeto muda como resultado de eventos
que o atingem. Na maioria das técnicas de 00, os diagramas de estados são
projetados para uma classe única para mostrar o comportamento ao longo do tempo
de vida de um único objeto.
Existem várias formas de diagrama de estados, cada uma com uma pequena
diferença semântica. O estilo UML é baseado no statechart de David Harel (1987).
A Figura 8-1 mostra um diagrama de estados UML para um pedido no sistema de
processamento de pedidos que apresentei anteriormente neste livro. O diagrama
indica os vários estados de um pedido.
Começamos no ponto inicial e mostramos uma transição inicial para o estado de
“Verificando”. Esta transição é rotulada “/ obter primeiro item”.
A sintaxe para um rótulo de transição tem três partes, sendo todas opcionais:
Evento LGuarda] /Açí7o. Neste caso, temos somente a ação “obter primeiro item”.
Uma vez realizada esta ação, entramos no estado de “verificando”. Este estado tem
uma atividade associada a ele, indicada por um rótulo com a sintaxe do/atividade.
Neste caso, a atividade é chamada “verificar item”.
Observe que usei os termos “ação” para a transição e “atividade” para o estado.
Embora os dois sejam processos, implementados tipicamente por algum método no
Pedido, eles são tratados diferentemente. Ações são associadas com transições e são
consideradas como processos de curta duração e não podendo ser interrompidos.
Atividades são associadas a estados e podem levar mais tempo. Uma atividade pode
ser interrompida por algum evento.
início
Observe que a definição de “curta duração” depende do tipo de sistema que você
está produzindo. Dentro de um restrito sistema de tempo real, “curta duração” pode
significar dentro de poucas instruções da máquina; para sistemas de informações
regulares, “curta duração” pode significar menos que alguns segundos.
Quando a transição não tem nenhum evento dentro do seu rótulo, isso significa que a
transição ocorre logo que qualquer atividade associada a um dado estado é
completada. Neste caso, isso significa tão logo tenhamos completado o estado
verificando. Três transições surgiram do estado Verificando. Todos as três têm
somente guardas nos seus rótulos. Um guarda é uma condição lógica que retornará
somente “verdadeiro” ou “falso”. Uma transição guardada ocorre somente se o
guarda for “verdade”.
Somente uma transição pode ocorrer de um dado estado, de modo que pretendemos
que os guardas sejam mutuamente exclusivos para qualquer evento.
Na Figura 8-1, examinamos três condições:
Autotransição
Estado
‘ 115y
v
)ce
lo
Is.
tataira
reto.
tin Fíqii
• Dia grama d Fstados sem Superestados
DIAGRAMAS DE ESTADOS
Mesmo com apenas três transições duplicadas, a Figura 8-2 parece um tanto
carregada. A Figura 8-3 esclarece muito as coisas, e se forem necessárias mudanças
mais tarde, é mais difícil esquecer o evento cancelamento.
Nos exemplos, mostrei uma atividade dentro de um estado, indicado por
um texto na forma de do/atividade. Você também pode indicar outras coisas dentro
de um estado.
Se um estado responde a um evento com uma ação que não causa uma transição,
você pode mostrar isso colocando um texto na forma Nome-do-evento/Nomeda-a çao
na caixa de estado.
Nome do Superestado
Ativado
__________ [Todos os itens verificados && __________
. todos os itens disponíveis]
1’ Verificando f’ Expedindo ‘
do / verificar j do / iniciar 1
> tem entrega
a Ç’ ,‘
‘o
Aguardando
cancelado
CanceIado
• Um evento pode ser gerado após um dado período de tempo. Isso é indicado com a
palavra-chave after. Por exemplo, você pode dizer after (20
minutes).
4
nos.
Um evento pode ser gerado quando uma condição se torna verdadeira. Você mostra
isso com a palavra-chave when. Por exemplo, você poderia ter when (tem perature
>100 degrees).
Existem também dois eventos especiais, entrada (entry) e saída (exit). Qualquer
ação que estiver marcada como ligada ao evento entry é executada sempre que se
chegar a um dado estado, através de uma transição. A ação associada ao evento exit
é executada sempre que o estado for deixado através de uma transição. Se você
tiver uma transição que volta ao mesmo estado (isto é chamado autotransição) com
uma ação, a ação de saída será executada primeiro, depois a ação de transição e,
finalmente, a ação de entrada. Se um estado tiver também uma atividade associada,
esta atividade é executada depois da ação de entrada.
‘ 117 r
v
9
Diagramas de Atividades
Diagramas de atividades são uma das partes mais inesperadas de UML.
Ao contrário da maioria das outras técnicas da UML, diagramas de atividades não
têm origens claras nos trabalhos anteriores dos três amigos. Ao contrário,
•o diagrama de atividades combina idéias de várias técnicas: os diagramas de
eventos de Jim Odeli, técnicas de modelagem de estado SDL, modelagem de
workflow e redes de Petri. Estes diagramas são particularmente úteis em conexão
com workflow e na descrição de comportamento que tem muito processamento em
paralelo.
Descreverei diagramas de atividades com mais detalhes do que eles realmente
merecem neste pequeno livro. A razão é que eles são uma das áreas menos
compreendidas de UML, e os livros atuais sobre UML são particularmente omissos em
sua discussão.
Na Figura 9-1, o símbolo central é o estado de atividade, ou simplesmente atividade.
Uma atividade é um estado de estar fazendo algo: tanto um processo de mundo real,
tal como datilografar uma carta, ou a execução de uma rotina de software, tal como
um método em uma classe.
O diagrama de atividades descreve a seqüê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 diagrama
de estados.
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 transição “else” deverá ser usada se todos os outros guardas do desvio
forem falsos.
\1y
DIAGRAMAS DE ATIVIDADES
Início
Separação
Atividade
Guarda
[pedido urgente]
Desvio
Intercalação
Junção
Fim
DIAGRAMAS DE ATIVIDADES
DIAGI<AMAs DE P,JIVIDADES
Execução
Setor Financeiro
34
lo
Diagramas Físicos
UML fornece dois tipos de diagramas físicos: diagramas de utilização e diagramas de
componentes.
Diagramas de Utilização
Um diagrama de utilização (deploynient diagram) mostra as relaçoes tisicas entre
componentes de software e hardzvare no sistema implementado. Um diagrama de
utilização é um bom lugar para mostrar como componentes e objetos são acessados
se movem em um sistema distribuído.
Cada nó no diagrama de utilização representa algum tipo de unidade computacional
— na maioria dos casos, uma parte do hardware. O hardzvare pode ser um simples
dispositivo ou sensor, ou poderia ser um computador de grande porte.
A Figura 10-1 mostra um PC conectado a um servidor UNIX através de TCP / IP.
Conexões entre nós mostram o caminho de comunicação sobre o qual o sistema vai
interagir.
Diagramas de Componentes
Um diagrama de componentes mostra os vários componentes em um sistema e suas
dependências.
DIAGRAMAS Físicos
11
UML e Programação
Até agora, eu abordei muito notação. Uma questão importante ainda não ficou clara:
como um programador usa realmente UML como parte de seu difícil trabalho diário
de programação? Responderei a esta pergunta abordando sobre como utilizo UML
quando estou programando, mesmo em pequena escala. Não entrarei em muitos
detalhes, mas espero poder lhe dar uma noção do que você pode fazer com UML.
Imaginemos um sistema de computador projetado para reunir informações
sobre pacientes para um hospital.
Vários profissionais da área da saúde fazem observações sobre os pacientes. Este
sistema simples permitirá que alguém obtenha informações sobre estas observações
e acrescente observações adicionais. Como este é um livro curto, passarei por cima
de ligações de bancos de dados e TU e considerarei somente as classes básicas de
domínio.
Este é um exemplo tão simples que tem apenas um caso de uso, chamado
“revisar e acrescentar informações de pacientes”. Podemos elaborar este caso com
alguns cenários.
• Pedir a última medida de batimento cardíaco de um paciente.
• Pedir o tipo sangüíneo de um paciente.
• Atualizar o nível de consciência do paciente.
• Atualizar o batimento cardíaco do paciente. O sistema marca o batimento como
lento, normal ou rápido, de acordo com os escopos definidos no
sistema.
Meu primeiro passo no processo é sugerir um modelo conceitual que descreva os
modelos neste domínio. Neste estágio, não estou pensando em como o software
trabalhará, somente em como organizar os conceitos que estão nas mentes de
médicos e enfermeiras. Iniciarei com um modelo baseado em vários pa
UML E PROGRAMÇÃO
drões de análise de Fowler (1997): Observação (Observation), Quantidade (Quantity),
Escopo (Range) e Fenômeno com Escopo (Pheno,nenon with range).
Observação de Pacientes: Modelo de Domínio
A Figura 11-1 mostra um modelo de domínio inicial para o nosso sistema.
Tipo de Fenômeno Fenômeno
_____________________________________ escopo:Escopo
o..1 *
11
**
Medição Categoria
valor:Quantidade _________________________ estáPresente:Booleano
medição [ _______ ________ _________________
*
Paciente
Quantidade Escopo
________________ Unidade ________________
valor:Número superior:Magnitude
unidade:Unidade inferior:Magnitude
Figura 11-1: Modelo de Domínio de Observação de Pacientes
UML E PROGRAMÇÃO
A Figura 11-3 mostra que podemos fazer uma Observação servir tanto para uma
Medição quanto para uma Categoria, determinando que a Medição de “90
batimentos por minuto” também pode ser uma Categoria, cujo Fenômeno associado
é “batimento cardíaco rápido”.
Neste estágio, detive-me apenas em representação de conceitos; não me concentrei
muito em comportamento. Não faço sempre isso, mas parece um bom ponto de
partida para um problema que diz respeito, principalmente, ao manuseio de
informações.
No momento, ainda estou discutindo conceitos de observação de paciente, bem
como estaria fazendo com um médico ou enfermeira. (Na verdade, isso é o que
acontece na vida real. Os modelos conceituais foram construídos por dois médicos e
por uma enfermeira, com a minha ajuda.) Para fazer a mudança para
\138 7’
v
UML E PROGRAMÇÃO
A Figura 11-5 mostra operações que acrescentei ao Paciente para refletir o meu
pensamento.
Não coloque esforço demasiado em propor operações se elas não forem, neste
momento, óbvias, O mais importante a perseguir logo é uma descrição de
responsabilidade. Se você pode moldá-la na forma de uma operação, muito bem, se
não, uma frase curta é útil na descrição de uma responsabilidade.
A atualização do nível de consciência dos pacientes envolve a criação de uma nova
Observação do Fenômeno apropriado. Para fazer isso, o usuário do sistema,
normalmente, gostaria de escolher um Fenômeno de uma lista de opções (pop-up).
Podemos tratar isso acessando os objetos-fenômeno associados a um particular Tipo
de Fenômeno, uma vez que esta responsabilidade está implícita na associação entre
ambos.
Para adicionar uma medição, devemos criar uma nova Medição. Uma complicação
adicional surge do fato que a Medição necessita olhar para verificar se
UML E 1ROGRAMÇAO
new 7 1
— uma Medição batimento cardíaco: batimento cardíaco: batimento cardíaco:
— de Fenomeno lento: Fenômeno normal: Fenômeno
achar Fenômeno()
inclui (Quantidade)
falso
inclui (Quantidade)
verdadeiro
E-
batimento
cardíaco normal
Figura 11 6: Diagrama de Seqüência de Observação de Pacientes
Passando para Código
Agora, podemos analisar algum código para implementação das idéias que discuti
nas seções anteriores. Começarei com Tipo de Fenômeno e fenômeno, uma vez que
eles têm muita ligação.
A primeira coisa a considerar é a associação entre eles: A interface deve permitir
navegabilidade nas duas direções? Neste caso, acredito que sim, porque as
duas direções serão valiosas e são conceitos muito ligados. Na verdade, também
UML E 1ROGRAMÇÃO
private TipoDeFenomeno _tipo;
private EscopoDeQuantidade _escopo;
package observações;
public class ObjetoDoDominio f
public ObjetoDoDominio (String nome) {
_nome = nome;
public ObjetoDoDominio ()
public String nome()
return _nome;
public String toString() {
return _nome;
protected String _nome = “sem nome”
Eu acrescentei uma classe ObjetoDoDominio, que conhece nomes e que realizará
qualquer outro comportamento que eu queira que todas as classes de domínio
tenham.
Eu agora posso criar o código destes objetos ao longo das seguintes linhas:
TipoDeFenomeno sexo =
new TipoDeFenomeno( “sexo”) .persist O;
String[] sexos = {“masculino”, “feminino”};
sexo. criaFenomenos (sexos);
A operação persistO armazena o TipoDeFenomeno em um objeto persistente de
modo que eu possa recuperá-lo mais tarde com o método estático getO. Eu vou pular
estes detalhes.
A seguir, eu prepararei o código para acrescentar observações a um paciente. Aqui
eu não quero que todas as associações sejam bidirecionais. Eu ligarei o paciente a
uma coleção de observações, uma vez que elas são usadas no contexto de um
paciente.
public class Observaçao extends ObjetoDoDominio {
public Observaçao (Fenomeno fenomenoRelevante,
Paciente paciente, Date quandoObservado) {
fenomeno= fenomenoRelevante;
Paciente . adicionaObservaçoes (this);
_quandoObservado = quandoObservado;
{
}
return nuil;
Após criar observações, eu preciso ser capaz de achar os Fenômenos mais recen tes.
Class Paciente
public Fenomeno fenomenoDeTipo
(TipoDeFenomeno tipoDeFenomeno)
w
li UML tSSENC1AL: UM bREVE U,UIA PARA A LINGUAGEM—I’ADRÃO DE MODELAGEM
DE OBJETOS
Agora nós podemos examinar o acréscimo de comportamento para medições.
Primeiro, vejamos a definição de classe Medição e o seu construtor.
public class Mediçao extends Observaçao
public Mediçao (Quantidade quantidade,
TipoDeFenomeno tipoDeFenomeno,
Paciente paciente, Date quandoObservado) {
initialize (paciente, quandoObservado);
_quantidade quantidade;
_tipoDeFenomeno = tipoDeFenomeno
public TipoDeFenomeno tipoDeFenomeno()
return _tipoDeFenomeno;
public String toString()
return _tipoDeFenomeno ÷ “: “ + _quantidade;
private Quantidade _quantidade;
private TipoDeFenomeno _tipoDeFenomeno;
class Observaçao
protected void initalize(Paciente paciente,
Date quandoObservado) {
paciente. adicionaObservaçoes (this);
_quandoObservado = quandoObservado;
Observe que um diagrama de classes nos dá um bom começo para este
desenvolvimento.
Mais uma vez necessitamos medições mais recentes.
Class Paciente
public Quantidade ultimaQuantidadeDe (TipoDeFenomeno
valor) {
Return ((ultimaMedia(valor) == nuil) ) ?
new
QuantidadeNula() :ultimaMediçao (valor) .quantidadeO;
private Mediçao
ultimaMediçao (TipoDeFenomeno valor) {
rama if (ultimaobservaçao(valor) == nuil)
)OflhO return nuli;
rojeto if (!ult±maObservaçao(valor) . isMeasurement()
return nuli;
—--,-
UML E PRU(,KAMÇAU
return (Mediçao)ultimaObservaçao (valor)
Em ambos casos, o diagrama de classes sugere a estrutura básica, e nós
acrescentamos comportamento a ele para suportar consultas mais interessantes.
Neste estágio, nós poderíamos descrever nossa posição com o diagrama de
classes na perspectiva de especificação mostrado na Figura 11-7 (ao lado).
Observe como esse diagrama salienta a interface em relação à implementação. Eu
modelei o papel do Tipo de Fenômeno para Fenômeno como um papel qualificado
porque esta é a interface primária no Tipo de Fenômeno. De maneira semelhante, eu
mostrei Observação com um ponteiro para Tipo de Fenômeno porque a interface
existe ali, embora Medição seja a única classe com um ponteiro direto para
Fenômeno.
Observando esse diagrama, nós podemos ver que a única, diferença entre Medição e
Observação é que Medição tem uma quantidade. Nós poderíamos remover
completamente a classe Medição do modelo de especificação, permitindo que
qualquer observação uma quantidade (potencialmente nula).
De outro modo nós poderíamos ter uma classe separada Medição, que teria campos
de quantidade e tipo de fenômeno, mas ninguém de fora do pacote estaria ciente da
existência destas classes. Nós precisaríamos acrescentar métodos Factory (Gamma,
Helm, Jonhson e Vlissides 1995) seja em Observação ou no Paciente para permitir
que a classe apropriada seja criada.
Eu deixarei esta mudança como um exercício para o leitor e passarei imediatamente
para a questão de atribuir um Fenômeno automaticamente para uma
Medição.
A Figura 11-7 ilustra o processo geral.
Primeiro, nós precisamos acrescentar uma chamada de metodokgia para o
construtor de Medição.
Class Mediçao
public Mediçao (Quantidade quantidade,
TipoDeFenomeno tipoDeFenomeno,
Paciente paciente, Date quandoobservado)
initialize (paciente, quandoObservado);
_quantidade = quantidade;
_tipoDeFenomeno = tipoDeFenomeno;
_fenomeno = determinaFenomenoPara(quantidade);
Isso delega a tarefa para tipo de fenômeno.
Class Mediçao
public Fenomeno determinaFenomenoPara (Quantidade arg)
return _tipoDeFenomeno. incluirFenomeno (arg),
Isto por sua vez consulta cada fenômeno.
Class TipoDeFenomeno
public Fenomeno incluirFenomeno (Quantidade arg)
Apêndice A
Técnicas e suas Aplicações
Técnica Objetivo
Diagrama de
Mostra o layout físico dos componentes nos nós de hardware.
Utilização
Técnica
Diagrama de Interação
Diagrama de Pacotes
Padrões
Refatoração
Diagrama de Estados
Casos de Uso
Objetivo
elas.
de um bom projeto.
Apêndice B
da
que
Mudanças entre
um Versões de UML
endi
-
Quando a primeira edição deste livro apareceu nas prateleiras, UML estava na versão
1.0. Muito de UML parecia ter se estabilizado e estava no processo de
reconhecimento pela OMG. Desde então, algumas revisões têm sido feitas. Neste
apêndice, descrevo as mudanças significativas que ocorreram desde a versão 1.0 e
como estas mudanças afetam o material deste livro.
Este apêndice resume as mudanças de modo que você possa se manter atualizado
se tiver uma edição mais antiga do livro. Fiz alterações no livro para mantêlo
atualizado com as versões UML, portanto, se você tem uma versão mais antiga do
livro, ele descreve a situação na data da publicação.
Revisões de UML
O lançamento público mais antigo do que veio a ser UML era a versão 0.8 da
Metodologia Unificada. Ela foi lançada para a OOPSLA, em outubro de 1995. Ela foi
trabalho de Booch e Rumbaugh, pois Jacobson ainda não era membro da Rational
naquela época. Em 1996, a Rational lançou as versões 0.9 e 0.91 que incluíam o
trabalho de Jacobson. Depois desta última versão, eles mudaram o nome para UML.
A Rational submeteu a versão 1.0 de UML para a Força-Tarefa de Projeto e Análise da
OMG em janeiro de 1997. Subseqüentemente, a Rational combinou aquela versão da
UML com outros itens e submeteu uma proposta única para o padrão OMG em
setembro de 1997, para a versão 1.1 da UML. Esta foi adotada
1.
de
‘re jf
as)li—
te}
m )OS
sa.
ve
rna
‘ou ais
)Cies.
de,
de
ra
3ar
ia,
los
lo-
1ides»
zer que
ends»
o como
ensar
estanão
Bibliografia
assunobre
a
muito
e decim
como
necespais
co ‘ciona
Kent Beck: Smalltalk Best Pra ctice Patterns. Prentice Hail, 1996.
Kent Beck: Ext reme Programming Explained: Embrace Change. AddisonWesley,
2000.
ma Kent Beck e Ward Cunningham: “A Laboratory for Teaching ObjectOriented
Thinking.”
L. is Proceedings of OOPS7—A 89. SIGPLANNot1ces, Vol. 24, No. 10, pp. 1-6. Veja
Object plLL1na Oriented <http: / /c2.com/doc /oopsla89/paper.html>.
te, isso
threads Grady Booch: Object-Oriented Analysis and Design with Applications, 2” ed.
Addison-Wesley,
tavocê 1994.
ração
Grady Booch: Object Solutions: Managing the Object-Oriented Project. Addison-
Wesley, 1996.
e com um
Grady Booch, James Rumbaugh e Ivar Jacobson [three amigos]: The Llnified Modeling
o para Language User Guide. Addison-Wesley, 1999.
1 Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad e Michael Stal:
seu U Pattern-Oriented Software Architecture: A System of Patterns. John Wiley &
Sons, 1996.
m um
varias Peter Coad e JilI Nicola: Object-Oriented Programming. Yourdon, 1993.
e qual nbor
Peter Coad e Edward Yourdon: Object-Oriented Analysis. Yourdon, 1991a.
torres Pete
Coad e Edward Yourdon: Object-Oriented Design. Yourdon, 1991b.
idade,
espe- Peter Coad, David North e Mark Mayfield: Object Modeis: Strategies, Patterns
and Applications.
des e Prentice Hali, 1995.
Alistair Cockburn: Surviving Object-Oriented Projects. Addison-Wesley, 1998.
les em
\160/ I3WLLO(,KAFIA
Steve Cook e John Daniels: Designing Object Systenis: Object-Oriented Modeling zvith
Syntropy.
Prentice Hail, 1994.
James O. Coplien: “A Generative Development Process Pattern Language.” In Coplien
e
Schmidt, 1995, pp. 183-237.
James O. Coplien e Douglas C. Schmidt, eds.: Pattern Languages of Program Design
[PLoPD1].
Addison-Wesley, 1995.
Ward Cunningham: “EPISODES: A Pattern Language of Competitive Development.” In
Vlissides, Coplien e Kerth, 1996, pp. 371-388.
Bruce Powel Douglass: Real-Time UME. Addison-Wesley, 1998.
Martin Fowler: Analysis Patterns: Reusable Object Modeis. Addison-Wesley, 1997.
Martin Fowler: Refactoring: Improving the Design of Existing Programs. Addison-
Wesley, 1999.
Erich Gamma, Richard Heim, Ralph Johnson e John Vlissides [Gang of Four]: Design
Patterns:
Elements of Reusable Object-Oriented Software. Addison-Wesley, 1995.
Adele Goldberg and Kenneth S. Rubin: Succeeding with Objects: Decision Frameworks
for
Project Management. Addison-Wesley, 1995.
David Harel: “Statecharts: A Visual Formalism for Complex Systems.” In Science
ofComputer
Programming, Vol. 8, 1987.
Ivar Jacobson, Grady Booch e James Rumbaugh [three amigos]: The Unified Software
Development Process. Addison-Wesley, 1999.
Ivar Jacobson, Magnus Christerson, Patrik Jonsson e Gunnar Õvergaard: Object-
Oriented
Software Engineering: A Use Case Driven Approach. Addison-Wesley, 1992.
Ivar Jacobson, Maria Ericsson e Agneta Jacobson: The Object Advantage: Business
Process
Reengineering with Object Technology. Addison-Wesley, 1995.
Andrew Koenig e Barbara Moo: Ruminations on C++: A Decade of Programming
Insight and
Experience. Addison-Wesley, 1997.
Philippe Kruchten: The Rational Unfied Process: An Introduction. Addison-Wesley,
1999.
Craig Larman: Applying UML and Patterns. Prentice Hali, 1998.
James Martin e James J. Odell: Object-Oriented Methods: A Foundation (UML Edition).
Prentice
Hali, 1998.
Robert Cecil Martin: Designing Object-Oriented C++ Applications: Using the Booch
Method.
Prentice Hali, 1995.
t1BLIOGRAF1A
Steve McConnell: Rapid Development: Taning Wild Software Schedules. Microsoft
Press, 1996.
Steve McConnell: Software Project Survival Guide. Microsoft Press, 1998.
Bertrand Meyer: Object-Oriented Software Construction. Prentice Hail, 1997.
William F. Opdyke: “Refactoring Object-Oriented Frameworks.” tese de Ph.D.,
University
of Illinois at Urbana-Champaign, 1992. Veja <ftp:// st.cs.uiuc.edu/pub/papers/
refactoring/opdyke-thesis.ps.Z>.
Trygve Reenskaug: Working with Objects. Prentice Hail, 1996.
James Rumbaugh: OMT Insights. STGS Books, 1996.
James Rumbaugh, Ivar Jacobson e Grady Booch [three amigos]: The Unified Modeling
Language Reference Manual. Addison-Wesley, 1999.
James Rumbaugh, Michael Blaha, William Premerlani, Frederick Eddy e William
Lorenzen:
Object-Oriented Modeling and Design. Prentice Hali, 1991.
Geri Schneider e Jason 1’. Winters: Applying Use Cases: A Practical Guide. Addison-
Wesley,
1998.
Sally Shlaer e Stephen J. Mellor: Object-Oriented Systems Analysis: Modeling the
World in
‘r Data. Yourdon, 1989.
Sally Shlaer e Stephen J. Meilor: Object Lfecycles: Modeling the World in States.
Yourdon,
e 1991.
Sally Shlaer e Stephen J. Melior: “Recursive Design of an Application Independent
d Architecture.” IEEE Software, Vol. 14, No. 1, 1997.
John M. Vlissides, James O. Coplien e Norman L. Kerth, eds.: Pattern Languages
ofProgram
Design 2 [PLoPD2]. Addison-Wesley, 1996.
Kim Walden e Jean-Marc Nerson: Seamless Object-Oriented Software Architecture:
Anal ysis
and Design of Reliable Systems. Prentice Hail, 1995.
Jos Warmer e Anneke Kleppe: The Object Constraint Language: Precise Modeling with
UMA.
Addison-Wesley, 1998.
Rebecca Wirfs-Brock, Brian Wilkerson e Lauren Wiener: Designing Object-Oriented
Software.
Prentice Hali, 1990.
4
A
Indice
A
ação 114 atividade
agregação no diagrama de atividades 121
definição 86 no diagrama de estados 114
exemplo 86 ator
amigo 102 definição 51
apagamento 74 descobrir 52
asserção notação 51
definição 67 atributo
papel na subclasse 69 definição 64
associação notação 64
bidirecional 62 atributo derivado
como ligação permanente 64 definição 87
como responsabilidade 60 exemplo 88
de nome 64 autochamada
definição 60 definição 73
navegabilidade 62 exemplos 72, 74
unidirecional 62 autotransição 117
versos subtipos 57
associação derivada
definição 87 B
exemplo 88
associação qualificada
definição 94 l3eck, Kent 20, 38, 48, 77, 79, 159
exemplo 95 Booch, Grady ix, 19, 20, 21, 26, 129, 159,
associação unidirecional 62 160, 161
Buschmann, Frank 159
\164/ ÍNDICE
v
caixa de ativação 73
campo 64
característica 66
cartões CRC 20, 25, 43, 70, 142, 151
definição 62
exemplo 79
quando utilizar 79
usando com casos de uso 79
casos de uso 152
capturando 53
categorizando 39
definição 26,50
determinando para iterações 39
e risco de requisitos 32
e risco tecnológico 36
em diagramas de atividades 129
em diagramas de iteração 71
quando utilizar 55
teste-exemplo 50
utilizando cartões CRC 79
cenário 49
classe abstrata
comparada à interface 92
notação 89
classe de associação
definição 96
exemplo 96
promovendo para uma classe cheia 96
sutilezas 97
classe de implementação 155
classe parametrizada
definição 98
exemplos 99
Classe-Responsabilidade-Colaboração
cartões (CRC)
veja cartões CRC
classificação
definição 83
exemplos 94
tipos 83, 85
classificação dinâmica
definição 93
exemplo 86
classificação estática 85
classificação múltipla
definição 83
exemplo 84
classificação única 83
Coad, Peter 20, 159
Cockburn, Alistair 48, 56, 159
Colaboração
definição 108
parametrizada 109
quando utilizar 111
Colaboração de responsabilidade de classe
componente 133
composição
definição 86, 156
notação 86, 87
concorrência dinâmica
definição 125
notação 125
condição 73
conexão 131
Cook, Steve 59, 69, 70, 119, 160
Coplien, James 160, 161
cso de uso de negócio 55
Cunninghan, Ward 20, 43, 77, 79, 159, 160
tipos 71
diagrama de objetos
definição 82
exemplo 82
exemplos 137, 138
diagrama de seqüência 150
definição 72
exemplos 72, 74, 76, 108, 142
versus diagramas de colaboração 77
diagramas de atividades 26, 33, 44, 80, 118, 151
definição 121
exemplos 122, 126, 128
quando utilizar 127
diagramas de classes 24,25, 26,33,36,43, 44, 45, 103, 107, 147, 148, 151
definição 57
exemplos 45, 46 ,58, 63, 82, 82, 84, 86, 88, 89, 90, 91, 95, 96, 96, 98, 99, 100, 109,
110, 136, 140, 141, 149
perspectivas 59
quando utilizar 69
diagramas de estados 44, 80, 129, 152
definição 113
e diagramas de utilidade 121
exemplos 114, 115, 116, 119
quando utilizar 119
diagramas de pacote 24, 36, 43, 152
definição 103
exemplos 104, 106
quando utilizar 111
diagramas de utilização 36, 44, 151
definição 131
exemplo 132
quando utilizar 134
diagramas e casos de uso
definição 51
exemplos 51
discriminador 84
Douglass, Bruce Powel 26, 119, 160
E
Eiffel 67, 69
elemento de ligação
definição 99
exemplos 99, 100
engenharia de informação 103
escopo de classe 83
classe
INDICE
ÍNDICE
Gangue dos Quatro 45, 59, 67, 88, 105, 148, 160
generalização
definição 66
exemplos 94
usando com pacotes 107
generalização de casos de uso
definição 53
exemplo 51
quando utilizar 54
Goldberg, Adele 160
guarda
em diagramas de atividades 123
em diagramas de estados 114
inconstante 68
interface
comparada à classe abstrata 92
comparada a estereótipo de Tipo 155
pura 89
UML 82
ISE 69
iteração
determinando casos de uso 39
determinando comprimento 39
determinando número 39
elementos 30
natureza incremental 40
natureza iterativa 40
Jacobson, Ivar ix, 19, 20, 21, 26, 48, 49, 51, 73, 159, 160, 161
Johnson, Ralph 45, 160
Junção
Kain, Brad 43
Kleppe, Anneke 67, 161
Kobryn, Cris 21
Koenig, Andrew 160
Kruchten, Philippe 30, 48, 160
marcador de iteração 73
Martin, James 20, 26, 79
Martin, Robert 111, 161
McConnell, Steve 48, 161
Mellor, Steve 20, 161
mensagem assíncrona 76
merge
definição 123
exemplos 122
metamodelo
definição 22
extrato 23
método de obtenção 65
metodologia 65
metodologia de ambiente 65
metodologia de objeto 21, 29, 49
metodologia unificada 21
metodologias de fábrica 148
Meyei Bertrand 67, 69, 161
modelo de domínio
construção 33, 34
definição 33
e diagramas de atividades 125
equipe 34
linhas gerais 34
utilizando casos de uso 33
modificador 65
ÍNDICE
multiplicidade e colaborações 109
definição 60 quando utilizar 47
exemplos 58 Veja também padrões de análise
Veja também padrões de projeto
padrões de análise
Ncenário 46
definição 46
exemplo 46
navegabilidade Fenômeno com Variação 136
definição 62 Mapeamento Histórico 97
exemplos 63 Modelos de Papéis 85
tipos 62 Observação 136
Nerson, Jean-Mark 69, 161 Quantidade 136
nó 131 Variação 100, 136 e 139
nome de função 60 padrões de modelos de função 85
notação 22 padrões de projeto
notação Lollypop 91,92 Composite 88
definição 45
exemplo 45
O Fachada 105
Proxy 45
palavra-chave quando 116
objeto de referência 92 perfil 82
objeto de valor 92 perspectiva conceitual
OCL (linguagem restringida a objeto) 67 associações 60
OCL 67 associações derivadas 89
Odeil, um ix, 20, 21, 26, 83, 121, 161 associações qualificadas 95
OMG (Object Managment Group) ix, 20, atributos 64
21 atributos derivados 89
OMT definição 26, 59
veja OMT exemplo 136
OMT 19, 20 generalização 66
Opdyke, William 161 operações 65
operação quando utilizar 69
definição 64, 65 perspectiva de especificação
notação 64 associações 60
orientação 36, 37 associações derivadas 89
otimização 44 associações qualificadas 95
atributos 64, 64
atributos derivados 89
definição 59
exemplos 140, 141, 149
generalização 66
pacote 103 navegabilidade 62
padrão composite 88 operações 64
padrão de cenário 46 quando utilizar 24, 69
padrão de fachada 105 realização 91
padrão de mapeamento histórico 97 subclasse 91
padrão de observação 136 subtipagem 107
padrão de quantidade 136 perspectiva de implementação
padrão de variação 30, 136, 139 associações 61
padrão Proxy associações derivadas 89
padrões 24, 25, 27, 44, 152 associações qualificadas 95, 96
definição 45 atributos 64
INDICE
atributos derivados 89 restrição completa 85, 156
definição 59 restrição dag 93
generalização 66 restrição de bag 93
navegabilidade 62 restrição de congelamento 93, 156
operações 64 restrição de pedido 93
quando utilizar 62 restrição Hierarchy 93
perspectivas 59 restrição imutável 93
plano restrição obrigatório 156
construindo 38 restrição query 65
gerenciando 41 restrições 67
plano de implementação 39 abstrata 89, 107
pós-condição 67 bag 93
pré-condição 68 completa 85, 156
processo congelada 93, 156
definição 19 consulta 65
fases30 dag93
visão geral 30 hierarquia 93
Programação Extrema 38, 48 imutabilidade 93
projeto dirigido - responsabilidade 20 obrigatória 156
projeto por contrato 152 pedida 93
definição 67 somente leitura 93
quando utilizar 69 restrictor read only 93
projeto recursivo 20 retorno 73, 148
prototipação 35 risco
categorias 32
lidando com 32, 35, 36, 38
Q risco de habilidade
definição 32
lidando com 36
query 60, 65 risco de requisito
definição 32
lidando com 32
risco político
definição 32
lidando com 38
raia risco tecnológico
definida 125 definição 32
exemplos 128 lidando com 35
realização 90, 92 Rubin, Kenneth S. 160
redes Petry 121 Rumbaugh, Jim ix,19, 20, 21, 26, 86, 129,
Reenskaug, Traygve 109, 161 159, 160, 161
refatoração 40, 108, 146, 152 RUP (Rational unzfied process) 20, 29, 30, 33,
definição 42 48
princípios 43
relação transitiva 104
relacionamento de inclusão
definição 53 S
exemplo 51
quando utilizar 54 Scheider, eri 161
relacionamento estendido SDL 121
definição 54 seção
quando utilizar 54 definição 123
responsabilidade 60, 61, 79 exemplos 122
restrição abstrata 89, 107
Separação 123
definição 123
exemplos 122, 125
Shlaer, Sally 20, 161
sistema de caso de uso 55
softzvare de autoteste 41
software Rational 20, 21
STL 100
subclassificação 67, 69, 89, 92
substituibilidade
definição 66
e asserções 69
subtipagem 67, 100
subtipo 57
superestado 115,116
visibilidade
definição 100
dentro de C++ 101
dentro de lava 101
dentro de Smalltalk 101
visibilidade de pacotes 102
visibilidade particular
em C++ 101
- em Smalltalk 101
visibilidade protegida
em C++ 101
em Java 102
visibilidade pública 45
em C++ 101
em lava 102
em Smalltalk 101
ÍNDICE
J 33,
T
tem pia te
Veja classe parametrizada
teste 41, 111
Thread condicional 125
três amigos 20, 21, 26, 29, 121, 159, 160, 161
U
união
definição 123
exemplos 122, 125
URLs 37, 48, 69, 79, 154, 151
v
velocidade do projeto 39
w
Walden, Kim 69, 161
Warmer los 67, 161
Wirfs-Brock, Rebecca 20, 79, 111, 154
zvorkflow 26, 121, 123, 129
Y
Yourdon, Ed 20, 159
J’
Diagrama de Pacote
dependência —
Diagrama de Seqüência
eto
Diagrama de Utilização
Diagrama de Colaboração
mensagem assíncrona