Actionscript 3 在我所有的框架类名前加前缀是否不好?

Actionscript 3 在我所有的框架类名前加前缀是否不好?,actionscript-3,oop,coding-style,conventions,Actionscript 3,Oop,Coding Style,Conventions,我为Flash游戏和应用开发了很多框架。我总是用一两个随机字符作为类名的前缀,以避免与开发人员可能已经拥有的类名冲突,例如: class LEntity 最近,我的一位同事因为我对类的命名糟糕且“令人讨厌”而对我大发雷霆,他接着对我为这里的人们创建的框架中的每个类进行了重命名 我很难彻底地解释我的理由,让他接受我所做的是一个好方法 我在上面所做的真的是件坏事吗?如果没有,我又如何解释呢?若然,原因为何 注释询问名称空间-我知道本例中的AS3有我知道的名称空间,但我不确定这是否是同一个名称空间

我为Flash游戏和应用开发了很多框架。我总是用一两个随机字符作为类名的前缀,以避免与开发人员可能已经拥有的类名冲突,例如:

class LEntity
最近,我的一位同事因为我对类的命名糟糕且“令人讨厌”而对我大发雷霆,他接着对我为这里的人们创建的框架中的每个类进行了重命名

我很难彻底地解释我的理由,让他接受我所做的是一个好方法

我在上面所做的真的是件坏事吗?如果没有,我又如何解释呢?若然,原因为何



注释询问名称空间-我知道本例中的AS3有我知道的名称空间,但我不确定这是否是同一个名称空间,或者它是否可以按预期使用。

鉴于Actionscript支持名称空间,没有理由仅使用前缀来防止命名冲突。这就是名称空间的用途


有些人喜欢使用名称空间来表示成员变量(例如,下划线前缀,有时是m_),这有一些优点,但仅仅是为了名称冲突的缘故。

听起来您不太了解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
}

我不得不同意你的同事的看法,你的班名很烦人

在ActionScript3中,我们使用包名来定义类的名称空间。如果您不确定名称空间的含义,请使用wikipedia定义(在撰写本文时):

通常,命名空间是一组标识符的容器 (名称),并允许消除同名标识符的歧义 在不同的名称空间中。”

因此,只要正确命名包,就永远不会“与类名冲突”。大多数开发人员使用所谓的反向域表示法来命名他们的包(例如com.mywebsite.MyGenericNamedClass)。域名是唯一的,所以不太可能与其他类发生冲突

根据经验,类名应该尽可能具有描述性,因此您的一些类名将与其他人的类名相同。以默认的Sprite类为例:

import flash.display.Sprite;
import uk.co.mywebsite.Sprite;
如果然后初始化对象:

var mySprite:Sprite = new Sprite();
编译器不知道您要初始化哪个精灵(是flash精灵还是您自己的自定义精灵),它会抛出一个错误

解决方案很简单:因为您的包已正确命名,所以只需使用完整的类名(包括包名)来初始化对象:

var mySprite:uk.co.mywebsite.Sprite = new uk.co.mywebsite.Sprite();
var myOtherSprite:flash.display.Sprite = new flash.display.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();

您选择的语言支持名称空间吗。C有时Cprefixes Cmake Tmore Rsense M当LpCstrothers通过“一两个随机字符”时,您的意思是每个类都被分配了一个随机的、不同的字符吗?如果每个前缀都不同,是的,这是非常糟糕的形式(不可能简单地知道名称!)。如果您的语言支持名称空间,那么您应该真正使用名称空间。如果不是,那么你就考虑用字符进行前缀(很多,很多框架)……每个人都从OSX(NS)到Linux GUI工具包,到Windows(不在.NET,但是在C/C++框架中)。。通过谷歌搜索,ActionScript似乎支持名称空间,在这种情况下,我建议使用内置的名称空间支持,而不是使用前缀来模拟它。前缀实际上是为了模拟名称空间提供的功能。除了名称空间之外,您命名类的理由对我来说似乎完全有效。这是正确的这是你的风格。你的同事听起来像个傻瓜。在AS3中,我只知道如何使用名称空间使给定类的属性或方法只能从使用所需名称空间的类访问(通常类似于
内部
,但不要求所有文件都在同一个包中)不,您误解了名称空间的工作方式和使用方式。名称空间不会使类“可访问”,这是通过访问关键字(public、private等)实现的.namespaces使标识符可见而不可访问。当您执行类似于
使用命名空间foo
的操作时,这只是将命名空间组合在一起,使它们位于同一范围内。您仍然可以通过指定前面的命名空间来使用命名空间函数(
foo::myfunc()
)。这与在类名前面添加字符的目的类似,但更具可读性。这不就是程序包吗?当我想到AS3中的名称空间时,我想到了实际使用名称空间关键字:这显然是adobe认为名称空间的用途,但不是它们通常的用途:)(除非我完全错了)OK,因此,请给我一个理由,在使用我的库的人拥有自己的
实体
类的情况下,我的方法很烦人,但他们也想扩展我的
静物
类<代码>类实体扩展实体?我不这么认为。当然,他们可以简单地重命名他们的实体类。但是如果他们正在使用另一个已经有实体类的库,会发生什么呢?我不是有意要让你不高兴,我从你的同事那里借用了“烦人”这个词,只是因为在ActionScript3中前缀类名是不必要的,而且读起来也不太好。如果将所有类都放在项目的根目录中,那么将类命名为简单实体可能是一个问题。但是,如果将类组织到包中,则可以避免名称冲突,例如:包com.yourdomain{import com.someoneelsesdomain.Entity;公共类实体扩展com.someoneelsesdomain.Entity{public function Entity(){super();}}