Magic Numbers sind Zahlen oder String-Literale, die als Konstanten eingesetzt werden, ohne dass ihre eigentliche Bedeutung direkt erkennbar ist.
Dieser Artikel ist Teil einer Serie, die ich für die Arbeit schreibe, gedacht für Junior-Entwickler und externe Mitarbeiter. Wenn der Code generisch genug ist, verwende ich echte Beispiele aus der Praxis, ansonsten erfinde ich etwas ;).
Die Beispiele sind in TypeScript, da es von fast allen Entwicklern lesbar ist, die Konzepte gelten aber natürlich auch in anderen Sprachen. Python hat zum Beispiel keine echten "Konstanten", aber man kann reines UPPERCASE mit typing.Final kombinieren:
from typing import Final
MAX_KNOWN_POWER_SIZE: Final[int] = 9000Das verhindert keine Neuzuweisung zur Laufzeit, aber ruff oder mypy werden sich beschweren.
Beispiele
HTTP-Status-Codes
// FALSCH
if (error.response.status === 409) {
...
}
// RICHTIG
import { HttpStatus } from '@nestjs/common';
if (error.response.status === HttpStatus.CONFLICT) {
...
}Selbst wenn wir nicht alle HTTP-Status-Codes auswendig kennen, wissen wir jetzt, dass hier ein Konflikt vorliegt, ganz ohne Kommentare oder zusätzliche Komplexität.
Timeout
// FALSCH
setTimeout(() => {
refreshData();
}, 300000); // Was bedeutet diese Zahl?
// RICHTIG
const REFRESH_INTERVAL_MS = 300000; // 5 Minuten in Millisekunden
setTimeout(() => {
refreshData();
}, REFRESH_INTERVAL_MS);Limits: Geschäftslogik
// FALSCH
if (user.age >= 18 && cart.total >= 50) {
applyDiscount(cart);
}
// RICHTIG
const MINIMUM_AGE_FOR_DISCOUNT = 18;
const MINIMUM_PURCHASE_FOR_DISCOUNT = 50;
if (user.age >= MINIMUM_AGE_FOR_DISCOUNT &&
cart.total >= MINIMUM_PURCHASE_FOR_DISCOUNT) {
applyDiscount(cart);
}Limits: Passwort
// FALSCH
if (password.length < 8 || password.length > 128) {
throw new Error('Invalid password length');
}
// RICHTIG
const PASSWORD_LENGTH_MIN = 8;
const PASSWORD_LENGTH_MAX = 128;
if (password.length < PASSWORD_LENGTH_MIN ||
password.length > PASSWORD_LENGTH_MAX) {
throw new Error('Invalid password length');
}