Today I'm gonna single out the object example in the CoffeScript guide. In this guide we get the Animal class example:
class Animal
constructor: (@name) ->
move: (meters) ->
alert @name + " moved #{meters}m."
class Snake extends Animal
move: ->
alert "Slithering..."
super 5
class Horse extends Animal
move: ->
alert "Galloping..."
super 45
sam = new Snake "Sammy the Python"
tom = new Horse "Tommy the Palomino"
sam.move()
tom.move()
This code is in violation of the Call Super code smell. We finally get half decent classes in Javascript using CoffeeScript, and this is the first example given - one that is considered by some to be an anti-pattern. Below I'm going to feature an attempt to refactor out this smell.
Updated Code
class Animal
constructor: (@name) ->
move: (meters = @distance()) ->
alert @movingMessage()
alert @name + " moved #{meters}m."
movingMessage: -> "Moving..."
distance: -> 10
class Snake extends Animal
movingMessage: -> "Slithering..."
distance: -> 5
class Horse extends Animal
movingMessage: -> "Galloping..."
distance: -> 45
sam = new Snake "Sammy the Python"
tom = new Horse "Tommy the Palomino"
sam.move()
tom.move()
Delegate methods are a much better use for an inheritance contract than methods that override a super to provide essentially the same behavior, only with different parameters. I would argue that the second version is substantially clearer as each method does precisely one thing, including the move method of Animal.