37
Object Constraint Language in Together Dan Massey Y&L Consulting

Object Constraint Language in Together Dan Massey Y&L Consulting

Embed Size (px)

Citation preview

Page 1: Object Constraint Language in Together Dan Massey Y&L Consulting

Object Constraint Language

in Together

Dan Massey

Y&L Consulting

Page 2: Object Constraint Language in Together Dan Massey Y&L Consulting

Picking up From Logicians

Follows 3242 presentation to go in depth on OCL and using OCL in tools

The preconference tutorial used the slides from session 3242 as the first third of the presentation.

Page 3: Object Constraint Language in Together Dan Massey Y&L Consulting

OCL Topics

OCL Basics

The LiquidLemons Example

OCL in Together

Team Modeling Exercise

Page 4: Object Constraint Language in Together Dan Massey Y&L Consulting

OCL Topics

OCL Basics

The LiquidLemons Example

OCL in Together

Team Modeling Exercise

Page 5: Object Constraint Language in Together Dan Massey Y&L Consulting

OCL is

Strongly typed declarative language

Small set of built-in types, including collections

User-defined types and operators

Page 6: Object Constraint Language in Together Dan Massey Y&L Consulting

OCL Basic Types

Boolean true or false

Integer theoretically unlimited natural numbers, subtype of Real

Real mathematical Real, no specific

implementation implied

String ‘sequence of characters’

Page 7: Object Constraint Language in Together Dan Massey Y&L Consulting

Boolean Operations

a : Boolean b : Boolean

a and b a or b a xor b

not a a = b a <> b

a implies b

implies constraint:

if a is true then b must be true

Page 8: Object Constraint Language in Together Dan Massey Y&L Consulting

Numeric Operators

Comparison

= equals <> not equals

< less > more

<= less or equal >= more or equal

Math

+ addition - subtraction

* multiplication / division

Page 9: Object Constraint Language in Together Dan Massey Y&L Consulting

Every Type in OCL is an Object

a : Integer b:Integer

a.mod(b) a.div(b)

a.abs() a.max(b)

a.min(b) a.round()

a.floor()

Operators are just infix notation operations.

Page 10: Object Constraint Language in Together Dan Massey Y&L Consulting

String Operations

a : String b : String

a = b a <> b

a.concat(b) a.size()

a.toLower() a.toUpper()

a.subString(1, 3)

Operations return new Strings.

Page 11: Object Constraint Language in Together Dan Massey Y&L Consulting

OCL Conditional

OCL provides one conditional construct:

if <Boolean expression>

then <expression>

else <expression>

endif

No “elseif” or “switch”/“case”

Page 12: Object Constraint Language in Together Dan Massey Y&L Consulting

OCL Operation Precedence

Grouping ()Path resolution ::Message notation . -> also ^ ^^Unary - notMultiplication/Division * /Addition/Subtraction + -Comparison < > <= >= <> =Logical and or xorLogical implication implies

Page 13: Object Constraint Language in Together Dan Massey Y&L Consulting

User-Defined Types

Classes, Interfaces, etc. defined in the model

Users may overload infix and unary operators:

Multiply Money by a Real

Add two Distance values

Page 14: Object Constraint Language in Together Dan Massey Y&L Consulting

OCL Collections

Refreshing our memories, we have:

Collection

Bag Sequence

Set OrderedSet

OCL allows you to treat any instance like a collection. You can ask if a single attribute is empty.

Page 15: Object Constraint Language in Together Dan Massey Y&L Consulting

Collections must by Typed

Set(Bid)

Bag(String)

Like generics in Java or templates in C++.

Page 16: Object Constraint Language in Together Dan Massey Y&L Consulting

Collections Literals

Use curly brackets around comma lists to specify Collection literals.

Bag {‘sock’, ‘sock’, ‘shirt’, ‘sweater’, ‘sock’}

Sequence {‘abe’, ‘bob’, ‘bob’, ‘tim’, ‘zak’}

Set {16.0, 2.0, 64.0, 8.0, 128.0, 3.5}

OrderedSet {1, 2, 4, 8, 16, 32, 64, 128}

You can also specify Collections of Collections.

Page 17: Object Constraint Language in Together Dan Massey Y&L Consulting

Basic Collections Operations

a : Set(String) b : String c : Set(String)

a = c a <> c

a->size() a->count(b)

a->excludes(b) a->excludesAll(c)a->includes(b) a->includesAll(c)a->isEmpty() a->notEmpty()a->sum() -- contents are of type supporting +

Page 18: Object Constraint Language in Together Dan Massey Y&L Consulting

More Collections Operations

OCL supports a wide range of Collection operations that vary by Collection type.

first(), last(), at(i : Integer), etc. for {ordered} collections

union(), -, asSet(), including(), symmetricDifference(collection : Collection) are a sample

Page 19: Object Constraint Language in Together Dan Massey Y&L Consulting

Flatten

Recursively adds the members of nested collections to a single collection.

context MyTypedef: a : Set(Set(Integer)) =

