Benutzer-Werkzeuge

Webseiten-Werkzeuge


skript:klassen

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
skript:klassen [2018/11/05 17:35]
d.golovko [1. Steuerung eines Roboters mit Hilfe einer Klasse]
skript:klassen [2018/11/08 14:13] (aktuell)
d.golovko
Zeile 2: Zeile 2:
  
  
-Ihr habt schon einige Datentypen kennengelernt,​ z.B. ''​int'',​ ''​float'',​ ''​boolean'',​ ''​char''​. Das sind **primitive Datentypen**. Sie stehen für eine Zahl, eine Buchstabe ​usw.+Ihr habt schon einige Datentypen kennengelernt,​ z.B. ''​int'',​ ''​float'',​ ''​boolean'',​ ''​char''​. Das sind **primitive Datentypen**. Sie stehen für eine Zahl, einen Buchstaben ​usw.
  
 Es gibt aber auch die Möglichkeit,​ Variablen für kompexere Zusammenhänge zu erstellen. Z.B. ist ein Datentyp denkbar, welcher die Studierenden des Robotiklabors repräsentiert. Ein_e Student_in könnte folgende Eigenschaften haben: Name, Matrikelnummer,​ Name des Projektteams,​ Noten usw. Oder, um ein Beispiel aus dem Bereich der Robotik zu geben, ein Datentyp, welcher einen Schrittmotor repräsentiert. Ein Motor könnte die Eigenschaften Pinnummer, Drehrichtung und Schrittwinkel haben. Darüber hinaus könnte man bestimmte Funktionalität mit diesem Datentyp verbinden, z.B. kann ein Motor eine vorgegebene Anzahl an Schritten in eine oder in die andere Richtung machen. Solche Datentypen heissen **Objektdatentypen** oder abstrakte Datentypen. ​ Es gibt aber auch die Möglichkeit,​ Variablen für kompexere Zusammenhänge zu erstellen. Z.B. ist ein Datentyp denkbar, welcher die Studierenden des Robotiklabors repräsentiert. Ein_e Student_in könnte folgende Eigenschaften haben: Name, Matrikelnummer,​ Name des Projektteams,​ Noten usw. Oder, um ein Beispiel aus dem Bereich der Robotik zu geben, ein Datentyp, welcher einen Schrittmotor repräsentiert. Ein Motor könnte die Eigenschaften Pinnummer, Drehrichtung und Schrittwinkel haben. Darüber hinaus könnte man bestimmte Funktionalität mit diesem Datentyp verbinden, z.B. kann ein Motor eine vorgegebene Anzahl an Schritten in eine oder in die andere Richtung machen. Solche Datentypen heissen **Objektdatentypen** oder abstrakte Datentypen. ​
  
