Franki: OOP + MVC Frage

Hallo.

Angenommen ich habe ein MVC-Pattern und das Modul "Sammlung"
und diese hat die Untermodule Fkt1-6.

Und ich brauche z.B. Fkt1 und Fkt3 _jedes_ mal, wenn Modul Sammlung aufgerufen wird, dann möchte ich direkt auf die Module von Fkt1,3 zugreifen und nicht erst über deren Controller gehen.

Irgendwie klingt das für mich aber sehr "unsauber".
Wie sieht das bei einem MVC-Pattern aus?
Kann man Modul-übergreifend _nur_ auf Models zugreifen um sich beispielsweise Informationen aus der Datenbank zu holen?
Oder sollte ich dafür extra eine Methode im jeweiligen Controller schreiben der das macht? Weil das wäre dann praktisch ein unnötiger Klassenaufruf und ein unnötiger Methodenaufruf mehr und bei PHP - kostet sowas nun mal Performance.
Deshalb habe ich z.B. Front-Controller, Dispatcher und autoload-Funktion in einer Datei (index.php), wozu noch mehr Dateien aufrufen wenn diese eh immer geladen werden und so groß sind die 3 Sachen nicht, als das mir die Ordnung wegfliegen würde.

Und was das Model angeht. Bisher stehen dort nur die Methoden in der direkt auf die Datenbank zugegriffen wird.
Jetzt arbeite ich an einer Bilderverwaltung, sollten diese Sachen (ich muss Bilder entgegennehmen, prüfen,ggf. verkleinern, verschieben) ins Model?

