Klassen für Objekt richtig erstellen

Fohnbit

Top Contributor
Hallo!

Ich habe eine Stromzählerabfrage über ModbusRTU programmiert.
Nun möchte ich meinen Code "richtig" in Klassen und Objekten aufteilen.

Es gibt 2 Zähler:
3-Phasig
1-Phasig

Jeder dieser Zähler hat unterschiedliche Baudsettings sowie Modbus Einstellungen. Die Ausgaben (Watt, Volt, ...) soll aber für beide gleich sein.
Die Zähler geben folgende Daten zurück:
Voltage
Current
Power
Volt Amps
Power Factor
Frequency of Voltage
Import Power
Export Power

Ich habe bis dato das so einmal gelöst wie im Bild.

Jedoch in wie weit soll man die Objekte einzeln abbilden?
Ein Stromzähler hat:
1 oder 3 Phasen
Er hat 1 Adresse
Er hat serielle Einstellungen
Er hat 1 oder mehr Input Register Adressen

Association oder Aggregation ist mir auch noch nicht ganz klar.
 

Anhänge

  • Bildschirmfoto vom 2014-12-27 13:43:40.png
    Bildschirmfoto vom 2014-12-27 13:43:40.png
    75,9 KB · Aufrufe: 30

senior.weber

Mitglied
Hi,

Ich würde nur eine Klasse "SmartMeter" erstellen, in der alle Eigenschaften drin sind, inklusive der Phasen als Collection oder Array[3]. Der Einphasige gibt halt für .getPhase(0) seine Phase zurück, und null für 1 und 2 -

zB könnte die Klasse eine Methode haben "setupAsOnePhase()" der die Phasen befüllt -

phases[0] = new Phase(<values>)
phases[1] = null
phases[2] = null

Man könnte dann noch einen SmartMeter1Phase als Klasse ableiten, und aus Conveniencegründen sowas wir "getPhase()" implementieren, aber eigentlich ist das Blödsinn - du müsstest in der Folge ja immer erstmal checken "instanceof Smartmeter1Phase" oder so.

Diese Vorgehensweise hat imo den Vorteil, dass du jeden SmartMeter gleich behandeln kannst im Code, und einfach über die Phasen iterieren kannst.
 

Flown

Administrator
Mitarbeiter
Also es gibt kein "richtiges" Modellieren. Aber für deinen Fall ist das eindeutig wie du es angehen solltest.

Wenn du gemeinsame Eigenschaften hast, die beide Stromzähler Teilen, dann bietet sich eine abstrakte Oberklasse an.

@senior.weber: Das ist nicht der richtige Ansatz! Wenn es ums Iterieren geht, dann kann man einfach eine Schnittstelle bieten mit Anzahl der Phasen und eine getter-Funktion, dann braucht man nicht mit null-Values zu arbeiten:

Bsp:
Java:
for(int i = 0; i < powerMeter.getPhaseCount(); i++) {
  powerMeter.getPhase(i);
}

Das ist wesentlich sauberer und die Zähler unterscheiden sich wirklich nur in dieser "Kleinigkeit".
 

senior.weber

Mitglied
Das ist wesentlich sauberer und die Zähler unterscheiden sich wirklich nur in dieser "Kleinigkeit".

ähm - warum soll er dann eine abstrakte Oberklasse bilden, wenn der einzige Unterschied der Unterklassen die Anzahle der Phasen ist?

@senior.weber: Das ist nicht der richtige Ansatz!

Es gibt 2 Fälle: 1 Phase und 3 Phasen - d.h. dein getPhaseCount() kann nur 1 oder 3 zurückgeben. Also auch irgendwie nicht der richtige Ansatz denke ich.

Ok null Werte abtesten ist auch nicht immer elegant, ich mache viel Groovy deshalb ist es üblich ein null (== groovy false) zurückzugeben - dann kann man mit
Code:
phases.get(1)?.getVolt()
oder so arbeiten.

Evt wäre es sinnvoll, so vorzugehen:

Code:
for( Phase p : meter.getPhases()){
   <p kennt seine Position (RST/123)>
}
 
Zuletzt bearbeitet:

consider

Mitglied
Hallo,

ich bin recht neu und habe mir dazu auch Gedanken gemacht. Mich stört, dass beim Lösungsansatz mit dem Array ordentlich Abhängigkeiten in der Klasse gesetzt werden. Meine Lösung ist sicher aber wieder viel zu kompliziert.

Wie wäre es, mit einer Sammlung für die Phasen als eigener Datentyp, welcher n der Lage ist, die Anzahl der Phasen, sowie eine Liste dieser zurückzugeben?

