Magic Literal: Unterschied zwischen den Versionen

Aus Programmieren-Wiki
Keine Bearbeitungszusammenfassung
Markierung: Manuelle Zurücksetzung
Keine Bearbeitungszusammenfassung
 
(18 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Bewertungsrichtlinie
{{CategoryBlock
|baustelle=Ja
|Baustelle=Ja
|blatt=2
|Java Grundlagen=Nein
|beschreibung=Wir reden von "Magic Numbers", wenn im Quellcode zahlen rumfliegen. Was heißt das? Konkret bedeutet das, dass eine Variable mit einem Wert deklariert wurde, der sich niemals ändern kann und wird - eine konkrete Zahl. Würde man jetzt etwas im Quellcode ändern wollen, was voraussetzt, dass wir überall im Program zum Beispiel nicht mehr durch 2, sondern durch 3 teilen sollen, müsste man das überall händisch ändern. Das kostet Zeit, Nerven und man stelle sich vor man findet nicht alle...Besser wäre also, Zahlen als Konstante/Variable zu deklarieren. Wenn wir diese Konstante/Variable jetzt ändern wie in unserem Beispiel, müssten wir nur einmal eine 2 durch eine 3 ersetzen, sodass das Program genau das macht, was wir wollen. Es ist also schneller und vor allem viel weniger Arbeit.Das gilt auch für Zeichenketten.Technisch gesehen sind "Magic Numbers" nicht auf Zahlen beschränkt. Auch Zeichenketten, die die o.g. Charakteristik erfüllen, sind "Magic Numbers" (oder dann eben "Magic Strings").
|Organisation=Nein
|schweregrad=leicht
|Programmierstil=Ja
|negativ=<syntaxhighlight lang="Java">final String password = "Test";
|Bewertungsrichtlinie=Ja
|blattAnnotation=2
|blattAbzug=3
}}
{{Inhaltsblock
|vorher====Beschreibung===
Als 'Magic Literal' bezeichnen wir einen Wert (z.B. Zeichenkette oder eine Zahl), die einen konstanten Wert darstellt, jedoch im Quelltext nicht als Konstante definiert wurde (Erinnerung: Klassenkonstanten werden mit *private static final* angeführt).
 
Es sei zu beachten, dass es für ein Literal ausreicht, einem konstanten Attribut zugewiesen zu sein, um nicht mehr als Magic Literal zu gelten. Konstante Attribute von Literalen sollten jedoch auch immer static sein ([[Statische Methoden und Attribute]]). Ebenso ist es, wie sonst auch, wichtig die Konstante sinnvoll zu benennen ([[Bedeutungslose Konstanten]]).
 
Einzige Ausnahme bildet das Literal <syntaxhighlight lang="Java" inline>0</syntaxhighlight>, wenn dieses im Rahmen der Initialisierung einer üblichen for-Schleife verwendet wird. <syntaxhighlight lang="Java" inline>for (int i = 0; i < ...)</syntaxhighlight> kann also ohne das Einführen einer Konstanten geschrieben werden.
 
 
''Einfacher gesagt:''
Wir reden von "Magic Numbers", wenn im Quellcode Zahlen herumfliegen. Was heißt das? Konkret bedeutet das, dass eine Variable mit einem Wert deklariert wurde, der sich niemals ändern kann und wird - eine konkrete Zahl. Würde man jetzt etwas im Quellcode ändern wollen, was voraussetzt, dass wir überall im Programm zum Beispiel nicht mehr durch 2, sondern durch 3 teilen sollen, müsste man das überall händisch ändern. Das kostet Zeit, Nerven und man stelle sich vor, man findet nicht alle. Besser wäre also, Zahlen als Konstante/Variable zu deklarieren. Wenn wir diese Konstante/Variable jetzt ändern wie in unserem Beispiel, müssten wir nur einmal eine 2 durch eine 3 ersetzen, sodass das Programm genau das macht, was wir wollen. Es ist also schneller und vor allem viel weniger Arbeit. Das gilt auch für Zeichenketten. Technisch gesehen sind "Magic Numbers" nicht auf Zahlen beschränkt. Auch Zeichenketten, die die o.g. Charakteristik erfüllen, sind "Magic Numbers" (oder dann eben "Magic Strings").
 
Das untenstehende Beispiel befasst sich mit 'Magic Numbers'. Analog gilt die Richtlinie bzw. Regel aber auch für die restlichen 'Magic Literals'.
}}
{{Inhaltsblock
|color=red
|vorher=Negativbeispiel:
|Beispiel=final String password = "Test";
if (password.length() < 8) {     
if (password.length() < 8) {     
System.err.println("Password too short, please choose a longer password!");
    System.err.println("Password too short, please choose a longer password!");
}</syntaxhighlight>
}
|positiv=<syntaxhighlight lang="Java">final String password = "Test";final int minimalPasswordLength = 8;if (password.length() < minimalPasswordLength) {    System.err.println(PASSWORD_ERROR_MESSAGE);}</syntaxhighlight>
|beispielname=MagicLiteralBad
|kategorie=Programmierstil
}}
|weiterlesen=Ja
{{Inhaltsblock
|color=green
|vorher=Positivbeispiel:
|Beispiel=final String password = "Test";
final int minimalPasswordLength = 8;
if (password.length() < minimalPasswordLength) {     
    System.err.println(PASSWORD_ERROR_MESSAGE);
}
|beispielname=MagicLiteralGood
}}
}}

