Top Banner
Designing with Groovy Traits Naresha K Chief Technologist Channel Bridge Software Labs [email protected] @naresha_k
40

Designing with Groovy Traits - Gr8Conf India

Jan 19, 2017

Download

Technology

Naresha K
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Designing with Groovy Traits - Gr8Conf India

Designing withGroovy Traits

Naresha K Chief Technologist

Channel Bridge Software Labs [email protected]

@naresha_k

Page 2: Designing with Groovy Traits - Gr8Conf India

About Me

Page 3: Designing with Groovy Traits - Gr8Conf India

OOP

Page 4: Designing with Groovy Traits - Gr8Conf India

Object Oriented Maturity Model

0

1

2

Page 5: Designing with Groovy Traits - Gr8Conf India
Page 6: Designing with Groovy Traits - Gr8Conf India
Page 7: Designing with Groovy Traits - Gr8Conf India
Page 8: Designing with Groovy Traits - Gr8Conf India

I made up the term ‘object-oriented', and I can tell you

I didn't have that in mind

Alan Kay

Page 9: Designing with Groovy Traits - Gr8Conf India

iskov Substitution Principle

Page 10: Designing with Groovy Traits - Gr8Conf India

"Favour 'object composition' over

'class inheritance'."

Page 11: Designing with Groovy Traits - Gr8Conf India
Page 12: Designing with Groovy Traits - Gr8Conf India

A case for Traits

Page 13: Designing with Groovy Traits - Gr8Conf India

The Problem

Bird charlie = new Bird()charlie.fly()

Butterfly aButterFly = new Butterfly()aButterFly.fly()

Page 14: Designing with Groovy Traits - Gr8Conf India

Recall Interfaces

interface Flyable {def fly()

}

Page 15: Designing with Groovy Traits - Gr8Conf India

class Bird implements Flyable {def fly() {println "Flying..."

}}

class Butterfly implements Flyable {def fly() {println "Flying..."

}}

Page 16: Designing with Groovy Traits - Gr8Conf India

The Smell

class Bird implements Flyable {def fly() {

println "Flying..."}

}

class Butterfly implements Flyable {def fly() {

println "Flying..."}

}

Page 17: Designing with Groovy Traits - Gr8Conf India

DRYclass FlyableImpl implements Flyable {def fly() {println 'Flying...'

}}

class Bird implements Flyable {def fly() {new FlyableImpl().fly()

}}

Page 18: Designing with Groovy Traits - Gr8Conf India

Making it Groovierclass DefaultFlyable implements Flyable {def fly() {println 'Flying...'

}}

class Bird {@DelegateFlyable flyable = new DefaultFlyable()

}

Page 19: Designing with Groovy Traits - Gr8Conf India

Summarizinginterface Flyable {def fly()

}

class DefaultFlyable implements Flyable {def fly() {println 'Flying...'

}}

class Bird {@DelegateFlyable flyable = new DefaultFlyable()

}

Page 20: Designing with Groovy Traits - Gr8Conf India

Introducing Trait

trait Flyable {def fly() {println "Flying.."

}}

class Bird implements Flyable {}

Page 21: Designing with Groovy Traits - Gr8Conf India

Multiple Capabilities

trait CanSing {def sing() {println "Singing"

}}

trait CanDance {def dance() {println "Dancing"

}}

class Person implements CanSing, CanDance {}

Person reema = new Person()reema.sing()reema.dance()

Page 22: Designing with Groovy Traits - Gr8Conf India

The Mechanics

Page 23: Designing with Groovy Traits - Gr8Conf India

Overriding Methods from a Trait

trait Speaker {def speak() {println "speaking"

}}

class Gr8ConfSpeaker implements Speaker {def speak() {println "Groovy is Groovy!"

}}

new Gr8ConfSpeaker().speak()

Page 24: Designing with Groovy Traits - Gr8Conf India

Traits can implement interfacesinterface Programmer {def code()

}

trait GroovyProgrammer implements Programmer {def code() {println 'coding Groovy'

}}

class Engineer implements GroovyProgrammer {}

