[TS] 지금 안 들리는 상태 모드.

개시하다


이번에는 컨디션 모드State Pattern에 대한 해설을 진행한다.
다태성을 이용하여 각 상태의 행위를 표현하는 디자인 도형이다.

이번 컨디션 모드는?


유명한 곳에는 TECHSCORE 선생의 해설이 있다.
  • 참조: TECHSCORE | 19.State 모드
  • 다음은 참조입니다.
    상태에 따라 동작의 패턴도 달라진다.예를 들어'기분 좋은 상태','기분 나쁜 상태'라는 두 가지 상태를 가진 엄마에게 몇 가지 부탁을 할까 고민한다.기분 좋은 엄마에게'용돈 주세요','딤섬 주세요'등을 부탁할 때는'좋아요, 좋아요'용돈 주거나 딤섬 주세요.하지만 기분 나쁜 엄마에게 이런 부탁을 해도 들어주지 않을 수도 있다.엄마의 행동은 상태에 따라 달라진다.
    State 모드란 상태의 변화에 따라 동작이 변할 때 위력을 발휘하는 모드이다

    예제


    다음과 같은'개'등급을 가정해 보자.
  • 상태는'공복'과'배부르다'
  • '같이 놀자'함수를 가지고 있다.'배부르다'할 때는 기분이 좋아서 놀지만'공복'때는 밥을 먹어야 해서 화가 난다
  • '식사'함수가 있고,'공복'때 먹고,'배부르다'때 먹지 않는다
  • 상태 모드 없음


    예제의 내용에 대해 어떤 디자인 모델도 특별히 신경 쓰지 않고 인코딩을 하면 다음과 같이 될 것 같다.
    
    class Dog {
      // 状態
      private _status: 'Hunger' | 'Full'
      
      constructor(status: 'Hunger' | 'Full' ) {
        this.setStatus(status);
      }
      
      public setStatus(status: 'Hunger' | 'Full') {
        this._status = status;
      }
      
      // 一緒に遊ぶ
      public withPlay(): void {
        switch(this._status) {
          case 'Hunger':
            console.log("お腹がすいたからご飯をくれ!");
            break;
          case 'Full':
            console.log("遊ぶ!");
            break;
        }
      }
      
      // ご飯を食べる
      public eat(): void {
        switch(this._status) {
          case 'Hunger':
            console.log("やった!ご飯だ!");
            break;
          case 'Full':
            console.log("もうお腹いっぱいだよ・・・");
            break;
        }
      }
    }
    
    
    각 함수는 switch 문장을 통해 상태를 판단하고 적당한 처리를 수행한다.
    상태는 두 가지가 있기 때문에 별 문제가 없지만 여기서부터'상태 추가'의 상황과'상태 관련 함수 증가'의 경우 매번 지점 처리를 다시 수정해야 한다.

    상태 모드로 구현


    거기에 등장하는 것은 컨디션 모드다.
    상태 모드에서'상태와 관련된 함수'를 인터페이스로 정의하고 각 상태에서 실현한다.
    상태가 있는 쪽(예와 같은Dog류)은 상태만 바뀐다.
    // 胃袋の状態IF
    interface StomachState {
      withPlay():void;
      eat():void;
    }
    
    // 空腹状態
    class HungerState implements StomachState {  
      withPlay = () => console.log("お腹がすいたからご飯をくれ!");
      eat = () => console.log("やった!ご飯だ!");
    }
    
    // 満腹状態
    class FullState implements StomachState {  
      withPlay = () => console.log("遊ぶ!");
      eat = () => console.log("もうお腹いっぱいだよ・・・");
    }
    
    class Dog {
      private _state: StomachState;
      constructor(state: StomachState) {
        this.setStatus(state);
      }
      
      public setStatus(state: StomachState) {
        this._state = state;
      }
    
      // withPlayとeatはそれぞれ_state側で定義されているため
      // その中身を意識せず実行するだけ
      withPlay = () => this._state.withPlay(); 
      eat = () => this._state.eat();
    }
    
    요점은'Dog 내에서 자신의 상태를 더 이상 의식하지 않는다'는 것과'상태가 변경되거나 추가될 때 다른 상태의 처리에 영향을 주지 않는다'는 것이다.
    위의 상태HungerStateFullState로 실시StomachState되고 있기 때문에 여기에 복팔분목 등을 더한 상태는 다시 실시StomachState하면 된다.
    이는 부주의FullStateStomachState의 행동에 변화가 생기지 않는 문제switch에 고릴라가 쓴 경우 누락되거나 의도하지 않은 부분이 변경될 여지가 있다는 의미다.

    정책 모드와 다름


    이번Typescript에 디자인 모델 중 하나인'상태 모델'을 소개했다.
    일반적으로 상태 모드는 정책 모드와 비슷합니다.
    각종 패턴을 가져온 상황에서 최종 시스템의 코드는 기본적으로 같다는 것이다.
    다음은 제 개인적인 견해입니다.
    상태 모델에 대해'다모드주의로 상태로 인해 발생하는 지점을 해결한다'는 방법을 취했고 전략 모델은'다모드주의로 알고리즘을 해결하는 커팅'방법을 취했다.
    중점은 "착안점이 다를 뿐 해결책으로 다중모드주의를 사용했다는 점은 동일하다"는 것이다.
    따라서 "기점으로서의 사상은 다르지만 코드 단계에서 떨어지는 경우는 똑같아 보인다"고 덧붙였다.
    전략 모델에 관하여 다음과 같은 글에서 총결하였다.
  • [Type script] 지금 들을 수 없는 정책 모드
  • 좋은 웹페이지 즐겨찾기