Woche 03
UML, Testing, Call-by-Value, Kontrollstrukturen
UML
Die Klasse wird in drei Teilen aufgeteilt: oben der
Klassenname, in der Mitte die Attributen, und unten die
Methoden.
Konstruktoren, Getter und Methoden wie toString() sind
oft nicht im Diagramm enthalten.
Sichtbarkeiten werden durch Symbole dargestellt:
“+” für public: Zugriff für alle Klassen möglich
“-” für private: Nur die eigene Klasse hat Zugriff
static zeigt an, dass es sich um Klassenattribute oder -
methoden handelt.
UML zu Code
Wie sieht der zugehörige Java-Code aus, wenn wir ein UML-Diagramm betrachten? Ein Beispiel:
1 public class Example {
2 private int age;
3 private String name;
4
5 private static int magicNumber;
6
7 public void run() {}
8
9 public double doStuff(Stuff stuff) {
10 return 0.0;
11 }
12
13 public static void main(String[] args) {}
14 }
W03P01 & W03P02
Roboter
JUnit Testing
Setup mit Gradle
Wir verwenden JUnit 5. In [Link] steht entsprechend:
1 ...
2 dependencies {
3 implementation '[Link]:junit jupiter:5.8.1'
4 }
5 ...
Achte darauf, dass du die richtige Version verwendest! JUnit 5 und nicht JUnit 4!
Sobald du @Test über eine Methode tippst, sollte dir deine IDE allerdings beim darüberhovern bereits
vorschlagen, JUnit in die Dependencies mit aufzunehmen, dann musst du dies nicht per Hand eintippen.
JUnit 5 Testing
Assertions
Um das Verhalten von Funktionen zu testen, vergleichen wir häufig den erwarteten Output mit dem
tatsächlichen Ergebnis für einen bestimmten Input. Hierfür nutzen wir Assertions.
1 assertEquals(9 , square(3));
2 assertEquals("Hello World", concatenate("Hello", " ", "World");
JUnit bietet noch viele weitere Assertions an, wie…
assertArrayEquals() für Arrays
assertEquals(expected, actual, delta) für float s, bei der auf Gleichheit minus ein delta getestet wird
assertNotNull()
und viele mehr…
Wie immer bei Fragen empfehlen wir, die Dokumentation hier zu überfliegen.
JUnit 5
Imports
Um in einer Klasse die Funktionalitäten von JUnit 5 nutzen zu können, müsste ihr sie importieren. Die
Imports der Annotationen und Assertions sehen dann etwa so aus:
import [Link];
import [Link];
import [Link];
import static [Link];
import static [Link];
import static [Link];
Achtet darauf, dass die Annotationen und Assertions von der Jupiter API importiert werden, also im
import-Statement der String “jupiter” enthalten ist.
(Die Imports kommen ganz nach oben in jede Klasse, die die jeweiligen Funktionalitäten verwendet,
direkt unter das package-Statement, falls vorhanden.)
W03P03
Testing in der Pinguinkneipe
Kontrollstrukturen
Selektion (bedingte Auswahl) Iteration (wiederholte Ausführung)
if-Anweisung while-Schleife
if-else-Anweisung do-while-Schleife
else if for-Schleife
switch
if-Anweisung
Allgemeine Form:
1 if(Bedingung A) {
2 // Code, der läuft, wenn A true ergibt
3 }
Beispiel:
1 public static void printIfZero(int number){
2 if(number == 0) {
3 [Link]("Zero!");
4 }
5 }
if-else Anweisung
Allgemeine Form:
1 if(Bedingung A) {
2 // Code, der läuft, wenn A true ergibt
3 } else {
4 // Code, der läuft, wenn A false ergibt
5 }
Beispiel:
1 public static void printIfZero(int number){
2 if(number == 0) {
3 [Link]("Zero!");
4 } else {
5 [Link]("Not zero!");
6 }
7 }
else if
1 if(number == 0) {
2 [Link]("Zero!");
3 } else {
4 if(number < 0) {
5 [Link]("Negative!");
6 } else {
7 [Link]("Positive");
8 }
9 }
kann kompakter dargestellt werden als:
1 if(num == 0) {
2 [Link]("Zero!");
3 } else if(num < 0) {
4 [Link]("Negative!");
5 } else {
6 [Link]("Positive!");
7 }
while-Schleife
Allgemeine Form:
1 while(Bedingung A){
2 // Code, der wiederholt läuft, solange A true ergibt
3 }
Beispiel:
1 public static void countDown(int start){ Output countDown(3):
2 while(start > 0){
3 [Link](start); 1 3
4 start--; 2 2
5 } 3 1
6 [Link]("GO!"); 4 GO!
7 }
do-while-Schleife
Allgemeine Form:
1 do {
2 // Code, der wiederholt läuft, solange A true ergibt
3 }while(Bedingung A);
Beispiel:
1 public static void passwordCheck(){
2 String password;
3 do {
4 password = getInput();
5 } while (!isPasswordCorrect(password));
6 }
Hier wird der Code in den geschweiften Klammern garantiert einmal ausgeführt.
for-Schleife
Allgemeine Form:
A: (Deklaration und) Initialisierung einer C: Veränderung (z.B. Hochzählen)
(oder mehrerer) Zählervariablen der Zählervariablen
1 for(Anweisung A ; Bedingung B ; Anweisung C){
2 // Code, der wiederholt läuft, solange B true ergibt
3 }
Beispiel:
1 public static void countDown(int start){ Output countDown(3):
2 for(int i=start; i>0; i--){
3 [Link](i); 1 3
4 } 2 2
5 [Link]("GO!"); 3 1
6 } 4 GO!
Bonus: Call-by-Value
1 public static void main(String[] args) {
2 int myNumber = 2;
3 addOne(myNumber);
4 [Link](myNumber);
5 }
6 public static void addOne(int number) {
7 number = number + 1;
8 }
Output: 2
Call-by-Value
Anders bei Klassenattributen
1 public class MyNumber {
2 public int value = 2;
3 // default constructor
4 public static void inc(MyNumber n) {
5 [Link] += 1;
6 }
7 }
8
9 public static void main(String[] args) {
10 MyNumber myN = new MyNumber();
11 inc(myN);
12 [Link]([Link]);
13 }
Output: 3
W03P04
W03P05