태클 경우 웹 문제 당신은 각각의 특정 규칙이 독립적으로 코딩 규칙 엔진을 만들 수 있습니다. 이에 대한 추가 개선 사항은 규칙을 작성하기 위해 DSL (Domain Specific Language)을 작성하는 것이지만 DSL만으로는 문제를 한 코드 기반 (기본)에서 다른 (DSL)로 대체 할뿐입니다. 구조가 없으면 DSL은 모국어 (Java, C # 등)보다 나아지지 않으므로 개선 된 구조적 접근 방식을 찾은 후 다시 돌아올 것입니다.
근본적인 문제는 모델링 문제가 있다는 것입니다. 이와 같은 조합 상황이 발생할 때마다 상황을 설명하는 모델 추상화가 너무 거칠다는 것이 명백합니다. 단일 엔터티에서 다른 모델에 속하는 요소를 결합 할 가능성이 높습니다.
모델을 계속 분류하면 결국이 조합 효과가 완전히 사라집니다. 그러나이 경로를 취할 때 더 큰 혼란을 일으키는 디자인에서 길을 잃기 쉽습니다. 여기에서 완벽주의는 반드시 친구가 아닙니다.
유한 상태 머신과 룰 엔진은이 문제를 어떻게 분석하고보다 관리하기 쉽게 만드는지 보여주는 예일뿐입니다. 여기서의 주요 아이디어는 이와 같은 조합 문제를 제거하는 좋은 방법은 종종 디자인 을 만들고 시스템이 만족스럽게 수행 될 때까지 중첩 된 추상화 수준으로 광고 구역을 반복하는 것 입니다. 복잡한 패턴을 만드는 데 프랙탈이 사용되는 방식과 유사합니다. 현미경을 사용하거나 높은 조감도에서 시스템을 보더라도 규칙은 동일하게 유지됩니다.
이것을 도메인에 적용하는 예입니다.
소가 지형을 통해 어떻게 움직이는 지 모델링하려고합니다. 귀하의 질문에 세부 사항이 없지만 많은 양의 if에 결정 조각이 포함되어 if cow.isStanding then cow.canRun = true
있지만 예를 들어 지형의 세부 정보를 추가하면 혼란에 빠질 것입니다. 따라서 수행하려는 모든 작업에 대해 생각할 수있는 모든 측면을 확인하고 다음 가능한 작업에 대해 이러한 확인을 반복해야합니다.
먼저 반복 가능한 설계가 필요합니다.이 경우 시뮬레이션의 변화하는 상태를 모델링하는 FSM이됩니다. 따라서 가장 먼저 할 일은 상태 인터페이스, 전환 인터페이스 및 전환 컨텍스트를 정의하는 참조 FSM을 구현하는 것입니다.다른 두 사람이 사용할 수있는 공유 정보를 포함 할 수 있습니다. 기본 FSM 구현은 컨텍스트에 관계없이 한 전환에서 다른 전환으로 전환합니다. 여기에서 규칙 엔진이 시작됩니다. 규칙 엔진은 전환이 발생하는 경우 충족해야하는 조건을 깨끗하게 캡슐화합니다. 여기서 규칙 엔진은 각각 부울을 리턴하는 평가 함수가있는 규칙 목록만큼 간단 할 수 있습니다. 전환이 이루어져야하는지 확인하려면 규칙 목록을 반복하고 규칙 중 하나라도 거짓으로 평가되면 전환이 발생하지 않습니다. 전환 자체에는 FSM의 현재 상태 (및 기타 가능한 작업)를 수정 하는 동작 코드 가 포함됩니다 .
이제 GOD 수준에서 단일 대형 FSM으로 시뮬레이션을 구현하기 시작하면 가능한 많은 상태, 전환 등이 발생합니다. if-else 엉망은 고정 된 것처럼 보이지만 실제로는 주변에 퍼져 있습니다. 이제 컨텍스트의 특정 정보에 대해 테스트를 수행하는 규칙 (이 시점에서 거의 모든 것을 포함)과 각 IF 본문은 전환 코드 어딘가에 있습니다.
프랙탈 분석을 입력하십시오. 첫 번째 단계는 각 젖소에 대해 FSM을 생성하는 것입니다. 여기서 젖소의 내부 상태 (서기, 달리기, 걷기, 방목 등)는 환경에 의해 영향을받습니다. 그래프가 완전하지 않을 수 있습니다. 예를 들어 방목은 스탠딩 상태에서만 액세스 할 수 있으며 다른 전이는 모델이 없기 때문에 해체됩니다. 여기서 소와 지형의 두 가지 모델로 데이터를 효과적으로 분리합니다. 각각 자체 속성이 설정되어 있습니다. 이 분석을 통해 전체 엔진 설계를 단순화 할 수 있습니다. 이제는 매우 구체적인 세부 사항을 결정하는 여러 개의 더 간단한 규칙 엔진 (각 전환마다 하나씩)을 결정하는 단일 규칙 엔진을 갖지 않습니다.
FSM에 동일한 코드를 다시 사용하기 때문에 기본적으로 FSM의 구성입니다. DSL을 더 일찍 언급했을 때를 기억하십니까? 당신이 쓸 규칙과 트랜지션이 많으면 DSL이 많은 일을 할 수있는 곳입니다.
더 깊어지다
이제 GOD는 더 이상 젖소의 내부 상태 관리에 대한 모든 복잡성을 처리하지 않아도되지만 더 나아가 야합니다. 예를 들어 지형 관리와 관련하여 여전히 많은 복잡성이 있습니다. 여기에서 고장이 충분한 곳을 결정합니다. 예를 들어 GOD에서 지형 역학 (긴 잔디, 진흙, 마른 진흙, 짧은 잔디 등)을 관리하게되면 동일한 패턴을 반복 할 수 있습니다. 모든 지형 상태 (긴 잔디, 짧은 잔디, 진흙, 건조 등)를 상태와 간단한 규칙 사이의 전환으로 새로운 지형 FSM으로 추출하여 지형 자체에 이러한 논리를 포함시키는 것을 막을 방법은 없습니다. 예를 들어, 진흙 상태에 도달하려면 규칙 엔진이 컨텍스트를 확인하여 액체를 찾으십시오. 그렇지 않으면 불가능합니다. 이제 하나님은 여전히 단순 해졌습니다.
FSM을 자율적으로 만들어 각 스레드를 제공하여 FSM 시스템을 완성 할 수 있습니다. 이 마지막 단계는 필요하지 않지만 의사 결정을 위임하는 방법 (전문 FSM을 시작하거나 미리 결정된 상태 만 반환)을 조정하여 시스템의 상호 작용을 동적으로 변경할 수 있습니다.
전환이 "다른 가능한 작업"을 수행 할 수 있다고 언급 한 것을 기억하십니까? 서로 다른 모델 (FSM)이 서로 통신 할 수있는 가능성을 추가하여이를 살펴 보겠습니다. 일련의 이벤트를 정의하고 각 FSM이 이러한 이벤트에 대한 리스너를 등록하도록 허용 할 수 있습니다. 따라서, 예를 들어 암소가 지형 헥스에 들어가면 헥스는 전이 변경을 위해 리스너를 등록 할 수 있습니다. 여기서는 각 FSM이 특정 도메인에 대한 지식없이 매우 높은 수준으로 구현되므로 약간 까다로워집니다. 그러나 암소가 이벤트 목록을 게시하도록하여이를 달성 할 수 있으며 셀이 반응 할 수있는 이벤트를 볼 경우 셀을 등록 할 수 있습니다. 여기서 좋은 이벤트 계층 구조는 좋은 투자입니다.
지형 패치 자체 모델에 포함 된 잔디 FSM과 함께 잔디의 영양 수준과 성장주기를 모델링하여 더 깊이 밀어 넣을 수 있습니다.
모든 측면이 거의 자체적으로 관리되므로 더 경건한 일에 시간을 할애 할 수 있기 때문에 GOD가 할 일이 거의 없을 정도로 아이디어를 추진할 수 있습니다.
요약
위에서 언급했듯이 여기 FSM은 해결책이 아니며, 그러한 문제에 대한 해결책이 코드 당 발견되지 않고 문제를 모델링하는 방법을 설명하는 수단 일뿐입니다. FSM 제안보다 가능하고 훨씬 나은 다른 솔루션이있을 가능성이 큽니다. 그러나 "프랙탈"접근 방식은이 난이도를 관리하는 좋은 방법으로 남아 있습니다. 올바르게 수행하면 중요한 곳에 더 깊은 레벨을 동적으로 할당하는 동시에 중요도가 낮은 곳에 더 간단한 모델을 제공 할 수 있습니다. 자원을 사용할 수있게되면 변경 사항을 대기시키고 적용 할 수 있습니다. 행동 순서에서 소에서 풀 패치로의 영양소 이동을 계산하는 것이 중요하지 않을 수 있습니다. 그러나 이러한 전환을 기록하고 나중에 변경 사항을 적용하거나 단순히 규칙 엔진을 교체하거나 FSM 구현을 직접 필드에없는 요소에 대해 더 단순한 순진 버전으로 대체하여 교육받은 추측에 근사 할 수 있습니다. 더 자세한 상호 작용을 통해 초점과 더 많은 리소스를 확보 할 수 있습니다. 이 모든 것이 시스템 전체를 다시 방문하지 않고; 각 부품이 잘 격리되어 있기 때문에 드롭 인 교체를 작성하거나 모델 깊이를 확장하기가 더 쉬워집니다. 표준 설계를 사용하면이를 기반으로 DSL과 같은 임시 도구에 대한 투자를 극대화하여 규칙이나 이벤트에 대한 표준 어휘를 정의하고 다시 높은 수준에서 시작하여 필요에 따라 세분화를 추가 할 수 있습니다. 각 부품이 잘 격리되어 있기 때문에 드롭 인 교체를 작성하거나 모델 깊이를 확장하기가 더 쉬워집니다. 표준 설계를 사용하면이를 기반으로 DSL과 같은 임시 도구에 대한 투자를 극대화하여 규칙이나 이벤트에 대한 표준 어휘를 정의하고 다시 높은 수준에서 시작하여 필요에 따라 세분화를 추가 할 수 있습니다. 각 부품이 잘 격리되어 있기 때문에 드롭 인 교체를 작성하거나 모델 깊이를 확장하기가 더 쉬워집니다. 표준 설계를 사용하면이를 기반으로 DSL과 같은 임시 도구에 대한 투자를 극대화하여 규칙이나 이벤트에 대한 표준 어휘를 정의하고 다시 높은 수준에서 시작하여 필요에 따라 세분화를 추가 할 수 있습니다.
코드 예제를 제공하지만 지금 당장 할 수있는 전부입니다.