Was ist eine globale Variable und warum soll man sie nicht benützen?

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.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Alfons Mittelmeyer: bei einer Kommunikation sind mindestens zwei beteiligt. Jetzt fängst Du an, etwas zu verstecken, so dass nur einer drauf zugreifen kann. Das ergibt wirklich keinen Sinn. Das einfachste, damit zwei kommunizieren können, ist, dass derjenige, der die Kommunikation initiiert, den Kanal als Argument übergibt.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Sirius3 hat geschrieben:@Alfons Mittelmeyer: bei einer Kommunikation sind mindestens zwei beteiligt. Jetzt fängst Du an, etwas zu verstecken, so dass nur einer drauf zugreifen kann. Das ergibt wirklich keinen Sinn. Das einfachste, damit zwei kommunizieren können, ist, dass derjenige, der die Kommunikation initiiert, den Kanal als Argument übergibt.
Also die Queue habe ich ja versteckt, nämlich in einem anderen Objekt. aber das verlagert ja nur das Problem, dafür gibt es eben dann dieses andere globale Objekt.

Normalerweise sendet man eine Message etwa mit:

Code: Alles auswählen

comm.send(message_id,parameter)
Wer aber dieses globale Objekt kennt, kann es auch tun mit :

Code: Alles auswählen

comm.proxy.send(message_id,parameter)
Die Frage ist, was ist das Problem mit dieser globalen Variablen, warum soll ich sie als Parameter übergeben? Es braucht sie ja keiner. Und wenn doch einer darauf zugreift und dann den längeren Ausdruck verwenden will, was schadet das?
BlackJack

@Alfons Mittelmeyer: Dann geht es nicht um die Queue, sondern dass das `comm`-Objekt jetzt globalen Zustand besitzt. Also müsste man den Kommunikationspartnern *dieses* Objekt als Argument übergeben, damit die nicht auch hart kodiert von diesem globalen Zustand abhängig sind. Beziehungsweise sollte es möglich sein so einem Objekt die Queue zu übergeben und mehrere davon zu erstellen, damit es nicht dieses eine globale Objekt mit globalen Zustand gibt.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@BlackJack: Es gibt ja auch kein globales Objekt auf das alle zugreifen. Jeder Kommunikationpartner bekommt eine eigene Instanz. Nur die GuiApp importiert die erweiterten Widgetklassen und dort wird dann auch das übergebene Proxy Objekt abgespeichert, damit man in der GuiApp bequem send ohne eine unötige Referenz auf ein Widget benützen kann. Was hätte auch Nachricht senden mit einem Widget zu tun

Bei nur zwei Kommunikationspartnern wird jeweils ein eigenes Proxyobjekt übergeben, wobei das eine das andere kennt. Bei mehr als zwei Kommunikationspartnern wird jeweils ein Proxyobjekt übergeben, welches ein zentrales Proxyobjekt kennt, und das ist auch nicht global. Die Kommunikationspartner wissen also überhaupt nichts über die anderen.

Für die GuiAppp ist es auch kein Problem, denn wer macht schon etwa:

gui_1 = tk.Tk(Proxy())
...

gui_2 = tk.Tk(Proxy())
....

gui_1.mainloop()

gui_2.mainloop()
Antworten