동일한 인터페이스 내에서 선언 된 인터페이스를 값으로 갖는 맵 정의

Jagvir

Java에서 Interpreter Design Pattern을 이해하려고합니다. Wikipedia 에서 다음 코드를 받고 있습니다. 쓰여있다

interface Expression {
    public int interpret(Map<String,Expression> variables);
}

Expression이 Type Expression의 Interface 안에있는 Map의 값인 것에 대해 여기서 무슨 일이 일어나고 있는지 설명해 주시겠습니까? 재귀 호출과 같은 것입니까? 친절하게 설명하십시오.

worldofprasanna

귀하의 질문에 답하기 위해 예, 동일한 함수 interpret()가 반복해서 호출되지만 동일한 클래스가 아닙니다. 따라서 실제로 재귀 함수가 아닙니다.

인터프리터 패턴을 설명하기 위해 위키 코드를 사용했지만 전체 그림을 이해하려면 위키 페이지로 이리저리 이동해야합니다.

http://en.wikipedia.org/wiki/Interpreter_pattern

인터프리터 패턴은 주어진 표현식의 각 변수와 연산자가 별도의 클래스로 표현 된 다음 이러한 클래스의 객체에서 평가가 발생하는 패턴입니다.

표현 - class, expression - ((y+z)-x)

지적한 위키 예제의 경우에서 Evaluator의 생성자를 호출하면 main()식만 생성되고 (또 다른 Expression 개체) syntaxTreeEvaluator 참조 변수에 저장됩니다 .

표현으로 거기에서 일어나는 일의 요점을 제공하려면 : x y z + -

  1. 첫 번째 변수는 x,y,z에서와 같은 저장되는 expressionStack변수
  2. 당신이 만났을 때 +, (y+z)안으로 밀려날 것입니다expressionStack
  3. -토큰 ((y+z)-x)Expression 객체는 expressionStack(에서 연산자에 대해 발생하는 푸시 및 팝 확인 Evaluator)

따라서 Evaluator의 생성자가 완료되면 구현이 다시 Expression으로 표시되는 Expression 객체를 갖게됩니다 ((y+z)-x).

이제에서 흥미로운 부분이 나옵니다. 클래스를 사용 main()하여 변수 값을 대체 하고이 순서로 발생합니다.(x,y,z)Number

  1. main () sentence.interpret(variables);  

  2. Evaluator.syntaxTree.interpret(variables);

  3. Variable.interpret(variables) // Here the actual values(5,10,42) gets substituted for x, y, z.

그런 다음 Expression평가됩니다.

당신이 볼 경우 interpret()Variables클래스는 해당 얻을 경우, 그것은 약간 다릅니다 Number전달 된 컨텍스트를 사용하여, 변수의 객체를. 이것은 전달 된 컨텍스트 객체를 사용하여 숫자에 대한 변수의 실제 대체입니다 main(). 이 차례로 호출 interpret()Number단지 수를 반환하고 작업이로 발생 ((10+5)-42) = -27.

이점:

이 기술을 사용하면 기존 작업에 영향을주지 않고 작업 (더하기, 빼기)을 계속 추가 할 수 있으며 한 작업은 다른 작업과 독립적입니다. SQL 쿼리 및 기타 인터프리터에서 사용됩니다.

감사합니다, Prasanna V.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

동일한 맵 초기화에서 이전에 정의 된 기존 키의 값으로 키 선언

분류에서Dev

d.ts 파일에 선언 된 인터페이스에서 TypeScript 앰비언트 선언 인터페이스를 사용하는 방법

분류에서Dev

자식 인터페이스에서 동일한 선언을 갖는 공통 메소드 선언의 아키텍처 중요성은 무엇입니까

분류에서Dev

인터페이스를 구현하는 클래스에 대해 거의 동일한 여러 선언 방지

분류에서Dev

인터페이스 메서드에서 반환 된 값에 대해 동일한 유형의 클래스를 지정하는 방법은 무엇입니까?

분류에서Dev

인터페이스 메서드에서 반환 된 값에 대해 동일한 유형의 클래스를 지정하는 방법은 무엇입니까?

분류에서Dev

맵 키를 기반으로 인터페이스 맵에서 유형 선택

분류에서Dev

인터페이스를 클래스에 의해 구현되는 것으로 선언

분류에서Dev

제네릭으로 구성된 인터페이스에는 한정자를 사용할 수 없습니다.

분류에서Dev

자식과 부모가 정의 된 인터페이스와 동일한 유형인지 확인하는 인터페이스를 정의하는 방법

분류에서Dev

인터페이스 블록 내에서 더미 인수 선언의 일부로 모듈 변수를 어떻게 지정합니까?

분류에서Dev

다양한 수의 속성으로 TypeScript 인터페이스를 선언하는 방법은 무엇입니까?

분류에서Dev

인터페이스 내에서 상속 된 인터페이스의 모든 메소드를 선언 하시겠습니까?

분류에서Dev

인터페이스 내에서 상속 된 인터페이스의 모든 메소드를 선언 하시겠습니까?

분류에서Dev

[MIDL] idl 파일의 c / c ++ 헤더에 선언 된 인터페이스를 사용하는 방법은 무엇입니까?

분류에서Dev

[MIDL] idl 파일의 c / c ++ 헤더에 선언 된 인터페이스를 사용하는 방법은 무엇입니까?

분류에서Dev

해당 클래스가 종속성으로 갖는 인터페이스의 각 구체적인 구현에 대한 클래스의 인스턴스 구성

분류에서Dev

