경로

경로는 모델을 통한 순회를 설명하는 표현식입니다.

개념적으로 경로는 지정된 연관 세트에 따라 접근할 수 있는 일부 오브젝트를 리턴하는 오브젝트에서 오브젝트 콜렉션까지의 함수입니다. 용어 "앵커"는 초기 오브젝트(경로의 매개변수)를 나타냅니다. 일반적으로 Q의 경로는 임의로 지정된 그래프입니다. 이 경로는 경로의 구문에 대한 지정된 그래프의 선형 표시입니다.

기본 경로

다음은 단순 경로의 예제입니다.

model->[project]->[containedPackages]->[classes]->[operation]

이 경로는 세 가지 연관의 단순 선형 순회를 보여줍니다. 이 경로는 오브젝트 모델로부터 시작하여 "project", "containedPackages", "classes" 및 "operation" 순서로 수행됩니다. 앵커 모델에 대한 이 경로의 적용 결과는 연관 "프로젝트"의 끝에 있는 패키지의 일부 클래스에 속하는 메타클래스 오퍼레이션의 모든 인스턴스 콜렉션입니다. 다음 그림은 이 경로가 순회하는 메타 모델의 일부를 보여줍니다.

메타 모델의 오퍼레이션 경로
참고: 경로는 메타 모델에 직접 해당합니다.

예를 들어, 프로젝트모델과 연관된 역할 "프로젝트"가 있으며 클래스패키지와 연관된 역할 "클래스"가 있습니다.

다음 그림은 이 경로를 적용할 수 있는 오브젝트 구조를 보여줍니다. 이러한 경우 경로는 오브젝트 opA1, opA2, opA3 및 opC1의 콜렉션을 평가합니다.

오브젝트 구조

따라서 경로의 구문에서 노드(예: [project])는 순회할 연관을 표시하고 두 노드 간의 에지(->)가 순회 순서를 지정합니다. 또한 구문에서 -> 기호는 실제 경로와 앵커를 구분하며 앵커는 선택적입니다. 앵커를 생략하는 경우 암시적 앵커가 current 변수에 현재 바인드되는 오브젝트입니다. 따라서 경로 [project]current->[project]의 축약입니다.

사이클이 있는 경로

다음 예제는 사이클이 있는 경로를 보여줍니다.

model->[project]->[containedPackages]->top:^[nestedPackages]->@top

이 예제에서는 세 개의 새로운 구문 요소를 소개합니다. 세 개의 구문 요소는 노드 레이블(top:), 결과에 추가 어노테이션(^) 및 참조 노드(@top)입니다. 레이블 및 참조 노드는 사이클의 2차원 구조와 기타 비선형 구조를 복합 경로로 인코딩하는 방법을 제공합니다. 이 예제에는 "top" 레이블이 지정된 노드에서부터 자체 노드까지의 사이클이 있습니다. 이 사이클은 Package의 모든 즉각적 중첩 패키지에 대한 연관인 Package의 재귀 연관 nestedPackages에 해당합니다.

이 사이클의 목적은 패키지의 nestedPackages에 있는 패키지를 포함하여 패키지의 모든 중첩 패키지를 순회하기 위한 것입니다. model에 대한 이 경로의 적용 결과는 model에서 project의 연관 containedPackages 끝에 있는 패키지의 직접 및 간접 중첩 패키지인 Package의 모든 인스턴스 콜렉션입니다. 그러나 이 경로를 이러한 방식으로 작업하려면 결과에 추가 어노테이션 ^을 사용해야 합니다. 노드 [nestedPackages]에서 이 어노테이션은 연관 nestedPackages 끝에 있는 모든 오브젝트가 결과 세트에 추가되어야 함을 의미합니다. 출력 에지가 없는 모든 노드에는 결과에 추가 어노테이션이 암시적으로 있어야 합니다. 따라서 첫 번째 예제의 노드 [operation]에는 결과에 추가 어노테이션이 암시적으로 있습니다. 그러나 두 번째 예제에서는 사이클로 인해 모든 노드에 출력 에지가 있습니다. 따라서 암시적으로 결과에 추가 어노테이션이 있는 노드가 없습니다.

[Project]->containedPackages]->top:^
[nestedPackages]->@top

중첩 패키지

다중 출력 에지가 있는 경로 노드

다음 예제는 둘 이상의 출력 에지가 있는 노드를 보여줍니다.

model->[project]->[containedPackages]->top:[]->([classes]; 
[nestedPackages]->@top)

이 예제에는 "top" 레이블이 지정된 노드에 [classes] 및 [nestedPackages] 노드와 같은 두 개의 후속 작업이 있습니다. 이러한 경우 "top" 노드도 비어 있는 연관([])입니다. 따라서 "top"은 경로에 있는 노드 구조에만 제공됩니다. [classes] 노드에는 출력 에지가 없으므로(둘 이상의 출력 에지가 있는 노드의 결과에 대한 화살표가 경로의 구조와 관련되지 않음) 결과에 추가 어노테이션이 암시적으로 있습니다.

