Programação Orientada por Objectos - Aula 6

1.556 visualizações

Publicada em

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.

Publicada em: Educação
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
1.556
No SlideShare
0
A partir de incorporações
0
Número de incorporações
48
Ações
Compartilhamentos
0
Downloads
104
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide
  • 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.
  • Programação Orientada por Objectos - Aula 6

    1. 1. Aula 6<br />Introdução ao UML: <br /><ul><li> Noções básicas
    2. 2. Áreas, vistas e tipos de diagrama
    3. 3. Níveis de pormenor
    4. 4. Notações para classes, objectos e relações</li></li></ul><li>Na aula anterior…<br />Erros e casos excepcionais<br />Conceitos<br />Excepções <br />Erros de programação<br />Erros no ambiente de execução<br />Representação, criação, detecção e tratamento<br />Excepções Java<br />Asserções Java<br />Boas práticas (incluindo segurança)<br />2009/2010<br />Programação Orientada por Objectos<br />2<br />
    5. 5. UML (Unified Modeling Language)<br />Linguagem visual de modelação<br />Diagramas representam modelo do sistema<br />Ferramenta importante de comunicação<br />Autores originais<br />Grady Booch<br />Ivar Jacobson<br />James Rumbaugh<br />Normalização<br />OMG (Object Management Group)<br />http://www.uml.org/<br />Versão 2.2<br />2009/2010<br />Programação Orientada por Objectos<br />3<br />
    6. 6. Diagramas<br />Estruturais<br />Estáticos (de classes, de objectos)<br />De desenho (estrutura interna, colaboração, componentes)<br />Casos de uso<br />Dinâmicos<br />Máquinas de estados<br />De actividades<br />De interacção (de sequência, de comunicação)<br />Físicos (de implantação)<br />Gestão de modelos (de pacotes)<br />2009/2010<br />Programação Orientada por Objectos<br />4<br />
    7. 7. Diagramas<br />2009/2010<br />Programação Orientada por Objectos<br />5<br />Modelo<br />Área dinâmica<br />Área física<br />Área de gestão do modelo<br />Área estrutural<br />…<br />…<br />…<br />Vista de casos de uso<br />Vista estática<br />Vista de desenho<br />…<br />…<br />Diagrama de classes<br />Diagrama de objectos<br />
    8. 8. Diagrama de classes<br />Representa<br />Classes<br />Relações entre classes<br />Diagrama estrutural e estático<br />Domínio do problema<br />Conceitos <br />Modelo de análise<br />Domínio da solução<br />Classes<br />Modelo de desenho<br />2009/2010<br />Programação Orientada por Objectos<br />6<br />Classes e suas relações não mudam durante execução do programa.<br />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.<br />Compreensão do problema, análise, recolha de requisitos, elaboração de glossário do domínio.<br />Desenho, síntese, implementação. Possível geração automática de código.<br />
    9. 9. Diagrama de objectos<br />Representa<br />Objectos<br />Ligações entre objectos<br />Diagrama estrutural e estático<br />2009/2010<br />Programação Orientada por Objectos<br />7<br />Fotografia estática do estado do sistema em execução num dado instante de tempo.<br />Ajuda a compreender a estrutura dos dados do sistema. A perspectiva continua a não ser dinâmica: o sistema está parado no tempo.<br />
    10. 10. Classes<br />package mypackage;<br />…<br />public abstract <br />class MyAbstractClass {<br /> private Set<Type> set;<br /> private List<Type> list;<br /> private TreeSet<Type> <br />sortedSet;<br /> public static final Type constant = value;<br /> public MyAbstractClass() {…}<br /> private Type privateFunction(final Type parameter) {…}<br /> void packagePrivateProcedure() {…}<br /> protected abstract Type abstractProtectedFunction();<br /> public static void classPublicProcedure() {…}<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />8<br />Classe representada por caixa com compartimentos.<br />mypackage::MyAbstractClass<br />Nome<br />- set: Type [*]<br />- list: Type [*] {ordered, nonunique}<br />- sortedSet: Type [*] {sorted}<br />+ constant: Type = value {frozen}<br />Atributos<br />Operações<br />«constructor»+ MyAbstractClass()<br />- privateFunction(in parameter: Type): Type<br />~ packagePrivateProcedure()<br /># abstractProtectedFunction(): Type<br />+ classPublicProcedure()<br />
    11. 11. Classes<br />package mypackage;<br />…<br />public<br />class MyClass {<br /> private Set<Type> set;<br /> private List<Type> list;<br /> private TreeSet<Type> <br />sortedSet;<br /> public static final Type constant = value;<br /> public MyClass() {…}<br /> private Type privateFunction(final Type parameter) {…}<br /> void packagePrivateProcedure() {…}<br /> protected Type protectedFunction() {…}<br /> public static void classPublicProcedure() {…}<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />9<br />mypackage::MyClass<br />- set: Type [*]<br />- list: Type [*] {ordered, nonunique}<br />- sortedSet: Type [*] {sorted}<br />+ constant: Type = value {frozen}<br />«constructor»+ MyClass()<br />- privateFunction(in parameter: Type): Type<br />~ packagePrivateProcedure()<br /># protectedFunction(): Type<br />+ classPublicProcedure()<br />
    12. 12. Objectos<br />import mypackage;<br />…<br />public class MyClassTester {<br /> public static void main(final String[] arguments) {<br />MyClasslocalVariable = new MyClass();<br /> …<br /> }<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />10<br />localVariable : mypackage::MyClass<br />set = (value3, value1, value2)<br />list = (value1, value2, value1)<br />sortedSet = (value1, value2, value3)<br />constant = value<br />
    13. 13. Objectos<br />import mypackage;<br />…<br />public class MyClassTester {<br /> public static void main(final String[] arguments) {<br />MyClasslocalVariable = new MyClass();<br /> …<br /> }<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />11<br />: mypackage::MyClass<br />localVariable : «ref»mypackage::MyClass<br />set = (value3, value1, value2)<br />list = (value1, value2, value1)<br />sortedSet = (value1, value2, value3)<br />constant = value<br />
    14. 14. Classes: especialização<br />package mypackage;<br />…<br />public class MyDerivedClassextends MyClass {<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />12<br />mypackage::MyClass<br />mypackage::MyDerivedClass<br />Generalização<br />Generalização<br />
    15. 15. Objectos: especialização<br />import mypackage;<br />…<br />public class MyClassTester {<br /> public static void main(final String[] arguments) {<br />MyClasslocalVariable = new MyDerivedClass();<br /> …<br /> }<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />13<br />: mypackage::MyDerivedClass<br />localVariable : «ref» mypackage::MyClass<br />set = (value3, value1, value2)<br />list = (value1, value2, value1)<br />sortedSet = (value1, value2, value3)<br />constant = value<br />
    16. 16. Classes genéricas<br />package mypackage;<br />…<br />public class MyClass<T> {<br /> private Set<T> set;<br /> private List<T> list;<br /> private TreeSet<T> <br />sortedSet;<br /> public static final T constant = value;<br /> public MyClass() {…}<br /> private TprivateFunction(final T parameter) {…}<br /> void packagePrivateProcedure() {…}<br /> protected TprotectedFunction() {…}<br /> public static void classPublicProcedure() {…}<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />14<br />T<br />mypackage::MyClass<br />- set: T [*]<br />- list: T [*] {ordered, nonunique}<br />- sortedSet: T [*] {sorted}<br />+ constant: T = value {frozen}<br />«constructor»+ MyClass()<br />- privateFunction(in parameter: T): T<br />~ packagePrivateProcedure()<br /># protectedFunction(): T<br />+ classPublicProcedure()<br />
    17. 17. Classes genéricas: ligação (binding)<br />import mypackage;<br />…<br />public class MyClassTester {<br /> public static void main(final String[] arguments) {<br />MyClass<String>localVariable = …;<br /> …<br /> }<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />15<br />T<br />mypackage::MyClass<br />mypackage::MyClass<T -> String><br />- set: String [*]<br />- list: String [*] {ordered, nonunique}<br />- sortedSet: String [*] {sorted}<br />+ constant: String = value {frozen}<br />«bind» <T -> String><br />«constructor»+ MyClass()<br />- privateFunction(in parameter: String): String<br />~ packagePrivateProcedure()<br /># protectedFunction(): String<br />+ classPublicProcedure()<br />Ligação<br />(binding)<br />
    18. 18. Objectos<br />import mypackage;<br />…<br />public class MyClassTester {<br /> public static void main(final String[] arguments) {<br />MyClass<String> localVariable = new MyClass<String>();<br /> …<br /> }<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />16<br />: mypackage::MyClass<T -> String><br />set = (“string3”, “string1”, “string2”)<br />list = (“string1”, “string2”, “string1”)<br />sortedSet = (“string1”, “string2”, “string3”)<br />constant = “string”<br />
    19. 19. Pacotes<br />package mypackage;<br />…<br />public class MyClass {<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />17<br />mypackage::MyClass<br />
    20. 20. Pacotes<br />package mypackage;<br />…<br />public class MyClass {<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />18<br />mypackage<br />MyClass<br />
    21. 21. Pacotes<br />package mypackage;<br />…<br />public class MyClass {<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />19<br />mypackage<br />MyClass<br />Conteúdo<br />
    22. 22. Interfaces<br />package mypackage;<br />…<br />public interface MyInterface {<br /> Type operation();<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />20<br />mypackage<br />«interface»<br />MyInterface<br />operation(): Type<br />…<br />
    23. 23. Realização<br />Interfaces<br />package mypackage;<br />…<br />public interface MyInterface {<br /> Type operation();<br /> …<br />}<br />public <br />class MyClassimplements MyInterface {<br />@Override<br /> public Type operation() { … }<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />21<br />mypackage<br />«interface»<br />MyInterface<br />operation(): Type<br />…<br />MyClass<br />+ operation(): Type<br />…<br />
    24. 24. Realização<br />Interfaces<br />package mypackage;<br />…<br />public interface MyInterface {<br /> …<br />}<br />public <br />class MyClassimplements MyInterface {<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />22<br />mypackage<br />MyInterface<br />MyClass<br />
    25. 25. Utilização<br />Realização<br />Interfaces<br />package mypackage;<br />…<br />public interface MyInterface {<br /> …<br />}<br />public <br />class MyClass implements MyInterface {<br /> …<br />}<br />public class MyOtherClass {<br /> …<br /> public <br /> void method(final MyInterface object) {<br /> final Type variable =<br />object.operation();<br /> …<br /> }<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />23<br />mypackage<br />MyOtherClass<br />MyInterface<br />MyInterface<br />MyClass<br />
    26. 26. Utilização<br />Realização<br />Interfaces<br />package mypackage;<br />…<br />public interface MyInterface {<br /> …<br />}<br />public <br />class MyClass implements MyInterface {<br /> …<br />}<br />public class MyOtherClass {<br /> …<br /> public <br /> void method(final MyInterface object) {<br /> final Type variable =<br />object.operation();<br /> …<br /> }<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />24<br />mypackage<br />MyOtherClass<br />«interface»<br />MyInterface<br />MyClass<br />
    27. 27. Restrições<br />2009/2010<br />Programação Orientada por Objectos<br />25<br />Rational<br />Rational<br />{mdc(numerator, denominator} = 1 Ʌ 0 < denominator}<br />- numerator: int<br />- denominator: int<br />- numerator: int<br />- denominator: int<br />…<br />…<br />{mdc(numerator, denominator} = 1 Ʌ 0 < denominator}<br />
    28. 28. Principais relações entre classes<br />Generalização <br />Associação<br />Agregação<br />Composição<br />Abstracção<br />Realização<br />Ligação (binding)<br />Utilização<br />Invocação<br />Criação<br />2009/2010<br />Programação Orientada por Objectos<br />26<br />«bind» <…><br />«call»<br />«create»<br />
    29. 29. Utilização: criação<br />package vehicles;<br />public class Car {<br /> …<br />}<br />package vehicles;<br />public class Factory {<br /> …<br /> public Car newCar(…) {<br /> …<br /> return new Car(…);<br /> }<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />27<br />vehicles<br />Factory<br />«create»<br />Criação<br />(utilização)<br />Car<br />
    30. 30. Associação<br />2009/2010<br />Programação Orientada por Objectos<br />28<br />business<br />Company<br />Associação<br />Person<br />
    31. 31. Associação: nome<br />2009/2010<br />Programação Orientada por Objectos<br />29<br />business<br />Company<br />WorksFor<br />Associação<br />Person<br />
    32. 32. Associação: papeis<br />2009/2010<br />Programação Orientada por Objectos<br />30<br />business<br />Company<br />employer<br />WorksFor<br />Associação<br />employee<br />Person<br />
    33. 33. Associação: multiplicidade<br />2009/2010<br />Programação Orientada por Objectos<br />31<br />business<br />Company<br />employer<br />0..1<br />WorksFor<br />Associação<br />employee(s)<br />*<br />Person<br />
    34. 34. Multiplicidade<br />2009/2010<br />Programação Orientada por Objectos<br />32<br />
    35. 35. Associação: representação<br />package business;<br />public class Company {<br /> private<br /> Set<Person> employees;<br /> …<br />}<br />public class Person {<br /> private Company employer;<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />33<br />business<br />Company<br />employer<br />0..1<br />WorksFor<br />Associação<br />employee(s)<br />*<br />Person<br />
    36. 36. Representação e multiplicidade<br />2009/2010<br />Programação Orientada por Objectos<br />34<br />
    37. 37. Associação: visibilidade<br />package business;<br />public class Company {<br />private<br /> Set<Person> employees;<br /> …<br />}<br />public class Person {<br />private Company employer;<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />35<br />business<br />Company<br />- employer<br />0..1<br />WorksFor<br />Associação<br />- employee(s)<br />*<br />Person<br />
    38. 38. Associação: navegabilidade<br />package business;<br />public class Company {<br /> private<br /> Set<Person> employees;<br /> …<br />}<br />public class Person {<br /> private Company employer;<br /> …<br />}<br />2009/2010<br />Programação OrientadaporObjectos<br />36<br />business<br />Company<br />employer<br />0..1<br />WorksFor<br />Associação<br />- employee(s)<br />*<br />Person<br />
    39. 39. Associação<br />package vehicles;<br />public class Car {<br /> private Set<Wheel> wheels;<br /> …<br />}<br />public class Wheel {<br /> private Car car;<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />37<br />vehicles<br />Car<br />- car<br />0..1<br />IsPartOf<br />- wheel(s)<br />3..6<br />Wheel<br />
    40. 40. Associação: agregação<br />package vehicles;<br />public class Car {<br /> @Parts<br /> private Set<Wheel> wheels;<br /> …<br />}<br />public class Wheel {<br /> @Whole<br /> private Car car;<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />38<br />vehicles<br />Car<br />- car<br />0..1<br />IsPartOf<br />Agregação<br />- wheel(s)<br />3..6<br />Wheel<br />
    41. 41. Associação<br />package business;<br />public class Company {<br /> private Set<Department><br /> departments;<br /> …<br />}<br />public class Department {<br /> private Company company;<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />39<br />business<br />Company<br />- company<br />1<br />IsPartOf<br />- department(s)<br />*<br />Departament<br />
    42. 42. Associação: composição<br />package business;<br />public class Company {<br /> @Components<br /> private Set<Department><br /> departments;<br /> …<br />}<br />public class Department {<br /> @Composite<br /> private Company company;<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />40<br />business<br />Company<br />- company<br />1<br />IsPartOf<br />Composição<br />- department(s)<br />*<br />Departament<br />
    43. 43. A reter<br />Tipos de diagrama UML<br />Notações para classes, objectos e relações<br />UML como forma de comunicação entre pessoas que precisam de se entender em relação<br />A um problema (análise)<br />A uma solução (desenho)<br />UML como modelo formal e possível fonte para geração automática de código (e.g., Java)<br />2009/2010<br />Programação Orientada por Objectos<br />41<br />
    44. 44. Referências<br />UML® ResourcePage (http://www.uml.org/)<br />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)<br />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)<br />2009/2010<br />Programação Orientada por Objectos<br />42<br />
    45. 45. A ler para as próximas aulas ...<br />Capítulos 1 a 10 e 16 do livro:<br />Y. Daniel Liang, Introduction to Java Programming, 7.ª edição, Prentice Hall, 2008.ISBN: 978-0-13-605966-0<br />2009/2010<br />Programação Orientada por Objectos<br />43<br />
    46. 46. Sumário<br />Introdução ao UML<br />Noções<br />Áreas, vistas e tipos de diagrama<br />Níveis de pormenor<br />Notações para classes, objectos e relações<br />Notações para as relações mais importantes, incluindo a generalização, a associação, a agregação e a composição<br />2009/2010<br />Programação Orientada por Objectos<br />44<br />

    ×