Verhaltensmuster STATE-Pattern (Zustandsmuster) in objective-C

  • Original von asrael
    Mag sein, dass in Java dieses State interface Teil eines grösseren Frameworks ist, dass vielleicht etwas mehr macht. Grafische Darstellungen anhand von Klassen die State implementieren. Ist aber nur Spekulation.
    Im Grunde ist es tatsächlich nur eine Klasse die einem Wert speichert, nix wildes.
    Wüsste auch nicht wieso man darauf so rumreiten sollte.


    Manfred

    Du hast das etwa häufig bei Benutzerführungen. Letztlich sind die ganzen ein- und ausgeblendeten View-Controller nichts als States, die auf eine bestimmte Operation ausgetauscht werden. Das ist aber noch recht einfach, weil beim iPhone das ja nu gepusht und gepoppt wird. Aber es ist ja leicht, sich vorzustellen, dass man "kreuz und quer" wandern kann. Dann sollte man das schon richtig umsetzen.

    Auch bei Steuerungen kann so etwas vorkommen. Du kannst dir leicht Maschinen vorstellen, die aufgrund von Ereignissen den Zustand wechseln. Denke an deinen Kassettenrekorder.

    Nein, sein Code ist keine Implementierung des Musters, sondern einer Klasse, die einen Wert speichert. Das stimmt schon. Das kann man aber nicht dem Muster vorwerfen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Original von zermelo
    Auch noch mein Kommentar zum Thema "Patterns":
    Ich bin jetzt nicht der glühende Verfechter davon, aber man sollte zumindest die wichtigsten kennen und verwenden, insbesondere da sie ja auch so einfach sind. Grade Dinge wie Singleton, Factory, Visitor und MVC braucht man andauern und der Versuch, entsprechende Probleme anders zu lösen endet so gut wie immer in schlechtem Code.
    Von daher finde ich es auch nicht verkehrt, wenn ein Arbeitgeber darauf besteht, dass seine Angestellten gewisse Pattern kennen - warum sollte man sich dem auch verwehren, grade weil man diese doch auch schnell verstanden hat. Leider wird das ganze aber, wie ich finde, etwas "gehyped" und was an sich selbstverständlich sein sollte als grosse Kenntniss deklariert. Das passt so schön in die Welt, in der Nicht-Softwareingineure Design-Enscheidungen treffen, und in dieser leben wir ja..mehr oder weniger :)

    Natürlich wird eine solche Fachwortsammlung gehypt. Ist doch toll, wenn sich Leute ein paar Fachbegriffe an den Kopp werfen können und niemand etwas Konkretes sagen muss.

    Leider leidet darunter die intellektuelle Auseinandersetzung. Das Ganze wird industrialisiert. Oder, um mich mal bescheiden selbst zu zitieren:
    "Mich wies erst vor wenigen Tagen ein Gestalter darauf hin, dass Juristen zur Reflexion neigen. Das stimmt. Reflexion beim Programmieren ist leider in einer Halde von Pattern, Sample-Code usw. untergegangen. Die Reflexion über das eigene Tun hat der IT-Negm vom RA-Negm."
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Original von Amin Negm-Awad
    Original von asrael
    Mag sein, dass in Java dieses State interface Teil eines grösseren Frameworks ist, dass vielleicht etwas mehr macht. Grafische Darstellungen anhand von Klassen die State implementieren. Ist aber nur Spekulation.
    Im Grunde ist es tatsächlich nur eine Klasse die einem Wert speichert, nix wildes.
    Wüsste auch nicht wieso man darauf so rumreiten sollte.


    Manfred

    Du hast das etwa häufig bei Benutzerführungen. Letztlich sind die ganzen ein- und ausgeblendeten View-Controller nichts als States, die auf eine bestimmte Operation ausgetauscht werden. Das ist aber noch recht einfach, weil beim iPhone das ja nu gepusht und gepoppt wird. Aber es ist ja leicht, sich vorzustellen, dass man "kreuz und quer" wandern kann. Dann sollte man das schon richtig umsetzen.

    Auch bei Steuerungen kann so etwas vorkommen. Du kannst dir leicht Maschinen vorstellen, die aufgrund von Ereignissen den Zustand wechseln. Denke an deinen Kassettenrekorder.

    Nein, sein Code ist keine Implementierung des Musters, sondern einer Klasse, die einen Wert speichert. Das stimmt schon. Das kann man aber nicht dem Muster vorwerfen.

    Ne, klar. Ich kenne State-Machines und die werden in der Tat häufig benutzt.
    Dieses spezielle Pattern kannte ich nur nicht.
    Man lernt ja nie aus...
  • Original von Amin Negm-Awad
    Original von macmoonshine
    @moozoom: Mach doch erstmal was Einfacheres als so ein abstraktes Entwurfsmuster, das Du augenscheinlich nicht verstanden hast.

    Genau das hat er aber nicht implementiert.

    Genau, schreib' ich doch. Und selbst, wenn er es richtig gemacht hätte, seine Klasse unsinnig, da Zustand ein abstrakter Oberbegriff ist. Genauso gut könnte er eine Klasse Singleton schreiben. Das macht ohne konkreten Anwendungsfall keinen Sinn.
    „Meine Komplikation hatte eine Komplikation.“
  • Also erstmal ne Satusklasse...

    Quellcode

    1. @interface OCState : NSObject {
    2. NSString *_OCTitle;
    3. }
    4. @property (readwrite, retain) NSString *title;
    5. // 0 gruen 1 rot
    6. - (void) setState: (int)value;
    7. - (void) dump;
    8. @end
    Alles anzeigen


    Zwei Subklassen, eine für jeden Zustand...

    Quellcode

    1. #import <Foundation/Foundation.h>
    2. #import "OCState.h"
    3. @interface OCStateGreen : OCState {
    4. }
    5. @end


    Quellcode

    1. #import <Foundation/Foundation.h>
    2. #import "OCState.h"
    3. @interface OCStateRed : OCState {
    4. }
    5. @end


    Eine loggt grün, die andere rot...

    Quellcode

    1. @implementation OCStateGreen
    2. - (void) dump
    3. {
    4. NSLog(@"%@ green", [self title]);
    5. }
    6. @end


    Quellcode

    1. @implementation OCStateRed
    2. - (void) dump
    3. {
    4. NSLog(@"%@ red", [self title]);
    5. }
    6. @end


    Und dann noch OCState, quasi das abstrakte Interface...

    Quellcode

    1. #import <objc/runtime.h>
    2. @implementation OCState
    3. @synthesize title = _OCTitle;
    4. - (id) init
    5. {
    6. self = [super init];
    7. if (self != nil) {
    8. [self setTitle: @"Neu"];
    9. }
    10. return self;
    11. }
    12. - (void) dealloc
    13. {
    14. [self setTitle: nil];
    15. [super dealloc];
    16. }
    17. - (void)setState:(int)value
    18. {
    19. if (value == 0) {
    20. object_setClass (self, [OCStateGreen class]);
    21. return;
    22. }
    23. if (value == 1) {
    24. object_setClass (self, [OCStateRed class]);
    25. return;
    26. }
    27. object_setClass (self, [OCState class]);
    28. }
    29. - (void) dump
    30. {
    31. NSLog(@"%@ undefined", [self title]);
    32. }
    33. @end
    Alles anzeigen


    Auf die Rennbahn...

    Quellcode

    1. OCState *state = [[OCState alloc] init];
    2. [state setTitle: @"TheState"];
    3. [state dump];
    4. [state setState: 0];
    5. [state dump];
    6. [state setState: 1];
    7. [state dump];
    8. [state release];


    Ausgabe...

    Quellcode

    1. 2010-04-29 12:19:18.490 state[1505:a0b] TheState undefined
    2. 2010-04-29 12:19:18.493 state[1505:a0b] TheState green
    3. 2010-04-29 12:19:18.494 state[1505:a0b] TheState red


    Der isa wird ausgetauscht. Die iVars bleiben aber erhalten. Ich glaube wir haben ein State Pattern entdeckt. Die Grippe hat sich gelohnt!

    Wo war gleich nochmal die aktuelle Diskussion über die Vorteile der ObjC Runtime... :D
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
  • Immerhin kann man so ganz ohne Änderung der RTE und des Compilers mal eben so AOP in Objective-C implementieren – mächtiger als in AspectJ.

    Aber man muss auch sehen, dass das meist eher für hochoptimierende Sachen angewendet wird. Die Google-Leute hatten da früher auch mal Projekte.

    +++

    Jetzt sehe ich es gerade wieder auf der Folie: "Beweisen, dass Objective-C-ler den Längeren haben."
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Amin Negm-Awad ()

  • Amin Negm-Awad schrieb:

    Immerhin kann man so ganz ohne Änderung der RTE und des Compilers mal eben so AOP in Objective-C implementieren – mächtiger als in AspectJ.

    Aber man muss auch sehen, dass das meist eher für hochoptimierende Sachen angewendet wird. Die Google-Leute hatten da früher auch mal Projekte.

    +++

    Jetzt sehe ich es gerade wieder auf der Folie: "Beweisen, dass Objective-C-ler den Längeren haben."
    Wann gibts denn da mal was zum spielen?


    Chris
    Man macht einfach solange irgendwelche Dinge, bis man tot ist.
    Und dann bekommen die anderen Kuchen.
  • Chris schrieb:

    Amin Negm-Awad schrieb:

    Immerhin kann man so ganz ohne Änderung der RTE und des Compilers mal eben so AOP in Objective-C implementieren – mächtiger als in AspectJ.

    Aber man muss auch sehen, dass das meist eher für hochoptimierende Sachen angewendet wird. Die Google-Leute hatten da früher auch mal Projekte.

    +++

    Jetzt sehe ich es gerade wieder auf der Folie: "Beweisen, dass Objective-C-ler den Längeren haben."
    Wann gibts denn da mal was zum spielen?


    Chris

    Du bist nicht en vogue.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    Chris schrieb:

    Amin Negm-Awad schrieb:

    Immerhin kann man so ganz ohne Änderung der RTE und des Compilers mal eben so AOP in Objective-C implementieren – mächtiger als in AspectJ.

    Aber man muss auch sehen, dass das meist eher für hochoptimierende Sachen angewendet wird. Die Google-Leute hatten da früher auch mal Projekte.

    +++

    Jetzt sehe ich es gerade wieder auf der Folie: "Beweisen, dass Objective-C-ler den Längeren haben."
    Wann gibts denn da mal was zum spielen?


    Chris

    Du bist nicht en vogue.
    Dass ich nicht "in Mode" bin nehm ich dir gerade so noch ab.
    Und wat is mit AOP? Haste da schon was zum rumspielen?

    Chris
    Man macht einfach solange irgendwelche Dinge, bis man tot ist.
    Und dann bekommen die anderen Kuchen.
  • Das kommt vorher. In der näcshten Woche wird das letzte Kapitel fertig, so dass ich Zeit für so etwas habe.

    +++

    In der nächsten Macoun kommt möglicherweise eine praktische Anwendung.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Amin Negm-Awad ()

  • Goetz Markgraf schrieb:

    Ich dreh' ab. Dass es so einfach ist, das Object, äh nein, die Klasse, äh, auch nicht, was denn eigentlich?


    Du änderst die Klasse des bestehenden Objekts.

    Aber Achtung! Was Amin schon angedeutet hat: Die Subklassen von OCStatus dürfen keine iVars enthalten, also keinen eigenen Speicher haben. Dafür wird dann nämlich beim Wechsel kein Speicher allociert/initialisiert. Man ändert nur die Klasse auf die das Objekt zeigt (isa), und damit wird die Implementation (Methoden) dieser Klasse benutzt. Da muss man halt mit der Konvention leben, das alle iVars im Interface Objekt gespeichert werden.

    Goetz Markgraf schrieb:

    Das macht einem wirklich so schnell keine andere Sprache nach.

    Wir ham halt den längsten.
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
  • macmoonshine schrieb:

    Manfred Kreß schrieb:


    Goetz Markgraf schrieb:

    Das macht einem wirklich so schnell keine andere Sprache nach.

    Wir ham halt den längsten.

    Zusammen mit den Perl-Entwicklern +duck und weg+

    Sind das nicht Mädchen?
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Manfred Kreß schrieb:

    Goetz Markgraf schrieb:

    Ich dreh' ab. Dass es so einfach ist, das Object, äh nein, die Klasse, äh, auch nicht, was denn eigentlich?


    Du änderst die Klasse des bestehenden Objekts.

    Aber Achtung! Was Amin schon angedeutet hat: Die Subklassen von OCStatus dürfen keine iVars enthalten, also keinen eigenen Speicher haben. Dafür wird dann nämlich beim Wechsel kein Speicher allociert/initialisiert. Man ändert nur die Klasse auf die das Objekt zeigt (isa), und damit wird die Implementation (Methoden) dieser Klasse benutzt. Da muss man halt mit der Konvention leben, das alle iVars im Interface Objekt gespeichert werden.

    Goetz Markgraf schrieb:

    Das macht einem wirklich so schnell keine andere Sprache nach.

    Wir ham halt den längsten.

    Manfred Kreß schrieb:

    Goetz Markgraf schrieb:

    Ich dreh' ab. Dass es so einfach ist, das Object, äh nein, die Klasse, äh, auch nicht, was denn eigentlich?


    Du änderst die Klasse des bestehenden Objekts.

    Aber Achtung! Was Amin schon angedeutet hat: Die Subklassen von OCStatus dürfen keine iVars enthalten, also keinen eigenen Speicher haben. Dafür wird dann nämlich beim Wechsel kein Speicher allociert/initialisiert. Man ändert nur die Klasse auf die das Objekt zeigt (isa), und damit wird die Implementation (Methoden) dieser Klasse benutzt. Da muss man halt mit der Konvention leben, das alle iVars im Interface Objekt gespeichert werden.

    Goetz Markgraf schrieb:

    Das macht einem wirklich so schnell keine andere Sprache nach.

    Wir ham halt den längsten.

    Amin Negm-Awad schrieb:

    macmoonshine schrieb:

    Manfred Kreß schrieb:


    Goetz Markgraf schrieb:

    Das macht einem wirklich so schnell keine andere Sprache nach.

    Wir ham halt den längsten.

    Zusammen mit den Perl-Entwicklern +duck und weg+

    Sind das nicht Mädchen?

    Nee, so eher Richtung Chuck Norris: Wie kann ich mein Leben möglichst schmerzvoll gestalten und das auch noch cool finden ;)

    Naja, es gibt ja auch Leute, die auch den Perl-Ableger PHP für eine ordentliche Programmiersprache halten. +schon wieder duck und weg+
    „Meine Komplikation hatte eine Komplikation.“