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.

X

Fehler melden

X

Suche