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 usorealização Modelo de análise
Modelo de casos de uso
Classes de análise Cenários de colaboração Diagrama de casos de uso Descrições Glossário Modelo do domínio realização Classes de projeto Cenários de colaboração Arquitetura de sofware Modelo de projeto
PROJETO
Classes de projetoOperações e atributos de cada classe
Diagramas de interação Arquitetura de software
Interfaces Subsistemas
CLASSE DE ANÁLISE X PROJETO
NO PROJETO
linguagemde programação alvo
visibilidades
relaçõessão detalhadas
operaçõesdas classes de projeto são
traduzidas de forma direta em código.
Método adotado para a atividade
Criar realizaçõesde casos de uso Descrever interaçõese refinardiagrama de classes
Simplificar diagramas de seqüência utilizando subsistemas(opcional)
Descrever comportamentos associados à
persistência
Definir mecanismosde projeto (Arquiteto de Software)
Diagrama de interação
Na análise
considerou-se que os objetos estavam
disponíveise persistidos
não havia preocupação com a criaçãoe
destruiçãodos mesmos
Não havia preocupação em acessá-lose
associá-losa outros objetos
Diagrama de seq.
análise
sd análise casos de uso
:meteorologista
:IUConv ersao :CtrlConversao :Historico :Conv ersaoCF
solicitar valor Celsius valor Celsius? c c converter valor c guardar conversao valor Fahrenheit mostrar 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álise
class Classes de análise (associações)ConversaoCF CtrlConversao Historico IUConversao :IUHistorico CtrlHistorico 0..10 pertence 1 1 1 1 1 1 1 1 1
Diagrama de classes de projeto
class classes converter
«boundary» IUConv ersao ~ mostrar(float) : void ~ solicitarCelsius() : float «control» CtrlConversao «entity» ConversaoCF - celsius: float - Horario: Date + getFahr() : float «entity» Historico + adicionar(ConversaoCF) : void - writeObject() : void «interface» Serializable 1 «instantiate» 1 1 «instantiate» 1 1 «instantiate» 1 0..10 {ordered} 1
Exemplo: realização 2
Conversor C > F (WEB)deployment proj eto 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 parcial
sd 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
Dependência: exemplos
class Dependência ClasseA + operacao(ClasseC) : void ClasseB ClasseC ClasseD «local» «parameter» «instantiate» Implementação de associações unidirecional 1:1 class Classe ClasseA ClasseB 1 1 classClasseA{privateClasseB 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. PrivateClasseB objB= new ClasseB(); // pode ser instanciado em outro local
3. // outros atributos 4. // métodos
5.
}
6.class ClasseB{
7. PrivateClasse objA= new ClasseA(); // pode ser instanciado em outro local
8. // outros atributos 9. // métodos 10. }
Unidirecional 0..1 : 0..5
class Professor Professor Disciplina 0..1 leciona 0..5 Unidirecional 0..1 : 0..5 Implementação 1 1.classProfessor{2. privateDisciplina[] 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..5 Implementação 2 1.classProfessor{
2. privateDisciplina[] disciplinas = new Disciplina[5]; 3. public void adicionarDisciplinas(Disciplina[] disc){ 4. // inicializar vetor disciplinas com parâmetro disc 5. } 6.} class Professor Professor Disciplina 0..1 leciona 0..5
Multiplicidade 1:*
1.classProfessor{
2. privateVector<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. publicVector<Pessoa> emprega;
3. ...
4.
}
5.public class Pessoa {
6. publicVector<Projeto> participa;
7. ...
8.
}
class muitos para muitos
Proj eto +emprega Pessoa
0..*
+participa 0..*
Associações reflexivas
class associação reflexiv a
Professor Disciplina 1 * +preRequisito 0..* +temPrerequisito 0..*
1.public class Disciplina {
2. public Vector<Disciplina> temPrerequisito;
3. public Vector<Disciplina> preRequisito;
4. ...
5.
}
Classes Associativas
class classe associativ a
Projeto Pessoa Participacao - cargaHoraria: int - dataEntrada: Date - dataSaida: Date +emprega 0..* +participa 0..* Equivale à...
Classes Associativas (2)
class classe associativa (proj)
Proj eto Participacao Pessoa
- 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. publicProjeto projeto;// se relação for bidirecional
14. PublicPessoa pessoa; // se relação for bidirecional
15. ...
16.
Agregação por composição
class agregação por composição
HistoricoPagsWeb URLVisitada - URL: String 0..*
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 URLVisitada
10. 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.classHistorico{
2. private classURLVisitada {
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» 11.public interface Serializable{
2....
3.
}
4.public classHistóricoimplements
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 UML
class 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