top:[ ]->([classes]); [nestedPackages]->@top

결과에 추가 어노테이션이 있는 맨 위 노드

따라서 모델에 대한 이 경로의 적용 결과는 해당 패키지의 중첩 패키지 또는 모델에서 프로젝트의 연관 containedPackage 끝에 있는 패키지에 속하는 클래스의 모든 인스턴스 콜렉션입니다.

조건이 있는 경로 노드

다음 예제는 조건이 있는 두 개의 노드를 보여줍니다.

aPackage->[nestedPackages]{$name="PkgA"}->[classes]{$name~="*Impl"}

경로의 모든 노드는 조건과 함께 표시됩니다. 연관 이름 뒤에 중괄호로 표시되는 조건은 해당 오브젝트가 노드를 통해 전달되도록 허용되기 전에 연관에서 오브젝트가 만족해야 하는 술어를 지정합니다. 이 예제에서 {$name="PkgA"} 조건은 "PkgA"라는 오브젝트만 [classes] 노드에 도달하도록 허용하고, {$name~="*Impl"} 조건은 정규식 "*Impl"과 일치하는 이름이 있는 오브젝트만 결과 세트에 표시되도록 허용합니다. [nestedPackages]{$name="PkgA"}의 영향은 filter {$name="PkgA"} over [nestedPackages]의 영향과 동일합니다. 조건식이 평가되는 방법에 대한 세부사항은 filter 문서를 참조하십시오.

경로의 실행 모델

경로는 오브젝트에서 오브젝트 콜렉션까지의 함수입니다. 이는 연관 세트에 따라 접근할 수 있는 오브젝트를 산출합니다. 경로는 해당 그래프 구조에서 이 계산을 인코드하며 특히, 구조는 계산입니다. 보다 정확하게 말하면, 경로는 데이터 플로우 그래프이며 실행 시 데이터 플로우와 유사합니다. 따라서 이제 데이터 플로우 보기에서 경로는 데이터 링크와 오퍼레이션으로 구성됩니다. 데이터 링크는 에지에 해당하고 오퍼레이션은 노드에 해당합니다. 데이터 링크는 플로우되는 오브젝트에 따른 콘딧이고 오퍼레이션은 수신 데이터 링크의 오브젝트를 허용하고 출력 데이터 링크에 대한 오브젝트를 생성하는 기본 계산입니다.

예를 들어, 다음 경로를 고려하십시오.

model->[project]->[containedPackages]->[classes]->[operation]

이 경로는 [project], [containedPackages], [classes][operation] 오퍼레이션이 서로 연속으로 연결된 상태로 구성됩니다. 오브젝트 모델이 [project]로 플로우되면 모델의 연관 "프로젝트"에 있는 모든 오브젝트가 플로우됩니다. 그리고 이러한 모든 오브젝트가 [containedPackages]로 플로우되어 연관 containedPackages의 오브젝트가 플로우됩니다. 이러한 모든 오브젝트가 [classes]로 플로우되고 연관 "클래스"의 오브젝트가 플로우됩니다. 그런 다음 이러한 모든 오브젝트가 [operation]으로 플로우되고 연관 "오퍼레이션"의 오브젝트가 플로우됩니다. 마지막으로 이러한 오브젝트가 전체 경로에 대한 암시적 결과 노드로 플로우됩니다. 리프 노드에 의해 생성된 모든 오브젝트가 암시적으로 결과 노드로 플로우되어 전체 경로에서 생성된 오브젝트가 수집됩니다.

오브젝트의 플로우가 중단되면 경로의 평가도 종료됩니다. 따라서 경로가 종료되지 않도록 주의해야 합니다. 정확히 말하면, 오브젝트 자체가 사이클을 완료하거나 오브젝트가 계단식으로 사이클을 완료하므로 오브젝트가 오퍼레이션을 재검토하는 경우에만 경로가 종료되지 않습니다.

오퍼레이션 동작에 몇 가지 경계 케이스가 있습니다. 첫 번째로, 오퍼레이션 []는 ID 오퍼레이션입니다. 모든 오브젝트가 플로우됩니다. 두 번째로, 오퍼레이션 [α]는 입력 오브젝트에 연관 α의 오브젝트가 없는 경우 출력을 생성하지 않습니다. 세 번째로, 오퍼레이션 [α]는 입력 오브젝트의 메타클래스에 연관 α가 없는 경우 출력을 생성하지 않습니다. 따라서 예를 들어, 오퍼레이션 [nestedPackages]는 입력 오브젝트가 Package가 아닌 Class의 인스턴스인 경우 출력을 생성하지 않습니다.

참고: 경로에 사이클이 없어야 합니다.

피드백