스크립트 개발 / 코드 계획 및 구성
스크립트 세트, 스크립트, 함수는 일정한 논리에 따라 구성·정리되어야 하며, 코드를 임의로 쌓아 두어서는 안 됩니다. 스크립트 세트와 스크립트를 합리적으로 구성하면 코드 유지보수와 시스템 실행 효율에 도움이 됩니다.
1. 용도와 유형에 따라 스크립트 세트와 스크립트를 합리적으로 구분하기
일반적으로 다음과 같은 코드 구성 방식을 권장합니다:
- 업무 처리 스크립트의 경우 업종, 프로젝트, 조직 등에 따라 별도의 스크립트 세트를 만듭니다. 예:
eShop,IoT,monitor,sales,marketing등 - 코드 양이 너무 많을 때는 사용 빈도에 따라 저빈도 스크립트와 고빈도 스크립트를 구분합니다. 예:
prediction,advanced_prediction
2. 다른 스크립트의 함수 호출
스크립트는 기능, 용도 등의 필요에 따라 서로 다른 스크립트 또는 스크립트 세트로 나눌 수 있으며, 서로 다른 스크립트의 코드는 상호 호출할 수 있습니다.
다른 스크립트의 함수를 호출해야 할 때는 해당 스크립트를 import 하면 됩니다.
다른 스크립트를 가져올 때는 반드시 고정된 작성 형식을 따라야 합니다:
| Python | |
|---|---|
1 2 3 4 5 6 | |
스크립트 편집기에서 왼쪽 사이드바의 물음표 아이콘에 마우스를 가져가면 관련 문장을 바로 복사할 수 있습니다
스크립트 세트를 내보내야 한다면, 이 스크립트 세트가 의존하는 다른 스크립트도 함께 내보내야 합니다. 그렇지 않으면 내보낸 스크립트 세트는 함수가 없어 실제로 실행할 수 없습니다!
스크립트 또는 스크립트 세트는 Python 모듈이 아니므로 원래 import로 가져올 수 없습니다
하지만 DataFlux Func 내부에는 동적 로딩 메커니즘이 구현되어 있어 import 문으로 동적 코드를 로드할 수 있습니다. 따라서 다음 작성 방식은 모두 잘못되었습니다.
| Python | |
|---|---|
1 2 3 4 5 6 | |
또한 스크립트를 가져올 때는 순환 참조가 발생하지 않도록 주의해야 합니다. 예:
| Python | |
|---|---|
1 2 3 4 5 6 7 8 | |
주의: 여러 스크립트를 동시에 편집할 때 현재 다른 스크립트를 가져온 경우, 참조된 스크립트는 실제로 게시된 버전으로 실행되며, 시스템은 어떤 경우에도 초안 버전을 가져오지 않습니다!
3. 단일 스크립트의 코드량 및 의존 체인
DataFlux Func는 스크립트를 실행할 때 필요한 스크립트를 동적 로딩하여 실행합니다. 하나의 스크립트가 다른 스크립트를 가져오면 가져온 스크립트도 동적으로 로딩됩니다.
따라서 특정 스크립트의 일부 함수가 매우 자주 호출된다면, 이를 별도의 독립 스크립트로 분리하여 로딩 비용을 줄일 수 있습니다. 단일 스크립트 크기는 1000줄 이내로 유지하는 것이 좋습니다.
또한 과도하게 긴 의존 체인으로 인한 불필요한 성능 손실도 피해야 합니다. 예:
- 스크립트 1은 스크립트 2에 의존
- 스크립트 2는 스크립트 3에 의존
- 스크립트 3은 스크립트 4에 의존
- 스크립트 4는 스크립트 5에 의존
- ...
Python 내장 모듈과 타사 모듈은 이 제한의 영향을 받지 않습니다
4. 스크립트를 구분하지 않는 경우
위에서 스크립트의 합리적인 계획과 스크립트 간 호출 방법을 언급했지만, 특정 상황(예: 실제 사용되는 공용 함수가 매우 적고 간단한 경우)에서는 스크립트를 구분하지 않고 모든 코드를 동일한 스크립트에 둘 수 있습니다.
이 방식은 코드에 약간의 중복이 발생하지만, 다음과 같은 추가적인 이점도 있습니다:
- 단일 스크립트만으로 실행되어 로딩 비용 감소
- 공용 함수의 변경에 영향을 받지 않음
- 스크립트 내보내기 시 의존 관계를 고려할 필요 없음
실제 상황에 따라 가장 합리적인 방식으로 스크립트를 계획하십시오.
5. 동일한 스크립트 세트 내 스크립트 간 상호 참조의 축약 표기
1.1.0rc51 버전에서 추가됨
같은 스크립트 세트 아래에서 스크립트 간 참조 시 스크립트 세트 ID 부분을 생략할 수 있습니다(즉, __로 시작하는 부분만 작성).
스크립트 세트를 복제하여 스크립트 세트 ID가 변경된 후에도 내부 함수 간 참조가 올바르게 유지되도록 합니다.
예:
| Python | |
|---|---|
1 2 3 4 | |
| Python | |
|---|---|
1 2 3 4 5 6 7 | |
6. 과도한 캡슐화 피하기
Python은 다중 패러다임 프로그래밍 언어로, 간단한 절차적 프로그래밍을 사용할 수 있으며 객체 지향 방식으로 프로그래밍할 수도 있습니다.
하지만 DataFlux Func에서는 디버깅을 편리하게 하기 위해 절차적 프로그래밍 방식에 가까운 방식으로 코드를 작성하고, 과도한 캡슐화를 피하는 것이 좋습니다.
예를 들어, 동일한 기능은 2가지 다른 방식으로 구현할 수 있습니다:
| Python | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
위 예시에서 두 방식 모두 동일한 기능을 구현할 수 있지만, query_some_api(...)는 직접 호출할 수 있는 함수이므로 편집기에서 이 함수를 선택한 후 인수를 바로 입력하여 실행할 수 있습니다.
반면 APIQuery 클래스의 do(...) 메서드를 디버깅하려면 먼저 객체를 인스턴스화해야 호출할 수 있으므로, 별도로 테스트 함수 test_api_query(...)를 작성하여 호출할 수밖에 없습니다.
구체적으로 어떤 방식을 사용할지는 실제 상황에 따라 적절히 선택하십시오.