OOP struktur frage

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • OOP struktur frage

    Hi,

    habe eine frage zur objektorientierten programmierung. Und zwar habe ich mein Projekt bis jetzt soweit es geht mit objekten programmiert. Dh. ua. das ich immer bei select-anfragen meine daten erst in ein object ablege und dann ausgebe / weiterverarbeite. Grösstenteils verwende ich globale Get funktionen... z.B. getUser, getUserList usw. wobei in jeder Funktion die objekte erstellt werden. Und genau hier liegt auch schon meine frage...da für ein Object mehrere GET funktionen vorhanden sind muss dieses Objekt auch an mehreren stellen erstellt werden. Wenn ich nun ein Objekt habe das z.B. 130 Eigenschaften aufnehmen kann und ich dieses objekt mehrmals erstelle, dann wächst der code natürlich schnell an... desweiteren muss bei änderung dieses objektes auch alle funktion geändert werden (mit die eigenschaften vorhanden sind).
    Lässt sich sowas nunmal nicht vermeiden (hab da keine gescheite idee) oder gibbts da n möglichkeit?

    Desweiteren werden ja die Select-Anweisungen jedesmal anders gebildet.. z.B. andere Sortierungen oder weniger / mehr Joins die gebildet werden. Z.B. an anderer Stelle ist es wiederum sinnvoll verknüpfungen per joins auszulesen und sogleich weitere objekte dem eigetnnlichen objekt beizufügen.. bsp: Wenn ich mir eine Userliste ausgebe, dann wird beim erstellen des Userobjektes auch gleich ein Usergruppenobjekt dem Userobjekt beigefügt. Würde man es nicht machen und möchte man trotzdem den Gruppennamen erhalten, dann müsste man für jeden user seperat die Gruppe auslesen, was denke ich mal datanbanktechnisch ziemlich unperformant sein dürfte..... zumindest wenn dann doch weitere informationen folgen.

    Wie gesagt, was mich dann halt stört ist das man die objekte teoretisch nach jeder selektanweisung (welche z.B. von den evtl. globaldefinierten funktionen abweicht) neu erstellen muss....

  • #2
    warum wurde OOP entwickelt?
    ich glaube nicht dafür um es bei Webanwendungen zu missbrauchen.
    <<Wenn ich nun ein Objekt habe das z.B. 130 Eigenschaften aufnehmen kann und ich dieses objekt mehrmals erstelle>>
    warum ?
    statt 130 eigenschaften kannman ein interne Array erstellen.
    statt 100 mal neue object zu machen schreibe einfach die functionen die ein Array liefern oder interne Array überschreiben.
    statt 130 get..() oder set...() zu machen, kannst du
    getByName($egenschaftname);
    und
    setByName($egenschaftname,$wert);
    benutzen, b.z.w __set und __get überschreiben.

    was ich aber nicht ganz verstehe, warum versuchst du aus einer Tabellen-Zeile ein object zu mache wenn eine Tabellen-zeile ohne weiteren ein object ist?
    Eine Tabelle ist eine Liste von Objekten!!!
    und die Funktionname getUserList klingt für mich sehr verdächtig, dass du die ganze abfrage als ein mehrdimensionale array lieferst, statt eine weitere verarbeitung b.z.w ausgabe von daten direkt durchzuführen.

    Meine meinung nach ist sql und datenbanken Objektorientiert genug.
    bei einer Classe die eine logische verbindung zu datenbank aufbauen muss, braucht man kaum eigenschaften.
    eine DB-classe muss einfach eine namenspace für die functionen die auf DB zugreifen bieten die einfach mit classname::function(); zu bedienen sind.
    Und noch eine Frage.
    wirst du deine Classen und objecte bei neuen Projekten benutzen, oder sind sie alle nur für diesen Projekt zu gebrauchen?
    wenn die Classen nur für einzige Projekt anwendbar sind, dann kannst du rhuig auf dein framework verzichten, und mit normalen funktionen arbeiten, und nur wenn es nicht zu vermeiden ist eine Classe zu erstellen, oder wenn diese Classe dir ein wirklich besseres Verständnis für dein Projekt verschafft, dann mach es, aber sei damit sehr sparsam(performance)
    Slava
    bituniverse.com

    Kommentar


    • #3
      Hi ich kann mich Slava nur anschließen.

      Du willst ja den User grafisch aufbereitet mit der DB kommunizieren lassen, und nicht die gesammte Strucktur der DB in Objekten abbilden!

      Verstehe mich nicht falsch, Objekte in PHP sind nicht immer sinnlos. Bsp. MySQL-Classe ( sollte deine x anderen objekte ersetzen ) , Template-Classe, u.ä.

      Gruß Basti

      Kommentar


      • #4
        also ich bin nicht der Meinung das es "unsinning" ist Webanwendungen und OOP zu kombinieren. Klar das der aufwand steigt, aber OOP wurde gerade deshalb entwickelt um spagetticode zu vermeiden. Imprinzip ist doch in so gut wie jeder programmierrsprache ein Recordset-Obj vorhanden welches den zugriff auf die Tabellenzeilen ermöglicht... obj. dienen doch vielmehr der kapselung von funktionen... gut die Eigenschaften könne man sicherlich dynamisch erstellen, finde es aber schöner wenn man eine classe hat in der die Eigenschaften alle vorhanden sind (jeder sieht sofort was dieses obj beinhaltet).
        bsp: Wenn ich nun z.B. bei einem Auftrag wissen möchte ob bereits ein PDF erstellt ist, ist es doch unsinning überall den dateinamen zu generieren, anweisungen zum prüfen ausführen ect.. Einfacher ist dann eine funktion wie auftrag.pdfExist(). oder wenn man einen Auftrag anlegen möchte muss man nicht auf jeder seite die Anweisng neu schreiben .. es reicht ein Auftrag.insert() und fertig .
        Und wenn es darum geht nur Classen zu erstellen bei objecten die man immer wieder verwenden kann, dann könne man ja imprinzip gleich weg lassen

        Und ich würde jetzt mal grob schätzen das z.b. die bekannten Foren auch OOP verwenden.

        Aso ganz vergessen .. jepps gerUserList liefert mir ein Array mit den einzelnen Usern zurück. Wenn ich nun irgenwo eine Liste mir bestimmten Usern generieren möchte kann ich einfach diese Funktion aufrufen (übergebe ihr paar suchparameter) und muss mich nur noch um die ausgabe kümmern.

        Bei speziellen abfragen ist man dann natürlich wieder eingeschränk und man muss das obj. lokal erneut definieren .... was mich wieder zu meiner frage führt *GG* .... Aber bin immer noch der meinung das es aufjedenfall sinnvoller ist die selectierten datensätze in obj zu schreiben.

        Kommentar


        • #5
          << gut die Eigenschaften könne man sicherlich dynamisch erstellen, finde es aber schöner wenn man eine classe hat in der die Eigenschaften alle vorhanden sind>>

          schöner oder sinnvoller?

          << Einfacher ist dann eine funktion wie auftrag.pdfExist(). oder wenn man einen Auftrag anlegen möchte muss man nicht auf jeder seite die Anweisng neu schreiben .. es reicht ein Auftrag.insert() und fertig >>

          und wie unterscheiden sich deine Methoden von einer einfacher function?
          wenn du deine functionen zu einem namesapce binden möchtest, dann mach bitte deine classe, aber die Methoden müssen dann statisch sein, damit du sie mit Afuftrag::insert() aufrufen kannst, ohne extra ein neue Object zu schaffen.

          <<Aso ganz vergessen .. jepps gerUserList liefert mir ein Array mit den einzelnen Usern zurück. Wenn ich nun irgenwo eine Liste mir bestimmten Usern generieren möchte kann ich einfach diese Funktion aufrufen (übergebe ihr paar suchparameter) und muss mich nur noch um die ausgabe kümmern. >>

          und gerade das finde ich nicht gut, weil du statt daten direckt zu verarbeiten zuerst in ein array packst, und erst dann ausgeben versuchst.
          gerade solche dinge kann man doch mit event-functionen erledigen.
          z.b.s
          PHP-Code:
          function getUser($function="adapter"){
          connect...
          $query=mysql_query(".....");
          while(
          $erg=mysql_fetch_array($query))
          $function($erg);
          }
          function 
          adapter($array){
           echo 
          implode(";",$array)."<br />";
          }
          //und jetzt einfach
          getUser();
          //und du hast eine csv ähnliche ausgabe
          //willst du die tabelle erstellen?
          function tabelle($array){
           echo 
          "<tr>";
            foreach(
          $array as $a){
            echo 
          "<td>$a</td>";
            }
          echo 
          "</tr>";
          }

          //Tabelle
          echo "<table>";
          getUser("tabelle");
          echo 
          "</table>"
          und hier hast du deine merfache einsatz von deiner function, die auslesen von Tabelle verborgen hat, und wenn es nicht mehr deinen anförderungen entschpricht überschreibst du einfach deine "adapter" function
          Slava
          bituniverse.com

          Kommentar


          • #6
            Re: OOP struktur frage

            Original geschrieben von daggit
            Grösstenteils verwende ich globale Get funktionen... z.B. getUser, getUserList usw. wobei in jeder Funktion die objekte erstellt werden.
            Warum global ? Warum ist die list-methode nicht ein member der
            klasse user oder userdao oder ... ?

            Original geschrieben von daggit
            Und genau hier liegt auch schon meine frage...da für ein Object mehrere GET funktionen vorhanden sind muss dieses Objekt auch an mehreren stellen erstellt werden.
            Warum mehrere ? Wenn du ne liste von usern haben willst,
            dann gibt es dafür genau eine methode. Feintuning wie sortierung
            oder filterung überlässt du parametern.

            Original geschrieben von daggit
            Wenn ich nun ein Objekt habe das z.B. 130 Eigenschaften aufnehmen kann...
            Dann ist die klasse eindeutig zu groß. Hier solltest du dann
            refaktorieren um die klassen zu verkleinern.


            Original geschrieben von daggit
            Wie gesagt, was mich dann halt stört ist das man die objekte teoretisch nach jeder selektanweisung (welche z.B. von den evtl. globaldefinierten funktionen abweicht) neu erstellen muss....
            Klingt nach einem undurchdachten design.

            Was die aussage mit den foren angeht, zumindest phpBB ist
            nicht objektorientiert.


            @slava
            Dein code mischt ansicht und logik.

            greets
            (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

            Kommentar


            • #7
              Re: Re: OOP struktur frage

              Original geschrieben von closure

              @slava
              Dein code mischt ansicht und logik.

              greets
              Ich habe eine Möglichkeit angezeigt, wie man erstellen von überflüssigen Arrays als Rückgabe gezeigt, was auch in meinem Beitrag geschrieben wurde.
              Er wollte ein Array haben um später bei Ausgaben zu benutzen, statt die ausgelesene Daten sequentiell für weiteren Bearbeitungen anzubieten.
              Ich bitte um die kurze Erklärung von Aussage
              Dein code mischt ansicht und logik.
              Slava
              bituniverse.com

              Kommentar


              • #8
                hallo nochmal

                und wie unterscheiden sich deine Methoden von einer einfacher function?
                habe mich vorhin etwas verschrieben.
                auftragobj.pdfExist() und
                auftragobj.insert() sind public methoden, keine statischen.


                @Slava (funktion)
                nette funktion, aber was mir nun eben fehlt sind die objekbezogenen funktionen. Wenn ich z.B. ähm.. wissen möchte wie viel ein user gegessen hat dann bräuchte ich eine funktion die mir sagt "gegessen = schnitzel + pommmes + eis" man könnte nun auch eine globale funktion erstellen, die dann die parameter zur berechnung erhält. Nur wenn sich später die berechnung ändert und ein weiterer parameter hinzu kommt, dann müsste man wieder alle seiten anpassen. Bei einer obj.funktion entfällt diese anpassung.


                Warum global ? Warum ist die list-methode nicht ein member der
                Ok stimmt, die Get-Obj methoden könnte und sollte man natürlich auch als static direct ans object binden....


                Warum mehrere ? Wenn du ne liste von usern haben willst,Feintuning wie sortierung
                oder filterung überlässt du parametern.
                jepp schon, denke aber sobald man mit vielen joins sortieren muss das es auch unübersichtlich wird jede erdenkliche möglichkeit in der funktion zu behandelt.

                was fällt mir spontan ein -_-... ka obs jetzt ein gutes beispiel ist aber z.B. "Zeige mir alle user die mehr als 10 Aufträge (mit rechnungen) angelegt haben und das ganze sortiert nach firma"...
                Spezielle fälle lassen sich denke ich nur schwirig als parameter übergeben, vorallem da ja die methode dem objekt evtl. auch gleich weitere objekte zuweisen soll um weitere db-anfragen zu vermeiden.
                Oder "liefer mir alle user, mal mit memos, mal ohne".... jede erdenklicke möglichkeit führt dann wohl auch irgendwann zu problemen.


                Dann ist die klasse eindeutig zu groß. Hier solltest du dann refaktorieren
                bin mir dabei noch n bisle unschlüssig. Weitere objekte kann man mit z.B. userobj.fetchMemos() dem userobjekt beifügen. Da es sich aber um eigenschaften handelt denke ich könnt man mehrere constructoren erstellen (einer für alles, und paar welche nur bestimme , haäufig verwendete eigenschaften erwarten). Vielleicht ca. 3 constructoren (details, alles, list) oda so.

                beim erstellen weiterer istanzen des Objektes hätte man dann nicht unbedingt megalangen code ....

                Kommentar


                • #9
                  <<
                  was fällt mir spontan ein -_-... ka obs jetzt ein gutes beispiel ist aber z.B. "Zeige mir alle user die mehr als 10 Aufträge (mit rechnungen) angelegt haben und das ganze sortiert nach firma"... >>

                  muss man wirklich dafür eine function erstellen?
                  ich glaube, dass deine sql-anweisung aussagekräftig genug ist, und dadrauf noch eine logische schicht zu legen ist nicht unbedingt nötig.
                  um dir aber die sql-befehle in übersicht zu halten, kannst du ein array mit allen sqlbefehlen erstellen und die schlüssel in diesem array mit sinvollen namen zu versehen.
                  z.b.s
                  $sql['all_user_ueber_10...']='select......';
                  für eine methode musstest du auch eine name für so ein select ausdenken müssen.
                  Jetzt kannst du deine sql in einzige Methode die selct behandelt übergeben, und
                  das war es eigentlich.
                  und deine Classe kannst du sogar in neuem projekt verwenden was eigentlich die vorteil von OOP ist.
                  Zuletzt geändert von Slava; 05.05.2006, 22:18.
                  Slava
                  bituniverse.com

                  Kommentar

                  Lädt...
                  X