Mutable container immer wieder neu übergeben?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

wenn Klasse A mit einer Liste arbeitet und diese Liste auch in Klasse B verwendet wird, reicht es dann nicht aus, diese Liste einmal an Klasse B zu übergeben?

Code: Alles auswählen

class A(object):
    def __init__(self, stuff):
        self.stuff = stuff

    def set_viewer(self, viewer):
        self.stuff_view = viewer

    def add_any(self, any_):
        self.stuff.append(any_)
        self.stuff_view()

class B(object):
    def __init__(self, content):
        self.content = content

    def show(self):
        print 'Tataa: {0}.format(self.content)

Code: Alles auswählen

In [25]: c = []

In [26]: a = stuff.A(c)

In [27]: b = stuff.B(c)

In [28]: a.set_viewer(b.show)

In [29]: a.add_any(1)
Tataa: [1]

In [30]: a.add_any(2)
Tataa: [1, 2]

In [31]: c.append(3)

In [32]: b.show()
Tataa: [1, 2, 3]
Vom Gefühl her möchte ich bei einer Änderung von 'stuff' diese veränderte Liste auch an 'b.show' übergeben obwohl 'b' mit derselben Liste wie 'a' arbeitet und somit eine Übergabe nicht wirklich nötig wäre.

Hintergrund ist folgender: Ich habe ein dictionary mit Ausdrücken zur Filterung von Terminen. Daneben gibt es eine Klasse, die mir unter anderem mit diesem dictionary den Inhalt zur Ansicht von Terminen aufbereitet und dann an die Anzeige weiterleitet.
Immer dann, wenn sich das dictionary ändert, wird dieses weitergereicht, damit ein neuer Inhalt zur Ansicht generiert werden kann. Und diese Übergabe ist ja eigentlich nicht nötig.

Ich hoffe, ich habe halbwegs erklären können, worum es mir geht... :wink:

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Ich bin jetzt nicht so der Experte, aber ich glaube nicht, dass es eine gute Idee ist, das so umzusetzen. Denn es wird ja nicht sofort zur Laufzeit offensichtlich, in welcher Instanz von A oder B jetzt die Liste verändert wird. Das kann m.M.n. ziemlich böse Nebenwirkungen haben, wenn zwei unterschiedliche Instanzen die selbe Liste bearbeiten.

Vom Stil her fände ich es besser, der Methode von A und B, die die Liste bearbeitet, die Liste mit zu übergeben, so à la

Code: Alles auswählen

A.add(list_, value)
B.show(list_)
Ausserdem
Explicit is better than implicit.
Es ist halt nicht sofort offensichtlich, dass sich etwas in zwei Klassen "automatisch" ändert. Deshalb würde ich die Änderung explizit jedem Objekt mitteilen. Schau dir mal das Visitor Pattern an, das könnte man für sowas verwenden

Frank
deets

Ich halte dein Beispiel fuer schlicht nicht realistisch genug, um daran eine Aussage zu treffen. Grundsaetzlich ist an geteilten Datenstrukturen nichts falsches. Ein Baum zB, der auf einem Knoten eine Methode "siblings" anbietet, und "children" tut gut daran, dazu dieselbe Datenstruktur zu verwenden.

Aber natuerlich gibt es genug Gelegenheiten, bei denen man nicht so vorgehen sollte.

Da musst du schon konkreter werden, was du *wirklich* willst.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Ok, ich versuch nochmal, das zu erklären:

Um Termineinträge anzuzeigen, gehe ich folgendermaßen vor:

1. PatternFactory erzeugt ein dictionary, das z. B. so

Code: Alles auswählen

{'title':
    {'not_': [], 'and_': ['Zahnarzt'], 'or_': []}
}
aussehen kann.
2. ContentFactory filtert mit einem solchen pattern passende Termineinträge und gibt diese dann zur Anzeige weiter.
Wenn sich das pattern nun ändert, wird ContentFactory darüber informiert, dort werden wieder Termine gefiltert und erneut zur Anzeige gebracht.

Grundsätzlich würde es ja reichen, ContentFactory nur über eine Änderung zu informieren. Denn dort liegt ja dasselbe pattern-dictionary wie in der PatternFactory. Eine erneute Übergabe müsste ja demnach nicht stattfinden.
Ich bin mir nicht ganz sicher, welcher Stil der bessere ist:
- Übergabe, damit klar ersichtlich ist, was geschieht, obwohl es nicht unbedingt nötig wäre oder
- keine Übergabe, weil eben nicht unbedingt nötig.

Wobei mein Gefühl auch eher zu dem tendiert, was frabron schreibt...

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich hab, wie schon im letzten Thread, immer noch nicht den Sinn hinter `not_`, `and_` und `or_` verstanden. Wieso arbeitest du nicht einfach mit Schlüsselwörtern?

Code: Alles auswählen

Appointment(title, date, keywords=['Zahnarzt', 'Arztbesuch'], priority=HIGHEST)
...oder was weiß ich. :mrgreen:

EDIT: Achsoooo, das ist die Suchanfrage. *kopfklatsch*
Antworten