C ++ 헤더 파일에 private 멤버 변수 선언이 포함 된 경우 어떻게 클래스의 "인터페이스"로 간주 될 수 있습니까?

분류에서Dev

Java 클래스 내부의 내부 인터페이스를 정의하고 선언하는 규칙?

분류에서Dev

인터페이스에 선언 된 메서드에 대한 제약

분류에서Dev

Java의 정적 블록에서 인터페이스를 선언 할 때 컴파일러가 오류를 표시하는 이유는 무엇입니까?

분류에서Dev

인터페이스와 추상 클래스가 동일한 메서드를 갖는 경우 모든 메서드를 Java의 클래스로 재정의하는 것이 더 낫습니다.

분류에서Dev

인터페이스에 강하게 연결된 메서드를 정의하는 적절한 방법

분류에서Dev

두 번째 인터페이스 내에서 일반 유형으로 사용되는 일반 유형과의 인터페이스

분류에서Dev

인터페이스에 대한 프로그래밍 : 언제 메서드를 인터페이스 메서드로 선언하지 않을까요?

분류에서Dev

Unity가 2 개의 등록 된 인터페이스에 대해 동일한 인스턴스를 주입하도록하는 방법

분류에서Dev

이러한 객체 배열의 각 객체에 포함 된 속성 값의 합집합으로 제한된 키로 인터페이스를 정의하는 방법은 무엇입니까?

분류에서Dev

Vue Router v4에서 사용자 정의 메타 필드에 대한 TypeScript 유형 인터페이스를 선언하는 방법은 무엇입니까?

분류에서Dev

여러 헤더 파일의 인터페이스에서 재정의 된 함수를 선언 할 때 중복 코드를 피하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    동일한 맵 초기화에서 이전에 정의 된 기존 키의 값으로 키 선언

  2. 2

    d.ts 파일에 선언 된 인터페이스에서 TypeScript 앰비언트 선언 인터페이스를 사용하는 방법

  3. 3

    자식 인터페이스에서 동일한 선언을 갖는 공통 메소드 선언의 아키텍처 중요성은 무엇입니까

  4. 4

    인터페이스를 구현하는 클래스에 대해 거의 동일한 여러 선언 방지

  5. 5

    인터페이스 메서드에서 반환 된 값에 대해 동일한 유형의 클래스를 지정하는 방법은 무엇입니까?

  6. 6

    인터페이스 메서드에서 반환 된 값에 대해 동일한 유형의 클래스를 지정하는 방법은 무엇입니까?

  7. 7

    맵 키를 기반으로 인터페이스 맵에서 유형 선택

  8. 8

    인터페이스를 클래스에 의해 구현되는 것으로 선언

  9. 9

    제네릭으로 구성된 인터페이스에는 한정자를 사용할 수 없습니다.

  10. 10

    자식과 부모가 정의 된 인터페이스와 동일한 유형인지 확인하는 인터페이스를 정의하는 방법

  11. 11

    인터페이스 블록 내에서 더미 인수 선언의 일부로 모듈 변수를 어떻게 지정합니까?

  12. 12

    다양한 수의 속성으로 TypeScript 인터페이스를 선언하는 방법은 무엇입니까?

  13. 13

    인터페이스 내에서 상속 된 인터페이스의 모든 메소드를 선언 하시겠습니까?

  14. 14

    인터페이스 내에서 상속 된 인터페이스의 모든 메소드를 선언 하시겠습니까?

  15. 15

    [MIDL] idl 파일의 c / c ++ 헤더에 선언 된 인터페이스를 사용하는 방법은 무엇입니까?

  16. 16

    [MIDL] idl 파일의 c / c ++ 헤더에 선언 된 인터페이스를 사용하는 방법은 무엇입니까?

  17. 17

    해당 클래스가 종속성으로 갖는 인터페이스의 각 구체적인 구현에 대한 클래스의 인스턴스 구성

  18. 18

    C ++ 헤더 파일에 private 멤버 변수 선언이 포함 된 경우 어떻게 클래스의 "인터페이스"로 간주 될 수 있습니까?

  19. 19

    Java 클래스 내부의 내부 인터페이스를 정의하고 선언하는 규칙?

  20. 20

    인터페이스에 선언 된 메서드에 대한 제약

  21. 21

    Java의 정적 블록에서 인터페이스를 선언 할 때 컴파일러가 오류를 표시하는 이유는 무엇입니까?

  22. 22

    인터페이스와 추상 클래스가 동일한 메서드를 갖는 경우 모든 메서드를 Java의 클래스로 재정의하는 것이 더 낫습니다.

  23. 23

    인터페이스에 강하게 연결된 메서드를 정의하는 적절한 방법

  24. 24

    두 번째 인터페이스 내에서 일반 유형으로 사용되는 일반 유형과의 인터페이스

  25. 25

    인터페이스에 대한 프로그래밍 : 언제 메서드를 인터페이스 메서드로 선언하지 않을까요?

  26. 26

    Unity가 2 개의 등록 된 인터페이스에 대해 동일한 인스턴스를 주입하도록하는 방법

  27. 27

    이러한 객체 배열의 각 객체에 포함 된 속성 값의 합집합으로 제한된 키로 인터페이스를 정의하는 방법은 무엇입니까?

  28. 28

    Vue Router v4에서 사용자 정의 메타 필드에 대한 TypeScript 유형 인터페이스를 선언하는 방법은 무엇입니까?

  29. 29

    여러 헤더 파일의 인터페이스에서 재정의 된 함수를 선언 할 때 중복 코드를 피하는 방법은 무엇입니까?

뜨겁다태그

보관