소개
저는 스칼라로 작성된 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의 "기호"와
- 속성 선언
는 기본적으로 나는 String
들로 선언 속성 두 가지 대안을 참조
이렇게하면, 내가 볼 수있는 한, DTO를 구성하는 API 사용자는 리플렉션 API와 이름/기호를 처리해야합니다. 또한 API의 구현은 리플렉션 API를 사용해야합니다. 따라서 반사 코드가있는 두 개의 위치가 있으며 사용자는 반사 API를 최소한 조금은 알고 있어야합니다.
질문 나는이 방법이 얼마나 헤비급 모르는 그러나
:
- 이 이름 또는 기호를 구성하는 비용이 있습니까?
- 리플렉션 API는 값 비싼 연산 결과를 캐싱합니까?
- 네트워크를 통해 다른 JVM으로 이름과 기호를 전송할 수 있습니까?
- 직렬화 가능합니까?
주 질문 : 전송 오브젝트 내에서 사용하기 적합한 스칼라 반사 API 이름 또는 기호가 있습니까?
리플렉션 API에서는 이렇게하는 것이 복잡해 보입니다. 어떤 힌트라도 환영합니다. 그리고 다른 대안들에 대한 어떤 힌트도.
피씨 : 내 API가 복잡하고 반사 부분이 꽤 실험적인 상태이기 때문에 아직 내 자신의 코드를 포함하지 않았습니다. Maye 나중에 유용한 것을 제공 할 수 있습니다.
답변을위한 Thx. 이름이 일반 문자열에 비해 어떤 이점도 있습니까? – user573215
이름은 캐시 됨 + 이름은 용어와 유형을 구분하는 태그를 제공합니다. upd. newTermName ("C")는 기본 문자열이 같더라도 newTypeName ("C")과 다릅니다. –