Objektanordnung - Was macht Sinn?

Unicate

Erfahrenes Mitglied
Hallo alle zusammen!

Ich möchte ein Programm schreiben, welches Kunden einer Firma verwalten kann.
Die Kunden können Privatpersonen sowohl als auch Firmen sein.
Kunden bekommen eine Kundennummer.

Meine Probleme:

Wenn ich die Firma als Kundenobjekt verwende(Eine Firma kann viele Personen haben) habe ich folgendes Problem:

Wenn nun eine Firma mehrere Ansprechpartner hat, ist das gut, da die Kundennummer dann in der Firma immer die gleiche ist.
Aber wenn nun ein Kunde ein Privatkunde ist, müsste ich für jeden Privatkunden eine extra Firma anlegen, damit jeder Privatkunde auch eine andere Nummer bekommt.

Andere Richtung:

Ich speichere Firmen in Personen (Jede Person kann eine Firma haben):

Da ich die Daten objektorientiert speichere wäre die redundanzfreiheit nicht gegeben (Da mehrere Personen dann die gleiche Firma haben könnten) und somit müsste ich bei Änderungen einer Firma
alle dieser Firma umschreiben.


Eine dritte Idee, die ich allerdings nicht sehr proffessionell finde:

Ich bau noch eine Kunde-klasse welche eine Kundennummer, den Kundentyp(Firma,Person) und das Objekt Firma bzw. Person enthält.




Was denkt Ihr darüber?
Habt Ihr eine bessere Idee?


Hier die zwei Klassen wie sie im Moment sind: (Firma hat viele Personen)
Firma:
Code:
public class Company {
	private String name;
	private String number;
	private List<Address> address;
	private List<Person> customers;
	.......
}
Person:
Code:
public class Person {
	private String title;
	private String firstname;
	private String lastname;
	private Map<String, String> email;
	private Map<String, String> otherPossibilities;	
	private Map<String,String> phonenumbers;
	.................
}
 
Wo ist das ein Problem? Eventuell kannst du von der Kundenklasse erben, und aus der geerbten eine Klasse für Instanzen für alle Privatkunden auf einmal machen. Aber wenn du sie zusammenwirfst nützt dir ein Verwaltungsprogramm auch recht wenig, das wirkt für mich wie eine Datenbank mit nur einem Satz.
 
Firmen haben mehrere Personen

Das heisst eigentlich müsste ich eine Liste mit Personen in die Klasse Firma einbinden.

Geht aber nicht da ich auch ab und an mal Privatkunden habe.

Vielleicht hab ich auch nicht richtig verstanden was du meintest, ist schon spät.

Ich schau's mir morgen nochmal an.
 
Soweit ich das weiß, sind Firmenkunden immer NUR Firmen und keine Angestellte. Deswegen weiß ich auch nicht, warum du drauf aus bist die Angestellten mit der zugehörigen Firma als Kunden zu referenzieren, das sind zwei Paar Schuhe. Natürlich kann ein Angestellter ein Kunde sein, aber dann als Privatperson, wenn es die Firmengeschäfte nicht betrifft. Sobald es um die Firmengeschäfte geht, ist die Firma der Kunde, nicht der Angestellte. Das muss man trennen.

Ich hab das mal so gelöst (Beispiel):
Kunde.java
Java:
package de.tutorials.unicate.kunden;

public abstract class Kunde {
	private String	email;
	private String	ort;
	private String	plz;
	private String	strasse;
	private String	telefon;

	public String getEmail() {
		return email;
	}

	public abstract String getName();

	public String getOrt() {
		return ort;
	}

	public String getPlz() {
		return plz;
	}

	public String getStrasse() {
		return strasse;
	}

	public String getTelefon() {
		return telefon;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public void setOrt(String ort) {
		this.ort = ort;
	}

	public void setPlz(String plz) {
		this.plz = plz;
	}

	public void setStrasse(String strasse) {
		this.strasse = strasse;
	}

	public void setTelefon(String telefon) {
		this.telefon = telefon;
	}
}

Firma.java
Java:
package de.tutorials.unicate.kunden;

import java.util.LinkedList;
import java.util.List;

public class Firma extends Kunde {
	private List<Angestellter>	angestellte;
	private Angestellter		ansprechpartner;
	private String				name;

	public Firma() {
		angestellte = new LinkedList<Angestellter>();
	}

	public void addAngestellter(Angestellter angestellter) {
		if(angestellte.contains(angestellter)) return;

		angestellte.add(angestellter);
		angestellter.setFirma(this);
	}

	public Angestellter[] getAngestellte() {
		return angestellte.toArray(new Angestellter[angestellte.size()]);
	}

	public Angestellter getAnsprechpartner() {
		return ansprechpartner;
	}

	@Override
	public String getName() {
		return name;
	}

	public void removeAngestellter(Angestellter angestellter) {
		angestellte.remove(angestellter);
		angestellter.setFirma(null);
	}

	public void setAnsprechpartner(Angestellter ansprechpartner) {
		if(ansprechpartner.getFirma() != this) { throw new RuntimeException(
				"Ansprechpartner ist kein Angestellter dieser Firma"); }

		this.ansprechpartner = ansprechpartner;
	}

	public void setName(String name) {
		this.name = name;
	}
}

PrivatPerson.java
Java:
package de.tutorials.unicate.kunden;

public class PrivatPerson extends Kunde {
	private String	nachname;
	private String	vorname;

