Der Refaktor "Einführung einer Konstanten" in Java (Der Refaktor "Einführung einer Konstanten" in Java), Lektion, Seite 723220
https://www.purl.org/stefan_ram/pub/konstanteneinfuehrung_java (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
Java-Kurs

Der Refaktor „Einführung einer lokalen final-Variablen“ in Java 

Ein Refaktor  ist eine Überarbeitung des Quelltextes eines Programmes, nach der sich das Programm weiterhin so verhält wie zuvor. Man kann also „von außen“ durch das Starten und Beobachten eines Programmes nicht erkennen, ob ein Refaktor angewendet wurde.

Das folgende Programm enthält keine lokale Variable.

Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( 22 ); }}
java.lang.System.out
22

Das folgende gleichwertige Programm enthält eine lokale final-Variable.

Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final int k = 22; java.lang.System.out.println( k ); }}
java.lang.System.out
22

Bei der Einführung einer lokalen final-Variablen wird ein Wertausdruck durch einen gleichwertigen Variablennamen ersetzt. Dazu wird eine entsprechende final-Variablendeklaration an passender Stelle in das Programm eingefügt.

Man kann dazu auch sagen, daß ein bestimmter Teilausdruck in eine Variable „ausgelagert“ wird.

Zulässigkeit Dieser Refaktor ist nur dann zulässig, wenn die vorkommenden Auswertungen keine Wirkungen (sondern nur Werte) haben, da die Wirkungen sonst an anderer Stelle auftreten würden.

Indikation Dieser Refaktor wird eingesetzt, wenn die Einführung einer lokalen final-Variablen Vorteile hat, etwa weil ein magischer Wert durch einen sprechenden Namen oder eine Wiederholung einer Information durch eine Wiederholung eines Namens ersetzt werden soll.

Namen dieses Refaktors “Introduce Explaining Variable” (Visual Studio ).

Übungsaufgaben

/   Einführung von Variablen (Beispielaufgabe)

Ein final-Variable für einen Wert eines Ausdrucks wird folgendermaßen eingeführt:

Das folgende Beispiel zeigt wie eine final-Variable für einen Wert eines Ausdrucks eingeführt wird. Dabei wird der Ausdruck durch einen noch verfügbaren Namen ersetzt, der Name wird dann davor als final-Variable definiert, wobei der Ausdruck als Initialisierungsausdruck für die final-Variable verwendet wird.

Vor der Einführung einer Variablen (Aufgabe)
java.lang.System.out.println( 2 );
Nach der Einführung einer Variablen (Lösung)
final int i = 2;
java.lang.System.out.println( i );

Beachten Sie, wie der Programmierer oben den richtigen Typ  – nämlich »int« – für die neue Variable festgelegt hat. Auch bei den folgenden Aufgaben ist es wichtig, jeweils den richtigen Typ  festzulegen. Im allgemeinen sollte dies der Typ des Initialisierungsausdrucks  der Variablendeklaration sein.

(Die Einführung eines Namens für den Wert eines Ausdrucks ist nicht immer ein Refaktor, sondern nur, wenn die Auswertung des Ausdrucks keine wichtigen Wirkungen hat und der Wert einer Auswertung des Ausdrucks sich während des Programmablaufs nach der Festlegung des Namens nicht verändert.)

/   Einführung von Variablen ⃗

Führen Sie eine Variable für den Ausdruck »"abc"« ein, die innerhalb des gegebenen Blocks deklariert wird. Das heißt, daß hinterher an der bisherigen Stelle jenes Ausdrucks nur noch ein Variablenname stehen soll.

Es soll sich hierbei um einen Refaktor  handeln, das heißt, daß der Block hinterher wieder dasselbe machen soll wie vorher.

Vor der Einführung einer Variablen (Aufgabe)
{ java.lang.System.out.println( "abc" ); }

/   Einführung einer lokalen final-Variablen

Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( 2 * 4 );
java.lang.System.out.println( 3 * 4 ); }}
transcript
8
12

Deklarieren Sie in dem voranstehenden Block eine final-Variable mit dem Wert »4« und ersetzen Sie jedes bisherige Vorkommen des Numerales »4« durch den Namen jener final-Variablen.

/   Einführung einer lokalen final-Variablen ⃖

Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 2 + java.lang.System.lineSeparator() +
3 + java.lang.System.lineSeparator() +
4 ); }}
Protokoll
2
3
4

Deklarieren Sie in dem voranstehenden Block eine final-Variable »ln« mit dem Wert des Aufrufs »java.lang.System.lineSeparator()« und ersetzen Sie jedes bisherige Vorkommen des Aufrufs »java.lang.System.lineSeparator()« durch den Namen jener final-Variablen.

/   Einführung einer lokalen final-Variablen 0 ⃗

Führen Sie eine final-Variable für den Wert des Ausdrucks »4 * 3« in das folgende Programm ein.

Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( 2 + 4 * 3 ); }}

