【问题标题】:Is it bad to prefix all of my framework class names?给我所有的框架类名加上前缀是不是很糟糕?
【发布时间】:2012-02-13 00:30:28
【问题描述】:

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

class LEntity

最近我有一位同事抨击我对类的糟糕和“烦人”的命名,然后他继续重命名我为这里的人们创建的框架中的每个类。 p>

我无法彻底解释我的推理,让他接受我的做法是一个好方法。

我在上面所做的实际上是一件坏事吗?如果不是,我该如何解释?如果有,为什么?


评论询问的是命名空间——我知道这个例子中的 AS3 有我所知道的命名空间,但我不确定这是否相同,或者它是否可以按预期使用。

【问题讨论】:

  • 您选择的语言是否支持命名空间?
  • kno kactually 套件 kis 结 ka kbad Kidea ka klot kof kframeworks kdo 套件。 Csometimes Cthe Cprefixes Cmake Tmore Rsense Mthen LPCSTRothers
  • 通过“一两个随机字符”,你的意思是每个班级被分配一个随机的、不同的吗?如果每个前缀不同,是的,这是非常糟糕的形式(不可能简单地知道名称!)。如果您的语言支持命名空间,那么您应该真正使用它。如果不是,那么您考虑使用字符作为前缀(很多很多框架都这样做......从 OSX(NS)到 Linux GUI 工具包,再到 Windows(不是在 .Net 中,而是在 C/C++ 框架中)。跨度>
  • 通过谷歌搜索,ActionScript 似乎支持命名空间,在这种情况下,我建议使用内置命名空间支持而不是使用前缀来模拟它。前缀实际上是为了模拟命名空间提供的功能。
  • 除了命名空间之外,您为类命名的原因对我来说似乎完全正确。这是你的风格。你的同事听起来像个混蛋。

标签: actionscript-3 oop coding-style conventions


【解决方案1】:

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

有些人喜欢使用命名空间来表示成员变量(即,下划线前缀,或者有时是 m_),这有一些好处,但只是为了避免名称冲突。

【讨论】:

  • 在 AS3 中,我只知道如何使用命名空间来使给定类的属性或方法只能从使用所需命名空间的类中访问(通常类似于 internal 但不需要所有文件在同一个包中)。
  • 不,您误解了命名空间的工作方式以及它们的使用方式。命名空间不会使类“可访问”,这是通过访问关键字(公共、私有等)完成的。命名空间使标识符可见,而不是可访问。当您执行use namespace foo 之类的操作时,这只是将命名空间组合在一起,因此它们在同一范围内。您仍然可以通过在其前面指定命名空间来使用命名空间函数 (foo::myfunc())。这与在类名前面添加字符的目的相似,但更具可读性。
【解决方案2】:

听起来您不太了解 namespacesAS3 中的包。

一个例子:

//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
}

【讨论】:

  • 这不只是包裹吗?当我想到 AS3 中的命名空间时,我想到了实际使用命名空间关键字:gskinner.com/blog/archives/2010/01/a_complete_guid.html
  • 这显然是 adobe 认为的命名空间,但这不是它们通常用于的:)(除非我完全弄错了)
【解决方案3】:

我必须同意你同事的观点,你的班级名称很“烦人”。

在 Actionscript 3 中,我们使用包名来定义类的命名空间。如果您不确定命名空间的含义,请参考 wikipedia 定义(截至撰写本文时):

"一般来说,命名空间是一组标识符的容器 (名称),并允许消除同音异义标识符的歧义 在不同的命名空间中。”

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

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

import flash.display.Sprite;
import uk.co.mywebsite.Sprite;

如果你随后初始化一个对象:

var mySprite:Sprite = new Sprite();

编译器不知道您要初始化哪个 Sprite(是 flash sprite 还是您自己的自定义 sprite),它会抛出错误。

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

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

【讨论】:

  • 好的,所以给我一个理由,我的方法在使用我的库的人有自己的Entity 类的情况下很烦人,但他们也想扩展我的LEntiy 类。 class Entity extends Entity?我不这么认为。当然,他们可以简单地重命名他们的实体类。但是如果他们使用 another 已经有实体类的库会发生什么?比预期更常见。
  • 我不是故意让你不高兴,我从你的同事那里借用了“烦人”这个词,只是因为在 ActionScript 3 中为类名添加前缀是不必要的,而且读起来不那么好。如果您要将所有类都放在项目的根目录中,那么简单地命名您的类 Entity 可能会出现问题。但是,如果您将类组织到包中,它将避免名称冲突,如下所示: package com.yourdomain { import com.someoneelsesdomain.Entity;公共类实体扩展 com.someoneelsesdomain.Entity { public function Entity() { super(); } } }
猜你喜欢
  • 2018-01-20
  • 2012-02-17
  • 2010-12-16
  • 2011-10-06
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
相关资源
最近更新 更多