1. Tìm phát âm về FSM

FSM(Finite state machine) - Máy tinh thần hữu hạn là một quy mô toán học màn trình diễn trạng thái của hệ, trong các số đó số trạng thái là hữu hạn. Từ mỗi trạng thái, thiết bị hoàn toàn có thể đổi khác qua 1 số tinh thần cố định khác, dựa trên các sự khiếu nại, input đầu vào.

Bạn đang xem: Fsm là gì, fsm nghĩa là gì

Fsm được màn trình diễn như 1 đồ gia dụng thị được đặt theo hướng.

Xem thêm: " Hành Lạc Là Gì - Giải Mật Những Địa Danh Kỳ Lạ

Ví dụ:

Máy trạng thái thể hiện trạng thái của 1 bài bác báo trên trang tin tức

*

draft, in reviews published là các tinh thần của bài xích viếtnhận xét, approve sầu, reject, unpublish là các sự kiện( sự kiện ). Các sự kiện này tạo nên Lúc nhận những đầu vào nlỗi cliông xã lên button, … Các sự kiện này gây ra Việc chuyển tâm trạng (ví dụ tự Draft -> In review), gọi là quy trình chuyển đổi (transition)

Đặc điểm

Trong quy mô thực hiện DFS vật dụng tâm lý đối kháng định.

Tại mỗi thời khắc sản phẩm chỉ ở 1 tâm trạng duy nhấtTại từng tinh thần, chỉ hoàn toàn có thể chuyển hẳn qua rất nhiều trạng thái được mang lại phépTừ trạng thái hiện tại, hoàn toàn có thể biết được phần lớn tinh thần kế tiếp mà lắp thêm rất có thể đưa qua

2. Ứng dụng của FSM trong lập trình

FSM biểu thị các tinh thần, sự kiện và quá trình biến hóa thân những tinh thần, đề nghị FSM rất có thể được sử dụng để làm chủ tinh thần của object, hoặc workflow.

Ví dụ: Quản lý tâm lý đơn hàng, làm chủ trạng thái của ticket, làm chủ tâm trạng của nhân vật dụng vào game, ...

Trong ví dụ bên trên, mỗi bài viết, chỉ có thể tất cả một tâm lý trên 1 thời điểm, với từ là một trạng thái chỉ rất có thể thay đổi qua một số tâm trạng được cơ chế trước:

Từ draft chỉ rất có thể chuyển qua in reviewTừ draft chẳng thể chuyển hẳn qua published

2.1 lúc không dùng FSM

khi ko áp dụng FSM thì code vẫn bắt buộc cần sử dụng cho tới không ít ĐK if … else… hoặc case (switch ... case … trong những ngôn từ khác)

defmodule Post vày defstruct content: "sample content", status: "draft" def all_status, do: <"draft", "in_review", "published"> def update_status(%status: "draft" = post, status) do if status == "in_review" vì IO.put("Update post status khổng lồ in_review") Map.put(post, :status, "in_review") else IO.put("Cannot update to #status from draft") post over end def update_status(%status: "in_review" = post, status) vày case status vị "draft" -> IO.put("Reject the post") Map.put(post, :status, "draft") "published" IO.put("Publish the post") Map.put(post, :status, "published") true -> IO.put("Cannot update khổng lồ #status from in_review") post over kết thúc def update_status(%status: "published" = post, status) vày if status == "draft" vì chưng IO.put("Unpublish the post") Map.put(post, :status, "draft") else IO.put("Cannot update to #status from published") post over endend*Vấn đề: *

Code dài, nặng nề không ngừng mở rộng, dễ dàng xẩy ra lỗi

Nếu thêm những trạng thái không giống đến post, nên update cục bộ những hàm update_status

Nếu có tương đối nhiều phương pháp đổi khác giữa những trạng thái, yêu cầu update toàn bộ

Làm sao biết từ bỏ tâm trạng hiện thời rất có thể chuyển hẳn qua tinh thần như thế nào khác?

Làm sao bảo vệ luồng dữ liệu/ xúc tích và ngắn gọn chạy đúng

2.2 Sử dụng FSM

Trong ví dụ này áp dụng thỏng viện as_fsm cung ứng bài toán implement vật dụng tinh thần bên trên ngữ điệu elixir

defmodule Post do # define state, event & transition use AsFsm, states: <:draft, :in_review, :published>, events: < review: < name: "In review", from: <:draft>, to: :in_Reviews, on_transition: fn(post, params) -> # thực tế vấn đề gán trạng thái mới được tự động hóa tiến hành vày tlỗi viện # code này chỉ nhằm mục tiêu mang lại dễ dàng nắm bắt post = Map.put(post, :status, :in_review) :ok, post kết thúc >, approve: < name: "Approve", from: <:in_review>, to: :published on_transition: fn(post, params) -> post = Map.put(post, :status, :published) :ok, post over >, reject: < name: "Reject", from: <:in_review>, to: :draft, on_transition: fn(post, params) -> post = Map.put(post, :status, :draft) :ok, post kết thúc >, unpublish: < name: "Unpublish", from: <:published>, to: :draft, on_transition: fn(post, params) -> post = Map.put(post, :status, :draft) :ok, post end > > defstruct content: "sample content", status: "draft"end# call triển khai iex > post = %Postcontent: "thử nghiệm content", status: "draft"iex > post = Post.review(post)# hoaciex > post = Post.trigger(post, :review)Việc implement FSM cũng không thật phức tạp cơ mà có thể tái thực hiện được rất nhiều lầnViệc thêm bắt đầu các tâm trạng (state) hoặc công việc nối tiếp (transition) ko bắt buộc chuyển đổi rất nhiều codecác luồng xử lý, sự kiện được diễn đạt rõ trên cấu hình trạng thái

3. Tmê mệt khảo