-Die Modelliernug ​der Welt mit Hilfe von Objekten entspricht dem Paradigma der **objektorientierten Programmierung**.  Fast alle modernen Programmiersprachen (C++, Java, Python, C#) unterstützen sie. Beispiele in diesem Artikel wurden in Java/​Processing erstellt. ​+Die Modellierung ​der Welt mit Hilfe von Objekten entspricht dem Paradigma der [[https://​de.wikipedia.org/​wiki/​Objektorientierte_Programmierung|objektorientierten Programmierung]].  Fast alle modernen Programmiersprachen (C++, Java, Python, C#) unterstützen sie. Die Beispiele in diesem Artikel wurden in Java/​Processing erstellt. ​
  
 Einen Objektdatentyp definiert man mit Hilfe einer **Klasse**. Ihr habt schon in den ersten Kurswochen mit Klassen/​Objekten gearbeitet, z.B. ''​Servo'',​ ''​Serial'',​ ''​String''​. Ein Objekt (eine Variable) eines bestimmten Objektdatentyps nennt man auch eine **Instanz** dieser Klasse. In der Regel schreibt man eine Klasse in einer eigenen Datei. Eine Klasse hat folgende Bestandteile:​ Einen Objektdatentyp definiert man mit Hilfe einer **Klasse**. Ihr habt schon in den ersten Kurswochen mit Klassen/​Objekten gearbeitet, z.B. ''​Servo'',​ ''​Serial'',​ ''​String''​. Ein Objekt (eine Variable) eines bestimmten Objektdatentyps nennt man auch eine **Instanz** dieser Klasse. In der Regel schreibt man eine Klasse in einer eigenen Datei. Eine Klasse hat folgende Bestandteile:​
-  * Attribute, auch Membervariablen oder Memberfelder genannt, sind die Eigenschaften des Objektes, z.B. die Drehrichtung des Motors. +  ​* **Attribute**, auch Membervariablen oder Memberfelder genannt, sind die Eigenschaften des Objektes, z.B. die Drehrichtung des Motors. 
-  * Ein oder mehrere Konstruktoren sind Methoden, mit welchen man das Objekt erstellt. Oft nutzt man den Konstruktor,​ um die Objektattribute zu initialisieren.  +  * Ein oder mehrere ​**Konstruktoren** sind Methoden, mit welchen man das Objekt erstellt. Oft nutzt man den Konstruktor,​ um die Objektattribute zu initialisieren.  
-  * Methoden, auch Funktionen genannt, definieren, was das Objekt machen kann.+  ​* **Methoden**, auch Funktionen genannt, definieren, was das Objekt machen kann.
  
 Exemplarisch sieht eine Klasse so aus (beachtet die Upper-Camel-Case-Schreibweise des Klassennamens):​ Exemplarisch sieht eine Klasse so aus (beachtet die Upper-Camel-Case-Schreibweise des Klassennamens):​
Zeile 23: Zeile 23:
 </​code>​ </​code>​
  
 +------
  
 ===== 1. Steuerung eines Roboters mit Hilfe einer Klasse ===== ===== 1. Steuerung eines Roboters mit Hilfe einer Klasse =====
Zeile 28: Zeile 29:
 ==Attribute und Konstruktor== ==Attribute und Konstruktor==
  
-Wir wollen nun das Beispiel von der letzten Crashkurs-Seite so umschreiben,​ dass Klassen verwendet werden. Wir wollen erstmal **einen** Roboter vorwärts bewegen und drehen lassen. Der Roboter hat folgende Eigenschaften:​ Radius, die aktuelle x- und y-Position sowie die aktuelle Richtung; Diese werden zu den Attributen der Klasse. Dafür erstellen wir in Processing einen neuen Tab, d.h. eine neue Datei. Am besten nennen wir sie genau so wie unsere Klasse, z.B. ''​Robot''​.+Wir wollen nun das Beispiel von [[skript:​bewegungen|der letzten Crashkurs-Seite]] so umschreiben,​ dass Klassen verwendet werden. Wir wollen erstmal **einen** Roboter vorwärts bewegen und drehen lassen. Der Roboter hat folgende Eigenschaften:​ Radius, die aktuelle x- und y-Position sowie die aktuelle Richtung; Diese werden zu den Attributen der Klasse. Dafür erstellen wir in Processing einen neuen Tab, d.h. eine neue Datei. Am besten nennen wir sie genau so wie unsere Klasse, z.B. ''​Robot''​.
  
-Nun müssen wir irgendwie ​der Klasse sagen können, dass diesen Attributen bestimmte Werte zugewiesen werden sollen. Das machen wir mit Hilfe des Konstruktors. ​Genau so wie bei Methoden/​Funktionen können an den Konstruktor Parameter übergeben werden. In unserem Beispiel werden wir die Anfangswerte der Attribute übergeben:+Nun müssen wir der Klasse sagen können, dass diesen Attributen bestimmte Werte zugewiesen werden sollen. Das machen wir mit Hilfe des Konstruktors. ​Genauso ​wie bei Methoden/​Funktionen können an den Konstruktor Parameter übergeben werden. In unserem Beispiel werden wir die Anfangswerte der Attribute übergeben:
  
 <file java Robot.pde>​ <file java Robot.pde>​
Zeile 43: Zeile 44:
    * Konstruktor    * Konstruktor
    */    */
-   ​Robot(int ​paramRadius, float paramXPos, float paramYPos, float paramAngle) { +   ​Robot(int ​radius, float x, float y, float angle) { 
-     ​this.radius = paramRadius+     ​this.radius = radius// hier muss man "​this"​ nutzen, um die Attributvariable vom gleichnamigen Parameter zu unterscheiden 
-     ​this.xPos = paramXPos+     ​this.xPos = x; // alternativ: xpos = x;  
-     ​this.yPos = paramYPos+     ​this.yPos = y; // alternativ: yPos = y
-     ​this.angle = paramAngle;+     ​this.angle = angle// '​this'​ muss sein
    }    }
 } }
 </​file>​ </​file>​
  
