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.
No comments:
Post a Comment