2013-11-26 8 views
0

나는 Bold for Delphi를 사용하며 구현은 OCL입니다. OCL은 목록 등을 필터링하는 데 능숙합니다. 그러나 링크 된 목록을 트래버스하는 좋은 방법을 찾지 못했습니다.OCL의 링크 된 목록을 따르십시오

클래스가 있다고 가정하면 PlanMission입니다. 자체를 가리키는 단일 링크 PlanMission.previous을 포함합니다. 부울 속성 isDummy도 있습니다.

isDummy이라는 인스턴스가있을 때까지 PlanMissions의 목록을 트래버스하고 싶습니다.

내가 정말 원하는 것은

if isdummy then 
    self 
else if previous->notEmpty and previous.isdummy then 
    previous 
else if previous.previous->notEmpty and previous.previous.isdummy then 
    previous.previous 
else 
    nil 
endif 
endif 
endif 

이 같은 것입니다 수행 할 수 있습니다

traverseList(previous, isDummy) 

traverseList

이 존재하지 않지만,이 개 매개 변수를 가져야한다.
  • previous

    :
  • isDummy을 따르지 링크 : 부울 조건 나는

가 어떻게이 수행 할 수 있습니다 중지 할 때 알 수 있도록?

설명 수정 나는 어떤 델파이 코드도 원하지 않습니다. OCL에 코드를 입력하고 싶습니다. Bold을 사용하는 사람들은 내 뜻을 알고 있습니다. OCL은 쿼리 객체, 속성 등이 포함 된 쿼리 언어입니다. 부작용이 없으므로 읽기 전용입니다. OCL 소개를 찾을 수 있습니다 here.

+0

나는 그것을 얻지 않는다. 델파이에서 이것을하고 싶습니까? OCL은 어떻게 작동합니까? – jpfollenius

+0

@jpfollenius 그는 다음을 요구하고 있습니까 : teh codez plz ?? – EProgrammerNotFound

+0

델파이 코드가 없으므로 델파이에서는 사소한 것입니다. OCL은 Delphi와 매우 다릅니다. 그것은 종종 modeldriven 개발에 사용됩니다. Delphi 용 Bold에는 OCL 구현이 하나 있습니다. –

답변

1

previous 관계의 전이 폐쇄를 계산해야합니다. (자기, self.previous, self.previous.previous 등)에서 OCL

그것이하여 (어느 것도 존재하지 않는 경우는 null) 다음은 제 1 더미 PlanMission를 추출 할 수 self->asOrderedSet()->closure(previous)

2.3.1 :

섹션에서
let c:Set(PlanMission) = 
    self->asOrderedSet()->closure(previous)->select(x|x.isDummy) in 
    if c->isEmpty() then null else select(x|x.isDummy)->first() 

11.9 OCL 2.3.1의이 도구는 O의 이전 버전을 지원하는 경우 사용할 수 있습니다 iterate의 측면에서 closure의 정의가 미리 정의 된 반복자 표현에 대한 매핑 규칙 CL.

+0

재미있는, 링크 주셔서 감사합니다. –