Aula 6Introdução ao UML:  Noções básicas
 Áreas, vistas e tipos de diagrama
 Níveis de pormenor
 Notações para classes, objectos e relaçõesNa aula anterior…Erros e casos excepcionaisConceitosExcepções Erros de programaçãoErros no ambiente de execuçãoRepresentação, criação, detecção e tratamentoExcepções JavaAsserções JavaBoas práticas (incluindo segurança)2009/2010Programação Orientada por Objectos2
UML (Unified Modeling Language)Linguagem visual de modelaçãoDiagramas representam modelo do sistemaFerramenta importante de comunicaçãoAutores originaisGrady BoochIvar JacobsonJames RumbaughNormalizaçãoOMG (Object Management Group)http://www.uml.org/Versão 2.22009/2010Programação Orientada por Objectos3
DiagramasEstruturaisEstáticos (de classes, de objectos)De desenho (estrutura interna, colaboração, componentes)Casos de usoDinâmicosMáquinas de estadosDe actividadesDe interacção (de sequência, de comunicação)Físicos (de implantação)Gestão de modelos (de pacotes)2009/2010Programação Orientada por Objectos4
Diagramas2009/2010Programação Orientada por Objectos5ModeloÁrea dinâmicaÁrea físicaÁrea de gestão do modeloÁrea estrutural………Vista de casos de usoVista estáticaVista de desenho……Diagrama de classesDiagrama de objectos
Diagrama de classesRepresentaClassesRelações entre classesDiagrama estrutural e estáticoDomínio do problemaConceitos Modelo de análiseDomínio da soluçãoClassesModelo de desenho2009/2010Programação Orientada por Objectos6Classes 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.
Diagrama de objectosRepresentaObjectosLigações entre objectosDiagrama estrutural e estático2009/2010Programação Orientada por Objectos7Fotografia 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.
Classespackage 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/2010Programação Orientada por Objectos8Classe representada por caixa com compartimentos.mypackage::MyAbstractClassNome- set: Type [*]- list: Type [*] {ordered, nonunique}- sortedSet: Type [*] {sorted}+ constant: Type = value {frozen}AtributosOperações«constructor»+ MyAbstractClass()- privateFunction(in parameter: Type): Type~ packagePrivateProcedure()# abstractProtectedFunction(): Type+ classPublicProcedure()
Classespackage mypackage;…publicclass 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/2010Programação Orientada por Objectos9mypackage::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()
Objectosimport mypackage;…public class MyClassTester {    public static void main(final String[] arguments) {MyClasslocalVariable = new MyClass();        …    }}2009/2010Programação Orientada por Objectos10localVariable : mypackage::MyClassset = (value3, value1, value2)list = (value1, value2, value1)sortedSet = (value1, value2, value3)constant = value
Objectosimport mypackage;…public class MyClassTester {    public static void main(final String[] arguments) {MyClasslocalVariable = new MyClass();        …    }}2009/2010Programação Orientada por Objectos11: mypackage::MyClasslocalVariable : «ref»mypackage::MyClassset = (value3, value1, value2)list = (value1, value2, value1)sortedSet = (value1, value2, value3)constant = value
Classes: especializaçãopackage mypackage;…public class MyDerivedClassextends MyClass {    …}2009/2010Programação Orientada por Objectos12mypackage::MyClassmypackage::MyDerivedClassGeneralizaçãoGeneralização
Objectos: especializaçãoimport mypackage;…public class MyClassTester {    public static void main(final String[] arguments) {MyClasslocalVariable = new MyDerivedClass();        …    }}2009/2010Programação Orientada por Objectos13: mypackage::MyDerivedClasslocalVariable : «ref» mypackage::MyClassset = (value3, value1, value2)list = (value1, value2, value1)sortedSet = (value1, value2, value3)constant = value
Classes genéricaspackage 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/2010Programação Orientada por Objectos14Tmypackage::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()
Classes genéricas: ligação (binding)import mypackage;…public class MyClassTester {    public static void main(final String[] arguments) {MyClass<String>localVariable = …;        …    }}2009/2010Programação Orientada por Objectos15Tmypackage::MyClassmypackage::MyClass<T -> String>- set: String [*]- list: String [*] {ordered, nonunique}- sortedSet: String [*] {sorted}+ constant: String = value {frozen}«bind» <T -> String>«constructor»+ MyClass()- privateFunction(in parameter: String): String~ packagePrivateProcedure()# protectedFunction(): String+ classPublicProcedure()Ligação(binding)
Objectosimport mypackage;…public class MyClassTester {    public static void main(final String[] arguments) {MyClass<String> localVariable = new MyClass<String>();        …    }}2009/2010Programação Orientada por Objectos16: mypackage::MyClass<T -> String>set = (“string3”, “string1”, “string2”)list = (“string1”, “string2”, “string1”)sortedSet = (“string1”, “string2”, “string3”)constant = “string”
Pacotespackage mypackage;…public class MyClass {    …}2009/2010Programação Orientada por Objectos17mypackage::MyClass
Pacotespackage mypackage;…public class MyClass {    …}2009/2010Programação Orientada por Objectos18mypackageMyClass
Pacotespackage mypackage;…public class MyClass {    …}2009/2010Programação Orientada por Objectos19mypackageMyClassConteúdo
Interfacespackage mypackage;…public interface MyInterface {    Type operation();    …}2009/2010Programação Orientada por Objectos20mypackage«interface»MyInterfaceoperation(): Type…
RealizaçãoInterfacespackage mypackage;…public interface MyInterface {    Type operation();    …}public class MyClassimplements MyInterface {@Override    public Type operation() { … }    …}2009/2010Programação Orientada por Objectos21mypackage«interface»MyInterfaceoperation(): Type…MyClass+ operation(): Type…
RealizaçãoInterfacespackage mypackage;…public interface MyInterface {    …}public class MyClassimplements MyInterface {    …}2009/2010Programação Orientada por Objectos22mypackageMyInterfaceMyClass
UtilizaçãoRealizaçãoInterfacespackage mypackage;…public interface MyInterface {    …}public class MyClass implements MyInterface {    …}public class MyOtherClass {    …    public     void method(final MyInterface object) {        final Type variable =object.operation();        …    }    …}2009/2010Programação Orientada por Objectos23mypackageMyOtherClassMyInterfaceMyInterfaceMyClass
UtilizaçãoRealizaçãoInterfacespackage mypackage;…public interface MyInterface {    …}public class MyClass implements MyInterface {    …}public class MyOtherClass {    …    public     void method(final MyInterface object) {        final Type variable =object.operation();        …    }    …}2009/2010Programação Orientada por Objectos24mypackageMyOtherClass«interface»MyInterfaceMyClass
Restrições2009/2010Programação Orientada por Objectos25RationalRational{mdc(numerator, denominator} = 1  Ʌ 0 < denominator}- numerator: int- denominator: int- numerator: int- denominator: int……{mdc(numerator, denominator} = 1  Ʌ 0 < denominator}
Principais relações entre classesGeneralização AssociaçãoAgregaçãoComposiçãoAbstracçãoRealizaçãoLigação (binding)UtilizaçãoInvocaçãoCriação2009/2010Programação Orientada por Objectos26«bind» <…>«call»«create»
Utilização: criaçãopackage vehicles;public class Car {    …}package vehicles;public class Factory {    …    public Car newCar(…) {        …        return new Car(…);    }    …}2009/2010Programação Orientada por Objectos27vehiclesFactory«create»Criação(utilização)Car
Associação2009/2010Programação Orientada por Objectos28businessCompanyAssociaçãoPerson
Associação: nome2009/2010Programação Orientada por Objectos29businessCompanyWorksForAssociaçãoPerson
Associação: papeis2009/2010Programação Orientada por Objectos30businessCompanyemployerWorksForAssociaçãoemployeePerson
Associação: multiplicidade2009/2010Programação Orientada por Objectos31businessCompanyemployer0..1WorksForAssociaçãoemployee(s)*Person
Multiplicidade2009/2010Programação Orientada por Objectos32
Associação: representaçãopackage business;public class Company {    private    Set<Person> employees;    …}public class Person {    private Company employer;    …}2009/2010Programação Orientada por Objectos33businessCompanyemployer0..1WorksForAssociaçãoemployee(s)*Person
Representação e multiplicidade2009/2010Programação Orientada por Objectos34
Associação: visibilidadepackage business;public class Company {private    Set<Person> employees;    …}public class Person {private Company employer;    …}2009/2010Programação Orientada por Objectos35businessCompany- employer0..1WorksForAssociação- employee(s)*Person
Associação: navegabilidadepackage business;public class Company {    private    Set<Person> employees;    …}public class Person {    private Company employer;    …}2009/2010Programação OrientadaporObjectos36businessCompanyemployer0..1WorksForAssociação- employee(s)*Person
Associaçãopackage vehicles;public class Car {    private Set<Wheel> wheels;    …}public class Wheel {    private Car car;    …}2009/2010Programação Orientada por Objectos37vehiclesCar- car0..1IsPartOf- wheel(s)3..6Wheel
Associação: agregaçãopackage vehicles;public class Car {    @Parts    private Set<Wheel> wheels;    …}public class Wheel {    @Whole    private Car car;    …}2009/2010Programação Orientada por Objectos38vehiclesCar- car0..1IsPartOfAgregação- wheel(s)3..6Wheel
Associaçãopackage business;public class Company {    private Set<Department>        departments;    …}public class Department {    private Company company;    …}2009/2010Programação Orientada por Objectos39businessCompany- company1IsPartOf- department(s)*Departament
Associação: composiçãopackage business;public class Company {    @Components    private Set<Department>        departments;    …}public class Department {    @Composite    private Company company;    …}2009/2010Programação Orientada por Objectos40businessCompany- company1IsPartOfComposição- department(s)*Departament
A reterTipos de diagrama UMLNotações para classes, objectos e relaçõesUML como forma de comunicação entre pessoas que precisam de se entender em relaçãoA 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/2010Programação Orientada por Objectos41
ReferênciasUML® 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/2010Programação Orientada por Objectos42

