Verwaltung Kundenspezifische Einstellungen

Status
Nicht offen für weitere Antworten.

eskimo328

Aktives Mitglied
In unserer Firma haben wir eine Java-Swing Anwendung (mobiles Außendienstsystem zur Auftragserfassung), die mittlerweile von mehrere Kunden genutzt wird. Jedes Kunde hat sonderwünsche.
So müssen an diversen Stellen in der Anwendung zwischen Kunden unterschieden werden, welcher Kunde was darf oder welche Einstellung hat.

Bisher wird das folgendermaßen gelöst:
In der Klasse KundenSettings wird definiert welcher Kunde was darf und an der entsprechenden Stelle wird dann abgefragt ...

Java:
if(KundenSettings.EINSTELLUNG1())
    // doSomething ...

Java:
public class KundenSettings
{
	private static KundenSettings INSTANCE = new KundenSettings();
	
	/**
	 * Beschreibung EINSTELLUNG1;
	 */
	private boolean EINSTELLUNG1;

	/**
	 * Beschreibung EINSTELLUNG2;
	 */
	private boolean EINSTELLUNG2;

	// ...
	
	private KundenSettings()
	{
		// kundenabhaengige settings
		switch (GeneralInfo.getKunde())
		{
			case KUNDE_A
				this.EINSTELLUNG1 = true;
				this.EINSTELLUNG2; = true;
				break;
			
			case KUNDE_B
				this.EINSTELLUNG1 = false
				this.EINSTELLUNG2; = true;
				break;
		}
	}
	
	public static boolean EINSTELLUNG1()
	{
		return KundenSettings.INSTANCE.EINSTELLUNG1;
	}
	
	public static boolean EINSTELLUNG2()
	{
		return KundenSettings.INSTANCE.EINSTELLUNG2;
	}
}

Jedoch wächst die Klasse KundenSettings mit jedem neuen Kunden und vorallem mit jeder neuen Einstellung. Mittlerweile umfasst sie 1500 Zeilen und ist recht unübersichtlich.

Habt ihr eine Idee wie man solche Einstellung noch verwalten kann? Bitte genauere Beschreibung und keine Aussagen wie: "wie wäre es mit XML?".
 
S

SlaterB

Gast
statt XML geht auch TXT, aber direkter Java-Quelltext ist auch nicht schlimmer, falls die Datei nicht zur Laufzeit bearbeitet werden muss,

----

'wie wäre es mit' Datenbank?

-------

gibt es irgendwelche Gemeinsamkeiten bei den Einstellungen?
kannst du z.B. einen Default-Wert konfigurieren und nur bei 10% der Kunden etwas anderes explizit definieren?

--------

kannst du Kunden zusammenfassen a la
case KUNDE_A:
case KUNDE_B:
case KUNDE_C:
this.EINSTELLUNG1 = true;
break;
case KUNDE_D:
case KUNDE_E:
case KUNDE_F:
this.EINSTELLUNG1 = false
break;

oder noch kürzer Listen/ Arrays anlegen:
einStellung1 = {KUNDE_A, KUNDE_B, KUNDE_C, ..}


diese Zusammenfassungen entweder für alle Einstellungen oder nur bestimmte Merkmale
 

eskimo328

Aktives Mitglied
Die Einstellungen werden vom Entwickler einmalig gesetzt. Die werden dann beim Programmstart 1 Mal geladen.
Eine Datenbanklösung halte ich nicht für sinnvoll.
Bisher sind es ca. 100 solcher Einstellungen. Also 100 Attribute und 100 entsprechende statische Methoden, über welche man die Attribute abfragen kann. Zudemm hat jedes Attribut einen Kommentar, dass man auch weiß, welches Attribut was macht. Dami kommt man auf ca 1500 Zeilen Code.
Es wird nicht für jeden Kunden jede Einstelung konfiguriert. Nur die Einstellungen die abweichen. Somit sind bei jedem Kunden bisher ca. 20-40 Einstellungen zu setzen.
 

Landei

Top Contributor
WTF?

Normalerweise macht man sowas mit einer properties-Datei (oder hier besser zweien: eine für den "Standard" und eine für den speziellen Kunden), und die Properties-Klasse nimmt dir schon viel Arbeit ab. Vom Umfang her sind 40 Zeilen auch nicht zuviel. Im Java-Code finde ich sowas grau! en! haft!
 

eskimo328

Aktives Mitglied
also angenommen ich habe eine settings-default.ini und eine settings-kundea.ini und eine settings-kundeb.ini

da steht denn zb drinnen:

Code:
EINSTELLUNG1=true
EINSTELLUNG2=false

wie mache ich es mit der beschreibung der einstellungen? bisher habe ich einen javadoc kommentar: /** ... */
ich möchte ja, dass jedes attribut irgendwie beschrieben wird, sodass man was für was jede einstellung überhaupt gut ist.

was haltet ihr von etwas in dieser richtung:

