KonstKh
12/6/2017 - 5:33 PM

Composition vs inheritance https://www.youtube.com/watch?v=wfMtDGfHWpA

Animal
.poop()
Dog
  // .poop()
  .bark()
Cat
  // .poop()
  .meow()
  
Robot
  .drive()
CleaningRobot
  // .drive()
  .clean()
  
MurderRobot
  // .drive()
  .kill()
  
// create robot which drive, kill and bark but not poop!

MurderRobotDog
  .bark()
// inheritance: dicide what your types are  
// composition: decide what your type do

//Composition
dog= pooper + barker
cat= pooper + meower
cleanongRobot= driver+cleaner
murderRobot= driver + killer
murderRobotDog= driver + killer + barker

//Implementation

const barker = (state) => ({
  bark: ()=> console.log('woof, I am ' + state.name);
});

const driver = (state) => ({
  drive: () => state.position = state.position + state.speed;
});

barker({name: 'karo'}).bark(); // woof, I am karo

const murderRobotDog = (name) => {
  let state = {
    name,
    speed: 100,
    position: 0
  }
  return Object.assign(
    {},
    barker(state),
    driver(state),
    killer(state)
    )
}

murderRobotDog('sniffles').bark(); // woof, I am sniffles