Manchmal können Aktionsfunktionen in der Controller-Klasse sehr umfangreich und unangenehm werden, mit vielen, vielen Codezeilen, um einfach den Datenfluss vom Modell zur Ansicht zu steuern. Irgendwann verlieren diese riesigen Funktionen die Grundprinzipien eines guten Codes völlig aus den Augen, dh sie tun nur eines: klein, lesbar und verwaltbar usw.
Wäre es eine gute Praxis, diese riesigen Aktionsfunktionen in kleinere private Funktionen in der Controller-Klasse zu unterteilen, oder sollte die Notwendigkeit einer solchen Optimierung bedeuten, dass wir sie lieber in das Modell aufnehmen sollten?
Ich würde dafür stimmen, dass die kleineren Funktionen im Controller privat sind, damit sie relativ zur Aktion sind, aber ich habe Argumente gehört, dass der Controller vorzugsweise einfach sein sollte, während das Modell riesig und klumpig werden kann. und fragte mich nur, welche die am meisten bevorzugte Methode sein würde.
quelle
Die beste Antwort, die ich geben kann, ist ein Zitat aus dem großartigen Buch von Robert Martin, "Clean Code", das ich jedem empfehlen kann, der sich für das Thema interessiert:
Kann es nicht besser sagen. Ein weiteres großartiges Zitat aus demselben Buch gilt:
Wenn Sie Ihren Code in mehrere Funktionen aufteilen, müssen Sie diesen Funktionen aussagekräftige Namen geben, die die Lesbarkeit Ihres Codes erheblich verbessern können. Selbstverständlich sollten alle Funktionen, die nicht für die Verwendung außerhalb der Klasse vorgesehen sind, privat sein, damit Sie Ihren Code problemlos über die Vererbung wiederverwenden können.
Wenn Ihr Controller jetzt zu viele Funktionen hat, ist dies ein Zeichen dafür, dass er wahrscheinlich zu viel tut. Dann können Sie es in mehrere unabhängige Teile aufteilen oder versuchen, einige Funktionen auf Modelle zu verschieben, wie in der anderen Antwort erwähnt. Auch wenn Sie der nicht-klassischen MVC-Variante folgen, bei der Ansichten eine gewisse Logik haben dürfen, können Sie einige Ihrer Funktionen dort platzieren, wann immer dies passt.
quelle
In MVC versuche ich sicherzustellen, dass mein Controller so "dünn" wie möglich ist und dass meine Modelle so dumm wie möglich sind.
Die erforderlichen Logik- und Hilfsfunktionen werden in separate eigenständige Hilfsklassen eingeteilt. Es macht mein Testen auch viel einfacher (Sie testen .. richtig ??: D) Das Testen von Controllern ist notorisch schwierig. Jedes Mal, wenn Sie versuchen, eine Instanz eines Controllers zum Testen zu erstellen, müssen Sie über den HTTP-Kontext und Fälschungen nachdenken http dies und das, und es ist ein Schmerz, aber es ist ein Schmerz mit Absicht. Sie brauchen all das Zeug, weil ein Controller so eng mit HTTP und dem Web verbunden ist. Es ist der Einstiegspunkt in Ihre Web-App.
Logik- und Hilfsfunktionen haben nichts mit dem Web zu tun. Sie sind völlig umweltunabhängig (oder sollten es sein). Das allein sollte Ihnen sagen, dass sie nicht am selben Ort zusammengehören. Wenn Sie die gesamte Anwendungslogik so eng mit dem Web oder einer bestimmten Webimplementierung verknüpfen, können Sie sie niemals mitnehmen.
Wir haben unsere MVC-Site mit all unseren Datenbankentitäten (nicht unseren MVC-Modellen, unseren tatsächlichen Datenbankentitäten), unserem Speicher, unseren Hilfsklassen und unserer Logik in separaten eigenständigen DLLs entwickelt. Wir hatten nur eine Website, aber wir haben es trotzdem so gemacht.
Vor einigen Monaten wurden wir gebeten, einige Desktop-Apps zu erstellen, die sich auf einige unserer Fringe-Systeme beziehen. Dies war einfach, da unser gesamter getesteter Code problemlos wiederverwendet werden konnte. Wenn wir unseren Code in unser Webprojekt geschoben oder in unsere Controller eingefügt hätten, wären wir dazu niemals in der Lage gewesen.
quelle
Neben den großartigen Antworten von Dmitri Zaitsev und Spaceman weiß ich nicht, ob Folgendes auch für PHP gilt: Sie sollten versuchen, private Methoden zu vermeiden, da es an automatisierten Testmöglichkeiten mangelt.
Ja, Sie können Metaprogrammierung oder Abhängigkeitsinjektion auch zum Testen privater Methoden verwenden, aber Sie sollten dies nicht tun, da dies einen großen Einfluss auf die Lesbarkeit Ihres Codes hat.
Denken Sie immer an das KISS-Prinzip: Halten Sie es einfach, dumm.
quelle