2009-01-21 2 views
73

Ich lese gerade eine blog post, die MVC mit einer Bankanalogie erklärt. Ich habe einige Monate Erfahrung mit der Entwicklung von Webanwendungen mit einem MVC-Framework (CakePHP), also bekomme ich die Grundlagen, aber ich begann ein Thema zu sehen, das mich denken ließ, dass ich einen fehlerhaften Ansatz für meine Logik verwende:Fette Modelle, dünne Controller und das MVC-Entwurfsmuster

  • Fat Modelle, Skinny Controller
  • Halten Sie so viel Geschäftslogik in den Modellen wie möglich

in meiner App-Modelle sind mit Anorexie und Controller sind fettleibig. Ich habe alle Geschäftslogik in den Controllern und nichts außer Assoziationen und Validierungsregeln in den Modellen.

Scanning durch meinen Controller, kann ich jetzt viel Logik identifizieren, die wahrscheinlich in einem Modell gehen sollte:

  • Die App haben Listen, die Elemente enthalten, und die Elemente sortiert werden können. Die Sortierlogik, die die Liste in Rangfolge bringt, befindet sich in einer Steuerung.
  • Ähnlich haben Artikel (Artikelmodell) auch Bilder (Image-Modell). Jedes Objekt kann ein Standardbild haben (in der Artikeltabelle mit image_id bezeichnet). Wenn ein Objekt mit seinen Bildern angezeigt wird, sollte das Standardbild zuerst angezeigt werden. Ich habe die Logik, die das in einem Controller macht.
  • Wenn eine Liste angezeigt wird, werden verwandte Listen in der Seitenleiste angezeigt. Die Logik zum Bestimmen, welche Listen in Beziehung stehen, befindet sich in einer Steuerung.

Nun zu meinen Fragen:

  1. Mit den Beispielen, die ich oben gab, bin ich auf dem richtigen Weg in der Annahme, dass diejenigen Instanzen der Logik sind gegenwärtig in einem Controller, der in einem Modell gehört?
  2. Welche anderen Bereiche der Logik, wie sie bei Web-Apps üblich sind, sollten in Modelle integriert werden?
  3. Ich bin sicher, dass die Identifizierung dieses Problems und die Änderung meines Entwurfsmusters die halbe Miete ist, aber selbst wenn ich mich entscheide, die oben genannten Beispiele zu nehmen und zu versuchen, diese Logik auf ein Modell zu übertragen, würde ich nicht wissen, wo ich anfangen soll . Kann mir jemand in die richtige Richtung zeigen, indem ich hier etwas Code posten oder auf gute Lernressourcen verlinken kann? CakePHP spezifische Hilfe wäre großartig, aber ich bin sicher, dass alles MVC ausreichen wird.
+0

Hab schon mal davon gehört :) – Marco

Antwort

54

Es ist ein bisschen hart, um die „richtigen“ Antworten zu geben, da einige von ihnen mit den Besonderheiten des Rahmens befassen (unabhängig von denen, mit dem Sie arbeiten).

zumindest in Bezug auf CakePHP:

  1. Ja

  2. Alles, was mit Daten oder Datenmanipulation sollte in einem Modell. In Bezug auf CakePHP was ist mit einer einfachen find() Methode? ... Wenn es eine Chance gibt, dass es etwas "Besonderes" (d. H. Eine bestimmte "Bedingung") hervorruft, was Sie anderswo brauchen könnten, ist das eine gute Ausrede, um die Methode eines Modells zu umbrechen.

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

+2

schön gestellt. Und ein guter Blogbeitrag auch. – andyk

+5

Blog Autor schreibt gewinnende Antwort FTW! – Xeoncross

19

Ich bin mit zumindest diese beiden ‚Tests‘ zu überprüfen, ob meine Logik an der richtigen Stelle ist:

1) Wenn ich einen Unittest schreiben, ist einfach nur das erstellen ‚real 'Objekt, auf dem der Test ausgeführt werden soll (= das Objekt, das Sie in der Produktion verwenden) und nicht viele andere, außer vielleicht einige Wertobjekte. Wenn Sie sowohl ein tatsächliches Modellobjekt als auch ein tatsächliches Controllerobjekt benötigen, um einen Test durchzuführen, könnte dies ein Signal sein, das Sie benötigen, um die Funktionalität zu verschieben.

2) Stellen Sie mir die Frage: Was, wenn ich eine andere Weise hinzufügte, um diese Klassen zu verwenden, würde ich Funktionalität auf eine Art kopieren müssen, die fast copy-paste ist? ... Das ist wahrscheinlich auch ein guter Grund, diese Funktionalität zu verschieben.

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

Verwandte Themen