English 中文(简体)
Java OOP - 通过接口或原型验证物体的最佳做法
原标题:Javascript OOP - Best practices when validating objects via interface or prototype

我正在从C#背景中学习更先进的脊髓灰质炎防治策略,并想知道如何实施或是否实施原型验证的良好想法。 例如,如果物体或功能需要其参数之一才能满足某种接口,则你可以检查其界面。

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); 

我在提出这一战略时,只用界面验证物体,而忽视了物体的内部执行。

或者说,你正在使用原型遗产,你是否应该根据原型功能验证参数? 我的理解是,你使用原型来实施违约功能,而接口没有具体说明任何违约功能。 有时,你将目标转至职能need,为履行这一职能,某些缺省功能。 是否最好对接口加以验证,或者你是否应当对原型进行验证,如果是的话,如何做到这一点?

www.un.org/spanish/ecosoc 我正在就我为什么要这样做提供更多情况。

例如,在网上游戏设计中(主要是用javascript书写的游戏)。 在这方面,我有兴趣进行验证,原因有二:

1) Providing a strong public API for modding the game if desired

2) 预防(或极不鼓励)潜在的che客

这需要在定制和滥用之间保持平衡。 具体来说,一种情况是设计物理发动机,使游戏中的物体对重力作出反应。 在现实的系统中,用户一定能够将不重力的物体添加到系统上。 该系统具有功能,表明在任何特定时刻重力的全球影响:

function getGravityAt(x, y) {
      // return acceleration due to gravity at this point
}

2. 作出反应的物体采用这种方法更新其加速度:

function update() {
      this.acceleration = getGravity(this.position); 
}

至少要做的是,确保系统所增加的任何物体都有更新方法,但你仍然有责任确保更新(更新)的方法真正是为了对严重性作出反应。 如果只允许从预约更新方法中继承物体,那么你至少在某种程度上知道该系统中的一切都现实的反应。

最佳回答

这是一个非常主观的问题。 我转而谈这样一个问题,即它是否在贾瓦特进行基于接口的验证(很有可能是好的使用案例,但不是语言的标准做法)。 但我要说,这或许是而不是。 一种根据原型验证物体的良好想法。

如果你完全通过接口进行验证,你很可能与其他方案者制造的物体合作。 制造物体的方法很多,有些依靠原型,有些则没有,虽然每个物体都有其支持者,但它们都采用了所有有效且可能的办法。 例如:

var Point = function(x,y) {
    return {
        x: function() { return x },
        y: function() { return y }
    };
};

var p = new Point(1,1);

标的<代码>p与上述接口相类似,但<代码>x和y为功能。 但是,通过检查其建筑商(即<代码>Object(<><>>>/code>)或<编码><>。 你们都可以做的是测试:p > 具有以下特性:xy,并且这些特性为>_Function>> - 以上内容。

您可能坚持认为,<代码>p 在其原型链中具有具体的传承,例如Abstract Point,其中将包括xy功能——您可使用instanceof加以核对。 但你可以肯定,<代码>xytn t已在p中重新定义:

var AbstractPoint = function() {};
AbstractPoint.prototype.x = function() {};
AbstractPoint.prototype.y = function() {};

var Point = function(x,y) {
    var p = new AbstractPoint(x,y);
    p.x = "foo";
    return p;
}

var p = new Point(1,1);
p instanceof AbstractPoint; // true
p.x; // "foo"

也许更重要的是,这使得更难以放弃符合接口但不会继承贵阶层的习俗物体。

因此,我认为,你目前要做的工作或许是你希望的最好办法。 在我的经验中,贾瓦特方案制定者比试图淡化静态语言的能力更有可能在高潮时使用:

function doSomethingWithUntrustedPoint(point) {
    if (!(point.x && point.y)) return false; // evasive action!
    // etc.
}
问题回答

我要重申的是,打字检查不属辅助性。

如果您仍然想要打字,谷歌的closure Editorer就是执行建议。 检查类型固定不变: 它有接口和(proto)类检查公约。





相关问题
selected text in iframe

How to get a selected text inside a iframe. I my page i m having a iframe which is editable true. So how can i get the selected text in that iframe.

How to fire event handlers on the link using javascript

I would like to click a link in my page using javascript. I would like to Fire event handlers on the link without navigating. How can this be done? This has to work both in firefox and Internet ...

How to Add script codes before the </body> tag ASP.NET

Heres the problem, In Masterpage, the google analytics code were pasted before the end of body tag. In ASPX page, I need to generate a script (google addItem tracker) using codebehind ClientScript ...

Clipboard access using Javascript - sans Flash?

Is there a reliable way to access the client machine s clipboard using Javascript? I continue to run into permissions issues when attempting to do this. How does Google Docs do this? Do they use ...

javascript debugging question

I have a large javascript which I didn t write but I need to use it and I m slowely going trough it trying to figure out what does it do and how, I m using alert to print out what it does but now I ...

Parsing date like twitter

I ve made a little forum and I want parse the date on newest posts like twitter, you know "posted 40 minutes ago ","posted 1 hour ago"... What s the best way ? Thanx.