2013-10-07 3 views
0

소개

저는 스칼라로 작성된 API 작업을하고 있습니다. 데이터 전송 객체 (DTO)를 API 함수에 전달 된 매개 변수로 사용합니다. DTO는 API 사용자에 의해 인스턴스화됩니다.전송 오브젝트 내에서 사용하기에 적합한 스칼라 반사 API 이름 또는 기호입니까?

API는 상당히 추상적/일반이므로 API가 작동해야하는 객체의 속성을 지정하려고합니다. 예 : Person "P"의 인스턴스가 API에 전달

case class Person(name: String, birthdate: Date) 

는, API가 "P"의 속성을 알 필요가에 운영한다 : 단지 name 또는 birthdate, 또는 둘 중 하나.

그래서 "P"인스턴스의 인스턴스를 포함하는 DTO, 속성의 선언 및 "P"유형에 대한 추가 정보를 디자인해야합니다.

문자열 기반의 접근 방식

한 가지 방법은 아마도 "P"와 그 유형의 속성을 지정 String의를 사용하는 것입니다. 이것은 비교적 간단 할 것입니다. String은 매우 가볍고 잘 알려져 있습니다. 패키지, 타입 및 멤버에 대한 공식 표기법이 String이므로, 선언은 어느 정도 구조화됩니다. 반대쪽 사용자가 String을 잘못 전달할 수 있으므로 String- 선언을 확인해야합니다. String 대신 전용 유형으로 속성을 나타내는 유형을 상상할 수 있습니다.이 유형은 증가 된 구조의 이점을 가질 수 있으며 그 유형조차도 유효한 인스턴스 만 존재할 수 있도록 설계되었습니다.

반사 API 접근

은 물론 반사 API는 내 마음에 와서 내가 반사 API에서 유형 속성을 선언하는 실험을하고있다. 불행히도 scala 2.10.x 리플렉션 API는 약간 비현실적입니다. 혼란을 일으킬 수있는 이름, 기호, 거울, 유형, typetag가 있습니다. 반사 API의 "이름"반사 API의 "기호"와

  • 속성 선언 (특히 TermSymbol)와

    1. 속성 선언
    :

    는 기본적으로 나는 String들로 선언 속성 두 가지 대안을 참조

    이렇게하면, 내가 볼 수있는 한, DTO를 구성하는 API 사용자는 리플렉션 API와 이름/기호를 처리해야합니다. 또한 API의 구현은 리플렉션 API를 사용해야합니다. 따라서 반사 코드가있는 두 개의 위치가 있으며 사용자는 반사 API를 최소한 조금은 알고 있어야합니다.

    질문 나는이 방법이 얼마나 헤비급 모르는 그러나

    :

    • 이 이름 또는 기호를 구성하는 비용이 있습니까?
    • 리플렉션 API는 값 비싼 연산 결과를 캐싱합니까?
    • 네트워크를 통해 다른 JVM으로 이름과 기호를 전송할 수 있습니까?
    • 직렬화 가능합니까?

    주 질문 : 전송 오브젝트 내에서 사용하기 적합한 스칼라 반사 API 이름 또는 기호가 있습니까?

    리플렉션 API에서는 이렇게하는 것이 복잡해 보입니다. 어떤 힌트라도 환영합니다. 그리고 다른 대안들에 대한 어떤 힌트도.

    피씨 : 내 API가 복잡하고 반사 부분이 꽤 실험적인 상태이기 때문에 아직 내 자신의 코드를 포함하지 않았습니다. Maye 나중에 유용한 것을 제공 할 수 있습니다.

  • 답변

    1

    1a) 이름은 구성하기 쉽고 가벼우 며 문자열보다 약간 큽니다.

    1b) 기호는 사용자가 작성할 수 없으며 staticClass 또는 member과 같은 API를 사용하여 이름을 결정할 때 내부적으로 만들어집니다. 이러한 API에 대한 첫 번째 호출에는 대개 ScalaSignature 주석의 기호 소유자에 대한 유형 서명을 푸는 작업이 포함되어 비용이 많이 든다. 후속 호출은 이미로드 된 서명을 사용하지만 일종의 해시 테이블 (1)에서 이름 별 조회 비용을 지불합니다. declarationdeclaration이 기본 클래스를 조사하지 않으므로 member보다 작습니다.

    2) 유형 서명 (예 : 클래스 구성원 목록, 매개 변수 + 메소드 반환 유형 등)은 지연로드되어 캐싱됩니다. 자바와 스칼라 반사 아티팩트 간의 매핑도 (2)으로 캐시됩니다. 내가 아는 한, 나머지 (예 : 하위 유형 검사)는 일반적으로 몇 가지 사소한 예외를 제외하고 캐시되지 않습니다.

    3-4) 반사 인공물은 우주에 따라 다르며 현재로서는 일련 번호를 지정할 수 없습니다. (3).

    +0

    답변을위한 Thx. 이름이 일반 문자열에 비해 어떤 이점도 있습니까? – user573215

    +0

    이름은 캐시 됨 + 이름은 용어와 유형을 구분하는 태그를 제공합니다. upd. newTermName ("C")는 기본 문자열이 같더라도 newTypeName ("C")과 다릅니다. –