-Damit können wir unsere Klasse schon nutzen und eine Variable dieses neuen Datentyps ​anzulegen. Wir können auch auf die Attribute zugreifen:+Damit können wir unsere Klasse schon nutzen und eine Variable dieses neuen Datentyps ​anlegen. Wir können auch auf die Attribute zugreifen:
  
 <file java Haupttab.pde>​ <file java Haupttab.pde>​
Zeile 63: Zeile 64:
 </​file>​ </​file>​
  
-Mit dem Wort ''​new''​ wird signalisiert,​ dass hier ein Konstruktor aufgerufen wird. Man kann die Attributwerte abfragen, indem man ''​objektName.attributName''​ schreibt. Wenn man sich innerhalb der Klasse befindet, kann man anstelle des Variablennamensdas Wort ''​this''​ verwenden -- wie es hier im Konstruktor gemacht wurde. ​+Mit dem Wort ''​new''​ wird signalisiert,​ dass hier ein Konstruktor aufgerufen wird. Man kann die Attributwerte abfragen, indem man ''​objektName.attributName''​ schreibt. Wenn man sich innerhalb der Klasse befindet, kann man anstelle des Variablennamens das Wort ''​this''​ verwenden -- wie es hier im Konstruktor gemacht wurde. ''​this''​ braucht man unbedingt, wenn der Attrbituname mit einem Parameternamen übereinstimmt (sonst überdeckt der Parameter das Attribut). In anderen Fällen ist ''​this''​ optional
  
  
 ==Methoden== ==Methoden==
  
-Die Methoden ''​move()''​ und ''​turn()''​ übertragen wir in die ''​Robot''​-Klasse. Diese Methoden greifen nicht mehr auf die globalen Variablen zu, sondern auf die Attribute des ''​Robot''​-Objektes. Darüber hinaus brauchen wir eine Methode, die die Zeichenfläche aktualisiert. Früher hatten wir das einfach in ''​loop()''​ gemacht; Jetzt ist dafür die Methode ''​drawRobot()''​ verantwortlich. Auf die Methoden der Klasse können wir im Haupt-Tab mit ''​objektName.methodenName()''​ zugreifen. ​Schaut euch das Endergebnis an:+Die Methoden ''​move()''​ und ''​turn()''​ übertragen wir in die ''​Robot''​-Klasse. Diese Methoden greifen nicht mehr auf die globalen Variablen zu, sondern auf die Attribute des ''​Robot''​-Objektes. Darüber hinaus brauchen wir eine Methode, die die Zeichenfläche aktualisiert. Früher hatten wir das einfach in ''​loop()''​ gemacht; Jetzt ist dafür die Methode ''​drawRobot()''​ verantwortlich. Auf die Methoden der Klasse können wir im Haupt-Tab mit ''​objektName.methodenName()''​ zugreifen. ​(Vielleicht habt ihr schon geahnt, dass die Schreibweise ''​myServo.write()''​ der letzten Woche, genau das machtdie Methode ''​write''​ der Klasse Servo  aufrufen.) ​
  
 +Schaut euch das Endergebnis an:
  
-Im Haupt-Tab: ​ 
  
 <code java Haupttab.pde>​ <code java Haupttab.pde>​
Zeile 87: Zeile 88:
 } }
 </​code>​ </​code>​
- 
 Im neuen Tab "​Robot":​ Im neuen Tab "​Robot":​
