Fette Modelle, dünne Controller und das MVC-Designmuster

75

Ich habe gerade einen Blog-Beitrag gelesen , in dem MVC anhand einer Bankanalogie erklärt wird. Ich habe einige Monate Erfahrung mit der Entwicklung von Webanwendungen mit einem MVC-Framework (CakePHP), damit ich die Grundlagen verstehe, aber ich sah ein Thema, das mich glauben ließ, dass ich einen fehlerhaften Ansatz für meine Logik gewählt habe:

  • Fette Modelle, dünne Controller
  • Behalten Sie so viel Geschäftslogik wie möglich in den Modellen

In meiner App sind Modelle magersüchtig und Controller sind fettleibig. Ich habe die gesamte Geschäftslogik in den Controllern und nichts außer Assoziationen und Validierungsregeln in den Modellen.

Beim Durchsuchen meiner Controller kann ich jetzt eine Menge Logik identifizieren, die wahrscheinlich in ein Modell passen sollte:

  • Die App verfügt über Listen, die Elemente enthalten, und die Elemente können eingestuft werden. Die Sortierlogik, die die Liste in eine Rangfolge bringt, befindet sich in einer Steuerung.
  • In ähnlicher Weise haben Elemente (Elementmodell) auch Bilder (Bildmodell). Jedes Element kann ein Standardbild haben (in der Elementtabelle mit image_id gekennzeichnet). Wenn ein Element mit seinen Bildern angezeigt wird, sollte zuerst das Standardbild angezeigt werden. Ich habe die Logik, die dies in einem Controller tut.
  • Wenn eine Liste angezeigt wird, werden Themenlisten in der Seitenleiste angezeigt. Die Logik zum Bestimmen, welche Listen zusammenhängen, befindet sich in einer Steuerung.

Nun zu meinen Fragen:

  1. Bin ich mit den Beispielen, die ich oben gegeben habe, auf dem richtigen Weg zu denken, dass dies derzeit Instanzen von Logik in einem Controller sind, der zu einem Modell gehört?
  2. Welche anderen Bereiche der Logik, die Web-Apps gemeinsam haben, sollten in Modelle einfließen?
  3. Ich bin mir sicher, dass es die halbe Miete ist, dieses Problem zu identifizieren und mein Entwurfsmuster zu ändern, aber selbst wenn ich mich entscheide, die oben genannten Beispiele zu verwenden und zu versuchen, diese Logik auf ein Modell zu übertragen, würde ich nicht wissen, wo ich anfangen soll. Kann mich jemand in die richtige Richtung weisen, indem er hier Code veröffentlicht oder auf einige gute Lernressourcen verweist? CakePHP-spezifische Hilfe wäre großartig, aber ich bin sicher, dass alles, was MVC ist, ausreichen wird.
Ryonlife
quelle
Ich habe schon mal

Antworten:

55

Es ist etwas schwierig, Ihnen die "richtigen" Antworten zu geben, da sich einige von ihnen mit den Besonderheiten des Frameworks befassen (unabhängig davon, mit welchen Sie arbeiten).

Zumindest in Bezug auf CakePHP:

  1. Ja

  2. Alles, was sich mit Daten oder Datenmanipulation befasst, sollte in einem Modell enthalten sein. Was ist mit CakePHP in Bezug auf eine einfache find () -Methode? ... Wenn die Möglichkeit besteht, dass es etwas "Besonderes" bewirkt (dh einen bestimmten Satz von "Bedingungen" zurückruft), das Sie möglicherweise an anderer Stelle benötigen, ist dies eine gute Ausrede, um die Methode eines Modells einzuschließen.

  3. Leider gibt es keine einfache Antwort, und das Refactoring des Codes ist ein natürlicher Prozess. Manchmal wachst du einfach auf: "Heilige Makkaroni ... das sollte im Modell sein!" (Na vielleicht machst du das nicht, aber ich habe :))

vladko
quelle
5
Blog-Autor schreibt gewinnende Antwort FTW!
Xeoncross
19

Ich verwende mindestens diese beiden "Tests", um zu überprüfen, ob meine Logik am richtigen Ort ist:

1) Wenn ich ein Unittest schreibe, ist es einfach, nur das eine "echte" Objekt zu erstellen, für das der Test durchgeführt werden soll (= das Objekt, das Sie in der Produktion verwenden), und nicht viele andere einzuschließen, außer vielleicht einigen Wertobjekten. Wenn Sie sowohl ein tatsächliches Modellobjekt als auch ein tatsächliches Controller-Objekt benötigen, um einen Test durchzuführen, kann dies ein Signal sein, das Sie benötigen, um die Funktionalität zu verschieben.

2) Stellen Sie sich die Frage: Was wäre, wenn ich eine andere Möglichkeit zur Verwendung dieser Klassen hinzufügen würde, müsste ich die Funktionalität so kopieren, dass sie fast kopiert und eingefügt wird? ... Das ist wahrscheinlich auch ein guter Grund, diese Funktionalität zu verschieben.

auch interessant: http://www.martinfowler.com/bliki/AnemicDomainModel.html

Simon Groenewolt
quelle