2015-07-01 27 views
14

Cập nhật:mô hình Nhà nước và bảo vệ

mô hình nhà nước có một cách sai lầm để giải quyết này. Do đó, bất kỳ mẫu nào khác đều được chào đón. Về cơ bản tôi đang tìm kiếm một cách để có điều kiện bảo vệ cho mỗi tiểu bang nhưng có một mã sạch sẽ và duy trì. Các hệ thống định tuyến phía trước như thế nào, emberjs, ui-router và bộ phản ứng-router thực hiện guard conditions để tránh nhập trạng thái cụ thể nếu điều kiện không được đáp ứng?


Tôi muốn thực hiện một máy trạng thái hữu hạn bằng cách sử dụng Mẫu nhà nước nhưng tôi không thể quấn quanh đầu. Nói tóm lại, nó giống như:

If error -> error state 
If A && B && C -> second state 
If only A -> first state 

Ở bất kỳ trạng thái nào, chúng tôi đi đến trạng thái lỗi. đầu vào (sự kiện) A, B và C có thể đến bất kỳ thứ tự nào nhưng nếu tất cả chúng vượt qua, chúng tôi sẽ chuyển sang trạng thái thứ hai. Nếu chỉ áp dụng đầu vào A, thì chúng ta sẽ chuyển sang trạng thái thứ nhất.

Sơ đồ trạng thái sau đây được lấy từ cuốn sách Ngôn ngữ cụ thể của miền của Martin Fowler.

DSL

Trong mô tả ông nói:

Hoa hậu Grant, có một ngăn bí mật trong phòng ngủ của cô đó là bình thường khóa và giấu. Để mở nó, cô phải đóng cánh cửa, sau đó mở ngăn kéo thứ hai trong lồng ngực và bật đèn cạnh giường của mình trên theo thứ tự. Khi những việc này được thực hiện, bảng điều khiển bí mật được mở khóa để cô ấy mở.

Tôi nhấn mạnh, rằng turning lightopening 2nd drawer thể xảy ra trong trật tự hoặc. Tương tự như A, B và C.

Dựa trên nhận xét @SQLPolice và cuốn sách, tôi đã rút ra điều này:

enter image description here

Nhưng vấn đề là, tôi có thể có (A & & B & & C & & D & & D & & E). Trong trường hợp đó nó sẽ là cồng kềnh để có tất cả các trạng thái tạm thời kết hợp.

+0

bạn có trạng thái bắt đầu, tôi giả sử? –

+0

Bạn đang vẽ cái gì trong ... UML/Flow ...? –

+0

@DavidBarker, cả hai. Tôi chỉ cần một cái gì đó trực quan để hiểu làm thế nào để thực hiện. – norbertpy

Trả lời

3

Một dự thảo nhanh trông như thế này:

enter image description here

+0

Cảm ơn, nhưng làm cách nào để tránh viết 'if (A && B && C)'? Lý do là, tôi đã có rất nhiều nếu và khác với các điều kiện khác nhau. Lý do duy nhất để chọn máy nhà nước là để tránh làm điều đó. – norbertpy

+0

Ah, tôi hiểu rồi. Điều gì đằng sau đó - là một bài tập về nhà cho trường học, hoặc những gì bạn muốn nhận ra? –

+0

Nó không phải là một bài tập về nhà. Tôi lớn tuổi hơn điều này. Đó là một vấn đề thực sự chúng tôi có và chúng tôi đang cố gắng đơn giản hóa mọi thứ. – norbertpy

4

Bạn có thể sử dụng một số hình thức phân tích từ vựng cho việc này. Tôi sẽ tiếp cận điều này bằng cách hạn chế khả năng chuyển đổi từ một trạng thái trừ khi các ràng buộc đặt trên cạnh giữa hai trạng thái được đáp ứng. Tôi đã viết một FSM trong PHP gần đây cho khung công tác Laravel có một ví dụ như thế này, nơi các ràng buộc khác nhau đều được yêu cầu là đúng trước khi một quá trình chuyển đổi có thể xảy ra. Nó sử dụng trạng thái giả hoặc xử lý trong trạng thái để chuyển đổi cờ cho biết rằng quá trình đã hoàn tất. Chỉ khi tất cả các cờ được đặt thành true thì có thể chuyển trạng thái.

Sample lexical state analysis

Sử dụng gói FSM tôi đã viết cho laravel, một ví dụ FSM thiết lập would look something like this.

Mỗi trạng thái sẽ (hoặc là onEnter) hoặc thông qua trạng thái giả thiết, đó là cờ ràng buộc trên FSM OR State thành true.

Điều này cũng sẽ kích hoạt một checkReady() sẽ kích hoạt chuyển tiếp hoặc giữ trạng thái hiện tại dựa trên các cờ ràng buộc.

Thêm các ràng buộc mới là trường hợp thêm chúng vào một mảng các ràng buộc trong trạng thái hoặc FSM chứa và xây dựng một phương thức để cho phép ràng buộc được loại bỏ khi thực hiện một nhiệm vụ.

Khi bạn đang xem xét nhiều trạng thái, với mỗi trạng thái tạo thành một yêu cầu về các ràng buộc. A sample state would look something like this.

Khi bạn đang xem xét một trạng thái đơn lẻ với trạng thái giả/trình xử lý. The state would look something like this, where it's logic is contained.

1

Một trừu tượng máy nhà nước bao gồm:

  1. Hoa
  2. Sự kiện hoặc đầu vào
  3. Transitions
  4. Actions

Một tuyên bố như một & & b & & c là một sự kiện hoặc đầu vào có hiệu quả ... một nhãn cho quá trình chuyển đổi. Vì vậy, nó cần phải được ánh xạ tới một sự kiện nếu bạn đang đi để phù hợp với trừu tượng máy nhà nước. Bạn cần viết mã để thực hiện ánh xạ đó.

Nếu máy trạng thái của bạn thường được điều khiển bởi các điều kiện như thế này, bạn cần phải móc các sự kiện có thay đổi b và c hoặc kiểm tra định kỳ theo hẹn giờ. Bất cứ khi nào họ thay đổi, mã của bạn ánh xạ tới một sự kiện và đăng chúng vào bất kỳ mã nào tiến bộ máy trạng thái.

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