hotti: Design Patterns

hi,

Overload reicht mir nicht. Ich will, dass eine Methode in einer Subklasse nicht einfach nur die gleichnamige Methode der Basisklasse überschreibt sondern die Methode der Basisklasse austauscht, so dass ein Interface weder die Methode der Basisklasse, noch die überladene Methode in der Subklasse aufruft, sondern die (gleichnamige) Methode, bei welcher der Code komplett ausgetauscht wurde.

Gibt es ein Design Pattern für solch eine Untat?

Bitte mal um Hinweise,
Horst

  1. Meine Herren!

    Gibt es ein Design Pattern für solch eine Untat?

    Damit mischst du API mit Implementation, was deine ganze Architektur insbesondere deine Klassenhierarchie und deine Interfaces imho. unbrauchbar macht. Ich kenne deinen konkreten Fall nicht, aber irgendwo scheint es da einen akuten Design-Fehler zu geben. Vielleicht solltest du diesen besser beheben, als dir ein Workaround zu basteln.

    Gut das war nun recht allgemein, aber so war ja auch deine Frage gestellt.

    1. hi,

      Gut das war nun recht allgemein, aber so war ja auch deine Frage gestellt.

      Hmm, ich wollte eigentlich nur den Namen des Design-Patterns ;)

      Falls es einen gibt...

      Horst

      1. Meine Herren,

        Hmm, ich wollte eigentlich nur den Namen des Design-Patterns ;)

        Falls es eines gibt, hat sich vermutlich schon als Anti-Pattern etabliert. Weil es gegen einen der elementaren Grundsätze von Design-Pattern verstößt:

        Program to an 'interface', not an 'implementation' (Gang of Four)

  2. Overload reicht mir nicht. Ich will, dass eine Methode in einer Subklasse nicht einfach nur die gleichnamige Methode der Basisklasse überschreibt sondern die Methode der Basisklasse austauscht, so dass ein Interface weder die Methode der Basisklasse, noch die überladene Methode in der Subklasse aufruft, sondern die (gleichnamige) Methode, bei welcher der Code komplett ausgetauscht wurde.

    Also so ganz verstehe ich dein anliegen nicht, versuche dennoch mein bestes.

    Soweit ich dich verstehe möchtest du eine Methode der Basisklasse tauschen? Dann würde ich einfach eine Hierarchieebene mehr einfügen.
    Basisklasse -> Neue Hierarchie mit neuer Methode -> Subklasse

    Anderer Lösungsansatz wäre die Basisklasse zu kopieren in eine andere Datei zu legen und dann den Include anders aufrufen

    $strFileName = "";
    //$strFileName = "main_";
    reuqire_once $strFileName."basisklasse.php";

    Es gibt dann zwei Dateien main_basisklassse.php und basisklasse.php. Die Klassen heißen auch gleich. Je nachdem welche inkludiert wird, sieht die spezielle Methode anders aus.

    Das war übrigens mein Objektorientierter Ansatz als ich noch keine OOP kannte. Damals waren es keine Objekte sondern Funktionen die ich so gesteuert habe. Allein der Controller für das ganze zu programmieren... oh weh.

    Gruß
    Schwank aus der Jugend erzählender
    T-Rex

    1. Overload reicht mir nicht. Ich will, dass eine Methode in einer Subklasse nicht einfach nur die gleichnamige Methode der Basisklasse überschreibt sondern die Methode der Basisklasse austauscht, so dass ein Interface weder die Methode der Basisklasse, noch die überladene Methode in der Subklasse aufruft, sondern die (gleichnamige) Methode, bei welcher der Code komplett ausgetauscht wurde.

      Also so ganz verstehe ich dein anliegen nicht, versuche dennoch mein bestes.

      Soweit ich dich verstehe möchtest du eine Methode der Basisklasse tauschen? Dann würde ich einfach eine Hierarchieebene mehr einfügen.

      Ja, das wäre eine Möglichkeit. Nun, konkret: Ich habe eine Subklasse, die nur Views erzeugt, die Templates liegen in einer MySQL-Tabelle. Ohne Controller sind die Templates tot. Ich erwecke einzelne Templates zum Leben, indem ich, URL-spezifisch, einen Controller zuweise, hier ein Beispiel: http://rolfrost.de/rezept_kalender.html?pdf=1

      Für meine Programmiersprache habe ich eine recht einfache Lösung dafür, die meine Legacy-Klassenhierarchie nicht verändert und auch keine weiteren Subklassen erfordert.

      Ich suche nur einen Namen für das Kind (Geburtsdatum heute morgen ca. 6:30 Uhr).

      Horst

      --
      Wenn Dir im Traum ein Bergwerk erscheint, wo Scheise mit Baggern abgebaut wird, wirds Zeit für einen neuen Job.
      1. Hallo,

        Ich suche nur einen Namen für das Kind (Geburtsdatum heute morgen ca. 6:30 Uhr).

        das ist nicht "heute morgen", sondern "letzte Nacht". ;-)

        Ciao,
         Martin

        --
        Alleine sind wir stark ...
        gemeinsam sind wir unausstehlich!
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Hallo,

          Ich suche nur einen Namen für das Kind (Geburtsdatum heute morgen ca. 6:30 Uhr).

          das ist nicht "heute morgen", sondern "letzte Nacht". ;-)

          Das Feature ist total geil. Ich kann Klassen zur Laufzeit um beliebige Funktionalitäten erweitern, ohne dass ich am Code der Klasse was ändern muss. Wie das Design Pattern letztendlich heißt, ist mir Schnuppe. Morgen kann ich länger schlafen ;)

          Horst Hacke

  3. hi,

    Overload reicht mir nicht. Ich will, dass eine Methode in einer Subklasse nicht einfach nur die gleichnamige Methode der Basisklasse überschreibt sondern die Methode der Basisklasse austauscht

    Das bedeutet, die Basisklasse müsste etwas über ihre abgeleiteten Klassen wissen und würde nach dem Entfernen dieser Klassen nicht mehr funktionieren. Hört sich nicht nach gutem Stil, ganz und gar nicht.

    Was _möglicherweise_ noch vernünftig sein könnte, wäre eine Delegation. D.h. eine Instanz einer Basisklasse speichert Instanzen von ihrer eigenen Klasse - entweder dynamisch oder statisch. Und dann ruft sie die Methode dieser gespeicherten Instanz/Instanzen auf. Diese Instanzen können dann natürlich auch Unterklassen sein.

    , so dass ein Interface weder die Methode der Basisklasse, noch die überladene Methode in der Subklasse aufruft

    Wie meinst du das? Ein Interface wird implementiert - das tut aktiv doch gar nichts.

    1. hi,

      Overload reicht mir nicht. Ich will, dass eine Methode in einer Subklasse nicht einfach nur die gleichnamige Methode der Basisklasse überschreibt sondern die Methode der Basisklasse austauscht

      Das bedeutet, die Basisklasse müsste etwas über ihre abgeleiteten Klassen wissen

      Nein, absolut nicht.

      und würde nach dem Entfernen dieser Klassen

      Es werden weder Klassen hinzugefügt noch entfernt. In meinen MVC-Subklassen ist der Controller keine Klasse sondern eine Methode.

      , so dass ein Interface weder die Methode der Basisklasse, noch die überladene Methode in der Subklasse aufruft

      Wie meinst du das? Ein Interface wird implementiert - das tut aktiv doch gar nichts.

      Ja, da hatte ich mich etwas unverständlich ausgedrückt. Mein Interface besteht aus mehreren Methoden, die in einer bestimmten Reihenfolge aufgerufen werden.

      Das Interface ist so implementiert, dass u.a. die Methode control() aufgerufen wird.

      Hat bspw. eine Subklasse die Methode control(), wird damit die control()-Methode der Basisklasse überschrieben. Hat die Subklasse diese Methode nicht, gibt es kein Overload.

      Sinn und Zweck der Sache nun: Die Zuweisung der control()-Methode wird von außen konfigurierbar. Es ist mir nun möglich, Webressourcen, die allesamt eine gemeinsame View-Class nutzen, den Controller oder Gruppen von Controllern zuzuweisen. Das spart mir einen Haufen Code und ist auch schön überschaubar.

      Nochemal das Beispiel: Debug auf Abruf

      Der URL nutzt eine View-Class, die viele andere URLs auch benutzen. Diese View-Class hat keine control()-Method. Als Erweiterung soll o.g. URL nun die Fähigkeit bekommen, dass Parameter möglich sind, bspw. für Debug-Geschichten o.ä. Der Request verbleibt in der View-Class, hier drinnen sind alle Attribute für den URL/Response bekannt, das ist auch ein riesen Vorteil, denn es müssen keine Attribute als Parameter übergeben werden.

      URL rezept_kalender.html hat als konfigurierbares Attribut: 'control' => '1' D.h., der Controller wird in einem bestimmten Pfad auf dem FS gefunden, das stellt mein Autoloader sicher. So wie ichs gebaut habe, liegt die Methode control() jedoch nicht im Namespace der Subklasse sondern im Namespace der Basisklasse. Ergo findet kein Overload statt, sondern die Methode der Basisklasse wird einfach nur ausgetauscht.

      Hotti

      --
      Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
      1. Overload reicht mir nicht. Ich will, dass eine Methode in einer Subklasse nicht einfach nur die gleichnamige Methode der Basisklasse überschreibt sondern die Methode der Basisklasse austauscht

        Das bedeutet, die Basisklasse müsste etwas über ihre abgeleiteten Klassen wissen

        Nein, absolut nicht.

        Wie wird dann festgelegt, welche Unterklasse die Methode überschreibt? Können ja theoretisch mehrere wollen.

        und würde nach dem Entfernen dieser Klassen

        Es werden weder Klassen hinzugefügt noch entfernt. In meinen MVC-Subklassen ist der Controller keine Klasse sondern eine Methode.

        Aber wer weiß denn, wie sich das in Zukunft ändert? OOP ist doch gerade auch dafür da, um flexibel zu bleiben. Ich sehe das jedenfalls relativ kritisch und würde vom Bauchgefühl her eher abraten und ggf. zu Delegation raten wie vorgeschlagen.

        , so dass ein Interface weder die Methode der Basisklasse, noch die überladene Methode in der Subklasse aufruft

        Wie meinst du das? Ein Interface wird implementiert - das tut aktiv doch gar nichts.

        Ja, da hatte ich mich etwas unverständlich ausgedrückt. Mein Interface besteht aus mehreren Methoden, die in einer bestimmten Reihenfolge aufgerufen werden. (...)

        Sorry, PHP ist nicht so meins (ich nehme an, dass es PHP ist) und den genauen Zweck habe ich trotzdem nicht verstanden. Was genau soll z.B. eine View sein etc. =/

        1. hi,

          Sorry, PHP ist nicht so meins (ich nehme an, dass es PHP ist) und den genauen Zweck habe ich trotzdem nicht verstanden. Was genau soll z.B. eine View sein etc. =/

          MVC, z.B. http://rolfrost.de/advent.html
          Im Response-Header x-class guckst Du Name der Klasse. Diese Anwendung ist eine Kompaktlösung, in x-class ist alles drin: Model, View, Controller und in diesem Fall auch das Template, letzteres natürlich fein säuberlich vom Code getrennt. Die Klasse ist final.

          Ich programmiere mit Perl. Seit 2001 Perl/OOP. In Anbetracht der Tatsache, dass dies alles mit Perl v5.6 seit dem Jahre 2001 recht einfach, objektorientiert, abwärtskompatibel (v5.6 bis v5.16) und mit übersichtlichen Code möglich ist, frage ich mich manchmal, was andere Perl-Entwickler von Perl6 erwarten. Warum es PHP gibt, frage ich schon lange nicht mehr.

          Horst

          1. Hallo,

            Warum es PHP gibt, frage ich schon lange nicht mehr.

            Dieses PHP ist aber auch eine häßliche Sprache... die zu Recht eigentlich niemand so ernst nimmt. Als "gräßlichen Perl-Klon" hat das mal ein mir nicht unbekannter Humanoid bezeichnet. Wobei Klon nicht so recht passt. Ich rate ja jedem davon ab, sich damit zu beschäftigen.

            1. Mahlzeit,

              Als "gräßlichen Perl-Klon" hat das mal ein mir nicht unbekannter Humanoid bezeichnet. Wobei Klon nicht so recht passt.

              Das kann nur jemand sagen, der absolut keine Ahnung hat.
              Der erste PHP-Interpreter wurde in Perl programmiert, somit war PHP ursprünglich eine Perl-Erweiterung.

              Da ist Perl eher ein C-Klon als PHP ein Perl-Klon.

              Ich rate ja jedem davon ab, sich damit zu beschäftigen.

              Dann kennst du vermutlich genau so viele Hoster für PHP wie für Perl, oder? Wenn nicht, ist deine Aussage (wiedermal) von Halbwissen geprägt.

              --
              42
              1. Na, mein lieber Freund,
                der noch ein wenig an seiner Rechtschreibung arbeiten muss,

                Dann kennst du vermutlich genau so viele Hoster für PHP wie für Perl, oder? Wenn nicht, ist deine Aussage (wiedermal) von Halbwissen geprägt.

                wo war denn meine letzte, von Halbwissen geprägte Aussage? Du scheinst notorisch Dinge in Sachen HINEINinterpretieren zu müssen, die nicht da sind.

                1. es gab NIE einen PHP-Interpreter, der in PERL geschrieben wurde. Es sei denn, du bezeichnest lose Sammlungen von Skripten als Interpreter. Dann brauchen wir nicht weiterzureden. Ausserdem hatte diese Urzeitsammlung nichts mit dem heutigen PHP zu tun. Oder doch, das grundlegend schlechte Sprachdesign vielleicht, dass die Entwickler einfach nicht mehr richtig geradebiegen können. Es bessert sich aber stetig, das muss man zugeben.

                2. welche Einflüsse hat denn PHP groß ausser Perl und C? Nichts. Gut, in den letzen Jahren wurde viel von JAVA abgekupfert. Welche Einflüsse hat PERL? Lese selbst. Lerne selbst. In diesem Kontext Perl also als C-Klon zu bezeichnen, zeugt von UNGLAUBLICHER Unkenntnis.

                3. Hoster? Tausend Fliegen können nicht irren, oder? Ausserdem gab es Zeiten vor PHP. Schöne Zeiten waren das.

                1. Hallo,

                  Na, mein lieber Freund,
                  der noch ein wenig an seiner Rechtschreibung arbeiten muss,

                  says who?

                  [...] Oder doch, das grundlegend schlechte Sprachdesign vielleicht, dass die Entwickler einfach nicht mehr richtig geradebiegen können.

                  Schreibt einer, der sich erst vorgestern über die das/dass-Schwäche ausgelassen hat. :-P

                  So long,
                   Martin

                  --
                  Wer mit dem Finger auf andere zeigt, sollte nicht vergessen, dass dabei drei Finger auf ihn selbst zeigen.
                  Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                  1. Martin,

                    [...] Oder doch, das grundlegend schlechte Sprachdesign vielleicht, dass die Entwickler einfach nicht mehr richtig geradebiegen können.

                    Schreibt einer, der sich erst vorgestern über die das/dass-Schwäche ausgelassen hat. :-P

                    glatt erwischt ;)

                    Bravo! Du hast mir ein Lächeln entzaubert!

                2. Hallo

                  Na, mein lieber Freund,
                  der noch ein wenig an seiner Rechtschreibung arbeiten muss,

                  worauf beziehst du das hier?

                  Ausserdem, ausser, Lese, Ausserdem

                  Müssen wir nicht alle immer wieder daran arbeiten?

                  Gruß
                  Kalk

                  1. Tabellenkalk!

                    du hast ein Sternlein bekommen! Das freut dich, gelle?

                    Ich freue mich mit Dir! Aber nicht, dass du morgen in der Schule damit angibst...

                    1. Mahlzeit,

                      um nen Fehler zuzugeben fehlt dir das Selbstbewusstsein, gell?
                      Dass jemand, der austeilt, aber nicht einstecken kann, humorlos ist, kann ich verstehen.

                      --
                      42
                  2. Moin Tabellenkalk,

                    Ausserdem, ausser, Lese, Ausserdem

                    Müssen wir nicht alle immer wieder daran arbeiten?

                    Sieht mir nach typischer schweizerischer Schreibweise aus. In dem Fall wäre es sogar richtig: die Schweizer kennen kein ß und haben so einige merkwürdige Verbformen.

                    LG,
                     CK

                    1. Hallo,

                      Sieht mir nach typischer schweizerischer Schreibweise aus. In dem Fall wäre es sogar richtig: die Schweizer kennen kein ß und haben so einige merkwürdige Verbformen.

                      Dann hätte ich aber kein "häßlich", "gräßlich" und "groß" vom selben Autoren erwartet.

                      Gruß
                      Kalk

                      PS: worauf sich der Humorlose in seiner Anrede eigentlich bezieht, weiß ich immer noch nicht.

                      1. Om nah hoo pez nyeetz, Tabellenkalk!

                        Dann hätte ich aber kein "häßlich", "gräßlich" und "groß" vom selben Autoren erwartet.
                        PS: worauf sich der Humorlose in seiner Anrede eigentlich bezieht, weiß ich immer noch nicht.

                        zumal es „hässlich“ und „grässlich“ heißen muss.

                        Matthias

                        --
                        Der Unterschied zwischen Java und JavaScript ist größer als der zwischen digital und Digitalis.

                        1. Hallo,

                          zumal es „hässlich“ und „grässlich“ heißen muss.

                          nicht, wenn er das "ä" lang ausspricht...

                          scnr
                          Kalk

                          1. Hi,

                            zumal es „hässlich“ und „grässlich“ heißen muss.
                            nicht, wenn er das "ä" lang ausspricht...

                            na gut, aber dann würde ich eher annehmen, dass er die beiden Wörter auch mit einfachem 's' schreibt und insgeheim von "Hase" und "Gras" ableitet. :-)

                            So long,
                             Martin

                            --
                            Auf der Flucht Haken schlagen: Ein ausgesprochen häsliches Merkmal.
                            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                3. Mahlzeit,

                  1. es gab NIE einen PHP-Interpreter, der in PERL geschrieben wurde. Es sei denn, du bezeichnest lose Sammlungen von Skripten als Interpreter.

                  Aha, von Wikipedia abschreiben kannst du schon mal. Wenn du jetzt noch geistig erfassen kannst, was du abschreibst, kommen wir auf einen Stand, der eine Diskussion ermöglicht.

                  Dein Problem ist, du glaubst, alles was du schreibst ist richtig, alles andere falsch. Das ist kein Zeichen von grossen Wissen, sondern ein Zeichen von Engstirnigkeit.

                  1. welche Einflüsse hat denn PHP groß ausser Perl und C? Nichts.

                  Wenn du das sagst, wirst du es auch glauben. Also brauch ich dir die Einflüsse anderer Programmiersprachen gar nicht erläutern. Denn entweder würdest du es nicht akzeptieren oder nicht verstehen. Beide Fälle sind nicht positiv für dich zu sehen.

                  Ich werd jetzt mal die Ignorierliste testen. Du bist IMO reine Traffikverschwendung.

                  --
                  42
  4. Hallo,

    Overload reicht mir nicht. Ich will, dass eine Methode in einer Subklasse nicht einfach nur die gleichnamige Methode der Basisklasse überschreibt sondern die Methode der Basisklasse austauscht, so dass ein Interface weder die Methode der Basisklasse, noch die überladene Methode in der Subklasse aufruft, sondern die (gleichnamige) Methode, bei welcher der Code komplett ausgetauscht wurde.

    Gibt es ein Design Pattern für solch eine Untat?

    erstmal sorry, dass ich hier ein Full-Quote mache. Eigentlich habe ich dich nicht verstanden, denke aber, dass du nach Sachen wie Service-Locator oder Proxy-Klassen suchst?

    1. override/überschreiben
      Ist aber wie overload/überladen kein Design Pattern sondern Feature einer Sprache bzw. ein Konzept der OOP.

      1. Das galt nicht Dir, timo.
        Das sollte eine Antwort auf den OP werden.