E11066: constants should be consolidated into a single file
What went wrong
Constants are scattered across 3 or more source files within the same module. This fragmentation makes it difficult for developers to discover what constants a module provides and leads to inconsistent naming across files.
Worked examples
Compilable examples demonstrating this error and the correct fix:
- ek9 -q 863 (Why must module constants be in a single file?)
Rationale
- Constants define a module's shared vocabulary of fixed values
- Scattering them across files forces developers to search multiple locations
- A single constants file provides one authoritative location for all fixed values
- Consolidation reveals naming inconsistencies and duplicate near-values
- Threshold: 3+ files with constants (2 files allows main + constants pattern)
How to fix it
Gather the module's constants into one dedicated file, leaving every other construct where it is.
With tooling, ek9_organize_constants does the whole move in one step: name the target file and it is created for you if it does not yet exist.
By hand:
- Create a constants file for the module (e.g. moduleConstants.ek9)
- Move every constant into its single `defines constant` block
- Review the names now they are visible together
- Leave functions, classes and records in their original files
Common causes
- Constants added ad-hoc to whichever file was being edited at the time
- Multiple developers independently creating constants in different files
- Splitting code by feature without centralising the module's vocabulary
See also
Examples
Every example is compiled by the EK9 compiler: the first fails exactly as captioned, the others fix it.
Fails with E11066: constants should be consolidated into a single file
bad/constants1.ek9
#!ek9 defines module error.e11066.bad defines constant MAX_RETRIES <- 3 DEFAULT_TIMEOUT <- 30
bad/constants2.ek9
#!ek9 defines module error.e11066.bad defines constant BASE_URL <- "https://example.com" API_VERSION <- 2
bad/constants3.ek9
#!ek9 defines module error.e11066.bad defines constant LOG_LEVEL <- "DEBUG" MAX_CONNECTIONS <- 100
Fixed: One dedicated constants file; the other files of the module use them by name
good/constants.ek9
#!ek9 defines module error.e11066.good defines constant MAX_RETRIES <- 3 DEFAULT_TIMEOUT <- 30 BASE_URL <- "https://example.com" API_VERSION <- 2 LOG_LEVEL <- "DEBUG" MAX_CONNECTIONS <- 100
good/client.ek9
#!ek9 defines module error.e11066.good defines function endpoint() as pure -> resource as String <- url as String: `${BASE_URL}/v${API_VERSION}/${resource}` connectionBudget() as pure <- description as String: `${MAX_CONNECTIONS} connections, ${DEFAULT_TIMEOUT}s timeout, ${MAX_RETRIES} retries`
good/logging.ek9
#!ek9 defines module error.e11066.good defines function logLine() as pure -> message as String <- line as String: `[${LOG_LEVEL}] ${message}`