Programação Orientada por Objectos - Aula 6

  • 1.
    Aula 6Introdução aoUML: Noções básicas
  • 2.
    Áreas, vistase tipos de diagrama
  • 3.
    Níveis depormenor
  • 4.
    Notações paraclasses, objectos e relaçõesNa aula anterior…Erros e casos excepcionaisConceitosExcepções Erros de programaçãoErros no ambiente de execuçãoRepresentação, criação, detecção e tratamentoExcepções JavaAsserções JavaBoas práticas (incluindo segurança)2009/2010Programação Orientada por Objectos2
  • 5.
    UML (Unified ModelingLanguage)Linguagem visual de modelaçãoDiagramas representam modelo do sistemaFerramenta importante de comunicaçãoAutores originaisGrady BoochIvar JacobsonJames RumbaughNormalizaçãoOMG (Object Management Group)http://www.uml.org/Versão 2.22009/2010Programação Orientada por Objectos3
  • 6.
    DiagramasEstruturaisEstáticos (de classes,de objectos)De desenho (estrutura interna, colaboração, componentes)Casos de usoDinâmicosMáquinas de estadosDe actividadesDe interacção (de sequência, de comunicação)Físicos (de implantação)Gestão de modelos (de pacotes)2009/2010Programação Orientada por Objectos4
  • 7.
    Diagramas2009/2010Programação Orientada porObjectos5ModeloÁrea dinâmicaÁrea físicaÁrea de gestão do modeloÁrea estrutural………Vista de casos de usoVista estáticaVista de desenho……Diagrama de classesDiagrama de objectos
  • 8.
    Diagrama de classesRepresentaClassesRelaçõesentre classesDiagrama estrutural e estáticoDomínio do problemaConceitos Modelo de análiseDomínio da soluçãoClassesModelo de desenho2009/2010Programação Orientada por Objectos6Classes 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 objectosRepresentaObjectosLigaçõesentre objectosDiagrama estrutural e estático2009/2010Programação Orientada por Objectos7Fotografia 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.
    Classespackage mypackage;…public abstractclass 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/2010Programação Orientada por Objectos8Classe representada por caixa com compartimentos.mypackage::MyAbstractClassNome- set: Type [*]- list: Type [*] {ordered, nonunique}- sortedSet: Type [*] {sorted}+ constant: Type = value {frozen}AtributosOperações«constructor»+ MyAbstractClass()- privateFunction(in parameter: Type): Type~ packagePrivateProcedure()# abstractProtectedFunction(): Type+ classPublicProcedure()
  • 11.
    Classespackage mypackage;…publicclass 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/2010Programação Orientada por Objectos9mypackage::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.
    Objectosimport mypackage;…public classMyClassTester { public static void main(final String[] arguments) {MyClasslocalVariable = new MyClass(); … }}2009/2010Programação Orientada por Objectos10localVariable : mypackage::MyClassset = (value3, value1, value2)list = (value1, value2, value1)sortedSet = (value1, value2, value3)constant = value
  • 13.
    Objectosimport mypackage;…public classMyClassTester { public static void main(final String[] arguments) {MyClasslocalVariable = new MyClass(); … }}2009/2010Programação Orientada por Objectos11: mypackage::MyClasslocalVariable : «ref»mypackage::MyClassset = (value3, value1, value2)list = (value1, value2, value1)sortedSet = (value1, value2, value3)constant = value
  • 14.
    Classes: especializaçãopackage mypackage;…publicclass MyDerivedClassextends MyClass { …}2009/2010Programação Orientada por Objectos12mypackage::MyClassmypackage::MyDerivedClassGeneralizaçãoGeneralização
  • 15.
    Objectos: especializaçãoimport mypackage;…publicclass MyClassTester { public static void main(final String[] arguments) {MyClasslocalVariable = new MyDerivedClass(); … }}2009/2010Programação Orientada por Objectos13: mypackage::MyDerivedClasslocalVariable : «ref» mypackage::MyClassset = (value3, value1, value2)list = (value1, value2, value1)sortedSet = (value1, value2, value3)constant = value
  • 16.
    Classes genéricaspackage mypackage;…publicclass 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/2010Programação Orientada por Objectos14Tmypackage::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()
  • 17.
    Classes genéricas: ligação(binding)import mypackage;…public class MyClassTester { public static void main(final String[] arguments) {MyClass<String>localVariable = …; … }}2009/2010Programação Orientada por Objectos15Tmypackage::MyClassmypackage::MyClass<T -> String>- set: String [*]- list: String [*] {ordered, nonunique}- sortedSet: String [*] {sorted}+ constant: String = value {frozen}«bind» <T -> String>«constructor»+ MyClass()- privateFunction(in parameter: String): String~ packagePrivateProcedure()# protectedFunction(): String+ classPublicProcedure()Ligação(binding)
  • 18.
    Objectosimport mypackage;…public classMyClassTester { public static void main(final String[] arguments) {MyClass<String> localVariable = new MyClass<String>(); … }}2009/2010Programação Orientada por Objectos16: mypackage::MyClass<T -> String>set = (“string3”, “string1”, “string2”)list = (“string1”, “string2”, “string1”)sortedSet = (“string1”, “string2”, “string3”)constant = “string”
  • 19.
    Pacotespackage mypackage;…public classMyClass { …}2009/2010Programação Orientada por Objectos17mypackage::MyClass
  • 20.
    Pacotespackage mypackage;…public classMyClass { …}2009/2010Programação Orientada por Objectos18mypackageMyClass
  • 21.
    Pacotespackage mypackage;…public classMyClass { …}2009/2010Programação Orientada por Objectos19mypackageMyClassConteúdo
  • 22.
    Interfacespackage mypackage;…public interfaceMyInterface { Type operation(); …}2009/2010Programação Orientada por Objectos20mypackage«interface»MyInterfaceoperation(): Type…
  • 23.
    RealizaçãoInterfacespackage mypackage;…public interfaceMyInterface { Type operation(); …}public class MyClassimplements MyInterface {@Override public Type operation() { … } …}2009/2010Programação Orientada por Objectos21mypackage«interface»MyInterfaceoperation(): Type…MyClass+ operation(): Type…
  • 24.
    RealizaçãoInterfacespackage mypackage;…public interfaceMyInterface { …}public class MyClassimplements MyInterface { …}2009/2010Programação Orientada por Objectos22mypackageMyInterfaceMyClass
  • 25.
    UtilizaçãoRealizaçãoInterfacespackage mypackage;…public interfaceMyInterface { …}public class MyClass implements MyInterface { …}public class MyOtherClass { … public void method(final MyInterface object) { final Type variable =object.operation(); … } …}2009/2010Programação Orientada por Objectos23mypackageMyOtherClassMyInterfaceMyInterfaceMyClass
  • 26.
    UtilizaçãoRealizaçãoInterfacespackage mypackage;…public interfaceMyInterface { …}public class MyClass implements MyInterface { …}public class MyOtherClass { … public void method(final MyInterface object) { final Type variable =object.operation(); … } …}2009/2010Programação Orientada por Objectos24mypackageMyOtherClass«interface»MyInterfaceMyClass
  • 27.
    Restrições2009/2010Programação Orientada porObjectos25RationalRational{mdc(numerator, denominator} = 1 Ʌ 0 < denominator}- numerator: int- denominator: int- numerator: int- denominator: int……{mdc(numerator, denominator} = 1 Ʌ 0 < denominator}
  • 28.
    Principais relações entreclassesGeneralização AssociaçãoAgregaçãoComposiçãoAbstracçãoRealizaçãoLigação (binding)UtilizaçãoInvocaçãoCriação2009/2010Programação Orientada por Objectos26«bind» <…>«call»«create»
  • 29.
    Utilização: criaçãopackage vehicles;publicclass Car { …}package vehicles;public class Factory { … public Car newCar(…) { … return new Car(…); } …}2009/2010Programação Orientada por Objectos27vehiclesFactory«create»Criação(utilização)Car
  • 30.
    Associação2009/2010Programação Orientada porObjectos28businessCompanyAssociaçãoPerson
  • 31.
    Associação: nome2009/2010Programação Orientadapor Objectos29businessCompanyWorksForAssociaçãoPerson
  • 32.
    Associação: papeis2009/2010Programação Orientadapor Objectos30businessCompanyemployerWorksForAssociaçãoemployeePerson
  • 33.
    Associação: multiplicidade2009/2010Programação Orientadapor Objectos31businessCompanyemployer0..1WorksForAssociaçãoemployee(s)*Person
  • 34.
  • 35.
    Associação: representaçãopackage business;publicclass Company { private Set<Person> employees; …}public class Person { private Company employer; …}2009/2010Programação Orientada por Objectos33businessCompanyemployer0..1WorksForAssociaçãoemployee(s)*Person
  • 36.
  • 37.
    Associação: visibilidadepackage business;publicclass Company {private Set<Person> employees; …}public class Person {private Company employer; …}2009/2010Programação Orientada por Objectos35businessCompany- employer0..1WorksForAssociação- employee(s)*Person
  • 38.
    Associação: navegabilidadepackage business;publicclass Company { private Set<Person> employees; …}public class Person { private Company employer; …}2009/2010Programação OrientadaporObjectos36businessCompanyemployer0..1WorksForAssociação- employee(s)*Person
  • 39.
    Associaçãopackage vehicles;public classCar { private Set<Wheel> wheels; …}public class Wheel { private Car car; …}2009/2010Programação Orientada por Objectos37vehiclesCar- car0..1IsPartOf- wheel(s)3..6Wheel
  • 40.
    Associação: agregaçãopackage vehicles;publicclass Car { @Parts private Set<Wheel> wheels; …}public class Wheel { @Whole private Car car; …}2009/2010Programação Orientada por Objectos38vehiclesCar- car0..1IsPartOfAgregação- wheel(s)3..6Wheel
  • 41.
    Associaçãopackage business;public classCompany { private Set<Department> departments; …}public class Department { private Company company; …}2009/2010Programação Orientada por Objectos39businessCompany- company1IsPartOf- department(s)*Departament
  • 42.
    Associação: composiçãopackage business;publicclass Company { @Components private Set<Department> departments; …}public class Department { @Composite private Company company; …}2009/2010Programação Orientada por Objectos40businessCompany- company1IsPartOfComposição- department(s)*Departament
  • 43.
    A reterTipos dediagrama UMLNotações para classes, objectos e relaçõesUML como forma de comunicação entre pessoas que precisam de se entender em relaçãoA 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/2010Programação Orientada por Objectos41
  • 44.
    ReferênciasUML® ResourcePage (http://www.uml.org/)MartinFowler, 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/2010Programação Orientada por Objectos42

Notas do Editor

  • #5 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.
  • #9 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
  • #10 Vamos alterar a classe para não ser abstracta, i.e., para ser concreta.
  • #11 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.
  • #12 Atenção! Isto não é UML, em rigor. Mas ajuda-nos a perceber a diferença entre referências e objectos referenciados.
  • #13 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
  • #16 Qual a relação entre classe genérica MyClasse&lt;T&gt; e a classe MyClasse&lt;T -&gt; String&gt;? É uma relação de “ligação” (binding)
  • #20 Pode, por isso, falar-se numa relação de conteúdo. Quando a relação é entre classes, chama-se-lhe embutimento (nesting).
  • #21 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.
  • #22 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.
  • #28 Existe dependência (uma classe usa outra), mas nenhuma é um atributo de outra.