roles and collaborations in scala

22
Roles and Collaborations in Scala Michael Pradel TU Dresden / EPFL Lausanne Supervised by: Prof. Uwe Aßmann, Prof. Martin Odersky, Jakob Henriksson June 26, 2008 Michael Pradel Scala Roles 1

Upload: others

Post on 04-Nov-2021

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Roles and Collaborations in Scala

Roles and Collaborations in Scala

Michael Pradel

TU Dresden / EPFL Lausanne

Supervised by: Prof. Uwe Aßmann, Prof. Martin Odersky, Jakob Henriksson

June 26, 2008

Michael Pradel Scala Roles 1

Page 2: Roles and Collaborations in Scala

Motivation - Why Roles?

I Objects ...I evolve at runtimeI are used differently depending on the contextI interact in manifold ways

I Roles ...I dynamically add/remove members to/from objectsI provide viewsI are grouped into collaborations

person

boy friend

Michael Pradel Scala Roles 2

Page 3: Roles and Collaborations in Scala

Motivation - Why Roles?

I Objects ...I evolve at runtimeI are used differently depending on the contextI interact in manifold ways

I Roles ...I dynamically add/remove members to/from objectsI provide viewsI are grouped into collaborations

person

husband

Michael Pradel Scala Roles 3

Page 4: Roles and Collaborations in Scala

Motivation - Why Roles?

I Objects ...I evolve at runtimeI are used differently depending on the contextI interact in manifold ways

I Roles ...I dynamically add/remove members to/from objectsI provide viewsI are grouped into collaborations

person

employee

husband

Michael Pradel Scala Roles 4

Page 5: Roles and Collaborations in Scala

Motivation - Why Roles?

I Objects ...I evolve at runtimeI are used differently depending on the contextI interact in manifold ways

I Roles ...I dynamically add/remove members to/from objectsI provide viewsI are grouped into collaborations

person

employee

husband

employer

wife

Michael Pradel Scala Roles 5

Page 6: Roles and Collaborations in Scala

Motivation - Why Scala Roles?

I Roles are known for a long timeI More or less accepted in modelingI But not in programmer’s toolboxI Existing solutions to role-based programming

I Inconvenient, bulky syntax, orI Heavyweight language extensions

I Idea: Let’s do it in a Scala libraryI Easy, simple syntaxI Lightweight - no change to language

Michael Pradel Scala Roles 6

Page 7: Roles and Collaborations in Scala

Goals

I 15 features of roles (Steimann), e.g.I Roles have state and behaviorI Multiple roles per objectI Dynamically adding and removing roles

I Conserve underlying languageI Type safetyI Collaborations as programming and reuse abstraction

Michael Pradel Scala Roles 7

Page 8: Roles and Collaborations in Scala

Representing Roles

Roles as classes?

Supertypes:

Husband Employee

Person

I All instances play theroles

Subtypes:

Person

Husband Employee

I Roles depend on coretypes

Roles as traits? No dynamism.

→ Our approach: Roles as objects

Michael Pradel Scala Roles 8

Page 9: Roles and Collaborations in Scala

Compound Objects with Dynamic Proxies

I An object and its roles should appear as one object→ Compound object

I Idea: Represent them with a dynamic proxyI Created at runtime on demandI Proxy delegates using reflectionI Type-safe access to role-playing objects

personemployee

proxyclient

Michael Pradel Scala Roles 9

Page 10: Roles and Collaborations in Scala

Compound Objects with Dynamic Proxies

I An object and its roles should appear as one object→ Compound object

I Idea: Represent them with a dynamic proxyI Created at runtime on demandI Proxy delegates using reflectionI Type-safe access to role-playing objects

person: P

employee: E

proxy: P with Eclient

Michael Pradel Scala Roles 10

Page 11: Roles and Collaborations in Scala

The as operator

I One simple operator for accessing roles:object as role

I Returns object and role hidden behind a proxyI Problem: Roles can be bound to arbitrary objects, i.e. not

having a method as

I Solution: Implicit conversionobject.as(role) → role.playedBy(object)

Michael Pradel Scala Roles 11

Page 12: Roles and Collaborations in Scala

Representing Collaborations

I Nesting of traits (or classes)I Outer trait is collaboration, inner traits are roles

