ステートとステートマシン

投稿日:

ステートマシンを使用した動作と状態遷移の定義—デートアプリで説明

(2020年12月20日)

状態とは

情報技術とコンピューターサイエンスでは、システムはステートフル先行するイベントまたはユーザーの操作を記憶するように設計されている場合。記憶されている情報は、システムの 状態 と呼ばれます。 。

システムの状態は、多くの場合、ユーザーが行う動作の集約によって定義されます。状態は、特定の状態での特定の動作が有効かどうかを確認するためのより体系的な方法であるため、重要です。

信号機の状態

例として信号機を考えてみましょう。緑の場合、運転手と同乗者は次に赤ではなく黄色が表示されることを期待しています。黄色に変わると、彼らは緑ではなく赤を期待します。したがって、ここでの状態は単純です。

Green -> Yellow -> Red
^ |
|\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_|

矢印(状態の許可された遷移)に従ってください。信号機は順調です。

出会い系アプリの一致の状態

ここで、より複雑な例として出会い系アプリを取り上げましょう。オンラインで「一致」する人々のためのアプリを構築していると想像してみてください。アルゴリズムの準備ができており、ユーザーのアプリにポップアップ表示される一致の背後にあるロジックの記述を開始する必要があるとします。

エンティティを定義しましょう最初にmatch を実行して、2人の対戦を表します。試合を設計する際に考慮すべきいくつかの州があります。

ランダムで不一致の人物が現れるなど、予期しない行動が見られないように州が必要です。画面に「こんにちは」と表示されます。

写真提供: スプラッシュ解除

のヨガデザイン私の思考プロセス:

  1. まず、一致を作成する必要があります、つまり、特定のアルゴリズムのセットが試合の準備ができている2人を選択します。もちろん、アルゴリズムは、両方が一致すること、お互いの好みに合うこと、禁止されていないことなどを事前に確認する必要があります。
  2. 次に、この一致は保留中の(他の人のスワイプを待機中)またはが失敗しました最初のユーザーのアクションによって異なります。ユーザーが右にスワイプすると(アプリの用語で「私はあなたが好き」を意味します)、状態は作成済みから保留中。ユーザーが左にスワイプすると(「私はあなたが好きではありません」という意味)、状態は失敗に変わります。
  3. 次に、両方の人がお互いを好きな場合は、保留中のから matched
  4. 試合に参加した人のどちらも、試合を「不一致」にして、状態を不一致。
  5. 状態の変化をすべてカバーできたと思います。しかし、これらはすべてですか?うーん…戻ってもう一度スワイプできる「巻き戻し」と呼ばれる有料機能はありませんか?これをどうすればよいですか?

すべての変更を確実に含めるにはどうすればよいですか?もしそうなら、どのようにプログラムしますか?

ステートマシンとは何ですか?

確立されたライフサイクルを持つエンティティの動作をモデル化するための方法論

状態指向のシステムを構築する場合、状態マシンは、複雑な遷移とトリガーをより適切に判断するのに役立ちます。

有限状態マシン(FSM)

Itは抽象マシンであり、有限数の 状態の1つに正確に存在できます。 > いつでも。 FSMは、いくつかの入力に応じてある状態から別の状態に変化する可能性があります。ある状態から別の状態への変化は、遷移と呼ばれます。 FSMは、その状態、初期状態、および各遷移をトリガーする入力のリストによって定義されます。

デートアプリの例を続けましょう。一致ivの背後にあるロジックから状態図を作成する場合id = “6d3c38c74f”>

、次のようになります:

*関係するさまざまなユーザーがさまざまな方法をとることができます。一致する顧客、またはデートアプリ(プラットフォームビルダー/会社)のいずれかです。

状態の数には限りがあり、試合のライフサイクル内のすべての動作をモデル化します。ステートマシンを構築するには、行をたどって、エンティティがさまざまな動作にどのように応答するかを確認する必要があります。

ステートマシンを使用する必要があるのはなぜですか?

わかりました。状態図は非常に役立ちますが、コードを作成するときにステートマシンを使用する必要があるのはなぜですか?

同じ例から、いくつかの簡略化されたコードを見てみましょう before および after ステートマシンが関与しています。

ステートマシンを使用する前に

多くのif/elseステートメント。

ステートマシンを使用した後

ChangeStateメソッドで、StateTransitionタイプを使用して状態遷移を処理します。他のすべてのメソッドは、一致を処理するロジックに焦点を当てることができるようになりました。

これ以上何ができますか?

いくつか例を挙げると:

  • 今のところ、フロントエンドインターフェイスが呼び出すには「巻き戻し」メソッドで十分であると想定しています。メソッドを処理するより繊細な方法は、一致が記録されているかどうかを確認し、記録されている場合は、それが好きか嫌いかを確認してから、使用するコマンドを決定することです。 UIに判断を任せる(そして間違っているリスクを冒す)のではなく、MatchEntityクラスで処理することをお勧めします。
  • 状態が遷移する場合複雑になりすぎたら、現在の状態とコマンドの軸を持つマトリックスを使用してみてください。マトリックス内のデータは、更新された状態にすることができます。このようにして、コードが読みやすくなります。

概要

では、なぜステートマシンを使用するのでしょうか。状態が変化するイベント(エンティティの重要な動作)を考慮するため、システムをより適切にモデル化できます。他のほとんどすべては、基本的なCRUDメソッドで解決できます。また、コードが読みやすく、保守しやすくなります。

APIの構築に関しては、プロダクトマネージャーからのリクエストのみに基づいてAPIを設計しないでください。重要な動作と遷移(状態)を念頭に置いて、エンティティのAPI(少なくとも最小API)を設計します。

リファレンス

リチャードクレイトン-ステートマシンを使用してください!

有限ステートマシン(FSM、またはこの投稿のコンテキストでは、単に「ステートマシン」)は、…

rclaytonをモデル化するための方法論です。 silvrback.com

有限状態マシン

有限状態マシン(FSM)または有限状態オートマトン(FSA、複数:オートマトン)、有限オートマトン、または単に状態…

en.wikipedia.org

C#の単純なステートマシンの例?

これを投稿しました:https://code.google.com/p/ysharp/source/browse/#svn\%2Ftrunk\%2FStateMachinesPoCこれが1つです…

stackoverflow.com