상수 세트 제거
1. 결정
엔티티 종류에서 상수 세트(~~const:이름~~)를 없앱니다. 시트가 낼 수 있는 것은
테이블과 enum 둘이 됩니다.
상수 세트가 하던 일은 한 행 테이블이 맡습니다. 이미 문서가 그렇게 안내하고 있습니다 — 언어별 가이드 §3은 「라이브 중에 조정할 가능성이 있는 수치라면 처음부터 상수 세트가 아니라 테이블 한 행으로 두세요」라고 적고, 시트 문서의 엔티티 표에도 같은 주의가 붙어 있습니다.
근거
| 근거 | 내용 |
|---|---|
| 테이블도 불변입니다 | 읽는 쪽에 쓰기 경로가 없습니다. 상수 세트가 주는 「고쳐지지 않는다」는 성질을 한 행 테이블이 이미 줍니다 |
| 한 행 테이블이 더 유리합니다 | 같은 값을 데이터 패치로 바꿀 수 있습니다. 상수는 코드 배포만이 유일한 경로입니다 |
| 가장 많이 틀리는 자리입니다 | 상수만 고치면 변환은 성공하고, .tcb는 한 바이트도 안 바뀌고, 매니페스트 해시도 그대로입니다. 「배포했다」고 믿기 가장 쉬우면서 신호가 어디에도 없습니다. 이 함정을 설명하려고 문서 한 절, 배포 판정 규칙 하나, 테스트 네 개가 있습니다 |
| 엔티티 하나가 모든 언어로 번집니다 | 생성기와 View 가 언어마다 하나씩 · 템플릿 16개(355행) · 메시지 5개 × 5개 로케일. 상수 세트를 위한 코드입니다 |
| 이미 한 타깃은 내지 않습니다 | UnrealCodeGenerator에 상수 처리가 없습니다. Unreal 타깃을 쓰는 프로젝트의 상수 세트는 지금 조용히 사라집니다. 언어 하나가 이미 없이 지내고 있습니다 |
| 실사용이 없 습니다 | 이전 소규모 코퍼스의 상수 세트는 0개입니다. 상수 세트를 선언하는 것은 픽스처 워크북 3개(core · conformance · conformance-skew)뿐이고, 그중 둘은 「상수 파일이 컴파일되는지」를 확인하려고 만든 것입니다(conformance README) |
잃는 것
컴파일 타임 상수입니다. 상수 세트는 선언으로 나가므로 배열 크기 · switch
레이블 · C++ 템플릿 인수 · enum 초기값 자리에 쓸 수 있었습니다. 한 행 테이블의
값은 런타임 데이터라 그 자리에 못 들어갑니다.
이 손실을 받아들입니다. 그런 값 — 프로토콜 번호, 배열 크기 — 은 애초에 스프레드시트가 아니라 코드에 적히는 것이 맞고, 시트에 적혀 있으면 시트를 고친 사람이 코드 배포를 잊는 쪽으로 기울기 때문입니다.
2. 열린 결정
| # | 결정할 것 | 선택지 | 기울어짐 |
|---|---|---|---|
| D1 | 이미 ~~const:~~가 적힌 시트 | (a) 오류로 거부 (b) 경고 후 무시 (c) 조용히 무시 | (a). 무시는 「값을 고쳤는데 아무것도 안 나갔다」를 한 단계 더 조용하게 만듭니다 |
| D2 | 레시피의 Naming.Constant 키 | (a) 지우고 방치 (b) 지우고 발견 시 경고 | RecipeModel.LoadFromFile은 ToObject<RecipeModel>()이므로 미지 키를 조용히 무시합니다. (a)를 고르면 기존 레시피는 계속 돌지만 그 줄이 죽은 것을 아무도 모릅니다 |
| D3 | snapshot_stat.constant_sets · constants 컬럼 | (a) 남기고 0을 쓴다 (b) 마이그레이션 6으로 DROP | 두 컬럼 모두 NOT NULL입니다. 히스토리 마이그레이션은 가산적이라는 규약이 HistorySchema에 적혀 있으므로 (a)가 규약대로입니다 |
| D4 | EntityKind.Constants · Constant | (a) 남기되 쓰지 않는다 (b) 제거 | HistoryStore.cs:274가 저장된 문자열을 Enum.Parse로 되읽습니다. 제거하면 기존 DB의 옛 스냅샷을 읽을 수 없습니다. (a)가 안전합니다 |
| D5 | DeploymentAdvice.JudgeConstants | (a) 함께 제거 (b) 옛 스냅샷을 위해 남긴다 | D4를 (a)로 하면 이쪽도 남기는 것이 일관됩니다 |
3. 바뀌는 곳
3.1 코어
| 위치 | 무엇 |
|---|---|
src/Models/ConstantSet.cs | 파일 삭제(93행) |
src/Models/Model.cs | ConstantSets · Reset() · ProjectTo 측 필터 · ContainsConstantSet · FindConstantSet. 뒤의 둘은 private이고 호출자가 없습니다 |
src/Cooking/Layouts/TabbitLayoutParser.cs | ParseConstantSet(약 100행)과 def.type == "const" 분기 |
src/Cooking/ModelCooker.Composites.cs | RefuseCompositeConstants |
src/Cooking/ModelCooker.Naming.cs | 상수 세트 · 상수 이름 수집 |
src/Cooking/NamingRules.cs | NameKind.Constant, NameKind.Entity의 설명 문구 |
src/Recipe/NamingRecipe.cs | Constant 프로퍼티(→ D2) |
src/Schema/SchemaDeclarations.cs | RefuseNamesTheSheetsAlreadyGave의 상수 세트 충돌 검사 |
src/CodeGeneration/TypeDependencies.cs | EnumsNamedBy(ConstantSet) |
src/Cooking/CookingMessages.cs · Layouts/TabbitLayoutMessages.cs · Exporters/ExportMessages.cs | id 5개. cook.constant-not-found는 이미 호출자가 없습니다 |
src/Messages/Catalog/ | id 5개 × 로케일 5개 = 25개 항목 |