Peter Cho

OOP

2018.12.09 | 1 Minute Read

OOP

  • 객체간의 관계 / 역할 / 책임 관점으로 개발한다.
  • 객체 컨텍스트를 사용한다.
  • 메모리 주소 기반으로 인자를 받는다.

Gof 디자인 패턴은 하드웨어 리소스가 부족한 시절에 만들어서 연산(CPU)을 많이 사용하는 방향으로 만들어 졌다. 하지만 현재는 리소스가 여유롭기 때문에 메모리(RAM)을 많이 사용하여 속도를 향상하는 방향으로 개발하게 됬다.

객체지향개발의 학술적 조건

  • 내적일관성 : Child는 Parent를 대체 가능
const Parent = class {}
const Child = class extends Parent {}
const a = new Child()
console.log(a instanceof Parent);

자바스크립트에서는 프로토타입 체이닝으로 구현하였다.

  • 내적동질성 : 태생을 그대로 유지할려는 성격
const Parent = class {
  wrap() { this.action() }
  action() { console.log("Parent") }
}
const Child = class extends Parent {
  action() { console.log("Child") }
}
const a = new Child();
a.wrap(); // output: Child

알고리즘 분화 시 객체지향에서 선택할 수 있는 두가지 방법

데이터가 변경되었을 때와 로직이 변경되었을 때는 해결하는 방법

상속 위임

속도와 효율이 좋아짐

내부계약관계로 추상층에서 공통 요소를 해결하고 상태를 공유할 수 있음

class Parent {
  constructor() {
    this._base = 'http://web.com';
  }
  load(path) {
    this._load();
  }
  _load() {
    throw 'override!'
  }
}
class Child1 extends Parent {
  _load() {}
}
class Child2 extends Parent {
  _load() {}
}

탬플릿 패턴을 통해 각각 행동이 기술된 사용자형을 통해 구현한다.

소유 위임

메모리를 많이 쓰게 됨

외부계약관계로 각각이 독립적인 문제를 해결하며 메시지를 주고 받는 것으로 문제를 해결함

class Parent {
  constructor() {
    this._base = 'http://web.com';
  }
  load(path) {
    this._parser(path);
  }
  set parser(v){
    this._parser = v;
  }
}
const parent = new Parent();
parent.parser = loadImage;
parent.load();

parent.parser = loadMarkdown;
parent.load();

전략 패턴을 통해 사용자형의 인스턴스 하나로 알고리즘만 변경해서 사용가능하다. 하지만 숙련도가 부족하면 추적하기 힘들다.

class Parent {
  constructor() {
    this._base = 'http://web.com';
  }
  load(path) {
    this._parser[0](path, ...this.parent[1]);
  }
  setParser(f, ...args){
    this._parser = [f, arg];
  }
}
const parent = new Parent();
parent.setParser(loadImage, ['png', 'jpeg']);
parent.load();

parent.setParser(loadMarkdown, ['title', 'description']);
parent.load();

커맨드 패턴 invoker를 통해 실행기 등록자를 통해 등록한 명령어를 실행한다.