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