Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Duck Typing, Compatibility, and the Adaptor Pat...

Duck Typing, Compatibility, and the Adaptor Pattern

Nordic JS, 2014

Reg Braithwaite

September 12, 2014
Tweet

More Decks by Reg Braithwaite

Other Decks in Programming

Transcript

  1. StandardCell.prototype.neighbours = function neighbours (neighbours) { return this._neighbours; }; StandardCell.prototype.setNeighbours

    = function setNeighbours (neighbours) { this._neighbours = neighbours.slice(0); return this; };
  2. StandardCell.prototype.nextAlive = function nextAlive () { var alives = this._neighbours.filter(function

    (n) { return n.alive(); }).length; if (this.alive()) { return alives === 2 || alives == 3; } else { return alives == 3; } };
  3. Universe.prototype.iterate = function iterate () { var aliveInNextGeneration = this.cells().map(

    function (c) { return [c, c.nextAlive()]; } ); aliveInNextGeneration.forEach(function (a) { var cell = a[0], next = a[1]; cell.setAlive(next); }); };
  4. View.prototype.drawCell = function drawCell (cell, x, y) { var xPlus

    = x + this.cellSize(), yPlus = y + this.cellSize() this._canvasContext.clearRect(x, y, xPlus, yPlus); this._canvasContext.fillStyle = this.cellColour(cell); this._canvasContext.fillRect(x, y, xPlus, yPlus); return self; };
  5. function ColourCell () { this._neighbours = []; this._age = 0;

    } ColourCell.prototype.neighbours = StandardCell.prototype.neighbours; ColourCell.prototype.setNeighbours = StandardCell.prototype.setNeighbours;
  6. ColourCell.prototype.nextAge = function next () { var alives = this._neighbours.filter(function

    (n) { return n.age() > 0; }).length; if (this.age() > 0) { return (alives === 2 || alives == 3) ? (this.age() + 1) : 0; } else { return (alives == 3) ? (this.age() + 1) : 0; } };
  7. Universe.prototype.iterate = function iterate () { var ageInNextGeneration = this.cells().map(

    function (c) { return [c, c.nextAge()]; } ); ageInNextGeneration.forEach(function (a) { var cell = a[0], next = a[1]; cell.setAge(next); }); };
  8. var COLOURS = [ BLACK, GREEN, BLUE, YELLOW, WHITE, RED

    ]; View.prototype.cellColour = function cellColour (cell) { return COLORS[ (cell.age() >= COLOURS.length) ? (COLOURS.length - 1) : cell.age() ]; }; // ...
  9. AsStandard.prototype.neighbours = function neighbours () { return this._colouredCell.neighbours(); }; AsStandard.prototype.setNeighbours

    = function setNeighbours (neighbours) { this._colouredCell.setNeighbours(neighbours); return this; };