체인의정석

자바스크립트와 전략패턴 본문

개발

자바스크립트와 전략패턴

체인의정석 2021. 6. 28. 13:36
728x90
반응형

처음부터 전략패턴을 사용하도록 설계할 수는 없음.

 

따라서 다음 서적을 읽으면 리팩터링을 잘할 수 있다.

 

서적 추천) Classic 한 오래된 책 - 10년이 지나도 유효한 책

패턴을 활용한 리팩터링 (패턴으로 리팩터링을 해 나가는것)

http://www.yes24.com/Product/Goods/14752528

 

패턴을 활용한 리팩터링 - YES24

 

www.yes24.com

자바는 정적언어라서 리팩터링이 잘 된다. 리팩터링을 하기 쉽지만 

자바스크립트는 어렵다.

 

상속을 하나에서 받아와서 하려면 인터페이스에서 메소드 하나만 추가하면 다 바꾸어야 한다.

따라서 상속을 쓸 때도 동작을 추가하고 인터페이스를 하나 더 두어서 분리 시킨다. 단일책임원칙도 이에 해당된다.

단일책임 원칙을 지켜야 한다. 역할을 구분하게 되면 유지보수하기 쉬운 코드를 얻을 수 있다.

 

1. If/else의 단점

- 로직이 추가되고 변경되는 것에 유연하지 않다.

- 가독성이 떨어진다.

- 연쇄적인 수정 가능

 

2. SOLID 5원칙

1. 단일책임원칙

2. 개방폐쇄원칙

3. 리스코프치환원칙

4. 인터페이스분리원칙

5. 의존 역전 원칙

 

3. OCP란 (개방 폐쇄 원칙)

소프트웨어 구성 요소는 확장에 대해서는 개방되어야 하지만 변경에 대해서는 폐쇄되어야 한다.

기존 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계

 

상속 비추천 - 깨지기 쉬운 상위클래스 문제.

상속은 하위클래스가 상위클래스의 기능과 밀접하기 때문에 상위가 바뀌면 하위에 영향이 매우 크다.

 

컴포지션 추천 - 변경될것과 변하지 않을 것을 엄격히 구분

두 모듈이 만나는 지점에 인터페이스를 정의

구현에 의존하기보다 정의한 인터페이스에 의존하도록 코드를 작성

 

컴포지션 적용 방법

  1. 변경될 것과 변하지 않을 부분을 구분하여 변경될 부분을 인터페이스로 추출합니다.
  2. 모듈이 만나는 지점에 인터페이스를 정의합니다.
  3. 인터페이스에 의존하도록 코드를 작성합니다.

 

전략 패턴이란?

객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고 유사한 행위들을 캡슐화 하는 인터페이스를 정의

 

적용전

const Strategy = class{
    constructor(){};
    execute(transport){
			if(transport === 'ship'){
        console.log('배로 이탈리아에 갑니다');
			} else(transport === 'land'){
		    console.log('육로로 이탈리아에 갑니다');
			}
    }
}

var transportation = new Strategy();
transportation.execute('ship'); // 배로 이탈리아에 갑니다

적용 후

const Strategy = class{
    constructor(){
        this.strategy = null;
    }
    setStrategy(strategy){
        this.strategy = strategy;
    }
    execute() {
        this.strategy.execute();
    };
}

const ShipStrategy = class{
    constructor(){};
    execute(){
        console.log('배로 이탈리아에 갑니다');
    }
}

const LandStrategy = class{
    constructor() {}
    execute() {
    console.log('육로로 이탈리아에 갑니다');
    }
};

var strat = new Strategy();
var ship = new ShipStrategy();
var land = new LandStrategy();
strat.setStrategy(ship);
strat.setStrategy(land); // 전략을 바꿈
strat.execute(); // 어떤 전략이든 설정된 것을 실행
// 육로로 이탈리아에 갑니다.

알고리즘 인터페이스를 정의, 알고리즘을 클래스로 캡슐화,

알고리즘이 바뀌어야 하는 순간에 캡슐화된 전략을 바꾸어서 알고리즘을 교체

 

 

참고

https://rutgo-letsgo.tistory.com/167

728x90
반응형
Comments