Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Viele Klassen "sauber" verschachteln bzw. verwenden

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Viele Klassen "sauber" verschachteln bzw. verwenden

    Hey Leute

    Bin an einem kleinen Projekt in dem ich viele Klassen habe. Bin etwas neu in dem Gebiet Klassen, und ich weiß nicht, wie ich alle sauber unter bekomme.

    Ich habe z.B. eine Klasse, die eine Nachricht in eine Datenbank schreibt. Die Methode die dafür zuständig ist, greift auf andere Klassen bzw. Methoden zu, die wiederum andere aufrufen.

    Somit kommt es dazu, dass ich kreuz und quer mehrfach die selben Klassen öffne... also Objekte erstelle die ich eig. schon mal erstellt habe.

    Gibt es eine saubere Lösung viele Klassen ineinander zu verschachteln, bzw. diese irgendwie global zur Verfügung zu stellen, damit ich sie nicht jedes mal doppelt und dreifach verwende?

    Jedes mal Klassen-Objekte in Methoden zu übergeben, wäre etwas zu aufwendig und würde sich sehr falsch anfühlen.

    Oder regelt man so etwas, indem man einfach besser seine Methoden auf die richtigen Klassen aufteilt?

    Wie regelt ihr so was? Vielen Dank für die Antworten!

  • #2
    Vor allem über clean code und aufgeräumte Logik mit klaren Zuständigkeiten . Gutes OOD ist mehr als aus allem ein Objekt zu machen. Arbeitest du nach bekannten Mustern? Kannst du irgendwas griffiges über deine Architektur verraten?

    Kommentar


    • #3
      Jedes mal Klassen-Objekte in Methoden zu übergeben, wäre etwas zu aufwendig und würde sich sehr falsch anfühlen.
      Sagt der, der von "Klassen öffnen" redet...

      Oder regelt man so etwas, indem man einfach besser seine Methoden auf die richtigen Klassen aufteilt?
      Wenn Du raten müsstest, was für eine Antwort würdest Du hier erwarten? "Nein, belass Deine Methoden besser in den falschen Klassen"?
      [COLOR="#F5F5FF"]--[/COLOR]
      [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
      [COLOR="#F5F5FF"]
      --[/COLOR]

      Kommentar


      • #4
        Verwende Komposition. Du kannst ja einfach einfach dem Konstruktor (bzw. Settern) die Objekte übergeben, und dir diese dann in Membervariablen speichern.

        Kommentar


        • #5
          ...langsam aber sicher steuert es auf kreuz und quer raus.

          Oder was meinst du genau mit "etwas griffigem".

          Könnte dir höchstens ein Beispiel nennen.

          Habe z.B. eine User-Klasse mit Methoden wie safeSettings($post) und getId().
          Genauso wie eine Media-Klasse mit saveImg($img, $userId).

          In der Methode safeSettings wird saveImg von Media verwendet. Die benötigt ja, wie zu sehen, einmal das $img dass sich aus $post ergibt und einmal die UserId.

          Da in der Media-Klasse noch mehr Methoden sind, die die UserId benötigen, wollte ich einfach in Media noch einmal User öffnen... -> mit dem Ergebnis dass sich die Klassen gegenseitig unendlich geöffnet haben.

          Ok, dann hab ich es halt so gelöst, indem ich einfach beim Aufruf von saveImg die UserId mit übergebe. Soweit klappt das auch.

          Aber, weil ich in Media kein User eröffnen kann, heißt das, dass ich jetzt bei jeder Methode in Media die UserId mit übergeben muss... und das passt mir nicht, da ich diese ja auch aus anderen Klassen aus verwende bei denen es kein Fehler mit dem endlos öffnen geben würde.

          Ich weiß gerade echt nicht wie ich mich ausdrücken soll^^.... hoffe ihr versteht ein Teil.

          Zu nikosch:

          Versuche immer alles klein zu halten, was vermutlich öfter mein Fehler ist und sich deshalb ein paar Sache beißen. Das meine ich mit Methoden in den falschen Klassen.

          Nur frag ich mich, ob in diesen Fällen eben eine mir nicht bekannte Methode (Lösung) die Lösung ist, oder man ganz simpel ne neue Klasse erstellt in der sich dann nichts mehr beißt, aber dadurch alles nur noch verschachtelter macht?

          PS: ich bleibe bei meinen "Klassen öffnen", das gefällt mir.

          Kommentar


          • #6
            Ich finde, wenn du die Teile Kontrollflusssteuerung und Datenbankebene sauber trennst, hast du schon viel weniger Probleme. In einer Model-Methode "saveSettings" hat meiner Meinung nach die Methodr aus dem Media-Model nicht wirklich viel verloren...
            [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

            Kommentar


            • #7
              saveImg von Media die eine UserId braucht - ich kann mir darunter nicht wirklich was vorstellen.
              [COLOR="#F5F5FF"]--[/COLOR]
              [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
              [COLOR="#F5F5FF"]
              --[/COLOR]

              Kommentar


              • #8
                Speichern eines Avatars zugehörig zu einem Benutzer?

                Ich hätte eine Methode saveImg, die mir die ID des Img zurückliefert welche ich dann im UserModel dem User zuweisen kann. Es spielt ja keine Rolle, welche Art von Bild ich da speichere, das hat das ImgModel auch nicht zu interessieren.
                [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                Kommentar


                • #9
                  Ah ok. Über einen kleinen "Action-Controller" (switch der $_GET oder $_POST ausliest) frage ich immer ab was jetzt ausgeführt werden soll, und führe dann eben immer eine Methode aus, in der noch viele andere Methoden sind, bei denen es dann irgendwann knallt.

                  Vielleicht wäre es einfach sinnvoller diese ganzen Methoden auszulagern und nacheinander normal abzuarbeiten, die Rückgabewerte zu übergeben und nicht alles ineinander zu verschachteln!

                  Meinst du sowas in der Art?

                  Kommentar


                  • #10
                    Speichern eines Avatars zugehörig zu einem Benutzer?
                    Dann ist das Design aber schlecht. Upload + Speichern einer Datei in einem Ordner ist erstmal nix, was mit "Usern" zu tun hat. Das ist ein Prozess, den ich als Filesystemoperation anlgen würde und einfach nur mit einem Zielordner initialisieren. Den wiederum kann man aus einem UserProfil-Objekt gewinnen, das meinetwegen auch diesen Speicherprozess vorhält (oder auch nur aufruft). Weiters ist an das Userprofil ein Userobjekt angebunden.
                    [COLOR="#F5F5FF"]--[/COLOR]
                    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                    [COLOR="#F5F5FF"]
                    --[/COLOR]

                    Kommentar


                    • #11
                      @SchokoGurke: Naja. Objektorientierung heißt nicht, Objekte als Namespaces zu mißbrauchen um damit eine prozedurale Architektur zu kaschieren. Mach dir mal "CleanCode" von UncleBob fit (Buch). "PHP-DesignPatterns" ist ebenfalls sinnvoll.

                      Kommentar


                      • #12
                        Gut, vielen Dank für die Infos

                        Werde mich dann mal weiter einarbeiten und vermutlich mächtig viel umschreiben oO

                        Kommentar

                        Lädt...
                        X