2

들어오는 데이터 항목을 처리하는 데 사용되는 규칙 트리를 나타내는 RuleTree 데이터 구조가 있습니다.규칙 처리를위한 API에 가변 상태 포함

  • RuleTree는 현재 임의의 수의 (가능한 경우 중첩 된) 규칙을 포함하는 변경 불가능한 데이터 구조입니다.
  • 다른 입력 데이터 항목에 동일한 RuleTree를 동시에 적용 할 다중 스레드가 있습니다.
  • RuleTree는 하나 이상의 단계에서 데이터를 입력하는 데 적용됩니다. 적용 할 단계를 결정하는 것은 호출 코드에 달려 있습니다. 이 현재 잘 작동

    ruleTree.applyStage1(data); 
    .. 
    // other stuff happens 
    .. 
    ruleTree.applyStage2(data); 
    .. 
    // other stuff happens 
    .. 
    ruleTree.applyStage3(data); 
    

    :

일반적인 제어 흐름은 무언가 같이 될 것입니다. 그러나 이제 RuleTree 처리 중에 일부 추가 상태 정보를 계산해야합니다 (예 : 트리의 특정 규칙에 대한 일치 항목 수 계산).

  • RuleTree는 가변 확인하고 나중에 다시 읽을 수있는 상태 정보를 저장 할 수 있도록 : 지금까지 내가 그것을 볼 수 있듯이, 나는 몇 가지 옵션이 있습니다. 그러나 서로 다른 스레드는 RuleTree의 다른 복사본이 필요하기 때문에 동시성은 더 까다 롭습니다.
  • RuleTree에 스레드 로컬 상태를 추가하여 상태 정보를 계산하고 RuleTree 내에 저장할 수 있지만 서로 다른 스레드가 서로의 상태 정보를 트 래핑하지 않도록합니다. 그러나 이것은 모든 단계가 동일한 스레드에서 실행되도록 보장되어야 함을 의미합니다.
  • ruletree에 추가 매개 변수 인 e.g. ruleTree.applyStage1(data, state)으로 전달할 수있는 상태 정보에 대한 별도의 개체가 있어야합니다. 이렇게하면 RuleTree가 좋고 불변으로 유지되지만 호출 코드는 이제 상태 데이터를 별도로 설정하고 관리해야하기 때문에 호출자에게 더 복잡한 규칙을 사용하게됩니다.

어떤 접근 방식이 가장 좋고 그 이유는 무엇입니까?

답변

2

"상태 정보 용 별도 개체"접근 방식은 고려중인 다른 접근 방식의 고유 한 결함이 없기 때문에 사용하십시오. 게다가, 사용자가 RuleTree의 모든 메소드에 상태를 전달하도록 요구하는 "개별 객체"모델의 주요 결함은 쉽게 처리 할 수 ​​있습니다.

RuleTree의 프록시를 고려하십시오. 나는 의사에 대한 실행 가능한 근사치로 루비를 사용합니다 :

class RuleTreeProxy 

    def initialize(ruleTree) # Constructor 
    @ruleTree = RuleTree 
    @state = RuleTreeState.new 
    end 

    def state 
    return @state 
    end   

    def applyStage1(data) 
    @rule_tree.applyStage1(@state, data) 
    end 

    def applyStage2(data) 
    @rule_tree.applyStage2(@state, data) 
    end 

    # etc. 

end 

는 @ 객체의 멤버 변수를 의미한다.

RuleTree를 사용할 필요

사람이 RuleTreeProxy를 생성하고 대신 호출 : 당신이 경우

matches = proxy.state.numberOfMatches 

:

proxy = RuleTreeProxy.new(ruleTree) 
proxy.applyStage1(data) 
proxy.applyStage2(data) 
... 

상태 개체가 RuleTree 수행 처리에 대한 유용한 정보를 검색하는 접근을 포함 서로 다른 단계가 서로 다른 스레드에서 수행되도록 요구 한 다음 두 스레드가 동시에 RuleTreeProxy 인스턴스에서 작업을 시도하지 않도록하거나 RuleTreeProx에 적절한 동기화를 추가하십시오 와이.

+0

답변을 주셔서 감사합니다. 저는 프록시 객체 시스템을 사용하는 것을 좋아합니다! – mikera

+0

@mikera - 재미있는 질문에 감사드립니다! –

관련 문제