2013-02-11 34 views
12

Gần đây, tôi đã bắt đầu thực hiện một số nghiên cứu về Máy hữu hạn của Nhà nước bằng JavaScript và tôi thậm chí là found a library giúp chúng dễ triển khai hơn. Trong khi tôi nghĩ rằng tôi đã nắm được ý tưởng rằng một máy trạng thái được sử dụng để theo dõi và thay đổi "trạng thái" của một đối tượng (ví dụ: 'sẵn sàng', 'hoàn thành', 'không hoạt động', v.v.), tôi không nghĩ rằng tôi hoàn toàn hiểu được ý nghĩa thực tiễn của chúng. ai đó có thể xin vui lòng giúp đỡ bằng cách làm rõ như sau:Máy nhà nước hữu hạn là gì và nó được sử dụng để làm gì?

  • chính xác là một máy trạng thái hữu hạn [hoặc là nó chỉ được gọi là một máy nhà nước? Tôi đã nghe nó đề cập đến cả hai cách]?
  • Một số ứng dụng thực tế cho các máy trạng thái hữu hạn (trong JavaScript) là gì?
  • Khi nào tôi không phải muốn sử dụng một máy trạng thái hữu hạn?
  • Sách, bài viết, hướng dẫn, v.v., cung cấp cái nhìn sâu sắc hơn về các máy trạng thái hữu hạn (bằng JavaScript)?
+0

Wikipedia? Google? Btw, lưu ý rằng JavaScript chỉ đơn thuần là ngôn ngữ ** tập lệnh ** (nghĩa là nó chỉ định nghĩa API lõi). Vì vậy, việc sử dụng thực tế phụ thuộc vào ** môi trường ** (trình duyệt web, web-server, Win8), và không phải trên ngôn ngữ chính nó. –

+2

Tôi đã làm trong thực tế Google này. Đó là lý do tại sao tôi đã nói rằng tôi đã nắm được thực tế rằng một máy trạng thái được sử dụng để theo dõi "trạng thái" trong một ứng dụng, nhưng tôi đang gặp khó khăn trong việc nắm bắt những tác động thực tế của điều này và hy vọng ai đó có thể làm rõ. –

+0

Các hình thức nhiều bước có thể? –

Trả lời

9

Máy trạng thái hữu hạn là khái niệm trừu tượng. Như vậy, khái niệm về máy trạng thái là trực giao với bất kỳ ngôn ngữ cụ thể nào. Nếu bạn look at wikipedia, nó nói "là một mô hình toán học của tính toán được sử dụng để thiết kế cả hai chương trình máy tính và mạch logic tuần tự".

Điều này có nghĩa là FSM thường được sử dụng làm khái niệm toán học được các nhà khoa học máy tính sử dụng để giải quyết các câu hỏi với kỷ luật, như "có thể xyz được tính toán không?"

Dựa trên câu hỏi của bạn và liên kết của bạn, tôi nghĩ bạn muốn hỏi về Sơ đồ nhà nước (hoặc Statechart) khác nhau. Khi bạn tạo một sơ đồ trạng thái, bạn đang chia chương trình của mình theo một loạt các trạng thái và các sự kiện có thể xảy ra ở các trạng thái đó. Ví dụ: chương trình của bạn có thể ở trạng thái "EditingForm", nhận sự kiện "doSave" và sau đó chuyển sang trạng thái "Đang lưu", nhận sự kiện 'Lưu hoàn tất' và quay lại trạng thái "Đang xem"

Sự trừu tượng này vô cùng hữu ích vì nó cho phép người lập trình tổ chức khái niệm những gì sẽ xảy ra khi nào, khi được triển khai đúng, dẫn đến mã sạch hơn và được tổ chức hơn. Ví dụ: "Xem" có thể không có sự kiện 'lưu' được xác định, do đó nếu chương trình ở trạng thái "Đang xem", bất kỳ Save nào cũng là vô nghĩa , vì điều đó chỉ xảy ra trong trạng thái "Chỉnh sửa".

