Ich bin zu 100% mit dem Fall einverstanden, dass man auf jeden Fall sowohl clientseitige als auch serverseitige Datenvalidierungen verwenden sollte.
In den Frameworks und Umgebungen, in denen ich gearbeitet habe, waren die Ansätze, die ich gesehen habe, noch nie TROCKEN. Meistens gibt es keinen Plan oder kein Muster - Validierungen werden in die Modellspezifikation und Validierungen in das Formular in der Ansicht geschrieben. (Hinweis: Die meisten meiner Erfahrungen aus erster Hand liegen mit Rails, Sinatra und PHP mit jQuery vor.)
Wenn man darüber nachdenkt, scheint es nicht schwierig zu sein, einen Generator zu erstellen, der bei einer Reihe von Validierungen (z. B. Modellname, Feld (er), Bedingung) sowohl das erforderliche clientseitige als auch das serverseitige Material produzieren könnte. Alternativ könnte ein solches Tool die serverseitigen Überprüfungen (z. B. den validates
Code in einem ActiveRecord-Modell) verwenden und clientseitige Überprüfungen (z. B. jQuery-Plugins) generieren, die dann auf das Formular angewendet werden.
Offensichtlich ist das oben Gesagte nur ein "Hey, ich hatte diese Idee" und kein formeller Vorschlag. So etwas ist sicherlich schwieriger, als es schien, als die Idee mich traf.
Das bringt mich zu der Frage: Wie würden Sie vorgehen, um eine Technik zum einmaligen Schreiben, Ausführen auf Server und Client für die Datenüberprüfung zu entwerfen?
Verwandte Unterthemen: Gibt es solche Tools für bestimmte Frameworks oder Client-Server-Technologien? Was sind die Hauptprobleme oder Herausforderungen bei dem Versuch, nur einen Satz von Validierungen beizubehalten?
quelle
form_for
um automatisch clientseitigen Validierungscode bereitzustellen, sehr nützlich ist.Eine Überlegung, die Lösungen häufig einschränkt, ist der Netzwerk-Roundtrip. Der Client soll die Benutzerdaten validieren, ohne eine Nachricht über das Netzwerk zu senden. Mit anderen Worten, wenn der Benutzer die Senden-Schaltfläche drückt, soll der Client die Daten lokal validieren.
Nehmen wir zunächst an, dass wir diese Einschränkung nicht haben. Wir könnten mit einem Netzwerkendpunkt kommunizieren, der Validierungsprobleme gut artikulieren kann. Wenn Sie beispielsweise Ihren neuen Benutzerdatensatz an diesen senden, anstatt mit einem Vanilla-HTTP-Fehlercode zu antworten, wird möglicherweise eine ausführliche JSON-Antwort zurückgegeben, in der die Probleme aufgeführt sind, und der Client aktualisiert die Anzeige intelligent, um die aufgetretenen Probleme widerzuspiegeln. Der Endpunkt spielt die Rolle eines Validierungsgateways.
Es ist trocken, aber nicht ohne Nachteile. Erstens hängt es von der Netzwerk-Roundtrip ab, die unseren Server mit Überprüfungen belastet, die clientseitig hätten durchgeführt werden können. Zweitens geht das Design davon aus, dass alle CRUD-Vorgänge über unsere Endpunkte erfolgen. Wie sieht es jedoch aus, wenn Entwickler und Prozesse unsere Datenzugriffsschicht umgehen, indem sie direkt auf die Datenbank zugreifen ?
Lassen Sie uns unsere Lösung überdenken, um diese Nachteile zu überwinden. Speichern und kommunizieren wir stattdessen unsere Validierungen als Metadaten:
Sowohl der Client als auch der Server verfügen über einen Mechanismus (z. B. eine Engine) zum Interpretieren und Anwenden dieser Daten. (Einige nennen dies die freie Monade, da sie den deklarativen Teil von seinem Interpreter trennt.) In JavaScript konnten wir jede Information auf Arbeitsfunktionen abbilden. Um zu booten, können wir jede Ebene unserer Architektur, einschließlich unserer Datenbank, lehren, Validierungen konsistent durchzusetzen.
quelle
Eine Möglichkeit wäre, sowohl auf der Server- als auch auf der Clientseite dieselbe Sprache / dasselbe Framework zu verwenden.
Z.B
Node.js :: Client / Server in JavaScript GET :: Client / Server in Java
In diesem Fall ist der größte Teil des "Domain Object" -Codes gemeinsam, was eine Validierung einschließt. Framework ruft den Code nach Bedarf auf. ZB wird derselbe Code im Browser vor "Submit" und auf dem Server aufgerufen.
EDIT (Juni / 2014): Mit Java 8 ist es jetzt einfach, JS-Validierungscode auch in Java-Anwendungen zu integrieren. Java 8 verfügt über eine neue, dauerhaftere JS-Ausführungs-Engine (z. B. invokeDynamic).
quelle
Ich habe nur über das gleiche Problem nachgedacht. Ich wollte ANTLR verwenden, um einen abstrakten Syntaxbaum sowohl in C # als auch in Javascript zu erhalten. Von dort aus verwenden Sie Tree Walker, um die in der Sprache angegebenen Aktionen auf die zu validierenden Objekte anzuwenden.
So können Sie, wo immer Sie möchten, eine Beschreibung der erforderlichen Validierung in der Datenbank speichern.
So würde ich das Problem angehen.
quelle