new Engineer().code()

Page 25: Designing with Groovy Traits - Gr8Conf India

Traits can declare abstract methods

trait Programmer {abstract String getLanguage()def code() {println "Coding ${getLanguage()}"

}}

class GroovyProgrammer implements Programmer {String getLanguage() { "Groovy"}

}

new GroovyProgrammer().code()

Page 26: Designing with Groovy Traits - Gr8Conf India

Traits can have a state

trait Programmer {String languagedef code() {println "Coding ${language}"

}}

class GroovyProgrammer implements Programmer {}

new GroovyProgrammer(language: 'Groovy').code()

Page 27: Designing with Groovy Traits - Gr8Conf India

A trait can extend another traittrait JavaProgrammer {def codeObjectOriented() {println 'Coding OOP'

}}trait GroovyProgrammer extends JavaProgrammer {def codeFunctional() {println 'Coding FP'

}}class Engineer implements GroovyProgrammer {}Engineer raj = new Engineer()raj.codeFunctional()raj.codeObjectOriented()

Page 28: Designing with Groovy Traits - Gr8Conf India

A trait can extend from multiple traits

trait Reader {def read() { println 'Reading'}

}trait Evaluator {def eval() { println 'Evaluating'}

}trait Printer {def printer() { println 'Printing'}

}trait Repl implements Reader, Evaluator, Printer {}

Page 29: Designing with Groovy Traits - Gr8Conf India

The diamond problemtrait GroovyProgrammer {def learn() { println 'Learning Traits'}

}

trait JavaProgrammer {def learn() { println 'Busy coding'}

}

class Dev implements JavaProgrammer, GroovyProgrammer {}

new Dev().learn()

Page 30: Designing with Groovy Traits - Gr8Conf India

Finer control on the diamond problem

class Dev implements JavaProgrammer, GroovyProgrammer {

def learn() {JavaProgrammer.super.learn()

}

}

Page 31: Designing with Groovy Traits - Gr8Conf India

Applying traits at run time

trait Flyable{def fly(){println "Flying.."

}}

class Person {}new Person().fly()

Page 32: Designing with Groovy Traits - Gr8Conf India

Applying traits at run time

def boardAPlane(Person person) {person.withTraits Flyable

}

def passenger = boardAPlane(new Person())passenger.fly()

Page 33: Designing with Groovy Traits - Gr8Conf India

More examples

Page 34: Designing with Groovy Traits - Gr8Conf India

Composing Behaviours

trait UserContextAware {UserContext getUserContext(){// implementation

}}

class ProductApi implements UserContextAware {}

class PriceApi implements UserContextAware {}

Page 35: Designing with Groovy Traits - Gr8Conf India

common fieldstrait Auditable {String createdByString modifiedByDate dateCreatedDate lastUpdated

}

class Price implements Auditable {String productCodeBigDecimal mrpBigDecimal sellingPrice

}

Page 36: Designing with Groovy Traits - Gr8Conf India

common fields - a trait approach

Price groovyInActionToday = new Price(productCode: '9789351198260', mrp: 899, sellingPrice: 751,createdBy: 'admin',modifiedBy: 'rk')

println groovyInActionToday.createdByprintln groovyInActionToday.modifiedBy

Page 37: Designing with Groovy Traits - Gr8Conf India

Chaining

interface Manager {def approve(BigDecimal amount)

}

Page 38: Designing with Groovy Traits - Gr8Conf India

Chainingtrait JuniorManager implements Manager {def approve(BigDecimal amount){if(amount < 10000G){ println "Approved by JM” }else{println "Sending to SM"super.approve()

}}

}trait SeniorManager implements Manager {def approve(BigDecimal amount){println "Approved by SM"

}}

Page 39: Designing with Groovy Traits - Gr8Conf India

Chaining

class FinanceDepartment implements SeniorManager, JuniorManager {}FinanceDepartment finance = new FinanceDepartment()finance.approve(3000)finance.approve(30000)

Page 40: Designing with Groovy Traits - Gr8Conf India

Groovy Coding!