Upload
ngobao
View
221
Download
0
Embed Size (px)
Citation preview
Diagrama de Classes de Projeto
Prof. Cesar Augusto Tacla
Plano
�Posição no método APOO�Projeto�Diagrama de seqüência (refinamento)�Diagrama de classe (refinamento)
Visão geral do método
� Análise de requisitos
� Análise� Refinar a descrição dos casos de uso� Levantamento das classes� Estudo da interação entre objetos
� Projeto� Refinamento do diagrama de classes� Definição do comportamento de classes� Modelo de implantação (deployement)
� Implementação� Modelo de implementação� Codificação
Posição da atividade
Resumo
Caso de uso
realizaçãoModelo de análise
Modelo de casos de uso
Classes de análise
Cenários de colaboração
Diagrama de casos de usoDescriçõesGlossárioModelo do domínio
realizaçãoClasses de projetoCenários de colaboração
Arquitetura de sofware
Modelo de projeto
PROJETO
�Classes de projeto�Operações e atributos de cada classe
�Diagramas de interação
�Arquitetura de software �Interfaces�Subsistemas
CLASSE DE ANÁLISE X PROJETO
NO PROJETO� linguagem de programação alvo �visibilidades�relações são detalhadas �operações das classes de projeto são
traduzidas de forma direta em código.
Método adotado para a atividade
�Criar realizações de casos de uso�Descrever interações e refinar diagrama
de classes�Simplificar diagramas de seqüência
utilizando subsistemas (opcional)�Descrever comportamentos associados à
persistência�Definir mecanismos de projeto (Arquiteto
de Software)
Diagrama de interação
�Na análise�considerou-se que os objetos estavam
disponíveis e persistidos
�não havia preocupação com a criação e destruição dos mesmos
�Não havia preocupação em acessá-los e associá-los a outros objetos
Diagrama de seq. análisesd análise casos de uso
:meteorologista:IUConv ersao :CtrlConv ersao :Historico :Conv ersaoCF
solicitar valor Celsius
valor Celsius?
c
c
converter valor c
guardar conversao
valor Fahrenheitmostrar valor convertido
valor Fahrenheit
sd conv erter c-f
:meteorologista
:Historico
conv:Conv ersaoCF
:IUConv ersao
:CtrlConv ersao
loop
[!FIM] solicitarCelsius() :float
Celsius?
c
c
ConversaoCF(c)
adicionar(this)
mostrar(conv.getFahr())
conv.Fahr
Diagrama de seq. projeto
salvar()
writeObject
Continuação slide anterior
Diagrama de classes de análiseclass Classes de análise (associações)
ConversaoCFCtrlConversao
Historico
IUConversao
:IUHistorico CtrlHistorico
0..10pertence
1
1 111
1 11 1
Diagrama de classes de projetoclass classes converter
«boundary»IUConversao
~ mostrar(float) : void~ solicitarCelsius() : float
«control»CtrlConv ersao
«entity»ConversaoCF
- celsius: float- Horario: Date
+ getFahr() : float
«entity»Historico
+ adicionar(ConversaoCF) : void- writeObject() : void
«interface»
Serializable1«instantiate»1 1
«instantiate»
1
1
«instantiate»
1
0..10 {ordered} 1
Exemplo: realização 2
�Conversor C > F (WEB)deployment projeto casos de uso
Serv idor WEB
Nav egador 1
Nav egador 2 Nav egador N-1
Nav egador N
«http»
«http» «http»
«http»
Diag. de seqüência parcialsd projeto casos de uso (web)
:meteorologista
«jsp page»
:IUConversao
«servlet»
:CtrlConversao
:Conv ersaoCF
pág. conversão
celsius
POST celsius
ConversaoCF(celsius)
Refinar diagrama de classes
�Dependência� Implementação de associações
Dependência
�Variável local�Parâmetro de operação (método)� Instanciação
�Atributos indicam associação
Dependência: exemplosclass Dependência
ClasseA
+ operacao(ClasseC) : void
ClasseB
ClasseC ClasseD
«local»
«parameter»«instantiate»
Implementação de associaçõesunidirecional 1:1
class Classe
ClasseA ClasseB
1 1
class ClasseA {private ClasseB objB = new ClasseB();// objB pode ser instanciado em outro local// outros atributos// métodos
}E se fosse bidirecional?
Implementação bidirecional 1:1
1.class ClasseA {2. Private ClasseB objB = new ClasseB(); // pode ser instanciado em outro local3. // outros atributos4. // métodos5.}6.class ClasseB {7. Private Classe objA = new ClasseA(); // pode ser instanciado em outro local8. // outros atributos9. // métodos10.}
Unidirecional 0..1 : 0..5
class Professor
Professor Disciplina
0..1
leciona
0..5
Unidirecional 0..1 : 0..5Implementação 1
1.class Professor {2. private Disciplina[] disciplinas = {3. new Disciplina(),4. new Disciplina(),5. new Disciplina(),6. new Disciplina(),7. New Disciplina(),8. };9.}
A instanciação pode ocorrer em outros pontos da classe
class Professor
Professor Disciplina
0..1
leciona
0..5
Unidirecional 0..1 : 0..5Implementação 2
1.class Professor {2. private Disciplina[] disciplinas = new Disciplina[5];3. public void adicionarDisciplinas(Disciplina[] disc){4. // inicializar vetor disciplinas com parâmetro disc5. }6.}
class Professor
Professor Disciplina
0..1
leciona
0..5
Multiplicidade 1:*
1.class Professor {2. private Vector<Disciplina> disciplinas = 3. new Vector<Disciplina>(5, 1);
4. public void adicionarDisciplinas(Disciplina[] disc){5. disciplinas.add(disc[0]);6. ...7. }8.}
class classes
Professor Disciplina
1 *
Bidirecional multiplicidade *:*
1.public class Projeto {2. public Vector<Pessoa> emprega;3. ...4.}5.public class Pessoa {6. public Vector<Projeto> participa;7. ...8.}
class muitos para muitos
Projeto Pessoa+emprega
0..*
+participa
0..*
Associações reflexivasclass associação reflexiv a
Professor Disciplina
1 *
+preRequisito0..*
+temPrerequisito0..*
1.public class Disciplina {2. public Vector<Disciplina> temPrerequisito;3. public Vector<Disciplina> preRequisito;4. ...5.}
Classes Associativas
class classe associativa
ProjetoPessoa
Participacao
- cargaHoraria: int- dataEntrada: Date- dataSaida: Date
+emprega
0..*
+participa
0..*
Equivale à...
Classes Associativas (2)
class classe associativ a (proj )
Projeto PessoaParticipacao
- cargaHoraria: int- dataEntrada: Date- dataSaida: Date
1
possui
0..* 1
participa
0..*
Implementação >>>>
Classes Associativas (3)
1.public class Projeto {2. public Vector<Participacao> m_Participacao;3. ...4.}5.public class Pessoa {6. public Vector<Participacao> m_Participacao;7. ...8.}9.public class Participacao {10. private int cargaHoraria;11. private Date dataEntrada;12. private Date dataSaida;13. public Projeto projeto;// se relação for bidirecional14. Public Pessoa pessoa; // se relação for bidirecional15. ...16.}
Agregação por composição
class agregação por composição
HistoricoPagsWeb URLVisitada
- URL: String0..*1
Implementação >>>
Agregação por composição (2)1.class URLVisitada {2. private String url;3.
4. URLVisitada (String url) {5. this.url = url;6. }7.}8.class Historico {9. // cria três objetos da classe URLVisitada10. private URLVisitada[] historico = { // ou coleção 11. new URLVisitada("http://www.uol.com.br"),12. new URLVisitada("http://www.terra.com.br"),13. new URLVisitada("http://www.lemonde.fr"),14. };15.…16.}
Implementação >>>
Agregação por composição (3)1.class Historico {2. private class URLVisitada {3. private String url;4. URLVisitada (String umaURL) {5. url = umaURL;6. }7. ...8. }9. private Vector<URLVisitada> historico = 10. new Vector<URLVisitada>(4, 2);11. ...12.
13.}
como private, a URLVisitada só pode ser instanciada dentro do escopo do todo
Classe aninhada
Agregação por associação
� Idem associação
Realização
«entity»Historico
+ adicionar(ConversaoCF) : void- writeObject() : void
«interface»
Serializable
«instantiate»
1
«entity»Historico
+ adicionar(ConversaoCF) : void- writeObject() : void
«interface»
Serializable
«instantiate»
1
1.public interface Serializable {2. ...3.}4.public class Histórico implements
Serializable {5. ...6.}
Subsistemas
�Comportamentos repetidos nos diagramas de seqüência podem indicar subsistemas
�Ex: autenticação, acesso a dados
Subsistemas: definição
�Composto por outros elementos �Pacotes�Classes
�Apresenta comportamento
Subsistemas: representação UMLclass subsistema
«interface»Faturamento
+ emitirFatura(Pessoa, float) : void
Faturamento
Class3
Class4
Ícone para estereótipo<<Subsistema>>
class subsistema
«interface»Faturamento
+ emitirFatura(Pessoa, float) : void
Faturamento
Class3
Class4
Ícone para estereótipo<<Subsistema>>
COMPORTAMENTOS ASSOCIADOS ÀPERSISTÊNCIA
�Refinar o diagrama de classes� Isolar camada do modelo do BD�Usar padrões
�Factory�Façade�gateway