2016-05-12 12 views
-10

ich diesen Code in Java haben, die den Hauptarm eines Roboters steuert:Umschreiben eine bedingte Kette als eine Folge von Einzeiler

if (gamepad1.left_stick_y > 50) 
{ 
    mainArm.setDirection(DIRECTION_FORWARD); 
    mainArm.setPower(50); 
} 
else if (gamepad1.left_stick_y < -50) 
{ 
    mainArm.setDirection(DIRECTION_REVERSE); 
    mainArm.setPower(50); 
} 

, dass nur ein kleiner Teil, aber es gibt eine Tonne von conditionals genau so, einige mit nur einer Aussage, wenn die Bedingung wahr ist. Kann es zu etwas vereinfacht werden wie: [Pseudocode. Nimm es nicht wörtlich. Ich weiß, es wird nicht funktionieren]

if (gamepad1.left_stick_y > 50) mainArm.setDirection(DIRECTION_FORWARD), mainArm.setPower(50); 
else if (gamepad1.left_stick_y < -50) mainArm.setDirection(DIRECTION_REVERSE), mainArm.setPower(50); 

Leider sind die Bibliotheken Leistung für die Einstellung für die Anbindung direkt mit der Hardware verwendet und so sind Closed-Source, so dass sie zu modifizieren indiskutabel ist.

+2

Haben Sie in Ihrem IDE voraus gegangen und versucht? –

+2

Aus Gründen der Rettung einer öffnenden und schließenden Klammer? Warum nicht einfach dasselbe tun wie im ersten Beispiel, aber die Zeilenumbrüche entfernen? – Chris

+0

Warum möchten Sie die if-Anweisung in einer Zeile haben? – adranale

Antwort

5

Dieser Code würde nicht kompilieren:

if (gamepad1.left_stick_y>50) mainArm.setDirection(DIRECTION_FORWARD), mainArm.setPower(50); 
//                 ^

Ihr Versuch, mehrere Operationen in einer Umwandlung durch ein Komma setzen nicht funktionieren würde:

JLS 15.27: im Gegensatz zu C und C++, hat die Java-Programmiersprache kein Komma-Operator.

Ein Ansatz ist die Kraft und Richtung zu ermöglichen, in einem einzigen Aufruf zu ändern:

if (gamepad1.left_stick_y > 50) mainArm.setDirectionAndPower(DIRECTION_FORWARD, 50); 

die Bibliotheken für die Leistungseinstellung und so sind Quelle geschlossen

Wenn Sie das nicht ändern können Bibliothek, können Sie Ihre eigene Hilfsmethode machen, um auf diesen Mangel zu reagieren:

private static void setDirectionAndPower(Arm arm, Direction dir, int pow) { 
    arm.setDirection(dir); 
    arm.setPower(pow); 
} 
2

Wenn Sie Ihren Setter ändern, damit es this dann zurückgegeben werden, können Sie Kette Methode aufruft:

public MainArm setDirection(int dir) { 
    this.direction = dir; 
    return this; 
} 

if (gamepad1.left_stick_y > 50) mainArm.setDirection(DIRECTION_FORWARD).setPower(50); 
5

Die Optimierung, die Sie vorschlagen, ist eine schlechte. Es ist schlimmer als das Original. Der Code wird weniger lesbar und fehleranfälliger. Wenn es mehr solche Bedingungen sind, kann man prüfen, ein entweder Refactoring durch die Logik in einer OOP Art und Weise neu zu gestalten oder durch ein Verfahren definiert, die von einer switch-Anweisung aufgerufen werden würde ...

+2

Und nur darum: switch-Anweisungen sind nur minimal "besser" als langwierig wenn/sonst/wenn Kaskaden. Sie sehen "besser organisiert" aus; Aber sie sind die falsche Antwort. – GhostCat

+0

Ja, Switch ist nur eine Alternative, aber es gibt noch viele mehr, wie zum Beispiel ein Designmuster zu verwenden oder gar nicht diesen Code zu schreiben :) (mit einer 3rd-Party-Bibliothek) – ACV

1

können Sie Ternary Operator verwenden:

mainArm.setDirection((gamepad1.left_stick_y > 50)?DIRECTION_FORWARD:DIRECTION_REVERSE); 
mainArm.setPower(50);