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:
Post a Comment