걸어 다니는 방문자 패턴을 보니 AST입니다. 이 패턴을 사용하려면 accept(visitor)
메서드를 AST 노드 객체에 추가합니다. 이 메소드는 visitor.visit(self)
을 호출하여 노드를 "처리"하여 원하는 결과를 얻습니다 (예 : 예쁜 인쇄 버전의 AST).대서양 표준시가 단지 배열의 배열 일 때 방문자를 사용해야합니까?
일반적으로 노드 자체를 수정하여 메서드를 추가해야합니다. 그러나 AST가 내장 객체를 사용한다면 어떨까요? Ruby의 Ripper 라이브러리는 AST를 배열의 배열로 반환합니다. 다음과 같이 내가 accept
방법을 추가 할 수 있습니다
class Array
def accept(visitor)
visitor.visit(self)
end
end
가
documentation for Array 보면, 현재에는
accept
방법이 없기 때문에 충돌이있을 수 없습니다. 그러나 이것은 나에게 맞는 느낌이 들지 않습니다. 특히 도서관을 직접 쓰는 경우 특히 그렇습니다. 나는 다른 사람들이 의존하고있는 내장 객체를 "오염"시키고 싶지 않습니다.
이것은 Ruby에만 국한된 것은 아니지만 비슷한 방법으로 C#에서 확장 메소드를 추가 할 수 있습니다.
내 질문은 :이 시나리오에서 Visitor 패턴을 사용해야합니까, 아니면 단순히 작업중인 데이터 유형을 가져 와서 원하는 대답을 반환하는 재귀 함수를 작성해야합니까?
아마도이 문제를 해결하는 가장 좋은 방법입니다. 방문자가이 문제를 처리하는 올바른 방법이 아닌 경우 적어도 제 질문 중 일부는 대안을 요구하고 있습니다. 당신의 전략에 대해 좀 더 생각해야합니다. –
같은 유형의 배열의 모든 요소가 다른 하위 유형을 가지고 있는지 여부가 문제입니다. –