Tom: OOP versa ProceduralProgramming?

Hello,

ich kämpf mich hier immer noch durch ein Projekt, dass zwar "OOP" benutzt, aber trotzdem mit register_globals=on arbeitet.

Nun arbeiten die Methoden in den Klassen grundsätzlich mit this->Eigenschaft, also übersetzt gesprochen ja eigentlich mit globalen Variablen.

Es werden komplexe Objekte erzeugt, die dann für eien Bildanzeige (GD) benutzt werden.
Die Speicherung des schrittweise erzeugten Objektes war bisher nicht vorgesehen.
Ich habe sie Eingebaut, und tunlichst nur die Primary-Key-Struktur nebst unabhängigen Werten über drei Tabellen gespeichert.

Nun muss ich aber dafür Sorge tragen, dass die Struktur, die ich speichere, auch wieder angezeigt werden kann. Die vorhandenen Methoden rur Erzeugung der Objekt-Struktur über User-Eingaben enthalten alle ziemlich teure SQL-Statements. Da ich ja aber die geürüfte Struktur absoeichere, muss ich diese Prüfungen nicht mehr durchführen.

Was würdet Ihr sagen? Arschkarte gezogen und alles neu machen, oder habe ich eine Idee übersehen?
Ich kann die Bilderzeugungsfunktionen nur benutzen, wenn die passende Speicherstruktur dur Erzeugung des Parameterstring für das Bild vorliegt.

Die Methode bedient sich leider aus der Session und nicht aus der DB!

