DEV Community

Cover image for Composition in Ruby
Hartmut B.
Hartmut B.

Posted on

Composition in Ruby

As Rubyists prepare for the most anticipated release of Ruby 3.0, its worth looking to unchanged principles.

Composition

One exiting feature of the ruby language is the presence of Modules.

module LimitOrder def price @price end end class Order attr :what, :amount (...) end class StockOrder < Order include LimitOrder (...) end 
Enter fullscreen mode Exit fullscreen mode

StockOrder inheritances anything from Order and has access to properties and methods of LimitOrder.

  • include works on instances of an object. Thus, any object generated by Stockorder.new can access the price method.

  • extend on the other hand includes properties and methods to classes and modules.

Instantiate Objects without publicly calling new

Let's design a module OrderPrototype. Its main purpose is to provide a method order, which finally calls Order.new.

module OrderPrototype def defaults { } end def order **fields (...) ## process fields and fillup arguments Order.new **arguments end end 
Enter fullscreen mode Exit fullscreen mode

The composition process starts by defining a module Limit:

module Limit extend OrderPrototype class << self def defaults super.merge { order_type: :limit, tif: :good_till_cancelled } end end end 
Enter fullscreen mode Exit fullscreen mode

class << self assigns the following methods to the class-level. defaults are processed by OrderProtoype.order.

Limit.order size: 1, (...) instantiates a specialized Order-Object without inheritance. Other useful order prototypes are Market.order, StopLimit.order a.s.o.

The Limit-object acts as a singleton
masquerading as constructor for conventional ruby objects.

The approach is implemented in: https://github.com/ib-ruby/ib-extensions/blob/master/lib/ib/order-prototypes.rb
and further documented here

Top comments (0)