[XML]
<settings>
<setting>
<key>EINSTELLUNG1</key>
<value>false</value>
<description>Beschreibung der einstellung1 ...</description>
<value kunde="A">true</value>
<value kunde="C">true</value>
</setting>
<setting>
<key>EINSTELLUNG2</key>
<value>true</value>
<description>Beschreibung der einstellung2 ...</description>
<value kunde="A">false</value>
</setting>
</settings>
[/XML]
 

Dragonfire

Bekanntes Mitglied
Wie sieht es denn mit einem objektorientierten Lösung aus?

Man könnte doch einfach für jede Einstellung ein Objekt erzeugen,
jeder Kunde hält eine Referenz auf die Einstellungen die ihm gestattet sind
auszuführen.

Bei der if-Anweisung überprüft man dann einfach,
ob der aktuelle Kunde das Einstellungs-Objekt hat/referenziert.

Diese Lösung hätte den Vorteil,
dass man auch zur Laufzeiten die Rechte ändern kann.
Des weiteren könnte ein Einstellungsobjekt eine Liste alle Kunden haben
die gerade diese Objekt referenzieren (wobei ich mir nicht sicher bin,
ob das guter Programmierstil ist).
 
S

SlaterB

Gast
if (Einstellungen.isEinstellung1(kunde))

if (Einstellungen.Einstellung1.contains(kunde))

if (kunde.has(Einstellungen.Einstellung1))

das ist doch alles Jacke wie Hose ;)
 

tme

Aktives Mitglied
Für mich sieht das wie ein Ruf nach einem Repository aus. Wir lieferten dafür eine (üblicherweise read-only verbundene) Datenbank mit den programmweit gesetzten, aber nichtsdesdotrotz pflegebedürftigen Einstellungen und Grundkonfigurationen aus. Dazu gehören z.B. auch GUI-Festlegungen, es lassen sich die Designs der GUI-Komponenten dort hinterlegen. Diese werden dann zur Runtime geladen und die Komponenten entsprechend der Repository-Einstellungen angezeigt.

Ein Repository kann eine oder mehrere wie auch immer formatierte Dateien, eine Datenbank oder jede andere strukturierte Hinterlegung von Daten sein.

Thomas
 
S

SlaterB

Gast
war bezogen auf Dragonfire's Vorschläge wie 'Man könnte doch einfach für jede Einstellung ein Objekt erzeugen'
 

Dragonfire

Bekanntes Mitglied
Aber wär meine Lösung nicht ein wenig dynamischer und würde weniger Codeänderungen
zur Folge haben?
Man könnte einfach in der Klasse "KundenSetting" eine HashMap mit allen Einstellungsobjekten anlegen, in der man dann neue Einstellungen einfügt.

Man müsste dann dem jeweiligen Kunden immer nur die Objekte hinzufügen;
aus der Hash auslesen und übergeben.

Das einzige was anderes ist als zum bisherigen Entwurf,
dass man dann keiner getter Methoden mehr braucht,
sondern nur den String ;)

Im Endeffekt habt ihr aber recht,
ist eigentlich nichts anderes ...
 

Landei

Top Contributor
also angenommen ich habe eine settings-default.ini und eine settings-kundea.ini und eine settings-kundeb.ini

da steht denn zb drinnen:

Code:
EINSTELLUNG1=true
EINSTELLUNG2=false

wie mache ich es mit der beschreibung der einstellungen? bisher habe ich einen javadoc kommentar: /** ... */
ich möchte ja, dass jedes attribut irgendwie beschrieben wird, sodass man was für was jede einstellung überhaupt gut ist.

Hast du gelesen, was ich geschrieben habe? Jeder Kunde bekommt seine eigene Properties-Datei (und es gibt noch einen "Master" mit den default-Werten). Halte ich immer noch für die beste Variante.
 

eskimo328

Aktives Mitglied
wenn ich denn die variante mit der properties datei verwende, hat es vorteile die properties im xml format zu speichern? oder ist es grad egal?
 
S

SlaterB

Gast
XML ist genau dann gut, wenn es Sinn macht (z.B. komplexe Datenstrukturen mit vielen Regeln wie Anzahl Subelemente) oder wenn die Verarbeitung es zwingend erfordert,
in diesem einfache Falle kannst du auch das Properties-Txt-Format verwenden:
x=true
y=true
z=false
 

eskimo328

Aktives Mitglied
wenn man die Klasse java.utils.Properties und dem xml format nutzt, wird folgende dtd vorgegeben: http://java.sun.com/dtd/properties.dtd

[XML]
<!--
Copyright 2006 Sun Microsystems, Inc. All rights reserved.
-->

<!-- DTD for properties -->

<!ELEMENT properties ( comment?, entry* ) >

<!ATTLIST properties version CDATA #FIXED "1.0">

