Parametrisierung von Methoden
Parametrisierung von Methoden
Der Einsatz von Methoden bringt enorme Vorteile in der Übersicht und Wartbarkeit, insbesondere bei steigender Komplexität. Man kann den vorigen Ansatz nochmals verbessern:
Stand jetzt würde man je nach Bedarf die Methoden rechts5()
, rechts10()
, ... rechts355()
ergänzen müssen, und das Selbe nochmal für die Drehung nach links. Man hätte 142 Methoden insgesamt. Das muss doch eleganter gehen!?
Es geht eleganter, und zwar mithilfe einer einzigen Methodendefinition. Dazu verwenden wir zwei Parameter. Der erste Parameter soll festlegen, ob links oder rechtsrum gedreht wird. Dazu genügt eine boolesche Variable, z.B. rechtsrum
. Der zweite Parameter grad
gibt die Gradzahl an, um die gedreht wird.
import lejos.robotics.RegulatedMotor;
import lejos.hardware.motor.EV3LargeRegulatedMotor;
import lejos.hardware.port.MotorPort;
public class EV3Drehung3
{
static RegulatedMotor reMo = new EV3LargeRegulatedMotor(MotorPort.A);
static RegulatedMotor liMo = new EV3LargeRegulatedMotor(MotorPort.D);
static int distanz360 = 780; //zu kalibrieren
public static void main(String[] args)
{
liMo.setSpeed(200);
reMo.setSpeed(200);
// Aufruf der Methode mit Parameter: Rechtskurve 90 Grad
drehungX(true, 90);
}
public static void drehungX(boolean rechtsrum, int grad)
{
//berechne die für die Gradzahl notwendige Distanz
int distanzX = (grad * distanz360) / 360;
if(rechtsrum) //Rechtsdrehung
{
liMo.rotate(distanzX,true);
reMo.rotate(-distanzX);
}
else //Linksdrehung
{
liMo.rotate(-distanzX,true);
reMo.rotate(distanzX);
}
}
}
import lejos.nxt.Motor;
import lejos.nxt.NXTRegulatedMotor;
public class Drehung3
{
static NXTRegulatedMotor reMo = Motor.A;
static NXTRegulatedMotor liMo = Motor.B;
static int distanz360 = 2000; //zu kalibrieren
public static void main(String[] args)
{
liMo.setSpeed(200);
reMo.setSpeed(200);
// Aufruf der Methode mit Parameter: Rechtskurve 90 Grad
drehungX(true, 90);
}
public static void drehungX(boolean rechtsrum, int grad)
{
//berechne die für die Gradzahl notwendige Distanz
int distanzX = (grad * distanz360) / 360;
if(rechtsrum) //Rechtsdrehung
{
liMo.rotate(distanzX,true);
reMo.rotate(-distanzX);
}
else //Linksdrehung
{
liMo.rotate(-distanzX,true);
reMo.rotate(distanzX);
}
}
}
Als Referenzwert wird nun distanz360
mit 360° kalibriert. Direkt die Drehung für 1° zu kalibrieren würde zu zusätzlicher Ungenauigkeit führen. distanz360
wird dann innerhalb der Methode mit dem Parameter grad
verrechnet.
Die Verwendung von if
und else
für den Parameter rechtsrum
ist bereits ein Vorgriff auf das nächste Unterkapitel
Fallunterscheidung. Alternativ kann man auch zwei Methoden rechtsX()
bzw. linksX()
definieren und die Fallunterscheidung innerhalb weglassen.