1. Tìm hiểu về FSM

FSM(Finite state machine) - máy trạng thái hữu hạn là một quy mô toán học màn biểu diễn trạng thái của hệ, trong số đó số trạng thái là hữu hạn. Từ từng trạng thái, máy bao gồm thể biến hóa qua 1 số ít trạng thái thắt chặt và cố định khác, dựa trên những sự kiện, input.

Bạn đang xem: Finite state machine là gì

Fsm được biểu diễn như 1 đồ thị tất cả hướng.

Ví dụ:

Máy tâm trạng thể thực trạng thái của một bài báo trên site thông tin tức

*

draft, in reviews published là những trạng thái của bài viếtreview, approve, reject, unpublish là các sự kiện( sự kiện ). Các sự kiện này tạo nên khi nhận các input như click lên button, … những sự kiện này tạo ra việc gửi trạng thái (ví dụ từ bỏ Draft -> In review), điện thoại tư vấn là vượt trình thay đổi (transition)

Đặc điểm

Trong mô hình sử dụng DFS sản phẩm trạng thái solo định.

Xem thêm: Nghĩa Của Từ : Conserve Là Gì, Nghĩa Của Từ Conserve, Đồng Nghĩa Của Conserve

Tại mỗi thời gian máy chỉ tại 1 trạng thái duy nhấtTại từng trạng thái, chỉ tất cả thể chuyển qua những tâm trạng được mang lại phépTừ trạng thái hiện nay tại, có thể biết được đầy đủ trạng thái sau đó mà máy rất có thể chuyển qua

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

FSM mô tả các trạng thái, sự kiện với quá trình đổi khác giữa các trạng thái, yêu cầu FSM có thể được thực hiện để làm chủ trạng thái của object, hoặc workflow.

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

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

Từ draft chỉ có thể chuyển hẳn qua in reviewTừ draft ko thể chuyển hẳn qua published

2.1 lúc không dùng FSM

Khi không sử dụng FSM thì code sẽ buộc phải dùng tới tương đối nhiều điều kiện if … else… hoặc case (switch ... Case … trong số ngôn ngữ 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) bởi vì if status == "in_review" vày IO.put("Update post status lớn in_review") Map.put(post, :status, "in_review") else IO.put("Cannot update khổng lồ #status from draft") post end end def update_status(%status: "in_review" = post, status) vì 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 end end def update_status(%status: "published" = post, status) vày if status == "draft" vày IO.put("Unpublish the post") Map.put(post, :status, "draft") else IO.put("Cannot update to lớn #status from published") post kết thúc endend*Vấn đề: *

Code dài, cạnh tranh mở rộng, dễ xảy ra lỗi

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

Nếu có nhiều cách chuyển đổi giữa các trạng thái, phải update toàn bộ

Làm sao biết trường đoản cú trạng thái bây giờ có thể chuyển qua trạng thái như thế nào khác?

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

2.2 áp dụng FSM

Trong lấy ví dụ như này áp dụng thư viện as_fsm cung ứng việc implement sản phẩm trạng thái trên ngôn từ elixir

defmodule Post do # define state, sự kiện and transition use AsFsm, states: <:draft, :in_review, :published>, events: < review: < name: "In review", from: <:draft>, to: :in_review, on_transition: fn(post, params) -> # thực ra việc gán trạng thái mới được tự động hóa thực hiện vày thư viện # code này chỉ để mục tiêu cho dễ 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 kết thúc >, 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# gọi triển khai iex > post = %Postcontent: "test content", status: "draft"iex > post = Post.review(post)# hoaciex > post = Post.trigger(post, :review)Việc implement FSM cũng không quá phức tạp nhưng có thể tái sử dụng được không ít lầnViệc thêm mới các trạng thái (state) hoặc công việc chuyển tiếp (transition) ko cần chuyển đổi quá các codecác luồng xử lý, event được biểu lộ rõ trên cấu hình trạng thái

3. Tham khảo