Set {Set{1, 2, 3}, Set{3, 4, 5}, Set{4, 5, 6}}

a->flatten() = Set{2, 3, 1, 5, 4, 6} -- no order

Page 20: Object Constraint Language in Together Dan Massey Y&L Consulting

Collection Loops

OCL supports an iterate() operation for Collections. On top of that idea, OCL provides a set of Collection operations that accept expression.

Examples:

any(expression) exists(expression)

collect(expression) one(expression)

select(expression) reject(expression)

Page 21: Object Constraint Language in Together Dan Massey Y&L Consulting

Other OCL Types

OclAny the root Type

OclVoidthe “null” Type “undefined”

OclType a type, like “Class” in Java

OCL provides operations for type identification.

Tuple group of named values

Tuple {name : String = ‘Dan’, role : Role = Role::Speaker}

Page 22: Object Constraint Language in Together Dan Massey Y&L Consulting

OCL Topics

OCL Basics

The LiquidLemons Example

OCL in Together

Team Modeling Exercise

Page 23: Object Constraint Language in Together Dan Massey Y&L Consulting

Liquid Lemons Domain

Page 24: Object Constraint Language in Together Dan Massey Y&L Consulting

LL Invariantscontext Sale-- a Sale has one or more itemsinv numberOfSaleItems : items->size() > 1

-- a Sale's subtotal may not be less than zeroinv subtotalGreaterThanZero : subtotal().amount >

0.0 and subtotal().currency = Currency::USDollars

Page 25: Object Constraint Language in Together Dan Massey Y&L Consulting

LL Pre and Postcontext LiquidLemons::addLemonade(flavor :

Flavor, size : DrinkSize)pre activeSale : currentSale->size() = 1pre mustHaveFlavor : not flavor.oclIsUndefined()pre mustSpecifySize : not size.oclIsUndefined()post newLemonade :

currentLemonade->size() = 1

Page 26: Object Constraint Language in Together Dan Massey Y&L Consulting

LL Query

Page 27: Object Constraint Language in Together Dan Massey Y&L Consulting

Collections Queries

context ItemAnalyzer::averagePrice() : Moneybody: items.basePrice()->sum() /

items.basePrice()->size()

context ItemAnalyzer::uniqueModDescriptions() : Set(String)

body: items.modDescriptions() ->flatten()->asSet()

Page 28: Object Constraint Language in Together Dan Massey Y&L Consulting

Composite QueriesUse small methods with single responsibilities to build up

larger functions.

-- the total we want is subtotal plus taxcontext Sale::total() : Moneybody: subtotal() + tax()

-- tax is the subtotal times the local tax ratecontext Sale::tax() : Moneybody: subtotal() * Tax::localRate

Page 29: Object Constraint Language in Together Dan Massey Y&L Consulting

Composite Queries Cont.context Sale::subtotal() : Moneybody: items.price()->sum()

context LineItem::price() : Moneybody: basePrice() + modsPrice()

context LineItem::modsPrice() : Moneybody: modifiers.price()->sum()

Page 30: Object Constraint Language in Together Dan Massey Y&L Consulting

Don’t Do Thiscontext LineItem::basePrice() : Moneybody: if size = DrinkSize::Small then if flavor = Flavor::Regular then Money::newInstance(1.23, Currency::USDollars) else Money::newInstance(1.73, Currency::USDollars) endif else if flavor = Flavor::Regular then Money::newInstance(2.43, Currency::USDollars) else Money::newInstance(3.13, Currency::USDollars) endif endif

Page 31: Object Constraint Language in Together Dan Massey Y&L Consulting

Use Polymorphism

Little policy classes are an extension of the little operations idea. Smaller rules are easier to read.

context LargeRegularLemonade::basePrice() : Moneybody: Money::newInstance(2.43, Currency::USDollars)

context SmallFlavoredLemonade::basePrice() : Moneybody: Money::newInstance(1.72, Currency::USDollars)

Page 32: Object Constraint Language in Together Dan Massey Y&L Consulting

OCL Topics

OCL Basics

The LiquidLemons Example

OCL in Together

Team Modeling Exercise

Page 33: Object Constraint Language in Together Dan Massey Y&L Consulting

Where Does the OCL Go?

Use the named property fields and boxes.

Shows up in generated docs and XMI export.

Not visible in diagrams.

Page 34: Object Constraint Language in Together Dan Massey Y&L Consulting

OCL Notes

Attach notes containing OCL to correct contexts.

OCL is visible in the diagrams.

Potential to clutter the model.

Page 35: Object Constraint Language in Together Dan Massey Y&L Consulting

Together Designer

Syntax checked OCL in “Constraint Notes” that establish context.

Now in field test.

Page 36: Object Constraint Language in Together Dan Massey Y&L Consulting

OCL Topics

OCL Basics

The LiquidLemons Example

OCL in Together

Team Modeling Exercise

Page 37: Object Constraint Language in Together Dan Massey Y&L Consulting

Domain Options

Tic-Tac-Toe

Ants

Electronic Voting

Poem

Golf

Turtle Logo

Dog Kennel