2017-12-12 2 views
-1

Ich versuche, dieses Problem in einem Java-Lehrbuch zu erforschen. Das Problem besteht darin, dieses Programm neu zu schreiben, um die Nebeneffekte zu eliminieren, bei der eine Änderung des Zustands eines Objekts oder einer Programmvariablen durch einen Aufruf einer Funktion (oder einer Methode, die irgendwie dasselbe ist) erzeugt wird.Wie würde man ein Programm umschreiben, um Nebenwirkungen zu eliminieren?

Paket Nebeneffekt;

Die kommentierten Zeilen sind, was passiert, wenn ich die Integer-Variable implementieren und es Ausdruck ist. Wenn ich diese Zeilen implementieren und die anderen Zeilen auskommentieren, ist das Ergebnis 45. Wenn das andere implementieren, ist das Ergebnis 30. Gibt es eine Möglichkeit, das Programm zu begradigen, so dass es keine Nebenwirkungen gibt? Ich dachte, ich entferne die globale Variable Zeile, da es in dem Buch sagt, dass es zu diesem schlechten, verwirrenden Code führen kann. Aber was kann ich sonst noch versuchen?

+0

Was ist Ihre gewünschte Ausgabe? –

+0

Das Problem gibt keine bestimmte Ausgabe an. Es wird nur vorgeschlagen, dass die Funktion den Wert von x als Parameter akzeptiert, anstatt eine globale Variable zu ändern. –

+0

Durch "eliminieren Nebenwirkungen", ich denke, Sie meinen * äußerlich sichtbare * Nebenwirkungen * produziert durch Methodenausführung *. Es gibt auch andere Arten von Nebenwirkungen, die Sie in Java nicht leicht vermeiden können. –

Antwort

0

Ich weiß, dass dies eine Aufgabe ist, aber solche Sachen sind immer etwas verwirrend. Das "Problem" ist, dass sie eine globale Variable so verwenden, wie sie NIE verwendet werden sollte. "Doktor, es tut weh, wenn ich das tue. Tu das nicht".

Im Allgemeinen sind statische (Klassen-) Variablen selten das, was Sie wirklich wollen. Auch main() ist für das Instanziieren Ihrer Objekte und das Drehen von ihnen auf der Welt verlieren, nicht das schwere Heben wie das war ein C-Programm.

Klassen erstellen und nach Wert übergeben. Verwenden Sie keine globalen Variablen, es sei denn, Sie haben wirklich die Absicht, nur eine einzige Instanz zu haben.

Das ist wirklich über das Beste, was ich anbieten kann, weil es aus Ihrer Frage nicht klar ist, was "das richtige" Ergebnis ist.

0

Das könnte funktionieren, aber ich bin mir nicht sicher. Ich habe die globale Variable kommentiert und int x sowohl in der f-Methode als auch in der main-Methode deklariert. Das Ergebnis ist, dass es egal ist, ob ich entweder "int result" Aufrufe verwende, es wird immer noch 10 als Ausgabe sein. Aber ich könnte falsch durch:

public class SideEffect { 

    **//public static int x;** 

    public static int f(int n){ 
     int x = 0; 
     x = x * 2; 
     return x + n; 
    } 
    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     int x = 5; 

     //int result = f(x) + f(x); 
     int result = 2 * f(x); 
     System.out.println(result); 
     //System.out.println(result2); 
    } 

} 
+0

Sie können wie folgt umschreiben: 'public static int f (int n) {return n;}' Wahrscheinlich nicht das, was Sie wollen. –

0

Okay, viel besser:

Paket Nebeneffekt;

Ich habe in x als Int in der öffentlichen statischen Int enthalten, so dass ich die Variable nicht initialisieren muss.

Verwandte Themen