Diese Überarbeitung soll ein Refaktor sein; die Ausgabe des Programms soll sich also nicht verändern.

/   Einführung einer lokalen final-Variablen 1 ⃗

Überarbeiten Sie die Lösung der vorigen Aufgabe, indem Sie darin auch noch einen Namen für den Wert des Ausdrucks in den Klammern hinter »println« einführen

?   Übungsfragen ⃗

Wiederholungen von Zeichenfolgen ⃗

Was ist die längste wiederholt vorkommende Zeichenfolge in dem folgenden Zeilenpaar?

Main.java
wrogcjklrr
gyogujklzt

?   Wiederholungen von Ausdrücken ⃗

Welcher Ausdruck ist der längste wiederholt vorkommende Ausdruck in dem folgenden Programm?

Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( java.lang.Math.cos( 0.2 )* 3 + java.lang.Math.log( 0.2 ));
java.lang.System.out.println( java.lang.Math.cos( 0.2 )* 3 + java.lang.Math.log( 0.3 )); }}

(Englische Aussprache von “log ”: /lɔg/.)

?   Wiederholungen von Ausdrücken (1) ⃗

Welcher Ausdruck ist der längste wiederholt vorkommende Ausdruck in dem folgenden Programm?

Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( java.lang.Math.cos( 0.2 )* 3 + java.lang.Math.log( 0.2 ));
java.lang.System.out.println( java.lang.Math.cos( 0.2 )* 4 + java.lang.Math.log( 0.3 )); }}

?   Wiederholungen von Ausdrücken (2) ⃗

Welcher Ausdruck ist der längste wiederholt vorkommende Ausdruck in dem folgenden Programm?

Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( java.lang.Math.cos( 0.2 )* 3 + java.lang.Math.log( 0.3 ));
java.lang.System.out.println( java.lang.Math.cos( 0.2 )* 3 + java.lang.Math.log( 0.3 )); }}

/   Einführung einer lokalen final-Variablen 2 ⃗

Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( 2 *( 1 + 2 + 3 + 4 ));
java.lang.System.out.println( 3 *( 1 + 2 + 3 + 4 )); }}
transcript
20
30

Deklarieren Sie in dem voranstehenden Block eine final-Variable für den Wert des längsten wiederholt vorkommenden Ausdrucks, und verwenden Sie in der final-Variablendeklaration jenen Ausdruck als Initialisierungsausdruck. Ersetzen Sie alle weiteren Vorkommen jenes Ausdrucks alsdann durch Verwendungen jener final-Variablen.

/   Einführung einer lokalen final-Variablen 3 ⃗

Diese Übungsaufgabe sollte erst nach der Nachbesprechung der voranstehenden Übungsaufgabe bearbeitet werden.

Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( java.lang.Math.sin( 1. + java.lang.Math.log( 2.178 )));
java.lang.System.out.println( java.lang.Math.cos( 1. + java.lang.Math.log( 2.178 ))); }}
java.lang.System.out
0.9785261962919047
-0.20612249554693626

Schreiben Sie die Einheit »Main.java« durch Anwendung des Refaktors Einführung einer lokalen final-Variablen  so um, daß die derzeit wiederholt vorkommenden gleichen Teilausdrücke nur einmal vorkommen. Deklarieren Sie dazu eine final-Variable mit dem Wert dieser Teilausdrücke und verwenden Sie die final-Variable dann an deren Stellen. Das Programm soll aber weiterhin dieselbe Berechnung ausführen (man soll diese nicht selber ausführen und dann das Ergebnis ins Programm schreiben). Die Ausgabe des Programms soll sich nicht (oder nur geringfügig) ändern. Es soll insgesamt nur eine  neue Variable eingeführt werden.

Nach der Überarbeitung soll das Programm eine final-Variablendeklarationen enthalten. Es sollen weiterhin die im Original aufgerufenen Methoden (etwas seltener) aufgerufen werden, und die Ausgabe muß unverändert sein (abgesehen von den letzten drei Stellen).

Reserveaufgabe ⃗

/   Einführung einer lokalen final-Variablen 4 ⃗

Diese Übungsaufgabe sollte erst nach der Nachbesprechung der voranstehenden Übungsaufgabe bearbeitet werden.

Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( 2 * java.lang.Math.pow( 4, 3 )/java.lang.Math.cos( 0.5 ));
java.lang.System.out.println( 2 * java.lang.Math.pow( 4, 3 )/java.lang.Math.cos( 0.6 )); }}
transcript
145.85522269754227
155.08842425757652

Schreiben Sie die Einheit »Main.java« durch Anwendung des Refaktors Einführung einer lokalen final-Variablen  so um, daß die derzeit wiederholt vorkommenden gleichen Teilausdrücke nur einmal vorkommen.

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram723220 stefan_ram:723220 Der Refaktor "Einführung einer Konstanten" in Java Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723220, slrprddef723220, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/konstanteneinfuehrung_java