FSM LÀ GÌ

1. Tìm hiểu về FSM

FSM(Finite state machine) - Máy tâm lý hữu hạn là 1 trong những mô hình tân oán học trình diễn tâm lý của hệ, trong những số đó số tinh thần là hữu hạn. Từ từng trạng thái, trang bị rất có thể biến đổi sang 1 số trạng thái thắt chặt và cố định không giống, dựa vào các sự kiện, input.

Bạn đang xem: Fsm là gì

Fsm được màn biểu diễn như 1 vật dụng thị có hướng.

Xem thêm: Mixtape Là Gì - Cách Người Nghe Nhạc Đón Nhận Mixtape Thế Nào

Ví dụ:

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

*

draft, in Đánh Giá published là những trạng thái của bài viếtđánh giá, approve, reject, unpublish là những sự kiện( event ). Các sự kiện này gây ra Lúc dìm những input đầu vào như cliông xã lên button, … Các sự kiện này gây ra câu hỏi gửi tâm lý (ví dụ từ Draft -> In review), gọi là quy trình thay đổi (transition)

Đặc điểm

Trong quy mô áp dụng DFS máy tâm trạng đối chọi định.

Tại mỗi thời điểm sản phẩm chỉ tại một trạng thái duy nhấtTại mỗi trạng thái, chỉ rất có thể chuyển sang phần đa tâm lý được đến phépTừ tâm lý bây giờ, hoàn toàn có thể hiểu rằng những tinh thần tiếp đến cơ mà sản phẩm hoàn toàn có thể đưa qua

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

FSM biểu thị những tinh thần, sự kiện cùng quy trình thay đổi thân những trạng thái, buộc phải FSM có thể được áp dụng để quản lý tâm lý của object, hoặc workflow.

Ví dụ: Quản lý tinh thần giao dịch, làm chủ tinh thần của ticket, cai quản tâm lý của nhân đồ vào game, ...

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

Từ draft chỉ hoàn toàn có thể chuyển sang in reviewTừ draft chẳng thể chuyển qua published

2.1 khi không dùng FSM

Khi ko sử dụng FSM thì code đang cần cần sử dụng tới không ít ĐK if … else… hoặc case (switch ... case … trong những ngữ điệu khác)

defmodule Post bởi vì 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ì IO.put("Update post status to lớn in_review") Map.put(post, :status, "in_review") else IO.put("Cannot update to #status from draft") post end kết thúc def update_status(%status: "in_review" = post, status) bởi vì case status bởi 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 lớn #status from in_review") post end 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 kết thúc endend*Vấn đề: *

Code dài, khó khăn không ngừng mở rộng, dễ dàng xảy ra lỗi

Nếu thêm các tâm lý không giống mang đến post, đề nghị update toàn bộ những hàm update_status

Nếu có rất nhiều biện pháp thay đổi giữa những tâm trạng, nên update toàn bộ

Làm sao biết từ tinh thần ngày nay rất có thể chuyển qua tinh thần nào khác?

Làm sao bảo đảm 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 thực hiện thư viện as_fsm cung ứng vấn đề implement đồ vật tâm trạng bên trên ngôn từ elixir

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

3. Tham mê khảo

Leave a Reply

Your email address will not be published. Required fields are marked *