Sinnvolles Software Design bei Eigenschaftsänderungen von Objekten

AndiMb

Mitglied
Hallo,

ich habe eine eher allgemeine Software Design Frage zum Eventhandling, hoffe aber trotzdem, dass mir jemand helfen kann.

Ich versuche mal das Problem allgemeinverständlich an einem Auto zu beschreiben. In meinen Fall wäre das Auto eine einfache Klasse, die mehrere Objekte der Klasse Bauteil enthält (Karosserie, Motor, usw.), welches wiederum mindestens ein Objekt der Klasse Material enthält. Für jede der drei Klassen kann der Preis bestimmt werden. Beim Material ist dieser einfach durch den Nutzer gesetzt, bei den anderen beiden Klassen (Auto, Bauteil) muss er aus den enthaltenen Objekten berechnet werden. Da der jeweilige Preis in einer GUI angezeigt werden soll, werden entsprechende Events bei Veränderungen verwendet und ausgelöst. Wenn man nun den Preis des Materials ändert, werden alle Bauteile darüber informert und berechnen den Preis neu. Dies wird an das Auto weitergereicht, was bedeutet, dass auch für das Auto der Preis neu berechnet wird. Allerdings wird das Auto mehrfach darüber informiert (sooft, wie es Bauteile aus dem veränderten Material enthält). Wenn nun wie in meinem Fall die Berechnung des Preises sehr aufwendig ist, wäre es wünschenswert, dass das Autoobjekt dies nur ganz am Ende macht, da die Zwischenwerte auch keinerlei Relevanz besitzen

Hat einer eine Idee wie man sowas sinnvoll realisieren kann.

Viele Grüße und vielen Dank im Voraus
Andreas
 

kaetzacoatl

Bekanntes Mitglied
Du wickelst das alles von hinten ab.
Also du informierst das Auto über die Veränderung,
dann fordert das Auto seine Teile auf ihren Preis neu zu
berechnen und ihn dann zurückzugeben.
 

Marco13

