Ich habe eine Reihe von Einzweckfunktionen, die ich in zwei separaten Controllern benötige. Im Moment habe ich nur doppelten Code und möchte ihn loswerden. Dieser Code ist Teil des Controllers und gehört nicht zu meiner Serviceschicht. Wo würdest du es hinstellen?
mvc
code-smell
Erin
quelle
quelle
Antworten:
Sie haben nicht gesagt, welche Art von Logik Sie teilen. Kurz gesagt, ist diese Steuerlogik oder eine Hilfsfunktion? Die beiden Methoden, um in einer objektorientierten Sprache damit umzugehen, sind Vererbung und Komposition. Vererbung ist sinnvoll, wenn zwischen den beiden Controllern eine gemeinsame Aktion besteht. Komposition macht den Rest der Zeit Sinn. Das Beispiel für die Verwendung der Vererbung liegt in meiner ursprünglichen Antwort unter dem Teiler.
Es ist nicht ungewöhnlich, dass je nach Framework eine Utility-Klasse oder eine Helfer-Klasse vorhanden ist. In Java- und C # -Webframeworks verfügen Sie möglicherweise über ein Paket / einen Namespace für Dienstprogramme. In Ruby on Rails nutzen Sie möglicherweise die
Helper
Klasse, die die Logik zwischen Controllern und Ansichten teilt. Grundsätzlich würde es so aussehen:Alternativ können Sie es zu einer Klasse machen, die Sie instanziieren. Der Schlüssel zum obigen statischen Klassenmuster besteht darin, Ihre Funktionen zu reinen Funktionen zu machen. Mit anderen Worten, Sie übergeben einen beliebigen Status, den es für seine Arbeit benötigt, und die Funktion verweist nicht auf einen anderen statischen Status im System.
In beiden Fällen würden Sie in jedem Ihrer Controller wie folgt darauf zugreifen:
Ursprüngliche Antwort
Sie haben nicht gesagt, was Ihre Plattform ist, da dies die Antwort beeinflussen kann. Unter der Annahme, dass es sich um eine objektorientierte Sprache handelt, besteht der häufigste Ansatz darin, eine Basisklasse zu erstellen, die beide Controller erweitern. In Ruby on Rails haben Sie beispielsweise Folgendes:
Sie können die Idee auch in andere Sprachen übersetzen. Der gleiche Ansatz funktioniert für ASP.NET MVC, Apache Wicket, Grails oder nahezu jedes andere objektorientierte Webframework. Wenn Ihre Sprache nicht objektorientiert ist, hängt es wirklich davon ab, wie das Framework für den besten Ansatz konzipiert ist.
quelle