Skip to content

Instantly share code, notes, and snippets.

View mikekelly's full-sized avatar

Mike Kelly mikekelly

View GitHub Profile
@mikekelly
mikekelly / base_consumer.rb
Last active November 13, 2015 10:38
A better consumer interface for hutch consumers
require 'hutch'
class BaseConsumer
# Ensure subclass is passed to Hutch::Consumer.included
def self.inherited(subclass)
subclass.include Hutch::Consumer
end
# Option to initialize a consumer with a message
def initialize(message: nil)
@mikekelly
mikekelly / hactor_example.rb
Created November 26, 2012 22:44
Hactor example
require 'hactor'
class HomeActor
include Hactor::Actor
def on_200(response)
response.follow 'ht:users', actor: UserListActor.new
end
end
{
"_links": {
"self": {
"href": "/product/987"
},
"manufacturer": {
"href": "/manufacturer/328764",
"title": "Manufacturer Inc."
}
},
{
"_links": {
"self": { "href": "/foo" },
},
"_controls": {
"attack": {
"target": "/attacks",
"method": "POST",
"headers": {
"Content-Type": "application/json"
@mikekelly
mikekelly / rspec_stub_chain_if_spec.rb
Created September 27, 2012 10:50 — forked from deepak/rspec_stub_chain_if_spec.rb
mocking stub chains with an assertion if the final call is made
require 'rspec'
class DevOps
attr_reader :monitor
def initialize(arguments)
@monitor = arguments.fetch(:monitor) { Monitor.new }
end
def check
require_relative 'deferrable'
require_relative 'slime'
class WidgetsController
include ControllerSlime
def create
creator = WidgetCreator.new(attributes: params[:widget])
creator.done do |widget|
<!doctype html>
<head>
<title>An example tweet</title>
</head>
<body xmlns:ht="http://haltalk.herokuapp.com/rels/">
<form class="properties" action="" method="POST">
<input type="hidden" name="_method" value="PUT" />
<input name="content" value="Justin Bieber is grate!111" />
<input name="created_at" value="2012-07-07T22:35:33+00:00" />
<button>Update</button>
@mikekelly
mikekelly / sketch.rb
Created July 4, 2012 06:36 — forked from mattwynne/sketch.rb
sketch for Matt Wynne
class Organization
def to_param
"42"
end
def saved?
rand > 0.5
end
end
@mikekelly
mikekelly / Backbone-HAL.js.coffee
Created May 28, 2012 11:19
Two small components for making Backbone play nicely with application/hal+json
window.HAL = {}
class HAL.Model extends Backbone.Model
constructor: (attrs) ->
super @parse(_.clone attrs)
parse: (attrs = {}) ->
@links = attrs._links || {}
delete attrs._links
@embedded = attrs._embedded || {}

Inheritance is a key concept in most object-oriented languages, but applying it skillfully can be challenging in practice. Back in 1989, M. Sakkinen wrote a paper called Disciplined inheritance that addresses these problems and offers some useful criteria for working around them. Despite being more than two decades old, this paper is extremely relevant to the modern Ruby programmer.

Sakkinen's central point seems to be that most traditional uses of inheritance lead to poor encapsulation, bloated object contracts, and accidental namespace collisions. He provides two patterns for disciplined inheritance and suggests that by normalizing the way that we model things, we can apply these two patterns to a very wide range of scenarios. He goes on to show that code that conforms to these design rules can easily be modeled as ordinary object composition, exposing a solid alternative to tradi