每个功能一个文件......真的吗?

时间:2009-04-21 23:21:54

标签: flex actionscript

我对Flex / ActionScript比较陌生,但我一直在使用我的util包中为每个函数创建一个文件的模式 - 文件名与函数名相同。就像文件是convertTime.as:

一样
package util{
    public function convertTime(s:String):Date{
        ...
    }
}

这样我就可以通过以下方式轻松导入函数:

import util.convertTime;
...
convertTime(...);

我喜欢这种方式比导入类对象更好,然后调用挂起的静态方法,如下所示:

import util.Util;
...
Util.convertTime(...);

但是,我做的越多,我最终会得到的文件越多,将一个函数放入文件中似乎有点浪费/愚蠢,特别是当函数很小时。还有另一种选择吗?或者这两个选项是我唯一的选择吗?

更新:经过一些研究,我也在下面发布了自己的答案。

3 个答案:

答案 0 :(得分:5)

是的,这些是实用程序库的两个主要选项。实际上,我们将这两种方法用于通用实用程序功能。对于我们认为应该实际构建的一小部分函数(例如map()),我们为每个文件放置一个函数,以便我们可以直接使用该函数。

对于更加模糊/专用的实用程序函数,我们不希望污染我们的全局命名空间,因此我们将它们作为实用程序类的静态函数。这样,我们确信当有人引用ArrayUtils.intersect()时,我们知道库的intersect()来自哪个,以及它的大致位置(它与两个数组相交)。

我建议尽可能使用后一种路线,除非你有一个功能,a)你经常使用b)真的很明显它一目了然。

答案 1 :(得分:3)

毕竟我遇到了其他一些选择,并认为我会在这里分享它们。

备选方案1 - 使用继承

这可能是一个明显的答案,但是有限。您可以将静态方法放入父类中,继承它们以将它们放入子类中。这只适用于类。此外,因为ActionScript是单一继承,所以只能继承一次。

备选方案2 - 别名方法

您仍然将实用程序函数编写为挂起util类的静态方法,但是您对它们进行了别名,以便您可以使用较短的名称访问它们,例如:

import mx.binding.utils.BindingUtils;
var bind:Function = BindingUtils.bindProperty;

现在你可以打电话

bind(...);

而不是冗长的

BindingUtils.bindProperty(...);

您可以在类范围和函数范围内执行此操作,但不能在包范围内执行此操作 - 因为显然您在包中只能有一个可见属性。如果在类范围中执行此操作,则需要确保它不会与其他类属性名称冲突。

备选方案3 - 使用包括

this flexonrails blog post中所述,您可以使用 include 在ActionScript中模拟mixin。 include与导入的不同之处在于,它所做的只是复制您所包含的整个文件并将其粘贴到您所包含的位置。因此,它完全没有处理命名空间问题,你不能像使用导入一样引用它的完整路径名,如果你有相互冲突的名字,你可以自己使用它。与import不同,它还会创建相同代码的不同副本。但是你可以做的就是将任意数量的函数放在一个文件中,并将它们包含在另一个文件的类或函数作用域中。例如:

// util/time_utils.as
function convertTime(..){
   ...
}
function convertDate(..){
   ...
}

包括:

include 'util/time_util.as';  // this is always a relative path
...
convertTime(...);

答案 2 :(得分:0)

@ an0nym0usc0ward

OOP只是将类似函数或属性合并到可导入和使用的对象中的方法。它只不过是代码的一种组织形式,所有代码最终都是在处理器中以程序方式执行,OOP只是源代码的组织。他在这里所做的可能不是你从书中学到的OOP,但它最终会完全相同,应该受到相同的尊重。

任何真正理解OOP的人都不会天真地认为OOP的批准和记录形式是反对代码定向的唯一可能方式。

编辑:这应该是对annym0usc0ward的粗鲁评论的评论回复,告诉他要学习OOP。但我想我在错误的方框中键入了它:)