Ich lerne mehr fortgeschrittene OO-Taktiken für Javascript aus einem C#-Hintergrund kommen und wundere mich über, wie oder wenn seine sogar eine gute Idee, Prototyp-basierte Validierung zu implementieren. Zum Beispiel, wenn ein Objekt oder eine Funktion erfordert einer seiner Parameter eine bestimmte Schnittstelle zu erfüllen, könnten Sie seine Schnittstelle wie so überprüfen,
var Interface = function Interface(i) {
var satisfied = function (t, i) {
for (var key in i) {
if (typeof t !== 'object') {
return false;
}
if (!(key in t && typeof t[key] == i[key])) {
return false;
}
}
return true;
}
this.satisfiedBy = function (t) { return satisfied(t, i); }
}
// the interface
var interfacePoint2D = new Interface({
x: 'number',
y: 'number'
});
// see if it satisfies
var satisfied = interfacePoint2D.satisfiedBy(someObject);
Ich habe mir diese Strategie ausgedacht, um ein Objekt nur anhand seiner Schnittstelle zu überprüfen und die interne Implementierung des Objekts zu ignorieren.
Oder sagen Sie, Sie verwenden Prototyp-basierte Vererbung, sollten Sie oder sollte nicht validieren Parameter auf der Grundlage ihrer Prototyp-Funktionen? Soweit ich weiß, verwenden Sie einen Prototyp, um Standardfunktionen zu implementieren, während eine Schnittstelle keine Standardfunktionen vorgibt. Manchmal kann das Objekt, das Sie an eine Funktion übergeben brauchen bestimmte Standardfunktionen, damit diese Funktion funktioniert. Ist es besser, nur gegen eine Schnittstelle zu validieren, oder sollten Sie jemals gegen einen Prototyp validieren, und wenn ja, was der beste Weg, es zu tun?
EDIT -- Ich gebe etwas mehr Hintergrundinformationen, warum ich diese Frage stelle,
Zum Beispiel bei der Entwicklung von Online-Spielen (meist in Javascript geschriebene Spiele). Es gibt 2 Hauptgründe, warum ich in diesem Zusammenhang an Validierung interessiert bin,
1) Bereitstellung einer starken öffentlichen API für die Modifizierung des Spiels, falls gewünscht
2) Verhinderung (oder zumindest starke Entmutigung) von potenziellen Betrügern
Dies erfordert ein Gleichgewicht zwischen Anpassungsfähigkeit und Missbrauch. Eine besondere Situation wäre die Entwicklung einer Physik-Engine, in der Objekte im Spiel auf die Schwerkraft reagieren. In einem realistischen System sollten die Benutzer nicht in der Lage sein, dem System Objekte hinzuzufügen, die nicht auf die Schwerkraft reagieren. Das System verfügt über eine Funktion, die die globale Wirkung der Schwerkraft an jedem beliebigen Punkt ausdrückt:
function getGravityAt(x, y) {
// return acceleration due to gravity at this point
}
Und Objekte, die reagieren, haben eine Methode, die dies zur Aktualisierung ihrer Beschleunigung nutzt:
function update() {
this.acceleration = getGravity(this.position);
}
Das Mindeste, was man tun kann, ist sicherzustellen, dass jedes dem System hinzugefügte Objekt eine "Update"-Methode hat, aber man stellt immer noch nicht sicher, dass die update()-Methode wirklich auf die Schwerkraft reagieren soll. Wenn nur Objekte erlaubt sind, die von einer prototypischen update()-Methode erben, dann weiß man zumindest zu einem gewissen Grad, dass alles im System realistisch reagiert.