문제

나는 장군을 찾고 있습니다

  1. 최적화
  2. 단정
  3. 확장 성

현재 C ++ 계층 상태 상태 기계 구현에 대한 조언.

견본

variable isMicOn = false
variable areSpeakersOn = false
variable stream = false
state recording
{
        //override block for state recording
        isMicOn = true //here, only isMicOn is true              
        //end override block for state recording
}
state playback
{
        //override block for state playback
        areSpeakersOn = true //here, only areSpeakersOn = true
        //end override block for state playback
        state alsoStreamToRemoteIp
        {
                //override block for state alsoStreamToRemoteIp
                stream = true //here, both areSpeakersOn = true and stream = true
                //end override block for state alsoStreamToRemoteIp
        }
}

goToState(recording)
goToState(playback)
goToState(playback.alsoStreamToRemoteIp)

구현

현재 HSM은 각 주가 어린이로서 다양한 상태를 가질 수있는 트리 구조로 구현됩니다.

각 상태에는 기본 값을 무시하는 가변 수의 "재정의"블록 (std :: 맵)이 포함되어 있습니다. 루트 상태에서 상태 머신에는 변수 세트 (함수, 속성 ...)가 일부 기본값으로 초기화되었습니다. 아동 상태를 입력 할 때마다 "재정의"목록은 변수 정의 및 부모 상태에서 동일한 이름의 변수와 값을 대체 해야하는 값을 정의합니다. 명확성을 위해 원본을 업데이트했습니다.

변수 참조

런타임에 현재 상태는 스택에 저장됩니다.

변수가 참조 될 때마다 하향 스택 워크가 가장 높은 오버라이드를 찾거나 기본값이없는 경우 기본값을 찾습니다.

스위칭 상태

단일 상태 프레임이 전환 될 때마다 상태가 스택으로 밀려납니다.

상태가 전환 될 때마다, 나는 현재 상태에서 루트 상태로 나를 데려가는 나무 하강을 추적합니다. 그런 다음 현재 추적이 이전 트레이스와 일치하는 것을 볼 때까지 대상 상태에서 루트 상태로 트리 하강을 수행합니다. 나는 그 두 가지 흔적이 만나는 곳에서 교차로를 선언합니다. 그런 다음 대상 상태로 전환하기 위해 소스에서 내려 가서 교차점에 도달 할 때까지 스택에서 상태 프레임을 터뜨립니다. 그런 다음 대상 노드로 올라가서 상태 프레임을 스택에 푸시합니다.

위의 코드 샘플의 경우

상태 스위치에 대한 실행 추적

  • 소스 상태 = 녹음
  • 대상 상태 = alsostreamtoremoteip

  • 소스의 하강 = 레코딩-> 루트 (트레이스 = [루트])

  • target의 하강 = alsostreamtoremoteip-> 재생-> 루트 (trace = [재생, 루트])

  • 루트에서 교차합니다.

녹음에서 alsostreamtoremoteip으로 전환하려면

  1. 스택에서 "녹음"을 팝하고 (여기에서 정의되지 않은 출구 함수를 호출하십시오).
  2. "재생"을 스택에 푸시하고 (Enter 함수를 호출하십시오).
  3. "alsostreamtoremoteip"을 스택에 푸시하고 (Enter 함수를 호출하십시오).
도움이 되었습니까?

해결책

두가지:

1 : 대부분의 경우 프로그램의 상태를 모델로 표시하고 직접 또는 MVC 패턴을 통해 상호 작용합니다.

2 : FSM이 실제로 필요하다면, 즉 모델에 무작위로 많은 작업을 수행하고자합니다. 그 중 일부는 특정 시간에 허용됩니다. 그 다음에....

여전히 프로그램 상태를 모델 (또는 분해 및 복잡성에 따라 여러 모델)으로 유지하고 상태 및 전환을 나타냅니다.

class State:
   def __init__(self):
      self.neighbors = {}

이웃이 사전을 포함하는 곳 {Action: State}, 당신이 같은 일을 할 수 있도록

someAction.execute() # Actions manipulate the model (use classes or lambdas)
currentState = currentState.neighbors[someAction]

또는 더 차가운 경우, 이웃에서 동작을 무작위로 선택하고, 실행하고, 상태를 무기한으로 이동하는 무한 루프가 있습니다. 프로그램을 테스트하는 좋은 방법입니다.

다른 팁

여기서 모든 세부 사항을 따르는지 잘 모르겠습니다. 그러나 여러 상태 기계가있는 FSM (유한 상태 기계) 구현을 설명하는 것으로 보입니다. 때때로, 특정 이벤트 (E1)가 FSM F1의 특정 상태 (S1)가 발생하면 전반적으로 처리를 단순화하려면 새로운 FSM (F2 호출)을 입력해야합니다).

이 경우 S1에서 E1이 발생하면 이벤트를 읽고 F2 FSM을 구현하는 작업 루틴을 호출해야합니다. 호출되면 F2의 시작 상태에서 처리를 시작하고 관련 하위 이벤트를 처리합니다. 최종 상태에 도달하면 F2의 통역사가 마무리됩니다. F2가 실행되는 동안 중단 된 F1 동작 루틴에 일부 정보를 반환 할 수 있으며 F1의 다음 상태는 그 영향을받을 수 있습니다.

'비난 블록'과 같은 설명의 나머지 부분은 구현에 액세스 할 수없는 사람들에게는별로 이해가되지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top