From 3ba49a55079e7b361d5dc2ed26c9585a4aaf4eeb Mon Sep 17 00:00:00 2001 From: Harald Mueller Date: Thu, 16 Dec 2021 09:00:49 +0100 Subject: [PATCH] muh --- m226 | 1 + .../uebung_vererbung_Sensor/ReadMe.md | 23 ++--- .../uebung_vererbung_Sensor/Readme_de.md | 88 ++++++++++++------- .../test/com/doerzbach/CsvWriterTest.java | 35 ++++++++ .../.gitignore | 3 + .../src/com/doerzbach/Main.java | 39 ++++++++ .../src/com/doerzbach/Uhrzeit.java | 7 ++ .../src/com/doerzbach/Zeit.java | 33 +++++++ .../src/com/doerzbach/Zeitformat.java | 8 ++ .../src/com/doerzbach/Zeitformat12.java | 25 ++++++ .../src/com/doerzbach/Zeitformat24.java | 14 +++ 11 files changed, 233 insertions(+), 43 deletions(-) create mode 160000 m226 create mode 100644 m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_Sensor/test/com/doerzbach/CsvWriterTest.java create mode 100644 m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/.gitignore create mode 100644 m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Main.java create mode 100644 m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Uhrzeit.java create mode 100644 m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Zeit.java create mode 100644 m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Zeitformat.java create mode 100644 m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Zeitformat12.java create mode 100644 m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Zeitformat24.java diff --git a/m226 b/m226 new file mode 160000 index 0000000..aac63e7 --- /dev/null +++ b/m226 @@ -0,0 +1 @@ +Subproject commit aac63e7f60613ef32a9e00bbbb2685d8efff3307 diff --git a/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_Sensor/ReadMe.md b/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_Sensor/ReadMe.md index 01c93d6..8a2bc04 100644 --- a/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_Sensor/ReadMe.md +++ b/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_Sensor/ReadMe.md @@ -42,18 +42,20 @@ It should implement the following methods and define the following fields: getUnit(): simply returns the variable unit. -3) Implementation: +3) **_Implementation:_** Create a child class of PressureSensor Barometric1000PressureSensorImpl that implements the following method: - doMeasurement(): This should write a value between 0.5 and 1.05 into the measurmentValue variable. Here, in reality, the physical sensor would be addressed via an interface of the sensor. This would be very manufacturer-specific and could change from model to model of the manufacturer. That means you would have to read the manuals of the manufacturer of Barometric1000 to program this method in reality. But let's make it easy and just write a random value into the variable measurmentValue. + doMeasurement(): This should write a value between 0.5 and 1.05 into the measurmentValue variable. -4) Implementation: + Here, in reality, the physical sensor would be addressed via an interface of the sensor. This would be very manufacturer-specific and could change from model to model of the manufacturer. That means you would have to read the manuals of the manufacturer of Barometric1000 to program this method in reality. But let's make it easy and just write a random value into the variable measurmentValue. + +4) **_Implementation_** Create a child class of PressureSensor Aqualung2021ProDivePressureSensorImpl and implement the method doMeasurment() which returns values between 0 and 10.0. Again, in reality you would need to read the manuals of Aqualung2021Pro. -5) Specification/partial implementation: +5) **_Specification/partial implementation:_** Create and partially implement one of the following abstract child classes of Sensor analogous to the class PressureSensor: @@ -63,21 +65,22 @@ It should implement the following methods and define the following fields: abstract class HumiditySensor abstract class SpeedSensor -6) Implementation: +6) **_Implementation:_** - Implement 2 concrete classes for two models of the abstract class you specified in task 5. + **--> ** Implement 2 concrete classes for two models of the abstract class you specified in task 5. -7) Using polymorphism: +7) **_Using polymorphism:_** - Now write a class CsvWriter that reads readings from one of these sensors at a given time interval and writes them to a file. (File name, interval and sensor should be configurable). + **--> ** Now write a class CsvWriter that reads readings from one of these sensors at a given time interval and writes them to a file. (File name, interval and sensor should be configurable). - Tip: Create an object of a child class of Sensor and pass it to the constructor of CsvWriter as a parameter together with the interval and the filename. File format: each line is Comma Separated Value (CSV) i.e. something like _time stamp_,_name of sensor_,_unit_,_measurement_. Each line corresponds to one measurement. - Implement a method "public void run()" which you then call to actually take the measurements and write them to the file. -8) Create the CsvWriter in a main class and allow the user to select the sensor, the interval and the file name. + +8) **--> ** **_Create the CsvWriter in a main class_** and allow the user to select the sensor, the interval and the file name. -9) Optional: Think about how you would write the same data into a database. +9) **--> ** **_Optional:_** Think about how you would write the same data into a database. diff --git a/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_Sensor/Readme_de.md b/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_Sensor/Readme_de.md index b4ebb7d..98a68ca 100644 --- a/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_Sensor/Readme_de.md +++ b/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_Sensor/Readme_de.md @@ -1,7 +1,7 @@ -Übung "Sensor" -============= +Sensor übung +============ -Dieser Code ist eine (mögliche) Lösung zur übung. +Dieser Code ist eine Lösung zur übung. Übung zu Vererbung, abstrakten Klassen und Polymorphismus @@ -13,55 +13,77 @@ Erstellen sie eine Klassenhierarchie, die mehrere verschiedene Sensoren enthält Aufgaben - -1) Spezifikation: +1) **_Spezifikation:_** - Erzeugen sie ein Abstrakte Klasse Sensor mit den folgenden abstrakten Methoden: + Erzeugen sie ein Abstrakte Klasse Sensor mit den folgenden abstrakten Methoden: - getUnit(): Diese soll die Einheit der Messung zurückgeben wie zum Beispiel Grad Celsius + getUnit(): Diese soll die Einheit der Messung zurückgeben wie zum Beispiel Grad Celsius - getValue(): Die Messung in der Einheit, d.h. ein double wie zum Beispiel 17.0 + getValue(): Die Messung in der Einheit, d.h. ein double wie zum Beispiel 17.0 - getName(): Diese soll nur den Namen des Messwerts zurückgeben, wie zum Beispiel "Aussentemperatur in Baar" + getName(): Diese soll nur den Namen des Messwerts zurückgeben, wie zum Beispiel "Aussentemperatur in Baar" - doMeasurement(): Diese soll die Messung wirklich durchführen, d.h. einen "Sensor auslesen" zum Beispiel indem eine serielle Schnittstelle angesprochen wird oder ein HTTP-Request gemacht wird oder etwas anderes. + doMeasurement(): Diese soll die Messung wirklich durchführen, d.h. einen "Sensor auslesen" zum Beispiel indem eine serielle Schnittstelle angesprochen wird oder ein HTTP-Request gemacht wird oder etwas anderes. -2) Spezifikation/Teil-Implementation: +2) **_Spezifikation/Teil-Implementation:_** Erzeugen sie eine abstrakte Klasse für alle Drucksensoren mit dem Namen PressureSensor. Diese soll Sensor erweitern. Diese soll folgende Methoden verwirklichen und folgende Felder definieren: - private String unit; + private String unit; - protected double measurementValue; + protected double measurementValue; - getValue(): gibt einfach die Variable measurementValue zurück. + getValue(): gibt einfach die Variable measurementValue zurück. - getUnit(): gibt einfach die Variable unit zurück. + getUnit(): gibt einfach die Variable unit zurück. -3) Implementation: Erzeugen sie eine Kind-Klasse von PressureSensor Barometric1000PressureSensorImpl die folgende Methode implementiert: - doMeasurement(): Diese solle einen Wert zwischen 0.5 und 1.05 in den measurmentValue Variable schreiben. Hier würde in der Realität der physische Sensor über eine Schnittstelle des Sensors angesprochen. Das wäre dann sehr herstellerspezifisch und könnte von Modell zu Modell des Herstellers auch noch ändern. Das heisst, sie müssten die Manuals des Herstellers von Barometric1000 lesen, um diese Methode in der Realität zu programmieren. Aber wir machen es uns einfach und geben schreiben einfach einen Zufallswert in die Variable measurmentValue. +3) **_Implementation:_** + + Erzeugen sie eine Kind-Klasse von PressureSensor Barometric1000PressureSensorImpl die folgende Methode implementiert: + + doMeasurement(): Diese solle einen Wert zwischen 0.5 und 1.05 in die measurmentValue Variable schreiben. + + Hier würde in der Realität der physische Sensor über eine Schnittstelle des Sensors angesprochen. Das wäre dann sehr herstellerspezifisch und könnte von Modell zu Modell des Herstellers auch noch ändern. Das heisst, sie müssten die Manuals des Herstellers von Barometric1000 lesen, um diese Methode in der Realität zu programmieren. Aber wir machen es uns einfach und schreiben einfach einen Zufallswert in die Variable measurmentValue. -4) Implementation: Erzeugen sie eine Kind-Klasse von PressureSensor Aqualung2021ProDivePressureSensorImpl und implementieren sie die Methode doMeasurment() die Werte zwischen 0 und 10.0 zurückgibt. Auch hier müssten sie in der Realität die Manuals von Aqualung2021Pro lesen. +4) **_Implementation:_** -5) Spezifikation/Teil-Implementation: Erzeugen und Teil-Implementieren sie eine der folgenden Abstrakten Kind-Klassen von Sensor analog zur Klasse PressureSensor: - -abstract class TemperatureSensor -abstract class HumiditySensor -abstract class SpeedSensor - -6) Implementation: Implementieren sie 2 Konkrete Klassen für zwei Modelle der von ihnen in Aufgabe 5 spezifizierten Abstrakten Klasse. - -7) Benutzen von Polymorphismus: Schreiben sie jetzt eine Klasse CsvWriter welche von einem dieser Sensoren in einem vorgegeben Zeitintervall Messwerte ausliest und diese dann in ein File schreibt. (Filenamen, Intervall und Sensor soll konfigurierbar sein). - • Tipp: Sie erzeugen ein Objekt einer Kind-Klasse von Sensor und übergeben diese an dem Konstruktor von CsvWriter als Parameter zusammen mit dem Intervall und dem Filenamen. - Fileformat: jede Zeile ist Comma Separated Value (CSV) d.h. sowas wie ,,,. Jede Zeile entspricht einer Messung. - • Implementieren sie eine Methode "public void run()" welche sie dann aufrufen um die Messungen wirklich zu machen und diese ins File zu schreiben. - -8) Erzeugen sie den CsvWriter in einer Main-Klasse und ermöglichen sie dem Benutzer den Sensor, das Intervall und den Filenamen auszuwählen. - -9) Optional: Überlegen sie sich, wie sie dieselben Daten in eine Datenbank schreiben würden. + Erzeugen sie eine Kind-Klasse von PressureSensor Aqualung2021ProDivePressureSensorImpl und implementieren sie die Methode doMeasurment() die Werte zwischen 0 und 10.0 zurückgibt. Auch hier müssten sie in der Realität die Manuals von Aqualung2021Pro lesen. + + +5) **_Spezifikation/Teil-Implementation:_** + + Erzeugen und Teil-Implementieren sie eine der folgenden Abstrakten Kind-Klassen von Sensor analog zur Klasse PressureSensor: + + abstract class TemperatureSensor + + abstract class HumiditySensor + + abstract class SpeedSensor + + + +6) **_Implementation:_** + + Implementieren sie 2 Konkrete Klassen für zwei Modelle der von ihnen in Aufgabe 5 spezifizierten Abstrakten Klasse. + + +7) **_Benutzen von Polymorphismus:_** + + **--> ** **_Schreiben sie jetzt eine Klasse CsvWriter_** welche von einem dieser Sensoren in einem vorgegeben Zeitintervall Messwerte ausliest und diese dann in ein File schreibt. (Filenamen, Intervall und Sensor soll konfigurierbar sein). + - Tipp: Sie erzeugen ein Objekt einer Kind-Klasse von Sensor und übergeben diese an dem Konstruktor von CsvWriter als Parameter zusammen mit dem Intervall und dem Filenamen. + + Fileformat: jede Zeile ist Comma Separated Value (CSV) d.h. sowas wie _time stamp_,_name of sensor_,_unit_,_measurement_. Jede Zeile entspricht einer Messung. + - Implementieren sie eine Methode "public void run()" welche sie dann aufrufen um die Messungen wirklich zu machen und diese ins File zu schreiben. + + +8) **--> ** Erzeugen sie den CsvWriter in einer Main-Klasse und ermöglichen sie dem Benutzer den Sensor, das Intervall und den Filenamen auszuwählen. + + +9) **--> ** **_Optional:_** Überlegen sie sich, wie sie dieselben Daten in eine Datenbank schreiben würden. diff --git a/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_Sensor/test/com/doerzbach/CsvWriterTest.java b/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_Sensor/test/com/doerzbach/CsvWriterTest.java new file mode 100644 index 0000000..34b7bb4 --- /dev/null +++ b/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_Sensor/test/com/doerzbach/CsvWriterTest.java @@ -0,0 +1,35 @@ +package com.doerzbach; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.io.BufferedWriter; +import java.io.IOException; + +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class CsvWriterTest { + + // TODO : Mock this to objects + Sensor sensor1; + BufferedWriter outBuffer; + + @Test + void runTest() throws IOException { + // Here we would like to test the CsvWriter and not the sensor or the Filewriter + /* TODO: For this we should mocked the sensor1 and the outBuffer to be able to keep track of + number of times the sensor1 is called and the outBuffer is called. */ + CsvWriter w=new CsvWriter(1, outBuffer,sensor1,10); + /* TODO: Here we should define the return values for getValue(), getUnit(), getName() + of sensor1 */ + // Now lets run the test + w.run(); + /* TODO: Check how many times the sensors getXXX() methods were called. + It should be 10 times */ + /* TODO: check that the outBuffer is flushed 10 times */ + /* TODO: check that the outBuffer is written 10 times */ + } +} \ No newline at end of file diff --git a/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/.gitignore b/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/.gitignore new file mode 100644 index 0000000..c3548f5 --- /dev/null +++ b/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/.gitignore @@ -0,0 +1,3 @@ +out +.idea +*.iml diff --git a/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Main.java b/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Main.java new file mode 100644 index 0000000..6a17f1e --- /dev/null +++ b/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Main.java @@ -0,0 +1,39 @@ +package com.doerzbach; + +import java.util.ArrayList; + +public class Main { + + public static void main(String[] args) { + + // write your code here + Zeitformat zeit1=new Zeitformat12(22,10); + Zeitformat zeit2=new Zeitformat24(22, 10); + Zeitformat zeit3=new Zeitformat12(17,10); + Zeitformat zeit4=new Zeitformat24(17, 10); + Zeitformat zeit5=new Zeitformat12(12,0); + Zeitformat zeit6=new Zeitformat24(12,00); + /*zeit1.zeitAusgabe(); + zeit2.zeitAusgabe(); + zeit3.zeitAusgabe(); + zeit4.zeitAusgabe(); + zeit5.zeitAusgabe(); + zeit6.zeitAusgabe();*/ + ArrayList zeiten=new ArrayList<>(); + zeiten.add(zeit1); + zeiten.add(zeit2); + zeiten.add(zeit3); + zeiten.add(zeit4); + zeiten.add(zeit5); + zeiten.add(zeit6); + for (Zeitformat zeit: zeiten){ + zeit.zeitAusgabe(); + } + Zeit zeit1clone=zeit1.clone(); + if(zeit1.equals(zeit1clone)){ + System.out.println("zeit1 und zeit2 sind gleich"); + } else { + System.out.println("zeit1 und zeit2 sind nicht gleich"); + } + } +} diff --git a/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Uhrzeit.java b/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Uhrzeit.java new file mode 100644 index 0000000..91371e9 --- /dev/null +++ b/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Uhrzeit.java @@ -0,0 +1,7 @@ +package com.doerzbach; + +public final class Uhrzeit { + static boolean entspricht(Zeit zeit1,Zeit zeit2){ + return zeit1.equals(zeit2); + } +} diff --git a/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Zeit.java b/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Zeit.java new file mode 100644 index 0000000..1315095 --- /dev/null +++ b/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Zeit.java @@ -0,0 +1,33 @@ +package com.doerzbach; + +import java.lang.reflect.InvocationTargetException; + +public class Zeit { + private int hours; + private int minutes; + + public int getHours() { + return hours; + } + + public void setHours(int hours) { + this.hours = hours; + } + + public int getMinutes() { + return minutes; + } + + public void setMinutes(int minutes) { + this.minutes = minutes; + } + public Zeit clone() { + Zeit clonedobject=new Zeit(); + clonedobject.hours = this.hours; + clonedobject.minutes = this.minutes; + return clonedobject; + } + public boolean equals(Zeit zeit){ + return zeit.minutes==this.minutes&&zeit.hours==this.hours; + } +} diff --git a/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Zeitformat.java b/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Zeitformat.java new file mode 100644 index 0000000..b904a0b --- /dev/null +++ b/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Zeitformat.java @@ -0,0 +1,8 @@ +package com.doerzbach; + +public abstract class Zeitformat extends Zeit{ + + public Zeitformat() { + } + public abstract void zeitAusgabe(); +} diff --git a/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Zeitformat12.java b/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Zeitformat12.java new file mode 100644 index 0000000..8fe16c3 --- /dev/null +++ b/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Zeitformat12.java @@ -0,0 +1,25 @@ +package com.doerzbach; + +public class Zeitformat12 extends Zeitformat{ + + public Zeitformat12(int hours,int minutes){ + setHours(hours); + setMinutes(minutes); + } + @Override + public void zeitAusgabe() { + String pmam; + int hours; + if(getHours()>12) { + pmam = "PM"; + hours=getHours()-12; + } else { + pmam = "AM"; + hours=getHours(); + + } + System.out.printf("%02d:%02d %s\n",hours,getMinutes(),pmam); + + } + +} diff --git a/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Zeitformat24.java b/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Zeitformat24.java new file mode 100644 index 0000000..3f18609 --- /dev/null +++ b/m226ab/2-Unterlagen/03-Vererbung/uebung_vererbung_herdt_verlag_kapitel_8_10/src/com/doerzbach/Zeitformat24.java @@ -0,0 +1,14 @@ +package com.doerzbach; + +public class Zeitformat24 extends Zeitformat{ + + public Zeitformat24(int hours,int minutes){ + setHours(hours); + setMinutes(minutes); + } + + @Override + public void zeitAusgabe() { + System.out.printf("%02d:%02d\n",getHours(),getMinutes()); + } +}