Aktuelle Version vom 14. Oktober 2025, 07:49 Uhr

🚧 Diese Seite befindet sich in Bearbeitung 🚧
🤓 Diese Seite ist eine Bewertungsrichtlinie, die ab Blatt 2 annotiert und ab Blatt 3 abgezogen wird. 🤓

Beschreibung

Als 'Magic Literal' bezeichnen wir einen Wert (z.B. Zeichenkette oder eine Zahl), die einen konstanten Wert darstellt, jedoch im Quelltext nicht als Konstante definiert wurde (Erinnerung: Klassenkonstanten werden mit *private static final* angeführt).

Es sei zu beachten, dass es für ein Literal ausreicht, einem konstanten Attribut zugewiesen zu sein, um nicht mehr als Magic Literal zu gelten. Konstante Attribute von Literalen sollten jedoch auch immer static sein (Statische Methoden und Attribute). Ebenso ist es, wie sonst auch, wichtig die Konstante sinnvoll zu benennen (Bedeutungslose Konstanten).

Einzige Ausnahme bildet das Literal 0, wenn dieses im Rahmen der Initialisierung einer üblichen for-Schleife verwendet wird. for (int i = 0; i < ...) kann also ohne das Einführen einer Konstanten geschrieben werden.


Einfacher gesagt: Wir reden von "Magic Numbers", wenn im Quellcode Zahlen herumfliegen. Was heißt das? Konkret bedeutet das, dass eine Variable mit einem Wert deklariert wurde, der sich niemals ändern kann und wird - eine konkrete Zahl. Würde man jetzt etwas im Quellcode ändern wollen, was voraussetzt, dass wir überall im Programm zum Beispiel nicht mehr durch 2, sondern durch 3 teilen sollen, müsste man das überall händisch ändern. Das kostet Zeit, Nerven und man stelle sich vor, man findet nicht alle. Besser wäre also, Zahlen als Konstante/Variable zu deklarieren. Wenn wir diese Konstante/Variable jetzt ändern wie in unserem Beispiel, müssten wir nur einmal eine 2 durch eine 3 ersetzen, sodass das Programm genau das macht, was wir wollen. Es ist also schneller und vor allem viel weniger Arbeit. Das gilt auch für Zeichenketten. Technisch gesehen sind "Magic Numbers" nicht auf Zahlen beschränkt. Auch Zeichenketten, die die o.g. Charakteristik erfüllen, sind "Magic Numbers" (oder dann eben "Magic Strings").

Das untenstehende Beispiel befasst sich mit 'Magic Numbers'. Analog gilt die Richtlinie bzw. Regel aber auch für die restlichen 'Magic Literals'.

Negativbeispiel:

final String password = "Test";
if (password.length() < 8) {    
    System.err.println("Password too short, please choose a longer password!");
}

Positivbeispiel:

final String password = "Test";
final int minimalPasswordLength = 8;
if (password.length() < minimalPasswordLength) {    
    System.err.println(PASSWORD_ERROR_MESSAGE);
}