-<code java Robot.pde>​ 
-class Robot { 
-  // Attribute:​==Attribute und Konstruktor== 
  
 +<file java Robot.pde>​
 +class Robot {
 +  // Attribute:
   int radius; // Radius des Roboters   int radius; // Radius des Roboters
   float xPos; // x-Position des Roboters   float xPos; // x-Position des Roboters
Zeile 101: Zeile 101:
    * Konstruktor    * Konstruktor
    */    */
-   ​Robot(int ​paramRadius, float paramXPos, float paramYPos, float paramAngle) { +   ​Robot(int ​radius, float x, float y, float angle) { 
-     ​this.radius = paramRadius+     ​this.radius = radius;  
-     ​this.xPos = paramXPos+     ​this.xPos = x; // alternativ: xpos = x;  
-     ​this.yPos = paramYPos+     ​this.yPos = y; // alternativ: yPos = y
-     ​this.angle = paramAngle;+     ​this.angle = angle
    }    }
  
Zeile 119: Zeile 119:
  
 /* /*
- * Bewegt den Roboter nach vorne in seine Richtung+ * Bewegt den Roboter nach vorne in seine Richtung ​um die angegebene Entfernung
  */  */
   void move(float distance) {   void move(float distance) {
Zeile 127: Zeile 127:
  
 /* /*
- * Rotiert den Roboter+ * Rotiert den Roboter ​um den den angegebenen Winkel ​
  */  */
   void turn(float angleDiff) {   void turn(float angleDiff) {
Zeile 133: Zeile 133:
   }   }
 } }
-</code>+</file>
  
-====2. Zwei Roboter auf der gleichen Zeichenfläche====+------
  
-<code java Haupttab.pde>​+=====2. Zwei Roboter auf der gleichen Zeichenfläche===== 
 + 
 +Die Verwendung von Klassen hat den Vorteil, dass wir -- im Gegensatz zur Version mit globalen Variablen -- mit wenig Mühe mehrere "​Roboter"​ auf unserer Zeichenfläche erstellen können. Weiterhin ist unser Code übersichtlicher und weniger redundant.  
 + 
 +<file java Haupttab.pde>​
 Robot robot1; // Der 1. Roboter  ​ Robot robot1; // Der 1. Roboter  ​
 Robot robot2; // Der 2. Roboter Robot robot2; // Der 2. Roboter
Zeile 156: Zeile 160:
   robot2.move(2);​   robot2.move(2);​
   // Falls die beiden zu nah sind, sollen sie sich umdrehen:   // Falls die beiden zu nah sind, sollen sie sich umdrehen:
-  if (robot1.radius + robot2.radius >= robot1.distance(robot2)) {+  if (robot1.distance(robot2) ​<= 0) {
     robot1.turn(PI);​     robot1.turn(PI);​
     robot2.turn(PI);​     robot2.turn(PI);​
   }   }
 } }
-</code>+</file>
  
-Im neuen Tab "​Robot":​ +<file java Robot.pde>​
- +
-<code java Robot.pde>​+
 class Robot { class Robot {
  
Zeile 177: Zeile 179:
    * Konstruktor    * Konstruktor
    */    */
-  ​Robot(int ​paramRadius, float paramXPos, float paramYPos, float paramAngle) { +   Robot(int ​radius, float x, float y, float angle) { 
-    this.radius = paramRadius+     ​this.radius = radius;  
-    this.xPos = paramXPos+     ​this.xPos = x; // alternativ: xpos = x;  
-    this.yPos = paramYPos+     ​this.yPos = y; // alternativ: yPos = y
-    this.angle = paramAngle+     ​this.angle = angle
-  }+   ​}
  
   // Methoden:   // Methoden:
   /*   /*
-   * Berechnet die Entfernung zwischen ​dem Zentrum von diesem Roboter und vom anderen Roboter+   * Berechnet die Entfernung zwischen diesem Roboter und einem anderen Roboter
    */    */
   float distance(Robot other) {   float distance(Robot other) {
-    float deltaX = this.xPos - other.xPos;​ +    float deltaX = this.xPos - other.xPos; // optional: float deltaX = xPos - other.xPos;​ 
-    float deltaY = this.yPos - other.yPos;​ +    float deltaY = this.yPos - other.yPos;  
-    float dist = sqrt((sq(deltaX) + sq(deltaY)));​+    float dist = sqrt((sq(deltaX) + sq(deltaY))) ​- this.radius - other.radius;
     return dist;     return dist;
   }   }
Zeile 221: Zeile 223:
   }   }
 } }
-</code> +</file>
  
skript/klassen.1541435717.txt.gz · Zuletzt geändert: 2018/11/05 17:35 von d.golovko