PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Stilfrage Java


ethrandil
2003-06-05, 21:54:41
Hiho,
ich habe ein kleines Datenbankprogg. geschrieben.
Es gibt nun zB Objekte des Typs Person, welches in der Datenbank irgendwie gespeichert ist.
Und ein Objekt von Typ BDatenbank, welches mir per getPersonPerName("Ethrandil") ein Person-Objekt liefert.

Eine andere möglichkeit wäre, Person beim Konstruieren die BDatenbank zu übergeben, und dann mit Person.createFromName("Ethrandil") zu initialisieren.

Was ist besserer stil, hübscher, übersichtlicher?


Person eth = BDatenbank.getPersonPerName("Ethrandil");


Person eth = new Person(BDatenbank);
eth.createFromName("Ethrandil");

Captain America
2003-06-05, 22:41:52
Die erste Version mit der Factory Methode, die scheint sicherer zu sein, da wenn du ein Objekt ohne Exception kreiert hast, sicher sein kannst, dass es bereit ist benutzt zu werden.

Ansonsten schwer zu sagen mit paar Zeilen Code weil ich nicht weiss in wie weit es erweiterbar sein muss etc.

micki
2003-06-06, 13:27:17
mit create suggerierst du mir, dass du sie erstellst
mit get sugerrierst du mir dass du eine erhällst.

//somit ist der code für mich nicht so bewertbar (hättest du net //geschrieben dass du eine person in beiden fällen aus der db hollst).

ich würde so
Person eth = BDatenbank.Person("Ethrandil");
eine person aus der datenbank heraushollen (zeiger aufs objekt)

weil..
.. die person nicht die funktionen der datenbank wissen sollte, in die sie gesteckt wird, denn es konnte sein, dass sie in zwei datenbanken mal rein muss, dann wüste man die klasse umschreiben, das wäre nicht generisch.
..die datenbank schliesslich die verwaltung machen sollte, dafür sind die Container ja eigentlich da, man würde ja auch nicht eine class Glass erstellen, dass sich der person gibt oder wieder entnimmt.

MfG
micki




naja, aber wie gesagt, ich

zeckensack
2003-06-09, 21:05:06
Original geschrieben von ethrandil
Hiho,
ich habe ein kleines Datenbankprogg. geschrieben.
Es gibt nun zB Objekte des Typs Person, welches in der Datenbank irgendwie gespeichert ist.
Und ein Objekt von Typ BDatenbank, welches mir per getPersonPerName("Ethrandil") ein Person-Objekt liefert.

Eine andere möglichkeit wäre, Person beim Konstruieren die BDatenbank zu übergeben, und dann mit Person.createFromName("Ethrandil") zu initialisieren.

Was ist besserer stil, hübscher, übersichtlicher?


Person eth = BDatenbank.getPersonPerName("Ethrandil");
Das sollte IMO, wie micki schon sagte, eine Referenz auf das in der Datenbank enthaltene Objekt liefern, und nichts erzeugen. Ein Objekt erzeugt man so:
Person eth=new Person("Ethrandil");
:D

Person eth = new Person(BDatenbank);
eth.createFromName("Ethrandil");

Gegenvorschlag:
Person eth;
if (BDatenbank.person_exists("Ethrandil"))
{
eth=BDatenbank.get("Ethrandil");
}
else
{
eth=new Person("Ethrandil");
BDatenbank.insert(eth);
}

Das müßte man aber noch optimieren :D

ethrandil
2003-06-09, 21:25:07
:bäh:
wennschondennschon:

Person eth;

eth=BDatenbank.getPerson("Ethrandil");

if(eth == null){
throw new PersonNotFoundException("failed to get Person from Database");
}

oder gleich:

Person eth;
try{
eth = BDatenbank.getPerson("Ethrandil");
} catch(PersonNotFoundException pnfe){
//Exceptionhandling
}


Mhhh nenene moment mal ...
was ist der Unterschied zwischen .get(name) und .getPerson(name) ??
.get kann ich schlecht machen, da es auch zB .getBuch(titel) gibt. 2 gets geht nicht.

Was ist denn eigentlich da an namensgebungen 'guter stil', wenn eine Funktion eines Objektes Datenbank ein Objekt bastelt, das aus der Datenbank kommt?

zeckensack
2003-06-09, 22:42:18
Original geschrieben von ethrandil
:bäh:
wennschondennschon:
<snip>
oder gleich:
<snip>Mit diesen Feinheiten von Java in Bezug auf Referenzen kenne ich mich nicht gut genug aus, sonst hätte ich wohl auch die Variante "Prüfe auf NULL-Pointer" vorgeschlagen :)
Zumindest würde ich es unter C++ so machen :naughty:

Mhhh nenene moment mal ...
was ist der Unterschied zwischen .get(name) und .getPerson(name) ??
.get kann ich schlecht machen, da es auch zB .getBuch(titel) gibt. 2 gets geht nicht.Hö? Du kannst dir doch die Namen der Funktionen frei aussuchen???
Na, sei's drum, wenn es getBuch schon gibt, dann ist getPerson wohl angemessen.
Was ist denn eigentlich da an namensgebungen 'guter stil', wenn eine Funktion eines Objektes Datenbank ein Objekt bastelt, das aus der Datenbank kommt? Eine solche Funktion sollte IMO, wenn sie tatsächlich ein neues Objekt bastelt, createPerson heißen. Wenn es die Aufgabe der Funktion ist, ein in der Datenbank vorhandenes Objekt als Vorlage zu benutzen, dann würde ich wohl duplicatePerson, aka copyPerson wählen.
Aber ich halte das immer noch für falsches Design, ganz ab von der Namensgebung der Funktionen. Ein Container sollte keine Objekte erzeugen. Ein Container muß auch nicht zwingend wissen, welche Sorte Objekt in ihm gespeichert ist.

Der Besitzer des Containers sollte dies wissen. Das wäre der Template-Ansatz von C++, das ganze läßt sich aber auch mehr oder weniger elegant mit Vererbung lösen. Dazu deklariert man ein Basisobjekt, meinetwegen 'Object', und schreibt den Container so, daß er nur mit 'Object' umgehen kann. Die eigentlichen Nutzdaten speichert man dann in Klassen die von 'Object' erben, dadurch lassen sie sich dann automatisch in den Container stecken.

getPerson, getBuch, etc entfallen bei diesem Ansatz komplett. Um mehrere Datentypen verwalten zu können, legt der Benutzer dann entweder mehrere Container an
(vgl:std::list <Person> person_container;
std::list <Buch> buch_container;),
oder die Daten-Objekte brauchen RTTI in irgendeiner Form.