Harzliche Grüße aus http://www.annerschbarrich.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau
  1. Hi Tom!

    Nun arbeiten die Methoden in den Klassen grundsätzlich mit this->Eigenschaft, also übersetzt gesprochen ja eigentlich mit globalen Variablen.

    Hm, aber das ist doch nur vernünftig. Man kann doch bei Eigenschaften des eigenen Objektes nicht von "globalen Variablen" sprechen, oder? Man braucht doch innerhalb eines Objektes keine solchen Schnittstellen wie von außen - IMHO.

    | Es werden komplexe Objekte erzeugt, die dann für eien Bildanzeige (GD) benutzt werden.

    Die Speicherung des schrittweise erzeugten Objektes war bisher nicht vorgesehen.

    Warum speicherst Du nicht das Bild an sich?

    Ich habe sie Eingebaut, und tunlichst nur die Primary-Key-Struktur nebst unabhängigen Werten über drei Tabellen gespeichert.

    Das sagt mir so ziemlich wenig ;-)

    Nun muss ich aber dafür Sorge tragen, dass die Struktur, die ich speichere, auch wieder angezeigt werden kann. Die vorhandenen Methoden rur Erzeugung der Objekt-Struktur über User-Eingaben enthalten alle ziemlich teure SQL-Statements. Da ich ja aber die geürüfte Struktur absoeichere, muss ich diese Prüfungen nicht mehr durchführen.

    Was ist wenn Du ein serialisiertes Objekt speicherst? Oder wie gesagt - besser direkt das erzeugte Bild?

    Ich kann die Bilderzeugungsfunktionen nur benutzen, wenn die passende Speicherstruktur dur Erzeugung des Parameterstring für das Bild vorliegt.

    Meinst Du $_GET Parameter? Kannst Du nicht diese speichern, oder die Funktion so umschreiben, dass man sie auch direkt aufrufen kann - wenn die Parameter bekannt sind?

    Die Methode bedient sich leider aus der Session und nicht aus der DB!

    Und was steht da so in der Session? Wie kommen die Daten in die Session?

    Grüße
    Andreas

    --
    SELFHTML Tipps & Tricks: http://aktuell.de.selfhtml.org/tippstricks/
    1. Hello,

      Nun arbeiten die Methoden in den Klassen grundsätzlich mit this->Eigenschaft, also übersetzt gesprochen ja eigentlich mit globalen Variablen.
      Hm, aber das ist doch nur vernünftig. Man kann doch bei Eigenschaften des eigenen Objektes nicht von "globalen Variablen" sprechen, oder? Man braucht doch innerhalb eines Objektes keine solchen Schnittstellen wie von außen - IMHO.

      Das ist eben die Frage, ob man einige Methoden einer Klasse nicht auch so bauen kann / bauen sollte, dass sie auch ohne die Abarbeitung der gesamte Klasse benutzbar sind. Bzw. wäre es ja der Sinn der Mthoden, dass ise ihre "Zuarbeiter" automatisch aufrufen, ich also einfach eine speziellee Methode der Klasse von außen aufrufe, und die sofort weiß, was zu tun ist...

      Jedenfalls sind hier zwei Konzepte durcheinander gekommen und ich muss nun sehen, was ich daraus mache. Da leigt aber an PHP 4, das noch keine echten Private Methods kannte.

      Wird Zeit, dass auch Private Funktions für die PP eingeführt werden!
      Man sollte dich da am Unit-Konzept von Turbo pascal orientieren und alles wird gut.

      | Es werden komplexe Objekte erzeugt, die dann für eien Bildanzeige (GD) benutzt werden.

      Die Speicherung des schrittweise erzeugten Objektes war bisher nicht vorgesehen.
      Warum speicherst Du nicht das Bild an sich?

      Weil das temporär erzeugte Bild immer noch Fehler enthält, die auf Konfigurationsmängeln beruhen, die in der DB gespeichert sind. Das Bild muss also 'generiert' wwerden. Du hast mich aber eben noch auf einen Historie-Mangel aufmerksam gemacht. Selbstverständlich muss (in der Weiterentwicklung) ich auch das im Browser gerenderte, in GD erzeugte, Bild als solches speichern, um Nachweis führen zu können...

      Wie mache ich denn DAS jetzt wieder? :-((   (ist ne rhetorische Frage)

      Ich habe sie Eingebaut, und tunlichst nur die Primary-Key-Struktur nebst unabhängigen Werten über drei Tabellen gespeichert.
      Das sagt mir so ziemlich wenig ;-)

      Naja, man speichert eben bicht das gesamte Objekt ab, das ja eigentlich auch in acht bis zehn iterativen Schritten aus den BDs erzeugt wurde, sondern nur die Primary Keys der Tabellen und einige unabhängige Werte, die beigefüttert wurden...

      Ich kann die Bilderzeugungsfunktionen nur benutzen, wenn die passende Speicherstruktur dur Erzeugung des Parameterstring für das Bild vorliegt.
      Meinst Du $_GET Parameter? Kannst Du nicht diese speichern, oder die Funktion so umschreiben, dass man sie auch direkt aufrufen kann - wenn die Parameter bekannt sind?

      Ja, die meine ich.
      Die Idee, die Get-Parameter des Bild-Scriptes 'as they are'  zu speichern, werde ich mal verfolgen. Das fällt auch in den Part "Historie-Funktionen"

      Die Methode bedient sich leider aus der Session und nicht aus der DB!
      Und was steht da so in der Session? Wie kommen die Daten in die Session?

      Genau DAS ist die Frage aller Fragen. Aber ich habe es jetzt wohl gleich (nur noch zwei Stunden schuften?). Ich muss eine neue Methode in die Klasse einbauen, die aus meinen gespeicherten Daten und sieben Tabellen das Objekt wiederherstellt, und dann die vorhandenen Methoden nutzen kann.

      Es ist (primär) nicht sinnvoll, das Objekt als Snapshot zu speichern, da dann die Probleme auf der anderen Seite beginnen (Buchhaltung, Kalkulation), und Änderungen in den Verweisen nicht bemerkt würden.

      Aber der Dialog mit Dir hat mir doch noch ein paar "Rotstift-Stellen" aufgezeigt Danke!

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. Hi Tom!

        Hm, aber das ist doch nur vernünftig. Man kann doch bei Eigenschaften des eigenen Objektes nicht von "globalen Variablen" sprechen, oder? Man braucht doch innerhalb eines Objektes keine solchen Schnittstellen wie von außen - IMHO.

        Das ist eben die Frage, ob man einige Methoden einer Klasse nicht auch so bauen kann / bauen sollte, dass sie auch ohne die Abarbeitung der gesamte Klasse benutzbar sind.

        Nein, das würde in meinen Augen dem OO-Konzept widersprechen. Ich betrachte ein Objekt als Einheit, mit bestimmten Eigenschaften und Methoden. Die öffentlichen Methoden stellen die Schnittstelle zur Außenwelt dar, private Methoden und Eigenschaften werden nur intern genutzt, und intern wird auch direkt auf selbige zugegriffen. Wichtig ist dass man nach außen hin eine gute API hat, so dass man die Arbeitsweise der Klasse intern komplett verändern kann, ohne Module, die diese Klasse benutzen angepasst werden müssen. Allerdings bekomme ich das in der Realität auch nicht immer so 100%ig hin, das liegt bei mir vor allem daran, dass ich teilweise sehr komplexe Objekte habe, dessen Arbeitsweise je nach Eigenschaften sich erheblich unterscheidet. Und hier komme ich auch mit Vererbung nicht wirklich auf einen grünen Zweig. Es ist in meinen Augen jedenfalls sinnvoll, mehr kleinere, spezialisierte Objekte zu verwenden, nur geht das leider nicht immer.

        Bzw. wäre es ja der Sinn der Mthoden, dass ise ihre "Zuarbeiter" automatisch aufrufen, ich also einfach eine speziellee Methode der Klasse von außen aufrufe, und die sofort weiß, was zu tun ist...

        In meinen Augen braucht eine Methode immer das komplette Objekte, daher wie bevorzuge ich wie gesagt möglichst kleine Klassen.

        Jedenfalls sind hier zwei Konzepte durcheinander gekommen und ich muss nun sehen, was ich daraus mache. Da leigt aber an PHP 4, das noch keine echten Private Methods kannte.

        Es liegt wohl eher an den Programmierern, die OOP nicht richtig verstanden haben ;-)

        Wird Zeit, dass auch Private Funktions für die PP eingeführt werden!

        was ist "die PP"?

        Man sollte dich da am Unit-Konzept von Turbo pascal orientieren und alles wird gut.

        Kenn ich nicht, aber was ist daran besser als an OOP?

        Warum speicherst Du nicht das Bild an sich?

        Weil das temporär erzeugte Bild immer noch Fehler enthält, die auf Konfigurationsmängeln beruhen, die in der DB gespeichert sind.

        Und warum erzeugst Du das Bild dann nicht erst, wenn alles korrekt ist?

        Und was steht da so in der Session? Wie kommen die Daten in die Session?

        Genau DAS ist die Frage aller Fragen. Aber ich habe es jetzt wohl gleich (nur noch zwei Stunden schuften?). Ich muss eine neue Methode in die Klasse einbauen, die aus meinen gespeicherten Daten und sieben Tabellen das Objekt wiederherstellt, und dann die vorhandenen Methoden nutzen kann.

        Ich würde die Methode(n) "refacroren", das heißt meist aufsplitten in mehrere Methoden/Objekte, die dann flexibler genutzt werden können, so dass Du nicht alles doppelt schreiben musst.

        Aber der Dialog mit Dir hat mir doch noch ein paar "Rotstift-Stellen" aufgezeigt Danke!

        gerne ;-)

        Grüße
        Andreas

        --
        SELFHTML Feature Artikel: http://aktuell.de.selfhtml.org/artikel/
        1. Hello,

          Das ist eben die Frage, ob man einige Methoden einer Klasse nicht auch so bauen kann / bauen sollte, dass sie auch ohne die Abarbeitung der gesamte Klasse benutzbar sind.

          Nein, das würde in meinen Augen dem OO-Konzept widersprechen.

          Hier müssen wir aber "Die Wertigkeit der OOP unter Berücksichtigung der höheren Internet-Philosopie"  (oder so frei nach Feuerzangenbowle) berücksichtigen.

          Man muss für Internet-Client-Server-Applikationen vollkommen andere Strategien entwicklen, als für verbindungsorientierte Applikationen, bei denen die laufzeit des Programmes minestens der Abarbeitungszeit eiens Vorganges entspricht.

          Daher ist die OOP für die Verwendung in verbindungsloses Umgebungen ohnehin schon fragwürdig (meine Meinung). Man muss auf das Wesentlichste reduzieren, da man ja bei jedem Request neu aufbauen (oder laden) muss.

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          1. Hi!

            Hier müssen wir aber "Die Wertigkeit der OOP unter Berücksichtigung der höheren Internet-Philosopie"  (oder so frei nach Feuerzangenbowle) berücksichtigen.

            Das ist richtig.

            Man muss für Internet-Client-Server-Applikationen vollkommen andere Strategien entwicklen, als für verbindungsorientierte Applikationen, bei denen die laufzeit des Programmes minestens der Abarbeitungszeit eiens Vorganges entspricht.

            Es gibt auch für OOP Konzepte dies zu erreichen, z.B. Design Patterns wie "Lazy Load"...

            Daher ist die OOP für die Verwendung in verbindungsloses Umgebungen ohnehin schon fragwürdig (meine Meinung).

            warum? IMHO ist es die sauberste Art der Programmierung. Performance ist nicht alles.

            Man muss auf das Wesentlichste reduzieren, da man ja bei jedem Request neu aufbauen (oder laden) muss.

            Man muss ja nicht alle Objekte initialisieren, außerdem gibt es entsprechende Caching-Strategien. Und es gibt im Internet nicht wirklich viele Anwendungen (gemessen an der Gesamtzahl der Anwendungen), die eine derartige Last verursachen, dass man sich so extreme Sorgen machen muss. Wie war das noch? "Premature optimization is the root of all evil" ;-)

            Grüße
            Andreas

            --
            SELFHTML Linkverzeichnis: http://aktuell.de.selfhtml.org/links/
            1. Hello,

              Man muss ja nicht alle Objekte initialisieren, außerdem gibt es entsprechende Caching-Strategien. Und es gibt im Internet nicht wirklich viele Anwendungen (gemessen an der Gesamtzahl der Anwendungen), die eine derartige Last verursachen, dass man sich so extreme Sorgen machen muss. Wie war das noch? "Premature optimization is the root of all evil" ;-)

              Na, jedanfalls hat sich mein Problem ganz plötzlich in Wohlgefallen aufgelöst, nachdem ich mir die Doku für die Klassen zusammengefriemelt hatte. Ist ja nix da. Da habe ich erst ziemlich kompliziert überlegt und gemalt, wie alles zusammenhängt und dann musste ich schlussendlich nur noch eine Popelfunktion mit ein paar foreach() schreiben und schon wars fertig. Dafür denkt man dann vier Stunden im Kreis rum...

              Sind aber ca. 30 Seiten Doku dabei entstanden.

              Harzliche Grüße aus http://www.annerschbarrich.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau
          2. hier scheint etwas durcheinander zu sein. oop ist immer die bessere wahl. und immer übersichtlicher. und immer stabiler.
            nur leider haben die programmierer zu viele schwächen. dies kann oop nicht verhindern.

            Das ist eben die Frage, ob man einige Methoden einer Klasse nicht auch so bauen kann / bauen sollte, dass sie auch ohne die Abarbeitung der gesamte Klasse benutzbar sind.

            ??? was bedeutet abarbeitung ganze klasse?
            das was du mit den privaten funktionen in pp meinst, läßt sich als funktionen in namensräumen lösen. diese werden dann statisch aufgerufen, also ohne instanzierte klasse (objekt). bekanntes beispiel (java) ist die math klasse.
            dieser namensraum kann im php die klasse sein. so kannst du die funktion x je nach kontext aufrufen:
            klasse1::x()
            klasse2::x()
            welche etwas völlig anderes machen.

            Man muss für Internet-Client-Server-Applikationen vollkommen andere Strategien entwicklen, als für verbindungsorientierte Applikationen, bei denen die laufzeit des Programmes minestens der Abarbeitungszeit eiens Vorganges entspricht.

            clent-server ist transaktionsorientiert. hier sind natürlich andere anforderungen an den kontroller-teil zu stellen, als bei fat-client.
            daher versucht m$ ja mit .net die ereignissteuerung auf den server zu übertragen.

            Daher ist die OOP für die Verwendung in verbindungsloses Umgebungen ohnehin schon fragwürdig (meine Meinung). Man muss auf das Wesentlichste reduzieren, da man ja bei jedem Request neu aufbauen (oder laden) muss.

            oop und verbindungslos gibt keinen zusammenhang.
            meine objektstrukturen auf dem server werden serialisiert und mit phpsession gepuffert.
            beim erneuten aufruf muß dafür gesorgt werden, das die klassen bereits deklariert sind, bevor die objektstruktur deserialisiert werden kann.
            daher übernehme ich die serialisierung und deserialisierung selbst, und überlasse dies nicht php. geht hervorragend.

            1. Hello,

              Ich arbeite schon länger an einer "Automatisierung" für die Seitenerstellung für den konkurrierenden, verbindungslosen Betrieb. Du glaubst wahrscheinlich nicht, dass ich mit der Original OOP von PHP bereits die gesteckte Speichergrenze gekillt habe, mit meiner prozeduralen Programmierung unter Nutzung von "Array of Functions" aber erst ca. 3/5 erreicht habe, bei gleichem Funktionsumfang.

              Auch im Zeitalter von Gigabyte-RAM sollte man nicht fahrlässig werden.

              Das ganze Konzept "PHP Scripting" oder "PERL Scripting" ...usw ist von der Auslegung her schon ein Objektmodell. Wenn ,man da nun noch ein weiteres Objektmodell einpflanzt, könnte es sein, dass man das Rad viermal erfindet.

              Harzliche Grüße aus http://www.annerschbarrich.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau
              1. Ich arbeite schon länger an einer "Automatisierung" für die Seitenerstellung für den konkurrierenden, verbindungslosen Betrieb. Du glaubst wahrscheinlich nicht, dass ich mit der Original OOP von PHP bereits die gesteckte Speichergrenze gekillt habe, mit meiner prozeduralen Programmierung unter Nutzung von "Array of Functions" aber erst ca. 3/5 erreicht habe, bei gleichem Funktionsumfang.

                ich kann dir leider nicht folgen.
                auch ich beschäftige mich schon seit jahren mit der 'richtigen' arbeitsweise von php. aber ich komme immer wieder auf objektstrukturen zurück. etwas besseres gibts unterm strich nicht.

                Auch im Zeitalter von Gigabyte-RAM sollte man nicht fahrlässig werden.

                wer braucht denn soviel speicher um eine seite aufzubauen ????

                Das ganze Konzept "PHP Scripting" oder "PERL Scripting" ...usw ist von der Auslegung her schon ein Objektmodell. Wenn ,man da nun noch ein weiteres Objektmodell einpflanzt, könnte es sein, dass man das Rad viermal erfindet.

                hier sehe ich keinen zusammenhang. php ist vom urgedanken her eine 'dynamisierung' von statischen seiten. hierbei werden teile der seite variabel gemacht, indem dort php benutzt wird. deshalb sieht der seitenquelltext auch idr. katastrophal aus und ist kaum lesbar.
                es geht aber auch anders, wenn man programmlogik und darstellung trennt. meine programmlogik erstellt eine objektstruktur, welche mit dem von dir erwähnten objektmodell nichts zu tun hat, und dies auch nicht neu erfindet.

                1. Hello,

                  es geht aber auch anders, wenn man programmlogik und darstellung trennt. meine programmlogik erstellt eine objektstruktur, welche mit dem von dir erwähnten objektmodell nichts zu tun hat, und dies auch nicht neu erfindet.

                  Zeigen!

                  Ich lerne immer gerne dazu.

                  Trotzdem behaupte ich, dass debi Interpretersprachen (>= 4GL) der Schitt von der PP zur OOP sehr viel verschwommener ist, als bei echten Compiler-Sprachen (<= 3GL).

                  Harzliche Grüße aus http://www.annerschbarrich.de

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  Nur selber lernen macht schlau
                  1. Hallo Tom,

                    Trotzdem behaupte ich, dass debi Interpretersprachen (>= 4GL) der Schitt
                    von der PP zur OOP sehr viel verschwommener ist, als bei echten
                    Compiler-Sprachen (<= 3GL).

                    Nein, Hybrid-Sprachen gab es auch “frueher” schon.

                    Grüße,
                     CK

                    --
                    So, wie ein Teil ist, ist das Ganze.
                    http://wwwtech.de/
                  2. Zeigen!

                    ich habe schon mehrfach dazu was gesagt:

                    z.b:

                    http://forum.de.selfhtml.org/archiv/2004/3/t74953/#m431683

        2. Hello,

          Wird Zeit, dass auch Private Funktions für die PP eingeführt werden!
          was ist "die PP"?

          Prozedurale Programmierung

          Man sollte dich da am Unit-Konzept von Turbo pascal orientieren und alles wird gut.
          Kenn ich nicht, aber was ist daran besser als an OOP?

          Nicht für OOP, sondern für PP. Was mir daran so gut gefiel, war der Umgang mit Namensräumen und Redefines.

          Und warum erzeugst Du das Bild dann nicht erst, wenn alles korrekt ist?

          Genau das will ich ja machen. Aber dazu muss ich den Mechanismus des "baue mir den Konfiguratinsstring" nachbauen bzw. ich denke, dass die Methode "baue mir das Klassenarray" die Lösung ist.

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau