합성 값 타입 — 벡터 · 회전 · 색
성분이 여러 개인 값을 셀 하나에 적는 표기와, 그것을 형식 변경 없이 싣는 설계입니다.
vec2i·vec3f·quat·color 같은 이름을 타입 행에 두고, 셀에는 (111, 222)·#3366CC·red를
적습니다.
핵심은 한 줄입니다. 합성 타입은 셀 표기이고, 파싱이 끝나면 레코드로 접힙니다. 와이어도 13개 생성기도 익스포터도 바뀌지 않습니다 — 레코드는 이미 전부 지원하는 형태이기 때문입니다.
1. 문제 — 성분이 여러 개인 값의 자리 부재
좌표 하나를 시트에 적으려면 지금은 컬럼 3개가 필요합니다. Pos.X·Pos.Y·Pos.Z로 적으면
중첩 필드가 레코드로 접어 주므로 소비 측의 형태는 나쁘지 않습니다. 비용은
그 앞쪽에 있습니다.
| 비용 | 내용 |
|---|---|
| 시트 | 성분마다 컬럼 하나이고, 헤더 4행이 성분마다 반복됩니다. 좌표 컬럼 20개는 실제 컬럼 60개입니다 |
| 의도 | float 컬럼 3개는 좌표인지 무관한 수치 3개인지 구별되지 않습니다. 타입 행은 시트를 읽는 사람이 보는 유일한 자리입니다 |
| 색의 표기 | #3366CC를 적을 자리가 없습니다. 지금 그런 값은 bigint에 0x3366CC로 들어가고, 성분으로 나누는 것은 소비 측의 일입니다 |
| 이름 있는 값 | red나 one처럼 팀과 업계가 이미 쓰는 이름을 셀에 적을 방법이 없습니다 |
2. 결정 — 타입 추가가 아니라 셀 표기
결정. 합성 타입은 파싱이 지속되는 동안만 타입이고, 셀이 값이 된 뒤에는 레코드입니다.
비트셋이 같은 판단을 한 자리이고, 근거도 같습니다. ValueType
멤버는 추가되지만 접히기 전까지만 존재합니다. 새 멤버가 다운스트림에 도달하면 조회
표·switch·SQL 스키마·13개 생성기·이력에 걸쳐 손이 가고, 실측 — 이 저장소에서
ValueType.Uuid를 언급하는 파일은 27개이며 그중 default가 있는 switch는 새 멤버를 모른 채
틀린 결과를 산출합니다. 접기는 그 100곳을 0곳으로 만듭니다.
접는 대상이 bitset과 다른 점은 접힌 뒤의 형태입니다.
| 타입 | 접힌 뒤 |
|---|---|
bitset | Int64 하나 — 스칼라 |
| 합성 타입 | 레코드 하나 — 성분마다 멤버 |
레코드를 고르는 것이 성립하는 이유는 그 형태가 이미 완성되어 있기 때문입니다. 모든 언어와
json·binary가 레코드를 지원하고, 와이어는 레코드를 원래 멤버마다 컬럼 하나로 싣습니다
(중첩 필드). 성분마다 컬럼 하나는 이 도구가 이미 쓰고
있는 저장 형태입니다.
접기의 시점
| 시점 | 타입 |
|---|---|
| 타입 행을 읽을 때 | 합성 타입 — 이름 표가 받습니다 |
| 셀을 읽을 때 | 합성 타입 — 4절의 표기 규격이 여기에서 적용됩니다 |
| 확장 직후 | 컬럼 N개의 레코드 그룹 |
| 와이어·13개 생성기·익스포터·이력 | 레코드 |
Field.TypeName은 vec3f로 남습니다 — 시트에 그렇게 적혀 있고, 그 컬럼에 대한 진단이 그
이름으로 지시해야 하기 때문입니다.