object constraint language philip stephen medcraft
TRANSCRIPT
![Page 1: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/1.jpg)
Object Constraint Language
Philip Stephen Medcraft
![Page 2: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/2.jpg)
SumárioIntroduçãoLigação com a UMLTipos básicos e operaçõesObjetos e propriedadesOperações em coleções
![Page 3: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/3.jpg)
IntroduçãoModelos gráficos são completos?Podemos gerar especificações precisas apenas com modelos gráficos?Muitas vezes, sentimos a necessidade de adicionar restrições aos objetos.Uma linguagem natural pode resolver?Uma linguagem formal é mais precisa!
![Page 4: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/4.jpg)
IntroduçãoOCL é uma linguagem descritiva.Uma expressão OCL não pode alterar nada no esquema.O estado do sistema nunca mudará devido a uma expressão OCL.Quando executada, uma expressão OCL simplesmente devolve um valor.
![Page 5: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/5.jpg)
IntroduçãoA OCL pode ser usada com diferentes propósitos:
Para especificar restrições em classes e tipos no diagrama de classes.Para descrever pré e pós condições para métodos.Como uma linguagem de navegação.
![Page 6: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/6.jpg)
![Page 7: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/7.jpg)
Ligação com a UMLUma expressão OCL:
´Essa é uma expressão OCL’O contexto para a expressão:NomeDoTipo´Expressão OCL no contexto de NomeDoTipo’Uma expressão OCL é escrita no contexto de uma instância de um tipo específico.
![Page 8: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/8.jpg)
Ligação com a UMLEm uma expressão OCL, o nome self é usado para referenciar o contexto.Exemplo:Company
self.numberOfEmployeesOutra opção:c : Company
c.numberOfEmployees
![Page 9: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/9.jpg)
Ligação com a UMLPré e Pós condições:
A expressão é uma pré ou pós condição para uma operação.
Portanto, a instância atual (contexto) é do tipo que possui a operação.Person::income(d : Date) : Integerpost: result = ... Alguma função ...
![Page 10: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/10.jpg)
Tipos básicos e operaçõesBoolean (and, or, not, implies, if-then-else)Integer (*, +, -, /, abs)Real (*, +, -, /, floor)String (toUpper, concat)CollectionSetBagSequence
![Page 11: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/11.jpg)
Tipos básicos e operaçõesCada expressão OCL é escrita no contexto de um modelo UML contendo:
um número de classes;associações entre as classes;generalizações.
Todos as classes do modelo UML são tipos nas expressões OCL anexadas ao modelo.
![Page 12: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/12.jpg)
Tipos básicos e operaçõesRelações entre tipos:
Os tipos básicos são organizados numa hierarquia.Uma expressão OCL é válida quando os seus tipos conformam. Caso contrário, temos um “type conformance error”.
![Page 13: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/13.jpg)
Tipos básicos e operaçõesOs relacionamentos entre os tipos devem obedecer as seguintes regras:
Cada tipo conforma com seu supertipo;Se tipo1 conforma com tipo2, e tipo2 conforma com tipo3, então tipo1 conforma com tipo3.
![Page 14: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/14.jpg)
Tipos básicos e operaçõesCasting:
Algumas vezes precisamos usar uma propriedade de um objeto que é definido num subtipo do objeto corrente.object.oclAsType(Tipo2)Neste exemplo, object é do tipo Tipo1.Só podemos fazer o cast para um subtipo do tipo corrente.
![Page 15: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/15.jpg)
Objetos e propriedadesPropriedades:
O valor de uma propriedade de um objeto definido num diagrama de classes é especificado da seguinte forma:UmTipo
self.nomePropriedade
![Page 16: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/16.jpg)
Objetos e propriedadesAtributos
A idade de uma pessoa é escrita como:Personself.age
O tipo dessa expressão é o tipo do atributo age (Integer).Poderíamos definir como regra:
Personself.age >= 0
![Page 17: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/17.jpg)
Objetos e propriedadesOperações
Cada operação pode ser definida por uma restrição de pós-condição.Person::income (d : Date) : Integer
post: result = -- alguma função --Para o caso de uma operação sem parâmetros:Company
self.stockPrice()
![Page 18: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/18.jpg)
Objetos e propriedadesNavegação
Partindo de um certo objeto, podemos navegar numa associação do diagrama de classes, para referenciar outros objetos e suas propriedades.Companyself.manager -- do tipo Personself.employee -- do tipo Set(Person)
![Page 19: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/19.jpg)
Objetos e propriedadesNavegação
A execução da primeira expressão resultará num objeto do tipo Person.A execução da segunda expressão resultará num conjunto de Pessoas.Por default, navegação sempre resulta num conjunto. No caso da associação conter o elemento {ordered}, a navegação resulta numa sequência.
![Page 20: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/20.jpg)
Objetos e propriedadesOs tipos Set, Bag e Sequence são pré-definidos em OCL. Cada um desses tipos de coleção possui um grande número de operações pré-definidas.Temos acesso a uma propriedade de uma coleção usando uma seta ‘->’, seguida do nome da propriedade.
![Page 21: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/21.jpg)
Objetos e propriedadesA expressão abaixo resulta no número de empregadores da Pessoa self.Personself.employer->sizeA expressão abaixo resulta em ‘true’ caso o conjunto de empregadores é vazio.Personself.employer->isEmpty
![Page 22: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/22.jpg)
Objetos e propriedadesAlguns exemplos de expressões OCL:
self.wife->notEmpty implies self.wife.age >=18 andself.husband->notEmpty implies self.husband.age >= 18
self.employee->size <= 50
self.wife.sex = #female and self.husband.sex = #male
not ((self.wife->size = 1) and (self.husband->size = 1))
![Page 23: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/23.jpg)
Objetos e propriedadesNavegação para classes de associação:
OCL usa um ponto e o nome da classe de associação iniciando com letra minúscula.
Personself.jobResulta no conjunto de todos os empregos que a pessoa possui dentre as empresas.
![Page 24: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/24.jpg)
Objetos e propriedadesNavegação:
Podemos ainda fazer uma melhor seleção dos objetos. Veja os exemplos:
Bankself.customer -- resulta num Set(Person) contendo -- todos os clientes do banco.self.customer[8764423] -- resulta numa pessoaque possui número daconta igual a 8764423
![Page 25: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/25.jpg)
Objetos e propriedadesColeções:
O tipo coleção é pré-definido em OCL.Define um grande número de operações pré-definidas que possibilitam ao autor manipular coleções.Collection é um tipo abstrato, com os tipos concretos de coleções sendo:• Set, Sequence, e Bag.
![Page 26: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/26.jpg)
Objetos e propriedadesSet
É o conjunto matemático.Não contém elementos duplicados.
BagÉ como Set, mas pode conter elementos duplicados.
SequenceÉ como Bag, com elementos ordenados.
![Page 27: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/27.jpg)
Objetos e propriedadesPodemos obter coleções das seguintes maneiras:
Definindo de forma direta:• Set {1, 2, 3, 5, 7, 11, 13, 17}• Sequence {1, 2, 3, 5, 7, 11, 13, 17}• Bag {1, 2, 3, 2, 1}
Através de uma navegação:Company self.employeeOperações em coleções:collection1->union(collection2)
![Page 28: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/28.jpg)
Operações em coleçõesOperação Select
Muitas vezes queremos apenas um subconjunto de uma coleção.O Select é uma operação realizada sobre uma coleção, com a seguinte sintaxe:Companyself.employee->select (age > 50)Companyself.employee->select (p | p.age > 50)Companyself.employee->select (p : Person | p.age > 50)
![Page 29: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/29.jpg)
Operações em coleçõesOperação Reject
Idêntica ao Select, no entanto, o subconjunto que pegamos da coleção é composta pelos elementos que não satisfazem à expressão.As duas expressões abaixo são iguais:
Collection->reject ( v : Tipo | expressão-booleana )Collection->select ( v : Tipo | not (expressão-
booleana) )
![Page 30: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/30.jpg)
Operações em coleçõesOperação Collect
Usamos a operação quando queremos especificar uma coleção a partir de uma outra, mas com diferentes objetos da coleção original.Companyself.employee->collect (birthDate)self.employee->collect (person | person.birthDate)self.employee->collect (person:Person | person.birthDate)
![Page 31: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/31.jpg)
Operações em coleçõesOperação ForAll
Muitas vezes uma restrição é comum para todos os elementos de uma coleção.ForAll resulta num boolean. Retornará true caso a restrição seja comum a todos.
Companyself.employee->forAll ( sobrenome = ‘Schiel’ )Será true, caso todos os empregados da empresa tenham sobrenome “Schiel”.
![Page 32: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/32.jpg)
Operações em coleçõesOperação Exists
Muitas vezes precisamos saber se há pelo menos um elemento de uma coleção para o qual uma certa restrição é válida.
Companyself.employee->exists ( sobrenome = ‘Schiel’ )Será true, caso exista pelo menos um empregado da empresa com sobrenome “Schiel”.
![Page 33: Object Constraint Language Philip Stephen Medcraft](https://reader035.vdocuments.site/reader035/viewer/2022081502/5706384b1a28abb8238f5a80/html5/thumbnails/33.jpg)
Operações em coleçõesOperação Iterate
A sintaxe é a seguinte:collection->iterate ( elem : Tipo; acc : Tipo =
<expressão> |expressão-com-elem-e-acc )
collection->collect ( x : T | x.propriedade )é idêntico a:collection->iterate ( x : T; acc : T2 = Bag{} |
acc->including(x.property) )