문제

인사말 현재 나 refactoring 나의 프로그램 중 하나,그리고 흥미로운 문제입니다.

내가 전에는 오토마타.전 항상작 상태 및 종료 상태입니다.일부 장면 전환 레이블,인코딩하는 특정 작업을 수행해야 합니다에 통과.상표 없음을 의미합니다.일부 전환 있는 조건이 충족되어야 합문을 통과하는,이 조건 없는 경우 상태의 전환은 기본적으로 엡실론-전환 NFA 것 횡단없이 소모하는 입력의 상징이다.

내가 필요로 다음과 같은 작업:

  • 체크인 경우 전환 label
  • 이 라벨
  • 추가 상표를 전환
  • 체크인 경우에는 전이는 조건
  • 이 조건
  • 체크에 대한 평등

심사에서는 처음 다섯 개의 점,이 소리 같은 명확한 장식으로,기본 전환와 두 장식:표가 붙은 상태입니다.그러나,이러한 접근 방식에 문제가:두 개의 전환이 동일한 것으로 간주되는 경우에 자신의 시작을 상태 및 end-상태가 동일한,레이블을 양쪽에서 전환이 동일(또는지존하는)그리고 두 가지 조건이 모두 동일한(또는 존재하지 않).으로 장식,내가 있는 두 개의 전환은 표시("foo",조건부("바",전("baz","qux")))및 조건부("음료"로 표시,("foo",전("baz","qux")))필요가 있는 비 로컬 평등,는 장식이 필요하는 모든 데이터를 수집 및 전환해 이 데이터를 수집트-베이스:

class Transition(object):
    def __init__(self, start, end):
        self.start = start
        self.end = end
    def get_label(self):
        return None
    def has_label(self):
        return False
    def collect_decorations(self, decorations):
        return decorations
    def internal_equality(self, my_decorations, other):
        try:
            return (self.start == other.start
                    and self.end == other.end
                    and my_decorations = other.collect_decorations())
    def __eq__(self, other):
        return self.internal_equality(self.collect_decorations({}), other)

class Labeled(object):
    def __init__(self, label, base):
        self.base = base
        self.label = label
    def has_label(self):
        return True
    def get_label(self):
        return self.label
    def collect_decorations(self, decorations):
        assert 'label' not in decorations
        decorations['label'] = self.label
        return self.base.collect_decorations(decorations)
    def __getattr__(self, attribute):
        return self.base.__getattr(attribute)

이 깨끗한 접근법?나는 뭔가?

나는 주로 혼란 때문에,내가 해결할 수 있는 이상 클래스 이름을 사용하여 협력적인 여러 기업

class Transition(object):
    def __init__(self, **kwargs):
        # init is pythons MI-madness ;-)
        super(Transition, self).__init__(**kwargs)
        self.start = kwargs['start']
        self.end = kwargs['end']
    def get_label(self):
        return None
    def get_condition(self):
        return None
    def __eq__(self, other):
        try:
            return self.start == other.start and self.end == other.end
        except AttributeError:
            return False

class LabeledTransition(Transition):
    def __init__(self, **kwargs):
        super(LabeledTransition).__init__(**kwargs)
        self.label = kwargs['label']
    def get_label(self):
        return self.label
    def __eq__(self):
        super_result = super(LabeledTransition, self).__eq__(other)
        try:
            return super_result and self.label == other.label
        except AttributeError:
            return False

class ConditionalTransition(Transition):
    def __init__(self, **kwargs):
        super(ConditionalTransition, self).__init__(**kwargs)
        self.condition = kwargs['condition']

    def get_condition(self):
        return self.condition

    def __eq__(self, other):
        super_result = super(ConditionalTransition, self).__eq__(other)
        try:
            return super_result and self.condition = other.condition
        except AttributeError:
            return False

# ConditionalTransition about the same, with get_condition
class LabeledConditionalTransition(LabeledTransition, ConditionalTransition):
    pass

클래스 LabledConditionalTransition 동작을 정확히 예상되고 데 코드에 있는 매력과하지 않는 것의 경우 혼란에서 이 크기입니다.

물론,세 번째 옵션은 것을 망치는 모든 것으로 하나의 전환 등의 무리와 함께서 has_label/has_transition.

그래서...내가 혼동된다.나는 뭔가?는 구현이 좋아 보이는?을 어떻게 처리 비슷한 경우,그 개체처럼 보이는 장식자 처리할 수 있지만,그런 다음,이러한 비지역 방법을 제공니까?

편집:추가 ConditionalTransition-클래스입니다.기본적으로,이는 좀처럼 행동 장식을 뺀 값 순서에 의해 만들어 주문을 만드는 장식,전 검사를 위한 시작 및 종료되고 올바르 LabeledTransition-클래스를 확인 상표는 정확하고 ConditionalTransition 검사에 대한 조건이 맞습니다.

도움이 되었습니까?

해결책

나는 생각한 그는 아무도 정말 이해하고 당신의 질문입니다.는 것이 좋에 넣어 컨텍스트를 만들고 그것은 짧습니다.예를 들어,여기에 하나의 가능한 국가의 구현 패턴에 python,시 연구 그것은 아이디어를 얻을.

class State(object):
    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return self.name

class Automaton(object):
    def __init__(self, instance, start):
        self._state = start
        self.transitions = instance.transitions()

    def get_state(self):
        return self._state

    def set_state(self, target):
        transition = self.transitions.get((self.state, target))
        if transition:
            action, condition = transition
            if condition:
                if condition():
                    if action:
                        action()
                    self._state = target
            else:
                self._state = target
        else:
            self._state = target

    state = property(get_state, set_state)

class Door(object):
    open = State('open')
    closed = State('closed')

    def __init__(self, blocked=False):
        self.blocked = blocked

    def close(self):
        print 'closing door'

    def do_open(self):
        print 'opening door'

    def not_blocked(self):
        return not self.blocked

    def transitions(self):
        return {
            (self.open, self.closed):(self.close, self.not_blocked),
            (self.closed, self.open):(self.do_open, self.not_blocked),
        }

if __name__ == '__main__':
    door = Door()
    automaton = Automaton(door, door.open)

    print 'door is', automaton.state
    automaton.state = door.closed
    print 'door is', automaton.state
    automaton.state = door.open
    print 'door is', automaton.state
    door.blocked = True
    automaton.state = door.closed
    print 'door is', automaton.state

의 출력 이상이 될 것이다:

door is open
closing door
door is closed
opening door
door is open
door is open

다른 팁

에서는 코드를 게시,의 유일한 차이로 전환하고 표기 전환의 반환에 get_lable()및 has_label().어떤 경우에 압축할 수 있습니다 이 두 가지는 단일 클래스 세트 label 특성을 없음

return self.label is not None

에 has_label()함수입니다.

게시할 수 있습니에 대한 코드 ConditionalTransition 등?나는 생각한 것이 그것을 명확하다.

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