	public String getNachname() {
		return nachname;
	}

	@Override
	public String getName() {
		return String.format("%s, %s", getNachname(), getVorname());
	}

	public String getVorname() {
		return vorname;
	}

	public void setNachname(String nachname) {
		this.nachname = nachname;
	}

	public void setVorname(String vorname) {
		this.vorname = vorname;
	}
}

Angestellter.java
Java:
package de.tutorials.unicate.kunden;

public class Angestellter extends PrivatPerson {
	private Firma	firma;

	public Firma getFirma() {
		return firma;
	}

	public void setFirma(Firma firma) {
		if(firma != null) {
			firma.addAngestellter(this);
		} else {
			if(getFirma() != null) {
				getFirma().removeAngestellter(this);
			}
		}

		this.firma = firma;
	}
}

Damit kann man nun sowohl Firmen als auch Privatpersonen als Kunden haben. Eine Privatperson kann aber auch ein Angestellter sein, somit ein Teil einer Firma, hat aber mit der Firma als Firmenkunde nix zu tun, sondern ist nur Beiwerk, kann aber in der Funktion als eigenständiges Individuum auch ein Kunde sein.

EDIT:
Mist, hab die Kundennummer vergessen, aber die kann man ja in der Kunden-Klasse locker einbauen.
 
Zuletzt bearbeitet:
Warum, Privatkunden haben ja auch Leute. (Mindestens der Einkäufer + Familie). Aber du betrachtest sie ja als Debitoren bzw. eventuell Kreditoren, da ist es doch vollkommen egal wer dort arbeitet, wichtig sind die Kundennummern, Daten (Adresse, Telefonnummer ect.), Einkäufe und wenn möglich auch Verkäufe. Die Einkäufe haben dann jeweils ein Datum, eine Rechnungsnummer, event. eine Beschreibung, und Waren die wiederrum Preis, Artikelnummer, MWSt., Kategorie ect. enthalten.

Oder verstehe ich dich ebenfalls falsch?
 
Warum, Privatkunden haben ja auch Leute. (Mindestens der Einkäufer + Familie). Aber du betrachtest sie ja als Debitoren bzw. eventuell Kreditoren, da ist es doch vollkommen egal wer dort arbeitet, wichtig sind die Kundennummern, Daten (Adresse, Telefonnummer ect.), Einkäufe und wenn möglich auch Verkäufe. Die Einkäufe haben dann jeweils ein Datum, eine Rechnungsnummer, event. eine Beschreibung, und Waren die wiederrum Preis, Artikelnummer, MWSt., Kategorie ect. enthalten.

Oder verstehe ich dich ebenfalls falsch?

Meinst du mich?
 
Danke erstmal für euer großes Interesse.

Wie ich drauf komme das eine Firma mehrere "Kunden" (!= Privatkunden) hat:

Ich z.B.arbeite ab und an mal für eine kleinere Internetfirma. Das sind 2 Leute in einer GbR.
Sie haben beide unterschiedliche Fachgebiete und ich mache für beide hin und wieder mal was.
Beide habe ein eigenes Büro mit unterschiedlichen Adressen.
D.h. wenn ich die Rechnung für den einen schreibe, möchte ich die nicht an den anderen schicken, ihm allerdings auch keine neue Kundennummer zuordnen müssen.

Sachen wie deine "Angestellter.java" wollte ich vermeiden da dadurch die Redundanzen entstehen können (wenn 2 angestellte/chefs/whatever einer firma zugehörig sind) von denen ich sprach.
(Und ich wollte einem Privatkunden mehrere Adressen zuweisen, was aber für mein Problem nicht zum Thema steht - wollt nur mal Klugscheissern;) )
 
Zuletzt bearbeitet:
Du wirst dich entscheiden müssen, wie du das trennen willst. Eigentlich müsstest du eine neue Kundennummer zuweisen, da du ja offensichtlich eine Person gezielt ansprechen möchtest. Natürlich kannst du die Firma nehmen und alle Mitarbeiter ebenfalls als Kunden eintragen, nur das macht keinen Sinn. Schöner wäre es, wenn du lediglich die Firma ansprichst, aber dann noch spezifizieren kannst, wen genau du ansprechen möchtest. Dann ist offiziell der Kunde die Firma, aber adressiert hast du einen Mitarbeiter. Das ist in meinen Augen aber nicht so ganz geschickt.

Du kannst ja mal was anderes versuchen. Wenn du einen Auftrag annimmst, dann müsstest du ja eigentlich den Auftrag als primäres Objekt verwenden und der Rest ist Referenz. In dem Auftrag kannste dann einen Ansprechpartner festlegen. Bei Privatpersonen wäre das die Person selbst oder wie in deinem Fall wäre der Kunde die Firma, aber der Ansprechpartner wäre je nach Auftrag entweder die eine Person oder halt die andere.

Wie gesagt, das wäre jetzt von einem Auftrag-Objekt betrachtet. Da legst du dann im Auftrag einen Kunden und einen Ansprechepartner fest. Dann hättest du das Problem gelöst.

EDIT:
Von welcher Redundanz sprichst du, ich sehe keine o.O Die Objekte werden referenziert und nicht kopiert oder verstehe ich da was falsch?
 
Zuletzt bearbeitet:
Zurück