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
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 byStockorder.new
can access theprice
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
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
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)