openlang

interface의 uses 절도 API에 들어갑니까?

Delphi 유닛에는 다른 언어들이 자꾸 새로 만들어 내는 구분이 이미 있습니다. implementation 위에 선언한 것은 이 유닛을 쓰는 다른 유닛에서 보입니다. 그 아래는 유닛만의 것이어서, 거기에만 있는 타입이나 루틴은 바깥에서 이름조차 부를 수 없습니다.

사람들이 과소평가하는 부분은 uses 절의 위치입니다. interface 쪽 uses 절에 적은 유닛은 공개 선언이 기댈 수 있는 대상이 되고, 그래서 그 유닛의 interface가 바뀌면 필요 이상으로 멀리까지 영향이 갑니다. 루틴 본문에서만 필요하다면 implementation 쪽 uses 절에 적으십시오. 컴파일러도 나름의 방식으로 같은 이야기를 합니다. 유닛끼리 서로 의존하는 것은 허용되지만, interface 쪽 uses 절로만 이어진 순환은 허용되지 않습니다.

오래된 데스크톱 프로젝트를 열면 저는 interface 부분과 그 uses 목록부터 읽습니다. 짧은 interface 부분과 짧은 uses 목록은 Pascal이 제공하는 것 가운데 공개 모듈 표면에 제일 가까운 것이고, 그렇게 유지하는 데는 비용이 들지 않습니다.

이어지는 대화 3

서로의 근거를 따라
  1. 고유 링크

    비공개 범위를 클래스가 아니라 라이브러리 단위로 잡으면, 두 부분으로 나누지 않아도 이 대부분을 얻어요. Dart에서는 _로 시작하는 식별자는 part 파일까지 포함해 그 라이브러리 안 어디서나 보이고, 바깥에서는 안 보여요. 패키지의 공개 얼굴은 보통 lib/ 아래 파일 하나가 show 목록을 붙여 export하는 형태고, 실제 코드는 lib/src에 있어요. 다른 패키지는 거기를 직접 import하지 않는 게 원칙이고요. 사실 interface 부분과 같은 생각이에요. 파일 하나와 폴더 관례로 나눠 놓았을 뿐이에요.

  2. 고유 링크

    덧붙이자면 이건 jar가 실제로 모듈 경로에서 실행될 때만 성립해요. 같은 jar를 클래스 패스에 두면 이름 없는 모듈로 들어가고, 거기서는 exports 목록이 아무 일도 안 해요. 패키지 전용 접근은 싼 방법이고 어느 쪽에서든 동작하니까, 오래된 애플리케이션이라면 패키지 전용 접근에 이름 관례 정도로도 괜찮겠어요. 모듈 기술자가 한 번도 없던 앱에 그걸 넣으려면 고쳐야 할 곳이 얼마나 늘어나나요? 대개 다들 잡아 둔 예산보다 많아요.