Seite 1 von 1

OOP: Weiß die Dose in welcher Schublade sie liegt???

Verfasst: Montag 12. Juni 2006, 13:16
von jens
Ich hab gerade mal ein grundsätzliche Frage... Bisher hab ich Klassen nie so richtig als Objekte angesehen, die Daten/Dinge repesäntieren. Deswegen weiß ich nicht so genau wo welches Attribut/Methode hingehört.

Mal ein Beispiel:

Ich hab folgende Hirachie:
  • 1. Ebene: Schreibtische
    • 2. Ebene: Schubladen
      • 3. Ebene: Dosen
Also ich hab drei Klassen für die drei Objekte. Die Daten sollen in eine DB geschrieben werden. Die Verknüpfung erfolgt über die IDs.
Ich würde sagen der Klassische Fall.

Wo Kommen die Attribute parent_id hin und wo die Methoden save_to_db() ???

Ich wollte das so machen, das jede Klasse (Schreibtisch, Schublade, Dose) die Methode save_to_db() bekommt.

Nun gibt es mehrere Möglichkeiten:

1. Ich rufe Schreibtisch.save_to_db() auf. Der Schreibtisch wird in die DB eingetragen und bekommt eine ID, die ich der nächsten Methode mitgebe, also: Schublade.save_to_db(ID). Die Schublade speichert sich dann in die DB und vermerkt die parent_id... usw...

2. Jedes Objekt hat das Attribut parent_id welches bei der Instanzierung mitgegeben wird. Bei dem Aufruf der save_to_db()-Methode braucht man die IDs also nicht übergeben...

3. Nicht die Dose hat eine Methode save_to_db(), sondern die Schublade speichert die Dose in die DB. Von daher muß die Dose garnicht wissen in welcher Schublade sie liegt...

Welche Variante ist die "Beste" ???

Verfasst: Montag 12. Juni 2006, 13:25
von N317V
Ich würde mir hierzu zwei Fragen stellen:

1. Muss die Dose das überhaupt wissen?
2. Kann die Dose nicht einfach die Schublade fragen, welche sie ist?

HTH

Verfasst: Montag 12. Juni 2006, 13:39
von jens
N317V hat geschrieben:2. Kann die Dose nicht einfach die Schublade fragen, welche sie ist?
Das wäre auch eine Möglichkeit. Aber dann müste ich die Schublade der Dose übergeben... Also im Grunde übergebe ich dann Schublade.self an dose.__init__() die es dann als self.parent "speichert"???

Verfasst: Montag 12. Juni 2006, 14:45
von Joghurt
Ich würde den Schreibtisch alle Schubladen speichern lassen. Danach ruft er für jede Schublade die save_to_db() Methode auf. Diese speichert dann alle Dosen und ruft für jede Dose die save_to_db() auf. Etc. pp.

Verfasst: Montag 12. Juni 2006, 15:53
von N317V
... und der Schreibtisch hat ein Inhaltsverzeichnis aller Schubladen und jede Schublade ein Inhaltsverzeichnis aller Dosen.

Verfasst: Montag 12. Juni 2006, 16:11
von Joghurt
N317V hat geschrieben:... und der Schreibtisch hat ein Inhaltsverzeichnis aller Schubladen
Äh, nein. Wozu sollte er? Es reicht doch, wenn er eine Liste aller seiner Schubladen hat.

Verfasst: Montag 12. Juni 2006, 16:14
von N317V
@Joghurt: Das meinte ich.

Im Prinzip kommt es jedoch auf die konkreten Anforderungen an. Unter Umständen kann es auch viel sinnvoller sein, wenn tatsächlich die Dose weiß in welcher Schublade in welchem Schreibtisch sie sich befindet. Die Dose also eine Art "Bewusstsein" ihrer Umgebung hat. Sowas wird aber leicht unsauber, weil man in der Regel diese Information doppelt vorhalten muss, sonst weiß zwar die Dose wo sie ist, aber die Schublade kann nichts über ihren Inhalt sagen.

Verfasst: Freitag 16. Juni 2006, 15:00
von Mad-Marty
Ihr macht euch die bewertung imo zu einfach.

Rein objektorientiert, wüsste der schreibtisch seine schubladen, die schubladen ihren inhalt.

ABER: Wenn wahrscheinlich ist das du oft von Dose auf Schublade schliessen musst, ignoriere das und speichere es eben.

Denn es nützt dir alles nichts, wenn du um an die informationen zu gelangen über 10.000 elemente iterieren musst (LANGSAM!).

An manchen stellen musst du eben die regeln etwas anders auslegen, oder das gesamtkonzept ändern um zu schnellen code zu gelangen.

(Und nein, die finale entscheidung kann dir keiner abnehmen.)

Verfasst: Freitag 16. Juni 2006, 15:06
von jens
Also 10.000 Elemente hab ich sicher nicht ;)

In Wirklichkeit geht es mit um PyLucid's module admin:
https://opensvn.csie.org/traccgi/PyLuci ... e_admin.py

Da hab ich folgendes:
  • Modul/Plugin
    • Methode
      • interne Seite
Ich weiß nicht, aber z.Z. sind das vielleicht so 50 Elemente... Also nicht wirklich viel ;)