Why does EK9 require named arguments for multiple Boolean parameters?

← Code Quality · Ref: Q816

EK9 requires named arguments when a call passes 2 or more Boolean literals. This prevents the 'Boolean blindness' anti-pattern.

THE PROBLEM

Positional Boolean arguments are unreadable at the call site:

  connect('db', 5432, true, false)   // what do true and false mean?

Without checking the function signature, the reader has no idea what each Boolean controls.

THE RULE

One Boolean literal is fine — context usually makes it clear:

  setVisible(true)                   // obviously sets visibility

Two or more Boolean literals trigger E11061:

  connect('db', 5432, true, false)   // ERROR: ambiguous

THE FIX

Use named arguments (EK9 requires all-or-nothing naming):

  connect(host: 'db', port: 5432, useSsl: true, autoReconnect: false)

See Q310 for code quality overview. See Q694 for named arguments.

Example

defines module qa.quality.boolean.args

  defines function

    configureNetwork()
      ->
        host as String
        useSsl as Boolean
        autoReconnect as Boolean
      stdout <- Stdout()
      stdout.println(`Host: ${host} SSL: ${useSsl} Reconnect: ${autoReconnect}`)

  defines program

    BooleanArgsDemo()
      stdout <- Stdout()

      // === CORRECT: named arguments for 2+ Booleans ===
      configureNetwork(host: "db.example.com", useSsl: true, autoReconnect: false)

      // === CORRECT: single Boolean is fine positionally ===
      stdout.println("Single Boolean: " + $true)

Common mistakes

E11061 — Two Boolean literals (true, false) as positional arguments are ambiguous. Use named arguments so the reader knows what each Boolean controls. See ek9 -h E11061 for details.

Incorrect:

      configureNetwork("db.example.com", true, false)

Correct:

      configureNetwork(host: "db.example.com", useSsl: true, autoReconnect: false)
Other ways to ask this
  • What is E11061 BOOLEAN_ARGUMENTS_REQUIRE_NAMES?
  • Why can't I pass two Boolean literals positionally in EK9?
  • How do I fix Boolean argument naming errors in EK9?

Coming from another language?

Java: no enforcement — Boolean parameters are a known code smell. Python: no enforcement but PEP 8 recommends keyword args. Swift: requires argument labels by default. Kotlin: supports named args but doesn't require them. EK9: 2+ Boolean literals = compile error unless named.

Keywords: arguments, E11061, readability, quality, ambiguous, parameters, named, boolean