object constraint language philip stephen medcraft
TRANSCRIPT
Object Constraint Language
Philip Stephen Medcraft
SumárioIntroduçãoLigação com a UMLTipos básicos e operaçõesObjetos e propriedadesOperações em coleções
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!
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.
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.
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.
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
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 ...
Tipos básicos e operaçõesBoolean (and, or, not, implies, if-then-else)Integer (*, +, -, /, abs)Real (*, +, -, /, floor)String (toUpper, concat)CollectionSetBagSequence
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.
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”.
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.
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.
Objetos e propriedadesPropriedades:
O valor de uma propriedade de um objeto definido num diagrama de classes é especificado da seguinte forma:UmTipo
self.nomePropriedade
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
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()
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)
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.
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.
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
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))
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.
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
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.
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.
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)
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)
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) )
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)
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”.
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”.
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) )