class Employment(hourlyWage: Int) extends TransientCollaboration {val employee = new Employee{}val employer = new Employer{}

trait Employee extends Role[Person] {var hoursWorked = 0var money = 0def work = hoursWorked += 8

}

trait Employer extends Role[Person] {def payOff = {employee.money += employee.hoursWorked * hourlyWageemployee.hoursWorked = 0

} } }

Michael Pradel Scala Roles 12

Page 13: Roles and Collaborations in Scala

.. and how to use it

val jack = new Person{}val bill = new Person{}val mary = new Person{}

val company = new Employment(15)val pub = new Employment(7)

(bill as company.employee).work(jack as company.employer).payOff

(mary as pub.employee).work(bill as pub.employer).payOff

Michael Pradel Scala Roles 13

Page 14: Roles and Collaborations in Scala

Roles and Role Mappers

I Sometimes useful: Arbitrary many instances of a roleI Role mappers ...

I create new role instances on demandI manage binding between cores and roles

I Same syntax: object as role

I Example: Multiple employees

bill as company.employeepaul as company.employeebill as company.employee

→ Two role instances

Michael Pradel Scala Roles 14

Page 15: Roles and Collaborations in Scala

Sticky Roles

I Alternative to as: Sticky rolesI Similar to first-class relationshipsI Participants of collaboration given in constructorI Example:

val company = new Employment(jack, bill)company.employee.workcompany.employer.payOff

Michael Pradel Scala Roles 15

Page 16: Roles and Collaborations in Scala

Forwarding vs. Delegation (Self Problem)

I Delegation: this always refers to the original receiver of amethod call

I Usual behavior in object-based languagesI Example: Employee overrides greet method

proxy

person employee

1. pickUpPhone()

2. pickupPhone() 3. greet()

Michael Pradel Scala Roles 16

Page 17: Roles and Collaborations in Scala

Delegation with Proxies and Traits

How Scala translates traits:

trait T {def fct = 23

}

public interface T {public int fct();

}public abstract class T$class {public static int fct(T $this) {return 23;

}}

I Idea: Set $this to the proxyI Method dispatch is done reflectively

1. Delegate to role object, if possible2. Delegate to core object, otherwise

Michael Pradel Scala Roles 17

Page 18: Roles and Collaborations in Scala

Case Study: Design Patterns

I Patterns assign roles to participating objectsI Applying the Scala Roles library to 24 patterns

(23 Gang of Four + Role Object)

Results:I Reusable collaborations: Composite, ObserverI Enhancements with roles: Decorator, Mediator, Role

Object, Template MethodI Obsolete in Scala: Adapter, Command, Interpreter,

Singleton, Strategy, VisitorI Invariant: remaining 11

Michael Pradel Scala Roles 18

Page 19: Roles and Collaborations in Scala

A Reusable Pattern Collaboration: Observer

I Observer contains two roles: Subject and ObserverI Most code of the subject can be easily reused:

private val observers = new HashSet[Observer]()def addObserver(o: Observer) = observers += odef removeObserver(o: Observer) = observers -= odef notifyObservers = observers.foreach(_.update(this))

I Idea: Dynamically add subject role to objectsI Arbitrary objects become observable without changing

their class

Michael Pradel Scala Roles 19

Page 20: Roles and Collaborations in Scala

Example

trait Book {private var status = "available"def borrow = { status = "borrowed" }def returnIt(late: Boolean) = { status = "available" }def turnPage = { }

}

val b = new Book{}; val l = new Library{}val o = new ObserverCollab[Book]("status")// or "borrow()", "returnIt(Boolean)", "returnIt(*)", etc.

val observableBook = b as o.subjectobservableBook.addObserver(l)

observableBook.borrow // invokes l.update(observableBook)

Michael Pradel Scala Roles 20

Page 21: Roles and Collaborations in Scala

Conclusions

I Roles are a useful programming abstractionI Programming technique to express roles and

collaborationsI Compound objects with dynamic proxiesI Access to role-playing objects is type-safeI It’s all just a library: No change of compiler, tools, etc.

See also:

Michael Pradel, Martin OderskyScala Roles - A Lightweight Approach towards Reusable CollaborationsICSOFT 2008

Michael Pradel Scala Roles 21

Page 22: Roles and Collaborations in Scala

Thanks! Questions?

Michael Pradel Scala Roles 22