.(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 CEPML2을 이용한 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를 이용한 코딩이 훨씬 가독성이 좋아집니다.
예를 들어 아래와 같은 상황이라고 가정을 해보겠습니다.
- 모든 BRANCH MEMBER 들을 COLLECT 합니다.
- 결과 값은 각 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)
ENDDOPML2 위주의 코딩 예시:
!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'