[Java]
package de.counter;

import java.util.ArrayList;

public class Phases {

private int phaseCount = 0;

private ArrayList<PhaseInterface> phases = new ArrayList<PhaseInterface>();

public void addPhase(final PhaseInterface phase) {
phases.add(phase);
phaseCount++;
}

public ArrayList<PhaseInterface> getPhases() {
return phases;
}

public int getPhaseCount() {
return phaseCount;
}
}
[/code]

Die hinzufügbaren Phasen könnten auch ein Interface implementieren, welches die Funktionen zum Aufrufen der einzelnen Felder
sicher stellt und wiedrum Abstraktion ermöglicht.

Java:
package de.counter;

public interface PhaseInterface {
	public double getVoltage();
}

Und dann die konkrete Implementation:

Java:
package de.counter;

public class Phase implements PhaseInterface {
	
	private double voltage;

	public Phase(double voltage) {
		this.voltage = voltage;
	}
	@Override
	public double getVoltage() {
		return voltage;
	}


}

Im Smartmeter würde ich dann einfach auf den Phasentyp delegieren um die Phasenliste zurück zu geben.
Zusätzlich würde ich, um die Art des Zählers schnell bestimmen und vergleichen zu können mit statischen Knstanten und einer internen Konstanten arbeiten.

Java:
package de.counter;

import java.util.ArrayList;

public class SmartMeter {
	public static final int SMETER1PHASE = 0;
	public static final int SMETER3PHASE = 1;
	private final int smType;

	private Phases phases;

	public SmartMeter(Phases phases) {
		this.phases = phases;

		if (phases.getPhaseCount() > 1) {
			this.smType = SmartMeter.SMETER3PHASE;
		} else {
			this.smType = SmartMeter.SMETER1PHASE;
		}
	}

	public ArrayList<PhaseInterface> getPhases() {
		return phases.getPhases();
	}

	public boolean is3Phase() {
		return smType == SmartMeter.SMETER3PHASE;
	}
	// und so weiter

}

Wenn ich das richtig sehe sind doch damit die Koplungen recht gering, da sie nirgends innerhalb der Klassen fast codiert sind.
SmartMeter erwartet lediglich ein Phases Objekt im Constructor und Phases in einer Methode einen InterfaceTyp Phase.

Ist die Herangehensweise so annehmbear, oder totaler Käse / Zu kompliziert / falsch gedacht / besser machbar (Letzteres isses ja immer).

PS: Darf man sowas hier im Forum? Also einen Lösungsvorschlag mit einer eigenen Frage kombinieren, oder ist das nicht so gerne gesehen?
 

Flown

Administrator
Mitarbeiter
Also das ist eine klare Vererbungshierarchie. Das analoge Beispiel dazu wäre: Fahrzeug -> LKW -> PKW

Ist nämlich das gleiche!

Aber wenn man nicht weiß in welchem Kontext dann diese Klassen verwendet werden, dann kann man nur spekulieren.
 

senior.weber

Mitglied
Hallo consider,

das ist imo im Ansatz OK - nur das PhaseInterface ist Käse-> es gibt ja nur eine konkrete Implementation - verstanden?

Für smType würde ich eine Enum Konstante oder einen String als Konstante nehmen, den kann man auch gleich so human-readable ausgeben im Zweifelsfall.

@Flown

Also das ist eine klare Vererbungshierarchie. Das analoge Beispiel dazu wäre: Fahrzeug -> LKW -> PKW
Ist nämlich das gleiche!

Das verstehe ich nicht in diesem Kontext - Wozu braucht man hier eine Vererbungshierarchie, wenn

1. die Kinderklassen *alle* Eigenschaften der Elterklasse hat und gleich implementiert
2. die Kinder sich nur in einem Merkmal unterscheiden

Um es für andere verständlich zu schreiben: ich denke du meinst

Code:
Fahrzeug -> LKW 
        |-> PKW
?
 
Zuletzt bearbeitet:

Flown

Administrator
Mitarbeiter
Entschuldige ich hätte das mit der Hierarchie besser hinschreiben sollen, danke für die Verbesserung.

1. die Kinderklassen *alle* Eigenschaften der Elterklasse hat und gleich implementiert
2. die Kinder sich nur in einem Merkmal unterscheiden

Gegenfrage was unterscheidet PKW von LKW? Trotzdem sind das zwei verschiedene Dinge, die eine eigene Klasse erfordern und im Normalfall getrennt behandelt werden würden. Das ist das gleich wie mit Stromzählern IMHO.

