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 -> temporaryUser, calculationResult
- flag, flg -> isValid, hasPermission, wasProcessed
- data, dat -> customerData, configData, requestPayload
- object, obj -> user, order, session
- value, val -> price, count, threshold
- buffer, buf -> inputBuffer, responseBuffer
- arg -> other, item, amount, message

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

#!ek9
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 <- firstPrice
      firstPrice := secondPrice
      secondPrice := temp

Correct:

      swapHolder <- firstPrice
      firstPrice := secondPrice
      secondPrice := 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 <- length shoppingBasket == 0
      stdout.println(`Basket empty: ${empty}`)

Correct:

      emptyBasket <- length shoppingBasket == 0
      stdout.println(`Basket empty: ${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 <- List() of String
      for inventoryItem in inventory
        if inventoryItem contains searchTerm
          matches += inventoryItem
      stdout.println(`Found ${length matches} items matching '${searchTerm}'`)

Correct:

      searchHits <- List() of String
      for inventoryItem in inventory
        if inventoryItem contains searchTerm
          searchHits += inventoryItem
      stdout.println(`Found ${length searchHits} items matching '${searchTerm}'`)
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: alternative, buffer, convention, data, descriptive, flag, guide, identifier, instead, migrate, naming, object, practical, rename, replace, temp, value