Top Contributor
Hmja, schwierig. Ein spontaner Gedanken (von

... Hier habe ich nochmal runtergescrollt: Ich wollte genau das schreiben, was kaetzacoatl geschrieben hat :D Aber wollte nachsehen, ob es vielleicht notwendig ist, dass die einzelnen Elemente auch Events werfen, weil sie quasi "unabhängig vom Auto" in GUI-Components angezeigt werden... Ist das der Fall? Vielleicht könnte man das trotzdem auf die von kaetzacoatl beschriebene Art machen, aber müßte sich dann überlegen, ob die Elemente vielleicht Events werfen, auf die zwar die GUI-Components hören, aber das Auto nicht...
 

AndiMb

Mitglied
Erstmal danke für die schnelle Antwort.

An sowas hatte ich auch schon gedacht. Nur wie erfährt dann das Bauteil, dass es den Preis wirklich neu berechnen muss. Ich möchte das natürlich nicht machen, wenn sich bei einem Bauteil mit einem anderen Material der Preis gar nicht geändert hat, denn auch für das Bauteil ist die Berechnung aufwendig. Zudem besteht das ursprüngliche Problem aus mehr als drei Hierarchieebenen, wobei die Anzahl eventuell sogar unerschiedlich sein kann.

In meinem Kopf sieht das Konzept so aus, dass man einmal die Hierarchie von unten her (Material) durchwandern muss, wobei jedes nur Objekt sich nur merkt, dass sich bei ihm was geändert hat. Anschließend muss dann die Hierarchie nochmal von oben her durchwandert werden. Aber wie ich das "von oben" nochmal auslöse ist mir noch nicht klar. Für eine statische Hierarchie mag das gehen. Aber es ist möglich, dass das Material dann wiederum aus verschiebenen Legierungselementen besteht und die Bauteile erst zu Baugruppen zusammengefasst werden, bevor sie an das Auto kommen.

Viele Grüße
Andreas
 
M

maki

Gast
Warum sollten Bauteile Preise berechnen?
Wurde sowas nicht mischen.

Zum traversieren von Bäumen kann man zb. in Post Order vorgehen.
 

kaetzacoatl

Bekanntes Mitglied
Ich dachte an sowas:
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

public class Auto {
	
	static Auto auto = new Auto();
	ArrayList<Teil> teile = new ArrayList<Teil>();
	
	public void update(Material m){
		for(int i = 0;i < teile.size();i++){
			if(teile.get(i).needUpdate(m))teile.get(i).update(m);
		}
	}

}
class Material implements ActionListener {

	@Override
	public void actionPerformed(ActionEvent arg0) {
		Auto.auto.update(this);		
	}	
	
}
interface Teil{

	boolean needUpdate(Material m);

	void update(Material m);
	
}
class BSP implements Teil{
	
	ArrayList<Teil> teile = new ArrayList<Teil>();

	@Override
	public boolean needUpdate(Material m) {
		for(int i = 0;i < teile.size();i++){
			if(teile.get(i).needUpdate(m))return true;
		}
		return false;
	}

	@Override
	public void update(Material m) {
		for(int i = 0;i < teile.size();i++){
			if(teile.get(i).needUpdate(m))teile.get(i).update(m);
		}		
	}
	
}
 
S

Spacerat

Gast
Geht alles mit dem Observerpattern auf ein Klasse "Preis" angewendet, wobei in diesem Fall nur Materialien ihren Preis haben. Problem dabei: verschiedene Materialien haben verschiedene Preise, Materialien gleichen Typs haben gleiche Preise. Für die Produktion von Materialien eignet sich also eine Factory (wer 'hätts gedacht? XD).
Dann geht man wie folgt vor:
Ändert man den Preis eines Materials, sollten sich auch gleichzeitig die Preise der Materialien gleichen Typs ändern. Materialien gleichen Typs erhalten also ein und dieselbe Instanz der Klasse Preis (per Factory geht das, fragt mal in der Kneipe :oops: Wirtschaft nach XD). Wird ein Material einem Bauteil hinzugefügt, registriert sich das Bauteil beim Preis des Materials als Observer und addiert den Wert zu seiner eigenen Preisinstanz hinzu (dieser würde dann logischerweise sofort auch übergeordnete Bauteile über sene Änderung informieren), beim Entfernen des Materials meldet sich das Bauteil bei dem Preis wieder ab und zieht den Wert von der eigenen Instanz entsprechend ab (übergeordnete Bauteile werden auch darüber informiert).
Wie aber publiziert man nun Preisänderungen? Recht einfach. Eine Änderung hat immer etwas mit einer Vorher- Nachherdifferenz zu tun. Für die Klasse Preis würde das bedeuten, dass sie ihre registrierten Bauteile auch genau nur darüber informiert. Kein grosses gerechne in den übergeordneten Objekten und alles in allem extrem performant. Wenn ich heut noch Zeit hab' setz' ich mich mal an ein KSKB.
 
S

Spacerat

Gast
Also für die Factory hat die Zeit jetzt nicht gereicht, das wird recht aufwändig. Dabei sagt man der Factory eigentlich nur, was benötigt wird und bekommt dann eine Instanz, die ihren Preis aus einer Map bekommt, das hat also weniger mit der Problematik des Themas zu tun.
Für den Rest hab' ich das mal gebaut:
Java:
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;

interface Observer {
	void update(double diff);
}

class Price {
	private final Collection<Observer> observer = new HashSet<>();
	private double value;

	public Price() {
	}

	public Price(Price price) {
		value = price.value;
	}

	public void setValue(double newValue) {
		double diff = this.value - newValue;
		this.value = newValue;
		for(Observer obs : observer) {
			obs.update(diff);
		}
	}

	public double getValue() {
		return value;
	}

	public void add(double value) {
		this.value += value;
		for(Observer obs : observer) {
			obs.update(value);
		}
	}

	public void addObserver(Observer obs) {
		for(Observer o : observer) {
			if(o == obs) {
				return;
			}
		}
		observer.add(obs);
		obs.update(value);
	}

	public void removeObserver(Observer obs) {
		observer.remove(obs);
		obs.update(-value);
	}
}

class Part {
	protected final Price price;

	protected Part(Price price) {
		this.price = price;
	}

	public Price getPrice() {
		return price;
	}
}

class AssemblyGroup extends Part {
	protected final List<Part> parts = new ArrayList<>();
	protected final Observer observer;

	protected AssemblyGroup() {
		super(new Price());
		observer = new Observer() {
			@Override
			public void update(double diff) {
				price.add(diff);
			}
		};
	}

	public final void addPart(Part part) {
		Price p = part.getPrice();
		p.addObserver(observer);
		parts.add(part);
	}

	public final void removePart(Part part) {
		Price p = part.getPrice();
		p.removeObserver(observer);
		parts.remove(part);
	}

	@Override
	public final Price getPrice() {
		return new Price(price);
	}
}

class Product extends AssemblyGroup {
	protected Product() {
		super();
	}

	// man kann hier noch explizit Methoden zum
	// adden und removen von AssemblyGroups
	// implementieren, muss man aber nicht.
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Sinnvolles skalieren von Werte-Set? Allgemeine Java-Themen 2
Zrebna Zuverlässiges Automatisiertes Testen im eigenem Software-Unternehmen aufsetzen - How to? Allgemeine Java-Themen 12
I In Java geschriebene Software nach Mac OS portieren Allgemeine Java-Themen 7
OnDemand Software Zertifizierung Allgemeine Java-Themen 4
Zrebna Wieviele Testfälle muss man hier schreiben? (Software Engineering) Allgemeine Java-Themen 13
Kirby.exe Software Entwicklung Allgemeine Java-Themen 9
Kirby.exe Software für Graphische Visualisierung Allgemeine Java-Themen 20
B Multiuser Software Allgemeine Java-Themen 3
L Nach dem Login // Java Desktop Software Allgemeine Java-Themen 7
W Software-Lizenzen Allgemeine Java-Themen 13
temi Fragen zur Software-Architektur Allgemeine Java-Themen 123
david19 Software AE über Domain laufen lassen Allgemeine Java-Themen 0
M JVM: Client Software Logging und Profiling aktivieren Allgemeine Java-Themen 1
G Job als Programmierer (Software oder Spiele Entwickler) Allgemeine Java-Themen 2
O Architektur für Software Allgemeine Java-Themen 14
K Java mit Software ausliefern, Securitybedenken? Allgemeine Java-Themen 4
wolfgang63 Code snipped Software Allgemeine Java-Themen 1
J Java Software Compare Files und Neue File erstellen Allgemeine Java-Themen 0
A Update Software programmieren Allgemeine Java-Themen 1
O Java Hardware Software Zeit Allgemeine Java-Themen 7
D Software entwicklen und verkaufen Allgemeine Java-Themen 1
OnDemand Software-Tracking Allgemeine Java-Themen 14
OnDemand Java Software verkauf untersagt Allgemeine Java-Themen 4
N Neue Software in Java 7 oder 8? Allgemeine Java-Themen 3
R Software ausliefern - Aber Wie? Allgemeine Java-Themen 10
R Installierte Software auslesen mit Java Allgemeine Java-Themen 3
L Software-Design: Kommunikation mit SerialPort (RXTX) Allgemeine Java-Themen 2
G Best Practices Software-Engineering‏ Allgemeine Java-Themen 3
G RXTX in proprietärer Software nutzen?! Allgemeine Java-Themen 10
A Sicherheit von Software Allgemeine Java-Themen 2
B Software Metriken für Java Allgemeine Java-Themen 36
F LGPL in kommerzieller Software Allgemeine Java-Themen 7
R Konzept eines Software-Rollout/Synchronisation via WebService Allgemeine Java-Themen 5
P Software schützen Allgemeine Java-Themen 8
R software implementierung Allgemeine Java-Themen 3
G Software fuer Auktionshaus Filmundo.de aber wie? Allgemeine Java-Themen 2
X Software soll einen Text vorlesen! Allgemeine Java-Themen 5
X Software schützen! DEMOVersion Allgemeine Java-Themen 12
D JDK fürGPL-Software? Allgemeine Java-Themen 6
S software zum zuschneiden von Bildern Allgemeine Java-Themen 2
C Software für Windows PC mit integierter Db oder Textdatei? Allgemeine Java-Themen 19
J Java Software schreiben? Allgemeine Java-Themen 4
P Bekannte Software in Java? Allgemeine Java-Themen 27
F Paket und Software Design Fragen. Allgemeine Java-Themen 5
M Chat-Software gesucht Allgemeine Java-Themen 3
T GPL Code inkommerzieller Software nutzen? Allgemeine Java-Themen 26
G Software für Java programmierung Allgemeine Java-Themen 5
Z Beipiel zu gut dokumentierten Software Allgemeine Java-Themen 3
B chat-software Allgemeine Java-Themen 5
T Soll ich meine Software als freeware zum download geben? Allgemeine Java-Themen 15
H Andere Software fernsteuern Allgemeine Java-Themen 7
H Software wartet? Allgemeine Java-Themen 11
J Meinung zum verwendeten Design Pattern Allgemeine Java-Themen 4
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
S ArrayList Design Allgemeine Java-Themen 4
S Interface Design von HookUp oder Callback Methoden für eigenes Framework Allgemeine Java-Themen 9
Kirby.exe Framework für Game Design Allgemeine Java-Themen 8
C WindowBuilder Design funktioniert nicht Allgemeine Java-Themen 0
M Diverse Design-Fragen Allgemeine Java-Themen 6
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
M OOP Design Pattern - "extends Observable implements Observer" Allgemeine Java-Themen 0
T OOP Fehler im Design Allgemeine Java-Themen 9
perlenfischer1984 Welches Design Pattern ist geegneit. Allgemeine Java-Themen 7
perlenfischer1984 Hilfe bei Design (Pattern) Allgemeine Java-Themen 5
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
R Parameter Adapter - Design Allgemeine Java-Themen 1
D Bezüglich Design meines Codes Allgemeine Java-Themen 1
D OOP Design Pattern für GUI - Datenbank Anwendung Allgemeine Java-Themen 1
S Java Design Frage Allgemeine Java-Themen 10
L OOP Klassen-Design (static oder nicht?) Allgemeine Java-Themen 3
P Auf die Anzahl der Joins achten beim WS design Allgemeine Java-Themen 1
M OOP Design Frage Allgemeine Java-Themen 2
J Domain Driven Design - Modellierungsfrage Allgemeine Java-Themen 3
F Welches Design Pattern? Allgemeine Java-Themen 3
H MVC Design Allgemeine Java-Themen 9
J Swing Eigenes Button-design Allgemeine Java-Themen 2
Q Kapselung Allgemeine Design- Frage Allgemeine Java-Themen 8
Z Design um boolsche ausdrücke zu speichern & auszuwerten Allgemeine Java-Themen 3
C Gutes Code Design (3 Schichten Modell) Allgemeine Java-Themen 19
D Design Stations-Gitter Allgemeine Java-Themen 4
M Public Static importRunning -> Bad Design oder ok ? Allgemeine Java-Themen 5
D [Drag&Drop] Design-Pattern-Frage Allgemeine Java-Themen 4
G Design Patterns für Programm Allgemeine Java-Themen 3
I Wie populär ist Design by Contract in Java und was haltet ihr davon? Allgemeine Java-Themen 5
Landei Design-Problem Formel-Parser Allgemeine Java-Themen 10
J Aktionen im State-Design-Modell Allgemeine Java-Themen 3
S Design Oberfläche Allgemeine Java-Themen 2
L Design-Frage: Platzierung der Save-Methode Allgemeine Java-Themen 3
G Domain Driven Design Model Allgemeine Java-Themen 14
G konkretes Domain Driven Design Aggregate Allgemeine Java-Themen 2
ruutaiokwu welches design pattern? frage an die oo-experten unter euch... Allgemeine Java-Themen 3
G Accordion Design Pattern Frage Allgemeine Java-Themen 2
hdi Hilfe beim Design (Stichwort OO, Pattern, ...) Allgemeine Java-Themen 11
B Design Problem Allgemeine Java-Themen 8
faulelotte Verständnisproblem Domain Driven Design Allgemeine Java-Themen 3
S Frage zum Design der Datenstruktur Allgemeine Java-Themen 10
D design gesucht - Angabe von zu ersetzenden substrings Allgemeine Java-Themen 2
D Design ohne Getter und Setter Allgemeine Java-Themen 8
D Design: on-the-fly-Parsing + Datenstrukturen Allgemeine Java-Themen 5
N Welches design pattern? Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben