特定のライブラリやフレームワークではなく、一般的なアプローチに興味があります。
可能であれば、スパゲッティコードっぽい条件を避けようとしています。私がこれらのアプリを完全に間違った方法で考えているのかもしれませんが、オンラインで役立つものを見つけることができないようです.
問題は、すべてが互いに影響し合う複数の種類の状態がある場合に発生します。次に例を示します。
次の能力を持つ人物をイメージしてください。
歩く。走る。座る。
Walk.execute()、Run.execute()、Sit.execute() でコマンド パターンを作成します。これらのコマンドは、ユーザー入力などによってトリガーされます。もちろん、これの優れている点は、実行をデバッグまたは修正する必要がある場合に、コード ベースのどこを見ればよいかを簡単に知ることができることです。
今、私は犬を追加するように求められています. 犬は...
歩く。走る。寝る。
人が歩いていて、犬が走っている場合、犬 (ひもにつないでいる) は、自分で走っている場合よりもゆっくりと走ります。また、犬が眠っている場合、その人は通常よりも長く座っています。つまり、犬と人はお互いに影響を受けています。
次に、食品を入れた冷蔵庫を追加するように求められます。冷蔵庫は、食べる量がランニングなどのエネルギーに影響するため、犬と人に影響を与えます。
このシステムを微調整するように絶えず求められます。「ドッグランをもっと眠らせてください。ただし、彼とその人が歩いていて、冷蔵庫がほとんど空になっている場合に限ります。」そして、後で「走った量が犬の睡眠に影響しないように変更してください。」
DogSleep に大量の条件文を詰め込みたくはありません。また、DogSleepIfDogAndManHaveBeenWalkingAndFridgeIsAlmostEmpty も避けたいと考えています。それはスケーラブルではありません。
いつでも、システムから冷蔵庫を取り外したいと思うかもしれません。または、根本的または微妙な方法で変更したい場合があります。
より現実的な例として、コンパクト プレーヤー、拡張プレーヤー (画面の半分を占めるプレーヤーなど)、フルスクリーン プレーヤーとして表示できるメディア プレーヤーがあります。つまり、これら 3 つの画面状態があります。
その間、プレーヤーは画像、ビデオ、またはテキストを表示している可能性があります。
ビデオを表示している場合、そのビデオは再生中、一時停止中、完了中などの可能性があります。
ビデオの状態は、さまざまな画面状態のレンダリング方法に影響します。メディアの種類もレンダリングに影響します。また、画面の状態は他のオブジェクトに影響を与えます (たとえば、何らかの理由で、プレーヤーがコンパクトな場合はビデオを一時停止できるはずですが、拡張または全画面表示の場合はできません)。
複数の状態システムが複雑で双方向 (または多方向) に流れる場合、複数の状態システムを互いに相互作用させる最善の方法は何ですか? デバッグとスケーリングが最も簡単になるように、そのようなコードをどのように編成すればよいでしょうか?