<!ELEMENT comment (#PCDATA) >

<!ELEMENT entry (#PCDATA) >

<!ATTLIST entry key CDATA #REQUIRED>

[/XML]

das ist ja nicht wirklich komplex. also lohnt es sich nicht wirklich xml zu nutzen. da ist das einfache txt-formaut fast noch übersichtlicher denke ich !?!
 

eskimo328

Aktives Mitglied
habe nun mal eine Variante umgesetzt. was haltet ihr davon? Habt ihr noch Verbesserungsvorschläge?

1. eine properties datei mit den default werten: kunde_default.properties
Code:
#  Kommentar Einstellung1
EINSTELLUNG1 = false

#  Kommentar Einstellung2
EINSTELLUNG2 = true

2. im gleichen Stil gibt es pro Kunde eine Properties Datei in dem nur noch die Keys mit den zugehörigen Werten stehen, die von den defaults abweichen.

3. dann gibt es eine enum Klasse in der die Keys stehen (ich verwende ungern String)
Java:
public enum KundenSettingKeys
{
	EINSTELLUNG1,
	EINSTELLUNG2,
	...;
}

4. Eine solche Property wird wie folgt abgefragt
Java:
if(KundenSettings.getProperty(KundenSettingKeys.EINSTELLUNG1))
...

5. Hier wird alles initialisiert und hier steckt die getProperty() MEthode:
Java:
public class KundenSettings
{
	private static KundenSettings instance = new KundenSettings();
	private Properties propertiesDefault;
	private Properties propertiesKunde;
	
	private KundenSettings()
	{
		/* load properties with default values */
		loadDefaultProps();
		
		/* load properties */
		loadKundenProps();
	}
	
	/**
	 * load default values from "manis_default.properties"
	 */
	private void loadDefaultProps()
	{
		propertiesDefault = new Properties();
		
		URL inDefault = KundenSettings.class.getResource("manis_default.properties");
		
		try
		{
			propertiesDefault.load(inDefault.openStream());
		}
		catch (IOException e)
		{
			LM_Logger.printStackTrace(e, this);
		}
	}
	
	/**
	 * load kundenspecific values 
	 */
	private void loadKundenProps()
	{
		propertiesKunde = new Properties(propertiesDefault);
		
		int kundenNr = // getKundenNr();
		
		URL inDefault = KundenSettings.class.getResource("kunde_"+String.valueOf(manisNr)+".properties");
		
		try
		{
			propertiesKunde.load(inDefault.openStream());
		}
		catch (IOException e)
		{
			LM_Logger.printStackTrace(e, this);
		}
	}
	
	/**
	 * @param key
	 * @return boolean
	 */
	public static boolean getProperty(ManisSettingKeys key)
	{
		String property = instance.propertiesKunde.getProperty(key.name());
		
		if(property == null || property.length() <= 0)
			return false;
			
		return new Boolean(property);
	}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Verwaltung von sehr vielen Objekten Allgemeine Java-Themen 12
T User Verwaltung mit JPA Allgemeine Java-Themen 2
N Zentrale Verwaltung von erweiterbaren Konfigurationen? Allgemeine Java-Themen 5
S Pfad Verwaltung Allgemeine Java-Themen 3
M Kameradaten bzw. Einstellungen herausfinden Allgemeine Java-Themen 9
J GUI-Einstellungen mittels Preferences Allgemeine Java-Themen 6
M DYGraphen darstellen... fehlende Einstellungen Allgemeine Java-Themen 1
B Fehler beim Auslesen von Einstellungen. Zwei ähnliche Blöcke, nur eins geht. Allgemeine Java-Themen 5
M Einstellungen in JAR speichern Allgemeine Java-Themen 8
I Einstellungen für ein Programm speichern Allgemeine Java-Themen 5
E Welches Dateiformat für gespeicherte Einstellungen? Allgemeine Java-Themen 20
F Schlüsselworte Einstellungen dynamisch deserialisieren Allgemeine Java-Themen 5
E FF Einstellungen über Programm ändern? Allgemeine Java-Themen 7
L RMI Die richtigen Policy-Einstellungen oder einfach Signieren? Allgemeine Java-Themen 3
M Speichern von Einstellungen Allgemeine Java-Themen 13
Mr.Isaaaac Tomcat Proxy Einstellungen, hä? Allgemeine Java-Themen 3
T Drucken mit PrintJob und Einstellungen merken Allgemeine Java-Themen 3
K Java Einstellungen Allgemeine Java-Themen 2
E Nicht Business-Logik Daten also Einstellungen wo speichern? Allgemeine Java-Themen 2
M Gloable Einstellungen Allgemeine Java-Themen 7
M Passwörter in Einstellungen speichern Allgemeine Java-Themen 2
S Java Editor einstellungen Allgemeine Java-Themen 4
M JVM Einstellungen in JAR einbetten Allgemeine Java-Themen 2
W Einstellungen verwalten Allgemeine Java-Themen 31
DEvent In Mehrbenutzersystemen Einstellungen speichern Allgemeine Java-Themen 8
TheJavaKid Einstellungen speichern ohne eine Datei zu erstellen! Allgemeine Java-Themen 19
D Probleme mit dem Drucker Einstellungen ! Allgemeine Java-Themen 5
M java Einstellungen Allgemeine Java-Themen 5
M problem mit packages - falsche einstellungen? Allgemeine Java-Themen 2
K Einstellungen aus Windows und Linux ermitteln Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben