oops v2.0.0-rc.1 - interfaces and traits for ruby
TRANSCRIPT
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)