Aula teórica 6 da unidade (disciplina) de Programação Orientada por Objectivos para os cursos de LIGE, LEI e LETI no ISCTE-IUL no 2.º semestre do ano lectivo de 2009/2010.
5. UML (Unified Modeling Language) Linguagem visual de modelação Diagramas representam modelo do sistema Ferramenta importante de comunicação Autores originais Grady Booch Ivar Jacobson James Rumbaugh Normalização OMG (Object Management Group) http://www.uml.org/ Versão 2.2 2009/2010 Programação Orientada por Objectos 3
6. Diagramas Estruturais Estáticos (de classes, de objectos) De desenho (estrutura interna, colaboração, componentes) Casos de uso Dinâmicos Máquinas de estados De actividades De interacção (de sequência, de comunicação) Físicos (de implantação) Gestão de modelos (de pacotes) 2009/2010 Programação Orientada por Objectos 4
7. Diagramas 2009/2010 Programação Orientada por Objectos 5 Modelo Área dinâmica Área física Área de gestão do modelo Área estrutural … … … Vista de casos de uso Vista estática Vista de desenho … … Diagrama de classes Diagrama de objectos
8. Diagrama de classes Representa Classes Relações entre classes Diagrama estrutural e estático Domínio do problema Conceitos Modelo de análise Domínio da solução Classes Modelo de desenho 2009/2010 Programação Orientada por Objectos 6 Classes e suas relações não mudam durante execução do programa. Modela a estrutura lógica do sistema. A perspectiva é não dinâmica: a evolução temporal do sistema em execução não é explícita. Compreensão do problema, análise, recolha de requisitos, elaboração de glossário do domínio. Desenho, síntese, implementação. Possível geração automática de código.
9. Diagrama de objectos Representa Objectos Ligações entre objectos Diagrama estrutural e estático 2009/2010 Programação Orientada por Objectos 7 Fotografia estática do estado do sistema em execução num dado instante de tempo. Ajuda a compreender a estrutura dos dados do sistema. A perspectiva continua a não ser dinâmica: o sistema está parado no tempo.
10. Classes package mypackage; … public abstract class MyAbstractClass { private Set<Type> set; private List<Type> list; private TreeSet<Type> sortedSet; public static final Type constant = value; public MyAbstractClass() {…} private Type privateFunction(final Type parameter) {…} void packagePrivateProcedure() {…} protected abstract Type abstractProtectedFunction(); public static void classPublicProcedure() {…} } 2009/2010 Programação Orientada por Objectos 8 Classe representada por caixa com compartimentos. mypackage::MyAbstractClass Nome - set: Type [*] - list: Type [*] {ordered, nonunique} - sortedSet: Type [*] {sorted} + constant: Type = value {frozen} Atributos Operações «constructor»+ MyAbstractClass() - privateFunction(in parameter: Type): Type ~ packagePrivateProcedure() # abstractProtectedFunction(): Type + classPublicProcedure()
11. Classes package mypackage; … public class MyClass { private Set<Type> set; private List<Type> list; private TreeSet<Type> sortedSet; public static final Type constant = value; public MyClass() {…} private Type privateFunction(final Type parameter) {…} void packagePrivateProcedure() {…} protected Type protectedFunction() {…} public static void classPublicProcedure() {…} } 2009/2010 Programação Orientada por Objectos 9 mypackage::MyClass - set: Type [*] - list: Type [*] {ordered, nonunique} - sortedSet: Type [*] {sorted} + constant: Type = value {frozen} «constructor»+ MyClass() - privateFunction(in parameter: Type): Type ~ packagePrivateProcedure() # protectedFunction(): Type + classPublicProcedure()
12. Objectos import mypackage; … public class MyClassTester { public static void main(final String[] arguments) { MyClasslocalVariable = new MyClass(); … } } 2009/2010 Programação Orientada por Objectos 10 localVariable : mypackage::MyClass set = (value3, value1, value2) list = (value1, value2, value1) sortedSet = (value1, value2, value3) constant = value
13. Objectos import mypackage; … public class MyClassTester { public static void main(final String[] arguments) { MyClasslocalVariable = new MyClass(); … } } 2009/2010 Programação Orientada por Objectos 11 : mypackage::MyClass localVariable : «ref»mypackage::MyClass set = (value3, value1, value2) list = (value1, value2, value1) sortedSet = (value1, value2, value3) constant = value
14. Classes: especialização package mypackage; … public class MyDerivedClassextends MyClass { … } 2009/2010 Programação Orientada por Objectos 12 mypackage::MyClass mypackage::MyDerivedClass Generalização Generalização
15. Objectos: especialização import mypackage; … public class MyClassTester { public static void main(final String[] arguments) { MyClasslocalVariable = new MyDerivedClass(); … } } 2009/2010 Programação Orientada por Objectos 13 : mypackage::MyDerivedClass localVariable : «ref» mypackage::MyClass set = (value3, value1, value2) list = (value1, value2, value1) sortedSet = (value1, value2, value3) constant = value
16. Classes genéricas package mypackage; … public class MyClass<T> { private Set<T> set; private List<T> list; private TreeSet<T> sortedSet; public static final T constant = value; public MyClass() {…} private TprivateFunction(final T parameter) {…} void packagePrivateProcedure() {…} protected TprotectedFunction() {…} public static void classPublicProcedure() {…} } 2009/2010 Programação Orientada por Objectos 14 T mypackage::MyClass - set: T [*] - list: T [*] {ordered, nonunique} - sortedSet: T [*] {sorted} + constant: T = value {frozen} «constructor»+ MyClass() - privateFunction(in parameter: T): T ~ packagePrivateProcedure() # protectedFunction(): T + classPublicProcedure()
18. Objectos import mypackage; … public class MyClassTester { public static void main(final String[] arguments) { MyClass<String> localVariable = new MyClass<String>(); … } } 2009/2010 Programação Orientada por Objectos 16 : mypackage::MyClass<T -> String> set = (“string3”, “string1”, “string2”) list = (“string1”, “string2”, “string1”) sortedSet = (“string1”, “string2”, “string3”) constant = “string”
19. Pacotes package mypackage; … public class MyClass { … } 2009/2010 Programação Orientada por Objectos 17 mypackage::MyClass
20. Pacotes package mypackage; … public class MyClass { … } 2009/2010 Programação Orientada por Objectos 18 mypackage MyClass
21. Pacotes package mypackage; … public class MyClass { … } 2009/2010 Programação Orientada por Objectos 19 mypackage MyClass Conteúdo
22. Interfaces package mypackage; … public interface MyInterface { Type operation(); … } 2009/2010 Programação Orientada por Objectos 20 mypackage «interface» MyInterface operation(): Type …
23. Realização Interfaces package mypackage; … public interface MyInterface { Type operation(); … } public class MyClassimplements MyInterface { @Override public Type operation() { … } … } 2009/2010 Programação Orientada por Objectos 21 mypackage «interface» MyInterface operation(): Type … MyClass + operation(): Type …
24. Realização Interfaces package mypackage; … public interface MyInterface { … } public class MyClassimplements MyInterface { … } 2009/2010 Programação Orientada por Objectos 22 mypackage MyInterface MyClass
25. Utilização Realização Interfaces package mypackage; … public interface MyInterface { … } public class MyClass implements MyInterface { … } public class MyOtherClass { … public void method(final MyInterface object) { final Type variable = object.operation(); … } … } 2009/2010 Programação Orientada por Objectos 23 mypackage MyOtherClass MyInterface MyInterface MyClass
26. Utilização Realização Interfaces package mypackage; … public interface MyInterface { … } public class MyClass implements MyInterface { … } public class MyOtherClass { … public void method(final MyInterface object) { final Type variable = object.operation(); … } … } 2009/2010 Programação Orientada por Objectos 24 mypackage MyOtherClass «interface» MyInterface MyClass
27. Restrições 2009/2010 Programação Orientada por Objectos 25 Rational Rational {mdc(numerator, denominator} = 1 Ʌ 0 < denominator} - numerator: int - denominator: int - numerator: int - denominator: int … … {mdc(numerator, denominator} = 1 Ʌ 0 < denominator}
28. Principais relações entre classes Generalização Associação Agregação Composição Abstracção Realização Ligação (binding) Utilização Invocação Criação 2009/2010 Programação Orientada por Objectos 26 «bind» <…> «call» «create»
29. Utilização: criação package vehicles; public class Car { … } package vehicles; public class Factory { … public Car newCar(…) { … return new Car(…); } … } 2009/2010 Programação Orientada por Objectos 27 vehicles Factory «create» Criação (utilização) Car
31. Associação: nome 2009/2010 Programação Orientada por Objectos 29 business Company WorksFor Associação Person
32. Associação: papeis 2009/2010 Programação Orientada por Objectos 30 business Company employer WorksFor Associação employee Person
33. Associação: multiplicidade 2009/2010 Programação Orientada por Objectos 31 business Company employer 0..1 WorksFor Associação employee(s) * Person
35. Associação: representação package business; public class Company { private Set<Person> employees; … } public class Person { private Company employer; … } 2009/2010 Programação Orientada por Objectos 33 business Company employer 0..1 WorksFor Associação employee(s) * Person
37. Associação: visibilidade package business; public class Company { private Set<Person> employees; … } public class Person { private Company employer; … } 2009/2010 Programação Orientada por Objectos 35 business Company - employer 0..1 WorksFor Associação - employee(s) * Person
38. Associação: navegabilidade package business; public class Company { private Set<Person> employees; … } public class Person { private Company employer; … } 2009/2010 Programação OrientadaporObjectos 36 business Company employer 0..1 WorksFor Associação - employee(s) * Person
39. Associação package vehicles; public class Car { private Set<Wheel> wheels; … } public class Wheel { private Car car; … } 2009/2010 Programação Orientada por Objectos 37 vehicles Car - car 0..1 IsPartOf - wheel(s) 3..6 Wheel
40. Associação: agregação package vehicles; public class Car { @Parts private Set<Wheel> wheels; … } public class Wheel { @Whole private Car car; … } 2009/2010 Programação Orientada por Objectos 38 vehicles Car - car 0..1 IsPartOf Agregação - wheel(s) 3..6 Wheel
41. Associação package business; public class Company { private Set<Department> departments; … } public class Department { private Company company; … } 2009/2010 Programação Orientada por Objectos 39 business Company - company 1 IsPartOf - department(s) * Departament
42. Associação: composição package business; public class Company { @Components private Set<Department> departments; … } public class Department { @Composite private Company company; … } 2009/2010 Programação Orientada por Objectos 40 business Company - company 1 IsPartOf Composição - department(s) * Departament
43. A reter Tipos de diagrama UML Notações para classes, objectos e relações UML como forma de comunicação entre pessoas que precisam de se entender em relação A um problema (análise) A uma solução (desenho) UML como modelo formal e possível fonte para geração automática de código (e.g., Java) 2009/2010 Programação Orientada por Objectos 41
44. Referências UML® ResourcePage (http://www.uml.org/) Martin Fowler, UML Distilled: A Brief Guide to the Standard Object Modeling Language, 3.ª edição, Addison-Wesley, 2003.ISBN: 0-321-19368-7(1.ª e 2.ª ediçõesnabiblioteca) James Rumbaugh et al., The Unified Modeling Language Reference Manual, 2.ª edição, Addison-Wesley, 2005.ISBN: 0-321-24562-8(1.ª edição do guia do utilizador na biblioteca) 2009/2010 Programação Orientada por Objectos 42
45. A ler para as próximas aulas ... Capítulos 1 a 10 e 16 do livro: Y. Daniel Liang, Introduction to Java Programming, 7.ª edição, Prentice Hall, 2008.ISBN: 978-0-13-605966-0 2009/2010 Programação Orientada por Objectos 43
46. Sumário Introdução ao UML Noções Áreas, vistas e tipos de diagrama Níveis de pormenor Notações para classes, objectos e relações Notações para as relações mais importantes, incluindo a generalização, a associação, a agregação e a composição 2009/2010 Programação Orientada por Objectos 44
Notas del editor
Cada tipo de diagrama dá-nos uma visão ou perspectiva do sistema. É crucialque os diferentes diagramas sejam coerentes entre si. Cada diagrama pode ser construído ou visto com diferentes níveis de granularidade (pormenor). O mesmo tipo de diagramas pode ser usado para expressar aspectos diferentes do sistema: Diagrama de classes para análise/desenho Diagrama de actividades para actores/operações/instruções individuaisCom ferramentas de modelação adequadas, os modelos representados pelos diagramas podem ser usados para gerar código automaticamente. As mesmas ferramentas podem também simplificar a tarefa de obter o modelo correspondente a código já existente.
Nível de pormenor é variável. O nome, atributos, operações ficam em compartimentos separados.Usa-se o sublinhado nos métodos ou atributos de classe (em Java, static). O sublinhado no nome da classe tem um significado muito diferente, que se verá à frente. O itálico no nome da classe significa que a classe é abstracta. O mesmo acontece na linha de uma operação: se estiver em itálico, a operação é abstracta. Entre aspas «» escrevem-se os chamados estereótipos. O estereótipo «constructor» assinala uma operação que na realidade é um construtor. Entre parênteses rectos assinala-se a multiplicidade dos atributos. * significa “qualquer número”. Entre chavetas escrevem-se propriedades dos atributos. Ordered indica, num atributo com multiplicidade não unitária, que os elementos têm uma ordem extrínseca relevante. Nonunique indica que os elementos podem repetir-se. Sorted indica que os elementos têm uma ordem intrínseca (que é a sua ordem natural). In indica que o parâmetro é apenas de entrada. Não se espera, por isso, que seja modificado (ou melhor, no caso de ser uma referência, espera-se que o objecto referenciado não mude de valor, pelo menos através do parâmetro). Frozen indica que o atributo, depois de inicializado, não mudará de valor.Note-se a tradução para Java da notação. Chama-se a atenção para os atributos com multiplicidade não unitária, que são traduzidos em colecções de tipos apropriados.Categorias de acesso: privado+ público# protegido~ pacote
Vamos alterar a classe para não ser abstracta, i.e., para ser concreta.
Os objectos representam-se em caixas, como as classes, mas agora o nome é o do objecto, seguido de : e finalmente do nome da classe. Todo o título é sublinhado. É usual representarem-se os valores das propriedades (atributos) no compartimento apropriado.O nome de um objecto na realidade não é o nome do objecto. Tipicamente é o nome de uma referência através da qual acedemos ao objecto. Assim, pode haver múltiplos “nomes” para um objecto, quer em simultâneo, quer em sequência.
Atenção! Isto não é UML, em rigor. Mas ajuda-nos a perceber a diferença entre referências e objectos referenciados.
O UML permite-nos omitir os pormenores. Devemos fazê-lo sempre que isso tornar mais claro o diagrama, i.e., sempre que isso facilitar a apreensão do aspecto do desenho que o diagrama pretende representar.A relação de generalização é uma das mais importantes no UML. Repare-se na notação usada para as anotações, que funcionam como comentários
Qual a relação entre classe genérica MyClasse<T> e a classe MyClasse<T -> String>? É uma relação de “ligação” (binding)
Pode, por isso, falar-se numa relação de conteúdo. Quando a relação é entre classes, chama-se-lhe embutimento (nesting).
Note-se que as operações nas interfaces são sempre públicas e abstractas. Normalmente assume-se que assim é também no UML, pelo que se omitem as respectivas notações.
Atenção! Assume-se que os vários tipos estão definidos em ficheiros diferentes, como é evidente! Só para poupar espaço é que se colocam as definições como se estivessem dentro do mesmo ficheiro. Daí que, neste e nos restantes diapositivos, haja apenas uma declaração de pacote mesmo quando há vários tipos.
Existe dependência (uma classe usa outra), mas nenhuma é um atributo de outra.