목록으로

.(Dot) 개념 이해하기

PML Beginner 5

.(Dot) 을 사용 하면 좋은 이유

우선 PML에서는 PML1 / PML2 둘 다 혼용하여 사용합니다.

간단히 설명하자면 VAR 을사용하면 PML1 = 을 사용하면 PML2 라고 생각하면 좋을 것 같습니다.

예를들어 PIPE를 COLLECT를 해보겠습니다

PML1을 이용한 PIPE Collect

예시:

VAR !A EVAL NAME FOR ALL WITH MATCHWILD(NAME,'*TEST*') PIPE FOR CE

PML2을 이용한 PIPE Collect

예시:

!collection = OBJECT COLLECTION()
!Collection.SCOPE(CE)
!Collection.TYPE('PIPE')
!Collection.FILTER(OBJECT EXPRESSION(|MATCHWILD(NAME,'*TEST*')|))
!A = !Collection.RESULTS()

이렇게 PML1을 이용할경우 한 줄로 코딩이 가능하지만 PML2를 이용하면 5줄이나 사용해야합니다.

뿐만 아니라 결과에서도 큰 차이가 있습니다

PML1 결과:

<string> '/TEST1'
<string> '/TEST2'
<string> '/TEST3'
<string> '/TEST4'
<string> '/TEST5'

PML2 결과:

<dbref> '123456/1'
<dbref> '123456/2'
<dbref> '123456/3'
<dbref> '123456/4'
<dbref> '123456/5'

즉 PML1을 사용시 !A 에 바로 NAME 값이 할당되지만

PML2를 사용시 dbref 값이 할당되기에 DO문을 사용하여 다시 Name으로 변환해주는 작업이 필요합니다.

!!collectAllFor을 사용하면 큰 차이가 안난다고 하지만 그럼에도 불구하고 Name으로 변환하는 작업은 필요합니다.

이렇게 간단한 작업에 있어서는 PML1을 사용하는 것이 간편한 경우가 있습니다.

다만 코드가 점점 더 복잡해 질수록 PML2를 이용한 코딩이 훨씬 가독성이 좋아집니다.

예를 들어 아래와 같은 상황이라고 가정을 해보겠습니다.

  1. 모든 BRANCH MEMBER 들을 COLLECT 합니다.
  2. 결과 값은 각 BRAN MEM의 STEXT값을 ‘-’ 로 나눈 것에서 2번째값 과 BRAN MEM의 NAME 에서 ‘-’를 제거한 값을 하나로 합친 문자열을 !Arraytest 라는 Array에 append합니다.

.( dot) 없이 PML1 위주의 코딩 예시:

VAR !branmems COLL ALL BRAN MEM FOR CE
	!Arraytest = ARRAY()
	DO !branmem values !branmems
	$*Stext값
	!stext = STEXT OF DETREF OF SPREF OF $!branmem
	$* 두번쨰로 나눈값
	!splitStext = PART('$!stext',2,'-')
	$* Branmem 이름
	!name = name of $!branmem
	!replaceName = REPLACE('$!name','-','')
	!Arraytest.append(!splitStext + !replaceName)
ENDDO

PML2 위주의 코딩 예시:

!branmems = !!collectAllFor('BRAN MEM', ||, CE)
DO !branmem values !branmems
	!stext = !branmem.spref.detref.stext.part('-', 2)
	!name = !branmem.name.replace('-','')
	!Arraytest.append(!stext + !name)
ENDDO

더욱 줄여본 예시:

!branmems = !!collectAllFor('BRAN MEM', ||, CE)
!block = OBJECT BLOCK('|!branmems[!EvalIndex].spref.detref.stext.part('-', 2) + !branmems[!EvalIndex].name.replace('-','')|')
!Arraytest = !branmems.EVALUATE(!block)

3개의 예시 모두 결과값은 같습니다.

조금 더 간단한 상황에서의 예시를 보면

PML1 방식에서의 IF문:

IF MATCHWILD(!A, '*TEST*') EQ FALSE THEN

PML2 방식에서의 IF문:

IF !A.MATCHWILD('*TEST*').not() then

이렇게 간단한 상황에서도 조금 더 보기 좋게 바꿀 수 있습니다.

모든 상황에 .(dot)을 사용해야 한다는게 아닙니다.

다만 적절하게 간결하게 사용할 수 있는 부분에서는 사용 하는게 가독성에 좋다고 생각합니다.

1. .(Dot) 을 이용한 속성 접근

  • PML2에서는 .을 사용하여 속성에 접근할 수 있습니다.
  • 변수 타입이 dbref 타입이여야 합니다.

예시:

!A = =1237491/12    $* !A = CE 해도 DBREF 타입입니다.
!NAME = !A.NAME
!TYPE = !A.TYPE
!P1BORE = !A.PPBO[1]
!P2BORE = !A.PPBO[2]
!P1CONN = !A.PPCO[1]
!P2CONN = !A.PPCO[2]

2. METHOD 사용예시

!A 의 NAME 는 ' TESTPIPE1 '로 가정하겠습니다.

예시: DOT을 사용한 REPLACE 사용

!A = =1237491/12
!RESULT = !A.NAME.Replace('1','')
Q VAR !RESULT

결과:

<string> '/TESTPIPE'