Gruß, Franki

  1. Hallo,

    Kann man Modul-übergreifend _nur_ auf Models zugreifen um sich beispielsweise Informationen aus der Datenbank zu holen?
    Oder sollte ich dafür extra eine Methode im jeweiligen Controller schreiben der das macht?

    Ich bin in dem Zusammenhang nicht sicher, was Du mit "Modul" meinst.
    Ist ein "Modul" dasselbe wie ein "Modell"?

    Wenn ja, hängt die Antwort auf Deine Frage (ob ich von einem Modell auf ein anderes zugreifen darf) in meinen Augen davon ab, wie die Beziehung zwischen den Modellen fachlich ist:

    Nehmen wir an, ich modelliere eine Firma:

    Wenn ich ein Modell "Abteilung" und ein Modell "Mitarbeiter" habe, so darf IMO das Modell "Abteilung" sehr wohl direkt auf das Modell "Mitarbeiter" zugreifen (z.b. über eine Methode "abteilung->getAllMitarbeiter()"), denn eine Abteilung besteht nun mal aus Mitarbeitern, es gibt (ausgehend von einer "einfachen" Firmenstuktur :)) keine Mitarbeiter ohne Abteilung etc.
    Auch ist die Beziehung zwischen beiden auch technmisch sehr eng, d.h., wenn ich die Implementierung eines Mitarbeiters ändere (beispielsweise ihn in einem anderen Datenbank-System persistiere) so muss ich vermutlich auch die Modellierung für "Abteilung" anpassen.

    Ein Mitarbeiter sollte aber z.b. keine Methode "getMeetingRoomList()" besitzen (mit der alle Meeting-Räume der Firma aufgelistet werden) - denn ein Meeting-Raum hat erstmal nichts mit einem Mitarbeiter zu tun, eine Beziehung zwischen den beiden (z.b. "Mitarbeiter A resereviert Meeting-Raum X") kommt erst durch die Applikations-Logik zustande und gehört deshalb in den Meeting-Room-Controller und nicht in den Mitarbeiter.

    Generell gilt für Design-Patterns aber im Allgemeinen: Man muss IMMER(!) Kompromisse zwischen sauberer Architektur, Performance, Speicher-Bedarf und anderen technischen Randbedingungen machen! Einen durchweg sauberen, speicherschonenden, performanten Weg gibt es so gut wie nie und nur in den Programmierübungen an den Schulen/Hochschulen ;)

    Und was das Model angeht. Bisher stehen dort nur die Methoden in der direkt auf die Datenbank zugegriffen wird.
    Jetzt arbeite ich an einer Bilderverwaltung, sollten diese Sachen (ich muss Bilder entgegennehmen, prüfen,ggf. verkleinern, verschieben) ins Model?

    Auch da muss man wieder sagen: Kommt auf den Standpunkt an ;)
    Das Verkleinern/Vergrößern eines Bildes könnte z.b. finde ich in ein Modell.
    Denn es ist das Wesen eines Bildes, dass man es verkleinern/vergrößern kann, und zwar eines jeden Bildes.

    Die Entgegennahme/Prüfung eines Bildes hingegen hängt (vermutlich, kommt aber stark auf die Anwendung an) von der Applikationslogik ab:

    Nehmen wir z.b. als Prüfung an "Prüfe ob die hoch geladene Datei X ein Bild ist und kleiner als 5 MB ist".
    Ist das eine Eigenschaft eines Bildes?
    Nein! Vielleicht möchtest Du zukünftig eine neue Anwendung programmieren, die zwar auch das "Bild-Modell" (welches "verkleinern" und "vergrößern" kann) nutzt, aber welche dann 10MB große Text-Dateien akzeptiert (die dann in Bilder umgewandelt werden). Und was passiert bei einer fehlgeschlagenen Prüfung? Soll der Benutzer eine Warnung angezeigt bekommen? Oder soll nur eine Log-Meldung geschrieben werden? Oder... Alles Dinge, die das Bild als Bild nicht interessieren.
    => gehört in den Controller.

    Ist aber wie gesagt sehr viel Ansichtssache dabei, weswegen ich auch so einen langen Roman schreiben muss um mich zu Deiner Frage zu äußern ;)

    Viele Grüße,
    Jörg

    1. hey,super erklärt Jörg. Ich habe mich mit MVC nur mal am Rande beschäftigt, und es klingt sehr interessant. durch deine Erklärung habe ich es erst jetzt richtig verstanden!

      Danke!

  2. Hi!

    Beschreibe doch bitte zunächst weniger aus der Sicht deiner derzeitigen Implementierung sondern mehr aus der Sicht der Aufgabenstellung, so dass man verstehen kann, was da und warum gebraucht wird. Das wird derzeit nicht klar, so dass viel Interpretationsspielraum vorhanden ist und die ersten Antworten dem von dir gewünschten Ziel vermutlich nicht sehr nahekommen.

    Angenommen ich habe ein MVC-Pattern und das Modul "Sammlung"
    und diese hat die Untermodule Fkt1-6.

    Da nehme ich mal an, dass es sich bei einem Modul um einen Teil der Ausgabe handelt, beziehungsweise um Programmteil, das für diese Ausgabe zuzüglich der dafür notwendigen Verarbeitung zuständig ist.

    Und ich brauche z.B. Fkt1 und Fkt3 _jedes_ mal, wenn Modul Sammlung aufgerufen wird, dann möchte ich direkt auf die Module von Fkt1,3 zugreifen und nicht erst über deren Controller gehen.

    Jetzt verwirrst du mich. Ich denke, Sammlung als Modul ist ein Controller mit den Actions Fkt1..6. Klär mich doch da bitte mal auf, aber - siehe oben - vorwiegend aufgabenstellungsbezogen, dann darauf eingehend, warum du dann deine derzeitige Implementation gewählt hast (und wie die strukturell aussieht).

    Kann man Modul-übergreifend _nur_ auf Models zugreifen um sich beispielsweise Informationen aus der Datenbank zu holen?

    Da ich nicht genau weiß, ob du unter Modul das gleiche verstehst wie ich, kann ich dir da nicht genau anworten.

    Oder sollte ich dafür extra eine Methode im jeweiligen Controller schreiben der das macht?

    Generell gesehen wäre zu überlegen, wie die Aufgabenverteilung geregelt ist und ob es eine Abgrenzung zwischen den Teilaufgaben gibt und wie stark die sein soll/muss.

    Weil das wäre dann praktisch ein unnötiger Klassenaufruf und ein unnötiger Methodenaufruf mehr und bei PHP - kostet sowas nun mal Performance.

    Ist das eine theoretische Überlegung oder eine (durch Messung) nachgewiesene gravierende Beeinträchtigung der Reaktionszeit?

    Deshalb habe ich z.B. Front-Controller, Dispatcher und autoload-Funktion in einer Datei (index.php), wozu noch mehr Dateien aufrufen wenn diese eh immer geladen werden und so groß sind die 3 Sachen nicht, als das mir die Ordnung wegfliegen würde.

    Bei häufigem Gebrauch liegen die sicher alle im Cache. Wie groß sind denn die Unterschiede zwischen der getrennten und zusammengeführten Version?

    Und was das Model angeht. Bisher stehen dort nur die Methoden in der direkt auf die Datenbank zugegriffen wird.
    Jetzt arbeite ich an einer Bilderverwaltung, sollten diese Sachen (ich muss Bilder entgegennehmen, prüfen,ggf. verkleinern, verschieben) ins Model?

    Geschäftslogik kommt ins Model, Ausgabeaufbreitung in die View. Dirigierende Aufgaben übernimmt der Controller. Das Model muss nicht immer nur eine Datenbankabstraktion sein, es kann auch als Repository gestaltet sein, in dem die geschäftlichen Verfahren gesammelt liegen.

    Du kannst dir ja mal die ASP.NET-Tutorials zu deren MVC-Implementation ansehen. Besonders da #20 - Validating with a Service Layer.

    Lo!