我为Flash游戏和应用程序开发了很多框架。我总是用一两个随机字符为我的类名前缀,以避免与开发人员可能已经拥有的类名冲突,例如:
class LEntity
最近我有一个同事让我为穷人和#34;烦人的"命名然后在我为这里使用的人创建的框架中重新命名每个类的类。
我无法彻底解释我的理由,让他接受我作为一种好方法所做的事情。
我上面所做的事实上是一件坏事吗?如果没有,我该怎么解释呢?如果是这样,为什么?
评论询问命名空间 - 我知道这个例子中的AS3具有我所知的称为命名空间但我不确定这是否相同或是否可以按预期使用。
答案 0 :(得分:2)
鉴于Actionscript支持名称空间,因此没有理由仅使用前缀来防止命名冲突。这就是命名空间的用途。
有些人喜欢使用命名空间来表示成员变量(即下划线前缀,有时候是m_),这有一些优点,但仅仅是为了名字冲突而不是。
答案 1 :(得分:1)
听起来你不太明白AS3中的名称空间包是什么。
一个例子:
//Class1.as
package com.test.someModule { //This is the package/namespace
public class Class1 {...}
}
//Class2.as
package com.test.otherModule {
import com.test.someModule.Class1; //Class1 can be used as "Class1" now. Otherwise you would do "com.test.someModule.Class1"
import com.test.someModule.*; //You can also use the "*" to "import" all classes in that package
}
答案 2 :(得分:0)
我必须同意你的同事,你的班级名称“烦人”。
在Actionscript 3中,我们使用包名来定义类的命名空间。如果您不确定命名空间的含义,请参考维基百科定义(截至编写本文时):
“通常,命名空间是一组标识符的容器 (名称),并允许消除驻留的同音词标识符的歧义 在不同的名称空间中。“
只要您正确命名包,就不会“与类名冲突”。大多数开发人员使用所谓的反向域表示法来命名他们的包(例如com.mywebsite.MyGenericNamedClass)。域名是唯一的,所以你不太可能与另一个类发生冲突。
根据经验,类名应尽可能具有描述性,因此您的某些类名将与其他人的类相同。以默认的Sprite类为例:
import flash.display.Sprite;
import uk.co.mywebsite.Sprite;
如果你然后初始化一个对象:
var mySprite:Sprite = new Sprite();
编译器不知道你想要初始化哪个Sprite(它是flash精灵还是你自己的自定义精灵),它会引发错误。
解决方案很简单:因为你的包已经正确命名,所以你需要做的就是使用包括包名的完整类名来初始化你的对象:
var mySprite:uk.co.mywebsite.Sprite = new uk.co.mywebsite.Sprite();
var myOtherSprite:flash.display.Sprite = new flash.display.Sprite();
请注意,您很少需要这样做。只有在同一范围内使用这两个类(默认的Sprite和您自己的Sprite)时,才需要这样做。通常,您只能导入自己的类:
/* we are not importing this any more
import flash.display.Sprite;*/
//only importing my own class
import uk.co.mywebsite.Sprite;
/* now I can initialize my object without using the full class name, and the compiler knows
I mean my own Sprite class */
var mySprite:Sprite = new Sprite();