Ereignis abfragen. Wie soll/kann ich vorgehen?

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.
mutetella
User
Beiträge: 1690
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Mittwoch 7. März 2012, 09:02

@deets:
Ok, ich versuche gerade zu verstehen, was Du meinst :wink: :

Mit 'Sentinelwert' meinst Du 'new_y', mit 'Domäne der zu setzenden Zustände' den Bereich 1 bis (cols * rows), oder? Falls ich das richtig verstanden habe verstehe ich den Fehler und das daraus resultierende Problem nicht... :?
ersteres schraenkt dich unnoetig ein: wenn du zB das ergebnis von move durch eine berechnung erhaeltst, und dabei kommt raus, dass ein zeichen *ueberschrieben* werden soll, also der offset legitimer weise 0 waere (mag konkret nicht sinnvoll sein, aber es gaebe ja faelle wo das so ist), dann musst du umstaendlich unterscheiden, dass das jetzt gar nicht passieren soll.
Ja, das Ergebnis von 'move()' kommt durch eine Berechnung zustande und es kann durchaus sein, dass 'move()' eine Position zurückgibt, die auf ein bereits gesetztes Zeichen verweist. Weshalb wäre der offset dann 0? Was meinst Du mit offset?
Ob das Zeichen auf dieser Position dann überschrieben oder dort etwas eingefügt wird entscheidet sich doch dort, wo 'move()' aufgerufen wird.


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

Mittwoch 7. März 2012, 09:33

@mutella: Mit Sentinelwert ist wohl eher die 0 gemeint, da sie sich von allen anderen Werten unterscheidet und ihr eine besondere Funktionalität zukommt, wenn sie übergeben wird - nämlich die von dir dokumentierte bloße Rückgabe der Position. Sentinels werden meisten benutzt, um das Ende von Arrays zu markieren und sowas (Vgl. NULL).

Dass es sich um einen Sentinel handelt ist hier aber IMHO nicht ganz offensichtlich, zumal er sich ja mehr oder weniger zufällig aus der Verhaltensweise der Funktion ergibt. Denn die Rückgabe der Position würde ja auch bei jedem anderen Wert erfolgen. Das Alleinstellungsmerkmal der 0 ist hier halt, dass sie keine Positionsveränderung betreibt.

Als "Domäne der zu setzenden Zustände" würde ich - etwas weiter gefasst - nicht nur den tatsächlich möglichen Wertebereich sehen, sondern allgemein Werte vom Typ Ganzzahl. Hier würde wohl `None` besser passen und dies - wie von deets vorgeschlagen - als Defaultargument, damit ein Aufruf der Funktion ohne Argument zum "None-Verhalten" führt.

Und "Offset" schließlich dürfte als Verschiebung der Cursorposition (dein `step`) zu sehen sein. So ganz habe ich in diesem Teil aber auch nicht verstanden, was deets mit dem "Ergebnis von move() durch eine Berechnung" meint. Er denkt hier offenbar an Situationen, wo ein Zeichen überschrieben wird, aber der Cursor sich dadurch nicht nach rechts bewegt. Der Satz ist allerdings IMHO etwas wirsch geschrieben... ^^
deets

Mittwoch 7. März 2012, 09:42

Also, die Domaene einer Funktion ist die Menge der Werte, die sie schluckt. Die Domaene von sin sind zB die reellen Zahlen (bzw. deren Abstraktion im Rechner durch doubles oder floats oder so, aber da wollen wir mal nicht so sein)

Und es ist halt immer bloed, wenn man *aus* dieser Menge ein Element nehmen muss, um eine Sonderbehandlung auszuloesen. Stattdessen ist es besser, eine neue Menge von Werten zu bilden (abstrakt gesprochen) - indem man die Summe aus der Domaene und einem Sentinel nimmt, in Python oft None.

Wenn ich also die Position abfragen will, dann sollte ich nicht einen Wert uebergeben muessen - darum den default-wert "None", der nicht in der Domaene liegt, den ich also einfach erkennen kann, und dann eine Sonderbehandlung ausfuehren:

Code: Alles auswählen

def position(self, pos=None):
      if pos is None:
         return self._position
      else:
         self._position = pos
deets

Mittwoch 7. März 2012, 09:46

@snafu

Was ich mit "Berechnung der Position" meinte bezog sich darauf, dass man ja oft Code hat, der einen Parameter berechnet. Nehmen wir mal an, man haette ein kleines Spiel auf der Console, und ein Boesewicht wird durch einen Buchstaben (X) dargestellt. Wenn ich jetzt in jedem Zeitschritt die Aktion des X berechne, dann kann die KI vielleicht sagen "och, ich bleib mal stehen" - und damit ist das Argument von move() dann 0. Wenn das jetzt aber eine Sonderbehandlung im Sinne eines alternativen Codepfades ausloest - dann hat man ein Problem.

Das muss im konkreten nicht so sein, aber als generelles Design-Paradigma, und darauf bezogen sich ja meine Argumente.
mutetella
User
Beiträge: 1690
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Mittwoch 7. März 2012, 09:54

Hej, das war mir doch alles längst klar, aber ihr habt das super erklärt... 8)


Ok, vielen Dank für Eure Hilfe! Jetzt hab's auch ich geschnallt, tu' mir halt oft mit Begrifflichkeiten schwer, ich mach' mich dann mal an den Umbau...

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

Mittwoch 7. März 2012, 09:55

@deets: Ah, ok. Du meinst eine Zwischenschicht, die nochmal gucken müsste, ob sich bei einer berechneten Position 0 ergeben hat. Wäre dies der Fall, dürfte sie den Wert nicht weiterdelegieren (würde ihn also z.B. bloß verwerfen und das war's), weil sonst - zumindest rein theoretisch - etwas anderes passiert als das, was der Aufrufer erwartet hätte - halt wegen der gesonderten Behandlung der 0.
Antworten