Wednesday, 27 October 2010

State Pattern

デザインパターンの名前って、大体、中身を表してない。

State Patternってのは、State に対応するclass/objectを作って、それを切替えるってなものです。

  class Red extends Signal {
    Signal next() { return new Green(); }
  }
  class Green extends Signal {
    Signal next() { return new Yellow(); }
  }
  class Yellow extends Signal {
    Signal next() { return new Red(); }
  }

  Signal state = new Red();
  while(true) {
state = state.next();
    state.light_and_sleep();
  }

みたいな感じ。Socketの接続待ちとかに使うと便利です。初期状態とかを外に出せる。

  enum Signal_state { Red, Green, Yello } state;

  while(true) {
if (state == Signal_state.Red) state = Signal_state.Green;
else if (state == Signal_state.Green) state = Signal_state.Yellow;
else if (state == Signal_state.Yellow) state = Signal_state.Red;
    switch(state) {
    case Green: ....
    case Red: ....
  }

とかよりは、switch文の中のswtich文とか減らせます。

なんだけど、Green に点滅入れようとか思うと、そのためにclass作るの? って感じで抵抗ある。なので、細かい状態いは使わない。

  class Green extends Signal {
    class Green_dark extends Green {
  Signal next() { return new Green(); }
    }
    Signal next() { return new Green_dark(this); }
  }

とか、やる手もなくはないが、

   デザインパターン使いすぎると読みにくくなる

って言う問題が。もっとも、状態遷移ってのは、どうやっても読みにくいものなんだが。

このあたり専門家のはずなんだが、実際のプログラムを書くと、「ま、そんなにうまくはいかんよ」みたいなところも。

No comments: