BeesBeesBees!

왕지호·2022년 11월 21일
0

오늘은 비동기를 이용한 프로토타입 과제인 BeesBeesBees를 배워보자!

BeesBeesBees

├── Grub
│ └── Bee
│ ├── HoneyMakerBee
│ └── ForagerBee

위에서 볼 수 있는 것처럼, 모든 Bee는 Grub을 기반으로 하여 각자의 특성에 맞는 일을 받게 된다.
공통된 특성을 기반으로 각자에게 맞는 특성을 부여받을 수 있는 것은 상속이 이루어졌음을 의미함!

이것을 토대로 과제를 작성해보자!


  1. Grub (Grub은 다른 모든 Bee의 기반)
  • Test Case
describe('Grub class functionality', () => {
  var grub;

  beforeEach(() => grub = new Grub());

  it('`age` 속성은 `0`이어야 합니다', () => {
    expect(grub.age).to.equal(0);
  });

  it('`color` 속성은 `pink`이어야 합니다', () => {
    expect(grub.color).to.equal('pink');
  });

  it('`food` 속성은 `jelly`이어야 합니다', () => {
    expect(grub.food).to.equal('jelly');
  });

  it('`eat` 메소드가 존재해야 합니다', () => {
    expect(grub.eat).to.be.a('function');
  });

  it('`eat` 메소드를 통해 `Grub`이 젤리를 먹습니다', () => {
    expect(grub.eat()).to.equal('Mmmmmmmmm jelly');
  });
  • Answer
class Grub {
  // TODO..
  constructor() {
    this.age = 0;
    this.color = "pink";
    this.food = "jelly";
  }
  eat() {
    return `Mmmmmmmmm ${this.food}`;
  }
}

module.exports = Grub;
  • constructor, 즉 생성자 함수를 이용해서 class 작성.

  1. Bee
  • Test Case
describe('Bee class functionality', () => {
  var bee;

  beforeEach(() => bee = new Bee());

  /*  Overwrite methods from superclass  */

  it('`age` 속성은 `5`이어야 합니다', () => {
    expect(bee.age).to.equal(5);
  });

  it('`color` 속성은 `yellow`이어야 합니다', () => {
    expect(bee.color).to.equal('yellow');
  });

  /*  Inherited from superclass  */

  it('`food` 속성은 Grub으로부터 상속받습니다', () => {
    expect(bee.food).to.equal('jelly');
  });

  it('`eat` 메소드는 Grub으로부터 상속받습니다', () => {
    expect(bee.eat).to.be.a('function');
  });

  /*  New methods and properties  */

  it('`job` 속성은 `Keep on growing`이어야 합니다', () => {
    expect(bee.job).to.equal('Keep on growing');
  });
  • Answer
const Grub = require("./Grub");

class Bee extends Grub {
  // TODO..
  constructor() {
    super();
    this.age = 5;
    this.color = "yellow";
    this.job = "Keep on growing";
  }
}

module.exports = Bee;
  • extends와 super() 키워드를 이용해서 상속을 구현하기!

  1. HoneyMakerBee
  • Test Case
describe('HoneyMakerBee class functionality', () => {
  var honeyBee;

  beforeEach(() => honeyBee = new HoneyMakerBee());

  /*  Overwrite methods from superclass  */

  it('`age` 속성은 `10`이어야 합니다', () => {
    expect(honeyBee.age).to.equal(10);
  });

  it('`job` 속성은 `make honey`이어야 합니다', () => {
    expect(honeyBee.job).to.equal('make honey')
  });

  /*  Inherited from superclass  */

  it('`color` 속성은 `Bee`로부터 상속받습니다', () => {
    expect(honeyBee.color).to.equal('yellow');
  });

  it('`food` 속성은 `Grub`으로부터 상속받습니다', () => {
    expect(honeyBee.food).to.equal('jelly');
  });

  it('`eat` 메소드는 `Grub`으로부터 상속받습니다', () => {
    expect(honeyBee.eat).to.be.a('function');
  });

  /*  New methods and properties  */

  it('`honeyPot` 속성은 `0`이어야 합니다', () => {
    expect(honeyBee.honeyPot).to.equal(0);
  });

  it('`makeHoney` 메소드는 `honeyPot`에 1씩 추가합니다', () => {
    expect(honeyBee.makeHoney).to.be.a('function');
    honeyBee.makeHoney();
    expect(honeyBee.honeyPot).to.equal(1);
    honeyBee.makeHoney();
    expect(honeyBee.honeyPot).to.equal(2);
  });

  it('`giveHoney` 메소드는 `honeyPot`에 1씩 뺍니다', () => {
    expect(honeyBee.giveHoney).to.be.a('function');
    honeyBee.makeHoney();
    honeyBee.makeHoney();
    honeyBee.makeHoney();
    honeyBee.giveHoney();
    expect(honeyBee.honeyPot).to.equal(2);
  });
  • Answer
const Bee = require("./Bee");

class HoneyMakerBee extends Bee {
  // TODO..
  constructor() {
    super();
    this.age = 10;
    this.job = "make honey";
    this.honeyPot = 0;
  }
  makeHoney() {
    this.honeyPot++;
  }
  giveHoney() {
    this.honeyPot--;
  }
}

module.exports = HoneyMakerBee;
  • this 키워드를 사용해서 상속받은 값을 가지고 +나 - 해준다

  1. ForagerBee
  • Test Case
describe('ForagerBee class functionality', () => {
  var foragerBee;

  beforeEach(() => (foragerBee = new ForagerBee()));

  /*  Overwrite methods from superclass  */

  it('`age` 속성은 `10`이어야 합니다', () => {
    expect(foragerBee.age).to.equal(10);
  });

  it('`job` 속성은 `find pollen`이어야 합니다', () => {
    expect(foragerBee.job).to.equal('find pollen');
  });

  /*  Inherited from superclass  */

  it('`color` 속성은 `Bee`로부터 상속받습니다', () => {
    expect(foragerBee.color).to.equal('yellow');
  });

  it('`food` 속성은 `Grub`으로부터 상속받습니다', () => {
    expect(foragerBee.food).to.equal('jelly');
  });

  it('`eat` 메소드는 `Grub`으로부터 상속받습니다', () => {
    expect(foragerBee.eat).to.be.a('function');
  });

  /*  New methods and properties  */

  it('`canFly` 속성은 `true`이어야 합니다', () => {
    expect(foragerBee.canFly).to.equal(true);
  });

  it('`treasureChest` 속성은 빈 배열 `[]`이어야 합니다', () => {
    expect(foragerBee.treasureChest).to.be.a('array');
  });

  it('`forage` 메소드를 통해 `treasureChest` 속성에 보물을 추가할 수 있어야 합니다', () => {
    foragerBee.forage('pollen');
    foragerBee.forage('flowers');
    foragerBee.forage('gold');
    expect(foragerBee.treasureChest).to.have.length(3);
    expect(foragerBee.treasureChest[0]).to.equal('pollen');
    expect(foragerBee.treasureChest[1]).to.equal('flowers');
    expect(foragerBee.treasureChest[2]).to.equal('gold');
  });
  • Answer
const Bee = require("./Bee");

class ForagerBee extends Bee {
  // TODO..
  constructor() {
    super();
    this.age = 10;
    this.job = "find pollen";
    this.canFly = true;
    this.treasureChest = [];
  }
  forage(treasure) {
    this.treasureChest.push(treasure);
  }
}

module.exports = ForagerBee;
  • forage라는 메소드를 사용해 treasureChest 속성에 treasure라는 인자를 push 한다!
profile
개발 공부하는 코린이!

0개의 댓글