This commit is contained in:
Harald Mueller 2021-12-16 09:00:49 +01:00
parent 8fde5ecfc4
commit 3ba49a5507
11 changed files with 233 additions and 43 deletions

1
m226 Submodule

@ -0,0 +1 @@
Subproject commit aac63e7f60613ef32a9e00bbbb2685d8efff3307

View File

@ -42,18 +42,20 @@ It should implement the following methods and define the following fields:
getUnit(): simply returns the variable unit. getUnit(): simply returns the variable unit.
3) Implementation: 3) **_Implementation:_**
Create a child class of PressureSensor Barometric1000PressureSensorImpl that implements the following method: 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. 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 Create and partially implement one of the following abstract
child classes of Sensor analogous to the class PressureSensor: 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 HumiditySensor
abstract class SpeedSensor 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. - 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. 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. - 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.

View File

@ -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 Übung zu Vererbung, abstrakten Klassen und Polymorphismus
@ -13,7 +13,7 @@ Erstellen sie eine Klassenhierarchie, die mehrere verschiedene Sensoren enthält
Aufgaben 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:
@ -26,7 +26,7 @@ Aufgaben
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. Erzeugen sie eine abstrakte Klasse für alle Drucksensoren mit dem Namen PressureSensor. Diese soll Sensor erweitern.
@ -41,27 +41,49 @@ Aufgaben
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: 3) **_Implementation:_**
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.
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: 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.
abstract class TemperatureSensor
abstract class HumiditySensor 5) **_Spezifikation/Teil-Implementation:_**
abstract class SpeedSensor
Erzeugen und Teil-Implementieren sie eine der folgenden Abstrakten Kind-Klassen von Sensor analog zur Klasse PressureSensor:
6) Implementation: Implementieren sie 2 Konkrete Klassen für zwei Modelle der von ihnen in Aufgabe 5 spezifizierten Abstrakten Klasse.
abstract class TemperatureSensor
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. abstract class HumiditySensor
Fileformat: jede Zeile ist Comma Separated Value (CSV) d.h. sowas wie <zeitstempel>,<measurment>,<unit>,<name of sensor>. 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. abstract class SpeedSensor
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. 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.

View File

@ -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 */
}
}

View File

@ -0,0 +1,3 @@
out
.idea
*.iml

View File

@ -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<Zeitformat> 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");
}
}
}

View File

@ -0,0 +1,7 @@
package com.doerzbach;
public final class Uhrzeit {
static boolean entspricht(Zeit zeit1,Zeit zeit2){
return zeit1.equals(zeit2);
}
}

View File

@ -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;
}
}

View File

@ -0,0 +1,8 @@
package com.doerzbach;
public abstract class Zeitformat extends Zeit{
public Zeitformat() {
}
public abstract void zeitAusgabe();
}

View File

@ -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);
}
}

View File

@ -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());
}
}