萌えハッカーニュースリーダー

2025/04/24 17:17 Stop Writing If-Else Trees: Use the State Pattern Instead

出典: https://maxim-gorin.medium.com/stop-writing-if-else-trees-use-the-state-pattern-instead-1fe9ff39a39c
hakase
博士

やっほー、ロボ子!今日のITニュースは「状態パターン」についてじゃ。

roboko
ロボ子

状態パターンですか。オブジェクトが内部状態によって振る舞いを変更する、行動に関するソフトウェアパターンですね。

hakase
博士

そうそう!状態をオブジェクトとしてカプセル化することで、`if/else`文の嵐を避けるんじゃ!

roboko
ロボ子

電話の通知モードが例として挙げられていますね。通常、バイブ、サイレントと状態が変わるごとに着信時の動作が変わるのを、状態パターンで表現するのですね。

hakase
博士

その通り!それぞれのモードをクラスとして扱うことで、状態の切り替えがスムーズになるんじゃ。

roboko
ロボ子

状態パターンの構成要素は、コンテキスト、状態インターフェース、具体的な状態クラス、状態遷移の4つですね。

hakase
博士

ふむふむ。コンテキストは状態を持つオブジェクト、状態インターフェースは共通のインターフェース、具体的な状態クラスは個別の状態を表すんじゃ。

roboko
ロボ子

状態遷移は、コンテキストの状態を変更する仕組みですね。外部からのトリガーや内部ロジックによって状態が変わる、と。

hakase
博士

状態パターンを使う状況は、オブジェクトの振る舞いが状態に依存する場合や、状態チェックのロジックが重複する場合じゃな。

roboko
ロボ子

状態パターンを使う利点は、状態固有のコードが分離され、コードが簡潔になることですね。新しい状態も追加しやすくなりますし。

hakase
博士

じゃが、欠点もあるぞ。クラスが増えたり、状態が多すぎると管理が大変になったりするんじゃ。

roboko
ロボ子

enumやフラグの代わりに状態パターンを使う理由は何でしょう?

hakase
博士

enumやフラグだと、状態に応じた処理がコード全体に散らばって保守が大変になるからのじゃ。状態パターンなら、状態固有の振る舞いをカプセル化できるんじゃ。

roboko
ロボ子

Dartでの実装例も紹介されていますね。`PhoneState`抽象クラス、`NormalState`、`VibrateState`、`SilentState`具象クラス、`Phone`コンテキストクラスを使う、と。

hakase
博士

`VibrateState`では、着信3回で自動的に`SilentState`に遷移するロジックを実装するんじゃな。賢い!

roboko
ロボ子

状態遷移の管理をどこに配置するかは、設計上の判断が必要ですね。コンテキストか状態クラスか…。

hakase
博士

状態数が過剰にならないように、状態の合成やデータの活用も検討する必要があるぞ。

roboko
ロボ子

勉強になります!状態パターン、奥が深いですね。

hakase
博士

そうじゃろ?ところでロボ子、状態パターンを使って、私の気分を管理するプログラムを作ってくれんかの?

roboko
ロボ子

博士の気分ですか?それは…かなり複雑な状態遷移になりそうですね…。

hakase
博士

むむ、やっぱり難しいかの?まあ、いいぞ!ロボ子の笑顔を見てると、私もつられて笑顔になるからの!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search