0

걸어 다니는 방문자 패턴을 보니 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 패턴을 사용해야합니까, 아니면 단순히 작업중인 데이터 유형을 가져 와서 원하는 대답을 반환하는 재귀 함수를 작성해야합니까?

답변

0

방문자 패턴은 재발하는 문제를 회피하는 알려진 해결책입니다. 여기서 문제는 multiple dispatch을 제공하지 않는 프로그래밍 언어에만 적용될 수 있습니다.

아는 것처럼 보이기 때문에 많은 사람들은 데이터 구조를 명확하게 분리하려고합니다.

일반적으로 클래스의 계층 구조 (노드의 종류가 다른 트리)가 있습니다. 그러나이 경우, 나는 그런 일이 일어나지 않는다고 생각합니다. 그래서 왜 처음부터 Visitor 패턴을 사용하고 싶은지 궁금합니다. 배열을 입력으로 사용하여 처리하는 다른 클래스를 만드는 것이 더 쉽지 않을까요?

+0

아마도이 문제를 해결하는 가장 좋은 방법입니다. 방문자가이 문제를 처리하는 올바른 방법이 아닌 경우 적어도 제 질문 중 일부는 대안을 요구하고 있습니다. 당신의 전략에 대해 좀 더 생각해야합니다. –

+0

같은 유형의 배열의 모든 요소가 다른 하위 유형을 가지고 있는지 여부가 문제입니다. –