MVC - wo Benutzereingaben überprüfen?
-
Wo sollten normalerweise die Benutzereingaben überprüft werden, z.B. ob es sich um ein Integerwert oder ob sich der Wert in einem bestimmten Intervall befindet?
Schon in der View, im Controller oder erst im Model?Mal als Beispiel. Das UI hat ein Eingabefeld und einen Button. Wenn man den Button drückt, wird aus der Eingabe aus dem Eingabefeld die Fakultät berechnet.
Wenn auf den Button gedrückt wird, meldet das die View dem Controller (Methode calcFak(int input) wird auf den Controller aufgerufen). Der Controller ruft nun die dafür vorgesehene Methode im Model auf -> Model benachrichtigt die View, dass es sich geändert hat und die View kann nun die benötigten Daten aus dem Model ziehen.
Aus dem Eingabefeld bekommt man erst mal einen String. Sollte der so wie er ist an den Controller übergeben werden oder soll die View den String vorher schon in einen Integerwert parsen und im Fehlerfall eine Fehlerausschrift produzieren und nichts an den Controller melden

-
ich denke im Controller... dieser nimmt ja eingaben entgegen, und müssen ggf. überprüft werden...
bin mir aber nich sicher...
-
was soll den im fehlerfall passieren?
-
Sowas würde ich in das Model legen. Das Model weiß schliesslich 1. was es für Daten hat und 2. kann dieses bestimmen, was für Daten zugelassen werden. Der Controller ist nur der Vermittler zwischen der View und dem Model. Der sollte eigentlich nichts manipulieren. Aber eine Eingabeprüfung ist auch eine Datenmanipulation. Und die Hoheit über Daten hat immer noch das Model.
-
grandpa schrieb:
Aus dem Eingabefeld bekommt man erst mal einen String. Sollte der so wie er ist an den Controller übergeben werden oder soll die View den String vorher schon in einen Integerwert parsen und im Fehlerfall eine Fehlerausschrift produzieren und nichts an den Controller melden

du könntest es auch zweistufig machen. beim eingeben wird z.b. eine vorfilterung gemacht, ob etwa keine buchstaben drin sind, wenn der benutzer zahlen eingeben soll. der controller verwirft dann den input, der nicht zum model passt.
-
naja die eingeabeelemete des controller können ja extra (filter) funktionen haben umd eigneben zu prüfen... so habe ich es immer gemacht.. aber ob dies elegeant ist weis ich nicht...
Bspw. bei einem Editfeld für eine Zahlen eigenabe , max. und min. überprüfen ..
Das Model sollte dann schon mit den vorgefiltern daten arbeiten können.. aber aber auch
-
Artchi schrieb:
Sowas würde ich in das Model legen. Das Model weiß schliesslich 1. was es für Daten hat und 2. kann dieses bestimmen, was für Daten zugelassen werden. Der Controller ist nur der Vermittler zwischen der View und dem Model. Der sollte eigentlich nichts manipulieren. Aber eine Eingabeprüfung ist auch eine Datenmanipulation. Und die Hoheit über Daten hat immer noch das Model.
das wäre völlig falsch. das model darf niemals direkt von aussen verändert werden. für dessen manipulation ist der controller zuständig.

-
Ja, die View könnte natürlich auch schon filtern. Es kann ja eine reine Integerview sein, die eh nur Zahlenwerte annimmt.
Am Ende ist es eine persönliche Designentscheidung. Würde eher wichtiger finden, das man den Filter austauschbar macht. Z.B. mit einem Visitor-/Strategiepattern. Ob es dann am Model, Controller oder View übergeben wird...
-
das daten format etc. eines eingabefeldes soll bei der übergabe ans model schon korrekt sein...
-
Artchi schrieb:
Ja, die View könnte natürlich auch schon filtern. Es kann ja eine reine Integerview sein, die eh nur Zahlenwerte annimmt.
eine 'view', wie der name schon sagt, nimmt nichts an, sondern macht nur die darstellung. weisst du überhaupt, um was es hier geht

--> http://de.wikipedia.org/wiki/Model_View_Controller
-
controller (eingabe der Daten und formatprüfung)
Model (verarbung der daten)
view (anzeige der daten bspw. diagramm)
grob ausgedrückt...
-
BorisDieKlinge schrieb:
controller (eingabe der Daten und formatprüfung)
Model (verarbung der daten)
view (anzeige der daten bspw. diagramm)
grob ausgedrückt...
ich meinte nicht dich

-
Also wenn das Model erst die Daten prüft, dann wäre es ja von der View abhängig. Wenn die View ein Eingabefeld zur Zahleneingabe hat, dann müsste das Model einen Text engegennehmen, wenn es ein Schieberegler wäre, der eine Zahl zurück gibt, dann müsste das Model eine Zahl entgegen nehmen. Ich würde die Überprüfung im Controller machen. Man kann zwar eine Vorfilterung in der View machen, aber die darf nicht die Überprüfung im Controller ersetzen, weil man die View einfach austauschen kann.
-
hm, das sind ja eine ganze Menge an verschiedenen Meinungen.
Meiner Meinung nach hat das Model Methoden wie in dem Beispiel
berechneFakultaet(unsigned int n)
und nicht
berechneFakultaet(string n)d.h. der richtige Datentyp wird im Model schon erwartet.
Deswegen muss die Umwandlung bzw Formatüberprüfung schon vorher passieren.
Was anderes ist es, wenn vielleicht bestimmte Wertebereiche vom Model erwartet werden, durch set()-Methoden sichergestellt.
Die View sollte das mitnichten wissen, sonst wäre sie abhängig.Beispiel Model-Methode:
void setWahrscheinlichkeit(double wahrscheinlichkeit) { if (wahrscheinlichkeit <= 1 && wahrscheinlichkeit >= 0) { this->wahrscheinlichkeit = wahrscheinlichkeit; } }In dem Fall prüft das Model die Daten. Ich denke das sollte auch so sein.
Allerdings wäre das irgendwie komisch. Davor prüft View oder Controller auf double-Wert und im Fehlerfall würde eine Fehlerausschrift wie "Gleitkommazahl erwartet!". Dann gibt der Nutzer 5 ein und dann würde die Fehlermeldung kommen wie "Wert zwischen 0 und 1 erwatet" Das ist ja auch irgendwie komisch.