AS3可以返回两种类型的方法的最佳实践

时间:2011-06-14 10:04:27

标签: flash actionscript-3 types wildcard return-type

我一直在为ActionScript 3开发一个框架,并且遇到了一个奇特的场景,我想让一个方法能够返回包含{AvFrameworkObjectArray的多个实例的AvFrameworkObjectAvFrameworkObject 1}}。

使用此方法注册public function register(...objects):Object { var reg:Array = []; var i:AvFrameworkObject; for each(i in objects) { i.fw = this; reg.push(i); } return reg.length > 1 ? reg : reg[0]; } 的一个或多个实例:

{{1}}

以上几点:

  1. 这对我来说似乎非常草率。真的吗?
  2. 我也可以使用通配符(星号*)作为返回类型,这更有意义吗?
  3. 是否可以实际定义仅两种返回类型?只是为了便于阅读等。

3 个答案:

答案 0 :(得分:4)

  1. 从某种严格意义上讲,这可能是草率的,但我看到的情况要糟糕得多。

  2. 您应始终尽可能缩小返回类型。因此,*作为返回类型的IMO比对象更差。

  3. 不,你不能有两种返回类型。

  4. 如果您对它进行了很好的测试并将其记录得很好,那么可以使用它。

    但是你总是返回一个数组,如果只有1个结果,那么你返回一个大小为1的数组?

答案 1 :(得分:3)

据我所知,所有对象都通过了by reference

  

在ActionScript 3.0中,所有参数都通过引用传递,因为所有值都存储为对象。但是,属于原始数据类型的对象(包括Boolean,Number,int,uint和String)具有特殊的运算符,使它们的行为就像它们按值传递一样。

您不必返回任何内容,只需设置fw变量成员即可。


话虽如此,你可以选择如何返回多个变量。

  • 一种常见的方法是返回返回的数组的计数,并使用参数来设置数组。通话就像var length:int = register(out, object1, object2, object3)。然后,您可以在for循环中使用length变量。
  • 另一种方法是返回整个数组。我认为它不需要更多解释,但我想明确表示,如果你想要一个特定的成员,你可以直接使用返回的数组。例如,如果您想要第一个对象,则可以编写t:Thing = fw.register(new Thing())[0];。请注意最后的 [0]
  • 您也可以使用上述方法,但使用Object Array {{1}}

我个人不喜欢返回抽象对象,通常我选择返回整个数组。

希望这有帮助。

答案 2 :(得分:0)

在这种情况下,我会返回1项数组以保持一致性。这将使一个更明智的界面;调用者总是可以期望返回一个数组,而不必通过对不同的返回对象做出不同的响应来使代码更复杂。

现在还存在这样的情况:代码将以完全相同的方式响应返回的对象,无论它的类型是什么,在这种情况下,这意味着返回的对象继承自某个公共基类。在这种情况下,返回类型应该是公共基类。

(我想我在这里假设您不会以完全相同的方式响应数组和AvFrameworkObject)