Nếu bạn nhìn vào tổng quan về khung mà bạn liên kết, bạn sẽ thấy có một loạt các trình xử lý mà bạn có thể sử dụng để nối vào các trạng thái, để lại trạng thái, hành động xảy ra, v.v. Điều này cho phép bạn thực sự làm những việc tương ứng đến trạng thái/hành động. Ví dụ: khi nhập trạng thái "Chỉnh sửa", bạn có thể hiển thị biểu mẫu cho người dùng và bật nút lưu. Khi nhập trạng thái "Đang lưu", bạn có thể tắt nút và kích hoạt yêu cầu lưu. Khi nhận được sự kiện "SaveComplete", bạn có thể chuyển sang trạng thái "Đang xem", xóa biểu mẫu và hiển thị nội dung khác.

+0

Vì vậy, máy trạng thái quản lý "trạng thái" bằng cách theo dõi những gì ứng dụng đang làm ("xem" một trang) và sau đó hoặc là hành động hoặc bỏ qua các sự kiện bị sa thải (theo thuật ngữ JavaScript)? Điều này gần như âm thanh rất giống như một bộ điều khiển (MVC) hoặc một sự kiện-xe buýt. –

+1

Nó rất giống nhau. Trong triển khai tôi đã sử dụng, bạn di chuyển qua ứng dụng của bạn bằng cách gọi các sự kiện trên statechart, vì vậy nó không thực sự theo dõi - đó là điểm vào để kiểm soát chương trình. – hvgotcodes

+0

Vì tôi đã nghiên cứu và sử dụng luồng dữ liệu một chiều trong các ứng dụng phía máy khách với Flux và đặc biệt là Redux, tôi đã bắt đầu hiểu rằng Redux thực sự giúp bạn sử dụng máy trạng thái hữu hạn xác định để xử lý trạng thái UI của bạn. Trong Redux, các sự kiện được nâng lên được biểu diễn như các hành động và các hàm giảm là các hàm thuần túy giống như các hàm chuyển tiếp, lấy trạng thái hiện tại và các đầu vào từ các sự kiện/hành động được nâng lên và tạo một trạng thái mới. tiểu bang. – lastmjs

2

Nó thường được sử dụng trong máy quét và lexer của trình phân tích ngôn ngữ. Tạo và sau đó phân tích từng mã thông báo trong mã nguồn dựa trên các quy tắc cú pháp nhất định.

Về cơ bản, ở đây bạn kiểm tra trạng thái hiện tại để xem các ký tự hoặc mã thông báo tiếp theo có hợp lý không và cách chúng được sắp xếp.

+0

Ah vâng, ví dụ tuyệt vời. –

10

Máy trạng thái hữu hạn là gì?

Đó là cách tuyên bố sự kiện và tác dụng phụ của việc chuyển đổi giữa chúng.

Một số ứng dụng thực tế của các máy trạng thái hữu hạn là gì?

Thay vì mã như thế này:

function decide() 
{ 
    if(mouseButtonIsDown && mouseIsMoving && mouseCoordinatesAreWithin(0, 0, 100, 100) && thePixelIsRed) { 
    clearBuffers(); 
    startPlaying(); 
    cursorBecomeHand(); 
    } 
    else if(!mouseButtonIsDown && !mouseIsMoving && mouseCoordinatesAreWithin(0, 0, 100, 100) && thePixelIsRed) { 


    } 
    // more ifs 
} 

Bạn giữ chỉ có một vài tiểu bang và phá vỡ sự kiện của bạn vào chức năng, xác định những gì xảy ra trong đó nhà nước.

function drag_started() { 
switch(your_state) { 
    case "within_box": 
    clearBuffers(); 
    cursorBecomeHand(); 
    your_state= "playing"; 
    startPlaying(); 
    break; 
} 

}

nào dẫn đến sự tách biệt của các quốc gia và các sự kiện, có nghĩa là ít hồi quy và bảo trì hơn.

Khi nào tôi không muốn sử dụng máy trạng thái hữu hạn?

Trả lời chính nó tại thời điểm này. Nếu bạn chỉ có một trạng thái, đừng bận tâm với một máy trạng thái.

Sách, bài viết, hướng dẫn, v.v., cung cấp cái nhìn sâu sắc hơn về các máy trạng thái hữu hạn (trong JavaScript)?

Chống lại học viện, tôi khuyên bạn nên đọc nguồn cho các plugin jquery. Ví dụ: xem dưới _mouseMove và _mouseUp trong the jquery ui source

Các vấn đề liên quan