OCL aliases
This is just a copy/paste of a reply I made in a newsgroup, but I think it is quite informative so here it is....
KEY
Square brackets denote a class [Person]
Rounded brackets denote a role (Pets)
Let's say you have a Car class and a Garage class, an individual car is regularly serviced at a specific garage so you have the following association
sensitive format for clarity :-)
KEY
Square brackets denote a class [Person]
Rounded brackets denote a role (Pets)
Let's say you have a Car class and a Garage class, an individual car is regularly serviced at a specific garage so you have the following association
The above OCL will fail because "Garage" is a class so the parser is expecting stuff like "allInstances". So you might think this should work
[Garage] (Garage) 1----0..* (ServicableCars) [Car]
Car.allInstances->select(Garage.Code = '1234')
but it doesn't because "self" refers to the root object and not the object at the parsed node where it is specified. This is what aliases are for:
Car.allInstances->select(self.Garage.Code = '1234')
This was possible in Bold too (native windows predecessor to ECO), but in Bold you could differentiate between members and classes through case sensitivity. PascalCase always meant a class whereas camelCase always meant a member, so this would work in Bold but doesn't in ECO as it is not case sensitive
{aliasname} + {pipe}
Car.allInstances->select(currentCar | currentCar.Garage.Code = '1234')
Although ECO is not case sensitive you will notice that I still use the
Car.allInstances->select(garage.code = '1234')
sensitive format for clarity :-)
Comments