JMP 추가 기능 - 네임스페이스를 사용하여 여러 인스턴스를 격리합니다.안녕하세요, JMP 커뮤니티 여러분!
저는 창을 생성하고, 전역 변수를 저장하고, 함수를 호출하는 JMP 추가 기능을 개발 중입니다. 단일 인스턴스로 실행할 때는 모든 것이 정상적으로 작동하지만, 사용자가 추가 기능을 두 번 실행하면 두 인스턴스가 동일한 전역 스코프를 공유하게 되어 변수 충돌이 발생합니다(한 창이 다른 창의 상태를 덮어씁니다).
스크립트를 초기화할 때 Names default to here(1)를 사용했고, 심지어 newspace()를 호출하여 새로운 네임스페이스를 만들고 모든 변수를 그 안에 넣었지만 여전히 충돌이 발생합니다. 윈도우 네임스페이스에 대해서는 알고 있지만, 윈도우 외부의 변수와의 충돌도 피하고 싶습니다.
// Launch this script twice — second run breaks the first window
strLabel = "Instance A";
counter = 0;
win = New Window( "Test " || strLabel,
btn = Button Box( "Click me",
counter++;
btn << Set button name( strLabel || " clicked " || Char( counter ) || "x" );
)
);
자동화 및 스크립팅제목: JMP 추가 기능 - 네임스페이스를 사용하여 여러 인스턴스를 격리하기각 창이 독립적이라면 이러한 용도로 설계된 윈도우 네임스페이스를 사용하는 것이 좋습니다.
Names default to here(1):
// Functions outside the window are still accessible
rand = function({}, floor(random uniform(10)));
win = New Window("Values",
show toolbars(0), show menu(0),
// You can put statements above display elements
window:randomvalue = rand();
v list box(
text box("Enter a value for this box:"),
// All references to display elements should be in the window namespace
window:teb = text edit box(""),
// Examples reading and writing values.
button box("Update random value", window:randomvalue = rand() ),
button box("Get values from this window",
window:tb << Set Text(
"Random value: " || char(window:randomvalue) ||
"\!NEntered Value: " || (window:teb << Get Text)
)
),
window:tb = text box("")
)
);
// You can get to this from outside the window, but make sure this namespace is protected too - for example from inside another window.
show(win:randomvalue, win:teb << Get Text);
제목: JMP 추가 기능 - 네임스페이스를 사용하여 여러 인스턴스를 격리하기가장 쉬운 방법은 윈도우 네임스페이스를 사용하는 것입니다. 컨텍스트 박스를 제외하면 두 번째로 쉬운 방법은 이름을 지정할 수 있는 명명된 네임스페이스를 사용하는 것입니다. 그다음으로는 하나의 명명된 네임스페이스를 활용하여 값을 리스트나 연관 배열에 저장하고 접근하는 방법이 있습니다. 익명 네임스페이스도 사용할 수 있지만, 윈도우 내에서 올바른 네임스페이스에 접근하려면 추가적인 작업이 필요합니다.
제목: JMP 추가 기능 - 네임스페이스를 사용하여 여러 인스턴스를 격리하기안녕하세요, 답변 감사합니다. 윈도우 네임스페이스를 구현하려고 하는데, 윈도우 외부로 변수를 추출하는 부분이 좀 어렵습니다. 여러 인스턴스를 실행할 때 윈도우 이름이 모두 동일하기 때문입니다.
제목: JMP 추가 기능 - 네임스페이스를 사용하여 여러 인스턴스를 격리하기여기서 도움이 되는 한 가지는 스크립트를 시작한 다음 중간에 입력을 요청하는 대신 창에서 모든 것을 호출하는 것입니다. 사용자 입력이 당장 필요하지 않더라도 '시작 중...'이라는 창을 열고, '창 열기' 스크립트에 현재 창 앞에 있는 모든 코드를 창 또는 로컬 범위 변수를 사용하여 작성할 수 있습니다. 스크립트가 길어지면 관리가 어려워질 수 있지만, 그럴 때는 해당 코드들을 창 앞에 정의된 여러 함수로 나누거나 아예 다른 파일에 저장하는 것을 고려해 볼 수 있습니다.
예를 들어, 시계열 처리 데이터 추가 기능의 유효성 검사 열은 다음과 같이 작성되었습니다. 이 스크립트에서 UpdateUI가 새 창(New Window)이 호출되기 전인 274번째 줄 에서 정의되는 방식을 주목하십시오(향후 이 글을 읽는 분들에게 혼란을 줄 수 있다면 죄송합니다). 그런 다음 670번째 줄 에서 버튼을 눌렀을 때와 다른 필드가 업데이트될 때 호출됩니다.
이 함수는 창 변수를 여기저기서 호출하는데, 그 주된 목적은 사용자 인터페이스를 업데이트하는 것입니다. 대부분의 추가 기능에서는 이러한 방식을 권장하지 않습니다. 필요한 모든 정보를 인자/매개변수로 전달하고 함수 내부에서는 모든 변수를 로컬 변수로 사용하며 결과만 반환하는 것이 좋습니다.
제목: JMP 추가 기능 - 네임스페이스를 사용하여 여러 인스턴스를 격리하기추가 기능을 실행하는 경우, 여기 네임스페이스에만 의존해도 전혀 문제가 없을 수 있습니다. 같은 스크립트 창에서 실행하면 작동하지 않지만, 별도의 스크립트 창에서 실행하면 제대로 작동할 것입니다.