OOPS v2.0.0-rc.1 - Interfaces and Traits for Ruby

Preview:

Citation preview

OOPS v2.0.0-rc.1Aditya Godbole

@aagdbl

Definitions

• Type - Set of methods

• Subtype(T) - Superset methods of the type T

• Class - Implementation of type + properties of implementing object

Maintainability

Maintainability

Re-use

Maintainability

Re-use

of?

Behaviour

(not data)

Maintainability

Maintainability

• Re-use of behaviour

Maintainability

• Re-use of behaviour

• Typing and Sub-typing

Axes of maintainability

Axes of maintainability

Don’t repeatyourself(DRY)

Axes of maintainability

Don’t repeatyourself(DRY)

Axes of maintainability

Don’t repeatyourself(DRY)

Don’t shoot yourself(DSY)

Maintainability

• Re-use of behaviour

• Sub-typing

Maintainability

• Re-use of behaviour

• Sub-typing Granularity

Composability

• Behaviour - Inject behaviour from multiple sources

• Types - Create superset types by combining smaller types

Classes

• Re-use

• Multiple inheritance

• Subtyping (Polymorphism)

• Multiple inheritance

Interfaces

Interfaces

• Type definitions

Interfaces

• Type definitions

• Composable

DRY

DSY

Classes / Inheritance

InterfacesJava?

DRY

DSY

Classes / Inheritance

Interfaces

Mixins /Modules

Java?

DRY

DSY

Classes / Inheritance

Interfaces

Mixins /Modules

Java?

Ruby?

DRY

DSY

Classes / Inheritance

Interfaces

Mixins /Modules

Java?

DRY

DSY

Classes / Inheritance

Interfaces

Mixins /Modules

Java?

Ruby?

DRY

DSY

Classes / Inheritance

Interfaces

Mixins /Modules

Java?

Ruby?Interfaces?

gem install rubycube

require “cube”

Composable Units of BEhaviour

DRY

DSY

Classes / Inheritance

Interfaces

Mixins /Modules

Java?

RubyInterfaces

DRY

DSY

Classes / Inheritance

Interfaces

Mixins /Modules

Java?

DRY

DSY

Classes / Inheritance

Interfaces

Mixins /Modules

Java?

RubyInterfaces

DRY

DSY

Classes / Inheritance

Interfaces

Mixins /Modules

Java?

RubyInterfaces

??

Conflicts

required interface

(sum, pos, fact)

AdvancedCalc =

SimpleCalcImpl

ProductCalcT

StatsCalcT - [:product]

+

+

=> AdvancedCalculator

Using Traits• Structural classes - Enforce structural integrity.

• Identify interactions - Create smallest possible interface

• Traits should be smaller or equal to interfaces

• If required - extend structural class to create glue class for required interface

• Compose using traits

Specs

• Rspec “shared_examples”

• Compose specs using “it_behaves_like”

Also achievable …

• Java 8+

• Golang

DRY

DSY

Java 8

InterfacesTraits

Ruby Go

__/\__

https://github.com/adityagodbole/rubycube

gem install rubycube

(please go and read the traits paper)