Upgrade to Pro — share decks privately, control downloads, hide ads and more …

qmuntal/stateless のススメ

qmuntal/stateless のススメ

Sugar Sato

October 22, 2024
Tweet

More Decks by Sugar Sato

Other Decks in Programming

Transcript

  1. 自己紹介 Sugar Sato (@satoIsSugar) • 2023年 BuySell Technologies入社 • 基盤チーム所属(Portal/Account/Approval)

    PjM ◦ アソシエイトマネージャー • Go / Angular / Serverless ◦ Go歴: Go 年目くらい • 熱帯植物 ◦ ビカクシダ • 猫 ◦ Lambda (♀ 2才)
  2. プロダクト群「バイセルリユースプラットフォーム Cosmos」の開発が進行中 リユースに必要なすべての機能を提供する 「リユースプラットフォーム Cosmos」の開発が進行中です。 Cosmosを活用して、バイセルグループ全体での業務効率改善やデータドリブン経営の深化を目指しています。 リユースプラットフォーム Cosmos 自社開発のリユース特化業務基幹システムでありサービス群の集合体 買取申込

    買取・査定 在庫管理 販売 多様なチャネルで収益最大化 CRM -顧客対応- 買取種別に応じた最適なシステム構築 Visit -訪問買取 - Store -店舗買取 - Promas -商材マスタ - Appraisal -専門査定 - Stock -在庫管理 - EXS -販売管理 - Core -会員管理- Portal -データ利用- Pocket -データ基盤- 買取 専門チームによる真贋・査定と連携 査定 申込 効率的な顧客対応 在庫 在庫管理の最適・効率化 販売 データ 各事業プロセスにある データを一元管理 :基幹システム
  3. 技術選定 スター数 リリース 特徴 qor/transition 433 v1.1.0 (2019/04/23) GORMと統合 状態変化ログの自動

    保存 bykof/stateful 209 v0.0.8 (2020/05/24) 構造体を作って stateful インター フェースを実装する looplab/fsm 2,830 v1.0.2 (2024/05/16) 他言語ステートマシ ンライブラリに触発さ れている ※ 2024/10/16 現在
  4. • 不採用 ◦ GORM との相性がよい ▪ b.c. コミッターに jinzhu san

    ◦ 最後のリリースから早5年... ◦ [IMO] 状態遷移のコードが若干見づらいかも 技術選定 (qor/transition)
  5. • 不採用 ◦ 他言語のステートマシンライブラリに触発されている ▪ oxplot/fysom, jakesgordon/javascript-state-machine ◦ [IMO] 若干使い勝手が悪く感じた

    ▪ fsm.Events 内が全て string 型のため • 定数が扱えない ▪ 既存のパラメータに対して fsm を合成する必要がある 技術選定 (looplab/fsm)
  6. • > Create state machines and lightweight state machine-based workflows

    directly ◦ UML ステートチャート に基づいている ◦ C# の dotnet-state-machine/stateless を Go に移植したもの • スター数: 945 (※ 2024/10/16 時点) • リリース: v1.7.1 (2024/08/23) qmuntal/stateless
  7. • いろんなタイプの状態とトリガーをサポート ◦ int, string, boolean, struct, etc… • 階層化構造

    • Entry/exit イベント • 条件付き遷移をサポートするガード機構 • スレッドセーフ • etc… qmuntal/stateless
  8. • ドキュメントが簡潔でよい ◦ This page is an almost-complete description of

    Stateless, and its explicit aim is to remain minimal. • 直感的に使える ◦ looplab/fsm だと既存パラメータに対して合成して使っていた ◦ 基本的には Configure() と Permit() を使って定義するだけ ▪ どのトリガーを使い、どこに遷移するのかわかりやすい 推しポイント
  9. NewStateMachineWithExternalStorage を使う理由 • NewStateMachine ◦ 内部状態 (State) を自分自身で保持 ◦ 内部で

    stateAccessor と stateMutator を持つ ◦ 状態を参照・変更するためにローカルメモリでのアクセスを行う ▪ あとから初期状態を変更することができない
  10. まとめ • qmuntal/stateless を使ってみて ◦ 良かったこと ▪ 定数が使えるので誤字によるミスが防げた ▪ 簡単に新しい「状態」を増やすこともできる

    ▪ テストも楽になった ▪ それから猿人バーゴンも発見することができた ◦ 課題感 ▪ mermaid からコード自動生成できるといいな
  11. • https://thinkit.co.jp/article/10012 • https://www.slideshare.net/slideshow/statemachinefull/40100048 • https://github.com/qor/transition • https://github.com/bykof/stateful • https://github.com/bykof/stateful?tab=readme-ov-file#draw-graph

    • https://github.com/looplab/fsm • https://github.com/oxplot/fysom • https://github.com/jakesgordon/javascript-state-machine • https://github.com/qmuntal/stateless • https://en.wikipedia.org/wiki/UML_state_machine • https://github.com/dotnet-state-machine/stateless • https://github.com/qmuntal/stateless?tab=readme-ov-file#project-goals 引用