bcquality/microsoft/knowledge/style/fixed-choice-set-must-use-enum-not-integer.md
Michael Dieringer b983a6da57 Fix remaining READ-convention sample links across this PR's 18 articles
The same plain-backtick "See sample: \`x.good.al\`." form fixed on
al-methods-limited-during-write-transactions (PR #161) turned up
repo-wide on 15 more of this PR's articles - Knowledge-Retrieval.ps1
requires the markdown-link form to associate a sample with its
article. All 16 fixed; the four local validators (frontmatter,
knowledge-index, knowledge-retrieval, review-fixtures, skill-index)
pass.
2026-09-21 22:30:25 +02:00

1.9 KiB

bc-version domain keywords technologies countries application-area
all
style
enum
option
integer
magic-number
variable-typing
field-typing
al
w1
all

A fixed set of named choices must use Enum, not a raw Integer

Contributions welcome — open a PR to refine or extend this article.

Description

When a variable or field represents a fixed set of named, mutually exclusive states — a difficulty level, a document type, a processing status — it should be typed as Enum (or Option when extending an object that still uses the legacy type). Representing that same state as a plain Integer and tracking the meaning of each value in a comment or in a developer's head is a magic-number anti-pattern: the compiler cannot catch an out-of-range value, and branches read as opaque numbers instead of names. This is about semantics, not member count, matching binary-choice-must-be-boolean.md's own distinction: a domain concept that is genuinely a stable true/false predicate belongs in Boolean even if someone represents it as a two-value Enum, while a domain concept with exactly two current named states is not automatically a Boolean in disguise — it stays an Enum when the states are named alternatives rather than a yes/no flag, or when it needs to implement an interface, preserve an existing contract, or leave room for a future third value.

Best Practice

Declare an Enum with named values and branch on the enum value, not a raw number.

See sample: fixed-choice-set-must-use-enum-not-integer.good.al.

Anti Pattern

Using a plain Integer field with the meaning of each value tracked only in a comment pushes the documentation of the states into something the compiler cannot check and a future maintainer cannot rely on.

See sample: fixed-choice-set-must-use-enum-not-integer.bad.al.