What should I name my variable instead of temp or data?
← Variable Naming Rules and Conventions · Ref: Q297
Ask yourself: what does this variable REPRESENT? The answer to that question IS the name. Here are specific alternatives for every banned name.
RENAMING TIER 1 NAMES (E11031)
temp/tmp: swapHolder, intermediateResult, pendingEntry, stagingArea flag/flg: isComplete, hasPermission, shouldRetry, needsUpdate data/dat: customerRecord, sensorReading, responsePayload, configSettings object/obj: currentItem, targetEntity, parsedElement, selectedWidget value/val: totalPrice, measuredWeight, userInput, computedScore buffer/buf: outputBuilder, messageAccumulator, readChunk, uploadContent
RENAMING OPERATOR KEYWORDS (E11032)
empty: isBlank, emptyBasket, noResults, clearedQueue length: nameLength, pathSize, messageCount, arrayExtent contains: hasItem, includesKey, foundMatch, holdingEntry abs: absoluteDistance, magnitude, positiveAmount sqrt: squareRoot, rootApproximation close: closeFile, shutdownConnection, terminateSession matches: foundItems, matchingRecords, searchHits, filteredResults
THE TECHNIQUE
When you reach for a generic name, pause and ask three questions: 1. What kind of thing is this? (a price, a name, a sensor reading) 2. Where did it come from? (user input, database query, calculation) 3. What will it be used for? (display, comparison, accumulation). Any of these answers produces a better name than temp or data.
See Q290 for the complete banned list. See Q296 for why these names are banned. See Q292 for naming conventions.
Example
defines module qa.naming.renameguide defines function performSwap() as pure -> firstItem as String secondItem as String <- swappedPair as String: `${secondItem}, ${firstItem}` isWidgetItem() -> item as String <- isMatch as Boolean? widgetLabel <- "Widget" isMatch: item contains widgetLabel retryConnection() -> maxAttempts as Integer <- connectionAttempts as Integer: 0 isRetryNeeded <- Boolean(true) while isRetryNeeded and connectionAttempts < maxAttempts connectionAttempts++ if connectionAttempts >= maxAttempts isRetryNeeded: false defines program RenamingGuideDemo() stdout <- Stdout() // === SCENARIO 1: SWAP (temp -> swapHolder) === firstPrice <- 100.0 secondPrice <- 200.0 swapHolder <- firstPrice firstPrice := secondPrice secondPrice := swapHolder stdout.println(`Swapped: ${firstPrice}, ${secondPrice}`) // === SCENARIO 2: CONDITION (flag -> isRetryNeeded) === connectionAttempts <- retryConnection(3) stdout.println(`Connected after ${connectionAttempts} attempts`) // === SCENARIO 3: PROCESSING (data -> customerOrders) === customerOrders <- ["Laptop", "Mouse", "Keyboard"] orderSummary <- "" for orderItem in customerOrders if length orderSummary > 0 orderSummary: orderSummary + ", " orderSummary: orderSummary + orderItem stdout.println(`Orders: ${orderSummary}`) // === SCENARIO 4: COLLECTION STATE (empty -> emptyBasket) === shoppingBasket <- List() of String emptyBasket <- length shoppingBasket == 0 stdout.println(`Basket empty: ${emptyBasket}`) widgetName <- "Widget" shoppingBasket += widgetName hasItems <- length shoppingBasket > 0 stdout.println(`Has items: ${hasItems}`) // === SCENARIO 5: STRING MEASUREMENT (length -> nameLength) === customerName <- "Alice Wonderland" nameLength <- length customerName longNameThreshold <- 10 isLongName <- nameLength > longNameThreshold stdout.println(`Name: ${customerName}, Length: ${nameLength}, Long: ${isLongName}`) // === SCENARIO 6: SEARCH RESULTS (matches -> searchHits) === inventory <- ["Widget", "Gadget", "Widget Pro", "Sprocket"] searchTerm <- widgetName searchHits <- List() of String for inventoryItem in inventory if inventoryItem contains searchTerm searchHits += inventoryItem stdout.println(`Found ${length searchHits} items matching '${searchTerm}'`)
Common mistakes
E11031 — The name 'temp' is non-descriptive and banned. Use 'swapHolder' to describe the variable's role in the swap operation. See ek9 -h E11031 for details.
Incorrect:
temp
Correct:
swapHolder
E11032 — The name 'empty' shadows a built-in operator keyword and is rejected. Use a descriptive alternative like 'emptyBasket'. See ek9 -h E11032 for details.
Incorrect:
empty
Correct:
emptyBasket
E11032 — The name 'matches' shadows a built-in operator keyword and is rejected. Use a descriptive alternative like 'searchHits'. See ek9 -h E11032 for details.
Incorrect:
matches
Correct:
searchHits
Other ways to ask this
- How do I rename temp, data, flag, and value in EK9?
- What are good alternatives to banned variable names in EK9?
- What descriptive name should I use instead of obj or buf?
Coming from another language?
Java: rename via IDE refactoring (IntelliJ Shift+F6), no compile-time naming enforcement. Python: rename manually or with rope refactoring, no naming enforcement. Rust: rename via rust-analyzer, no naming enforcement for descriptive quality. Go: rename via gopls, no naming enforcement. C/C++: rename via clangd or manual find-replace, no naming enforcement. Kotlin: rename via IntelliJ, no naming enforcement. JavaScript: rename via IDE, ESLint naming rules are optional. EK9: compiler forces you to think about naming at the point of declaration, alternatives shown in error messages.
Keywords: instead, guide, descriptive, value, convention, temp, buffer, flag, rename, naming, alternative, data, object, migrate, replace, identifier, practical