Aber egal, wie man es auch wendet und dreht, dass ist jetzt eine philosophische Frage, wie man das implementieren würde. Das ist eine Frage des Stils und, wie ich vorher erwähnt habe, eine Frage des Kontext, wie man die Klassen weiterverwenden wird.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
C Archiv für eigene Klassen Java Basics - Anfänger-Themen 9
T Vererbung Verschiedene Attribute für vererbte Klassen Java Basics - Anfänger-Themen 4
N Project layout eclipse ( seperate ordner für klassen ? ) Java Basics - Anfänger-Themen 1
E Best Practice Exaktes Rechnen mit (Pseudo-)Rationalen/Realen Zahlen. Operations Zuweisung für (eigene) Klassen Java Basics - Anfänger-Themen 3
H Suche Vergleichstabelle für die Klassen String und StringBuilder Java Basics - Anfänger-Themen 1
M xml log4j überschreiben für/in Java Klassen Java Basics - Anfänger-Themen 4
M Vererbung Methode nur für einige Klassen? Java Basics - Anfänger-Themen 8
K Klasse für andere Klassen sichtbar machen Java Basics - Anfänger-Themen 6
F Einfache Klassen für Datum und Zeit Java Basics - Anfänger-Themen 3
N Variable für alle Klassen Java Basics - Anfänger-Themen 6
S Bildschirm für alle Klassen erstellen Java Basics - Anfänger-Themen 8
F import Statement für Klassen die dem default Package zugeordnet sind? Java Basics - Anfänger-Themen 2
F Überbegriff für Klassen, Interfaces, enums? Java Basics - Anfänger-Themen 2
M Klassen für Textmenüs Java Basics - Anfänger-Themen 5
E Infos für alle Klassen eines Projekts Java Basics - Anfänger-Themen 5
V int-Wert für alle Klassen verfügbar machen Java Basics - Anfänger-Themen 7
L Klassen und Methoden für Dateivergleiche. Java Basics - Anfänger-Themen 4
L ArrayList für mehrere Klassen zugänglich Java Basics - Anfänger-Themen 10
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
M Abstrakte Klassen - Notation Java Basics - Anfänger-Themen 9
Detlef Bosau Nachladen von Klassen zur Laufzeit Java Basics - Anfänger-Themen 24
M Anonyme Klassen - Warum wird in der Konsole nichts ausgegeben? Java Basics - Anfänger-Themen 1
MoxMorris Einige Methoden aus verschiedenen Klassen nacheinander auszuführen läuft seltsam Java Basics - Anfänger-Themen 2
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
I 2 verschiedene Klassen mit gleichen Property vergleichen Java Basics - Anfänger-Themen 13
C Array von Klassen Java Basics - Anfänger-Themen 2
monsterherz 2 Klassen daher Probs mit dem Dateinamen Java Basics - Anfänger-Themen 9
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 9
I @Entity Klassen, Service Beans etc. aus einem Share Projekt beziehen? Java Basics - Anfänger-Themen 26
S IntelliJ geht alle Klassen durch Java Basics - Anfänger-Themen 9
I Gleiche Klassen und Methoden in unterschiedlichen Projekten nutzen Java Basics - Anfänger-Themen 2
T variablen klassen übergreifend Java Basics - Anfänger-Themen 12
N Klassen Methoden anderer Klassen aufrufen Java Basics - Anfänger-Themen 4
D Klassen Klassen Kommunikation Java Basics - Anfänger-Themen 12
Encera Auf Objekte aus anderer Klassen zugreifen Java Basics - Anfänger-Themen 20
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
M Andere Methoden in anderen Klassen aufrufen Java Basics - Anfänger-Themen 11
L Methoden in anderen Klassen nutzen Java Basics - Anfänger-Themen 6
D Klassen und Vererbung Java Basics - Anfänger-Themen 2
L Best Practice Annotierte Klassen im Classpath herausfinden Java Basics - Anfänger-Themen 1
P Mit dem Scanner Klassen aufrufen Java Basics - Anfänger-Themen 3
O Klassen Zusammenspiel zwischen 2 Klassen Java Basics - Anfänger-Themen 1
K Zweite Ausgabe von vererbten Klassen Java Basics - Anfänger-Themen 3
M Wie können Klassen nicht-materialisierte Attribute haben, die nur über get/ set-Mehoden simuliert sind? Java Basics - Anfänger-Themen 6
Speedrunner klassen aufrufen Java Basics - Anfänger-Themen 41
M Log4J (v2) nachträglich in allen Klassen hinzufügen Java Basics - Anfänger-Themen 9
D importieren eigener Klassen Java Basics - Anfänger-Themen 12
W Wo ist der Wurm in meinem Grundverständnis von Klassen? Java Basics - Anfänger-Themen 22
S Daten/Klassen/Packages richtig updaten!? Java Basics - Anfänger-Themen 2
alice98 Erste Schritte Liste erstellen ohne vorgefertigte Klassen Java Basics - Anfänger-Themen 1
S Objekte von zwei klassen in zwei verschiedene Textdateien schreiben Java Basics - Anfänger-Themen 5
elsaaaaaa Wochentag als String ausgeben mit JDK Klassen Java Basics - Anfänger-Themen 6
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
Z Mehtode bei Start des Programms ausführen (Klassen übergreifend) Java Basics - Anfänger-Themen 12
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
TimoN11 Java Klassen Global einbinden Java Basics - Anfänger-Themen 1
B Inventar als einzelne Klassen anlegen? Java Basics - Anfänger-Themen 12
G Java Klassen und Instanzmethoden Java Basics - Anfänger-Themen 15
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 3
S Klassen instanziieren und verwenden von Getter und Setter Java Basics - Anfänger-Themen 4
B Variablen Variablen übertragen ohne Klassen Java Basics - Anfänger-Themen 5
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
H Methoden in großen Klassen gruppieren oder auslagern? Java Basics - Anfänger-Themen 10
G Abstrakte Klassen Java Basics - Anfänger-Themen 11
Y Klassen Klassen und Objekte Java Basics - Anfänger-Themen 3
Y Klassen Klassen und Objekte mit set und get Java Basics - Anfänger-Themen 0
A Generischen Klassen Java Basics - Anfänger-Themen 8
A Vererbung Klassen im Bezug auf Auto´s Java Basics - Anfänger-Themen 18
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
A Klassen Vererbung und zusätzliche Unterklassen Java Basics - Anfänger-Themen 23
J 2 klassen benutzen Java Basics - Anfänger-Themen 5
A Klassen und methoden Java Basics - Anfänger-Themen 15
A Bankweverwaltung mit Klassen und Methoden Java Basics - Anfänger-Themen 14
J Klassen Problem Java Basics - Anfänger-Themen 8
I Java Klassen "Graphics" und "MouseEvent" kombinieren Java Basics - Anfänger-Themen 7
I Klassen als Datentyp nutzen? Java Basics - Anfänger-Themen 11
M Aufsplitten von Methoden in andere Klassen Java Basics - Anfänger-Themen 2
M (Sehr großes Problem) Listen als static in anderen Klassen verwendet Java Basics - Anfänger-Themen 12
C Klassen objektorientiert aufteilen Java Basics - Anfänger-Themen 6
hello_autumn Klassen Anzahl sowie die Anzahl der Junit Tests ermitteln? Java Basics - Anfänger-Themen 8
A Auf Eigenschaften von Objekten anderer Klassen zugreifen Java Basics - Anfänger-Themen 5
F Klassen und Pakete Projektübergreifend (Eclipse) Java Basics - Anfänger-Themen 6
V_Fynn03 Klassen Überweisungen tätigen und einzahlen mit 2 Klassen Java Basics - Anfänger-Themen 1
W Abarbeitungsreihenfolge Anonyme Klassen Java Basics - Anfänger-Themen 2
V_Fynn03 Bruchrechner programmieren (2 Klassen) Java Basics - Anfänger-Themen 9
D OOP- Eine Klasse in mehrere Klassen aufteilen Java Basics - Anfänger-Themen 7
J Problem mit Array: 2 Klassen Java Basics - Anfänger-Themen 2
W Frage zu anonymen Klassen Java Basics - Anfänger-Themen 4
Curtis_MC Parameter-Übergabe bei Klassen und Methoden Java Basics - Anfänger-Themen 12
E Klassen implementieren Java Basics - Anfänger-Themen 94
T Interfaces in erbenden Klassen Java Basics - Anfänger-Themen 2
C Methoden/Klassen Übergabewerte Java Basics - Anfänger-Themen 8
C Java Klassen/Methoden/Übergabeparameter Java Basics - Anfänger-Themen 4
L Wie geht man bei mehreren Action Klassen vor? Java Basics - Anfänger-Themen 0
P Datentypen, Klassen, Operatoren, Wrapperklassen Java Basics - Anfänger-Themen 2
L Wie teilt man ein Programm in vernünftige Klassen ein? Java Basics - Anfänger-Themen 10
T Klassen Denkfehler im Klassen "dynamisch" instanzieren? Java Basics - Anfänger-Themen 4
P Zugriff auf Variablen anderer Klassen in Greenfoot Java Basics - Anfänger-Themen 1
A Methode, Klassen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben