选择好的标识符名称

时间:2009-05-08 21:27:06

标签: naming-conventions

好的,所以你可以阅读有关标识符命名的指导原则,直到你脸色发青了......骆驼的情况,pascal的情况下,让它们描述性......但它们无法帮助你真正选择最好的名字对于给定的应用程序域。

最容易选择(恕我直言)是一个或两个单词的名词组:

  • EntryForm
  • 员工
  • WidgetCollection

但并不是每个班级都整齐地融入名词中,所以我看到很多人通过在他们的末尾添加-er将动词变为名词:

  • 的AccountManager
  • RecordCounter
  • ProcessRunner

我看到的最大问题是很多时候他们都很模糊......特别是经理。究竟是什么管理?

所以我的问题是你如何为一个班级选择一个好名字?“好”我的意思是信息丰富且毫不含糊。

我知道,我知道。几乎每个现代IDE都内置了重构支持,您可以更改名称而不必睁眼,那么重点是什么?一个选择不当的名字会混淆和误导任何偶然发现它的人,直到它被重命名为止,这仍然是一个有效的问题。

相关

  

What’s the best approach to naming classes?

10 个答案:

答案 0 :(得分:9)

答案 1 :(得分:4)

1)不要缩写。只有在符合行业标准的HTML(如HTML)时才使用首字母缩略词。

2)在你的名字中保持自我一致。

3)使用您的应用程序所在域中的术语。在提出名称时,假设您在添加人们不熟悉的新名称时花费的子弹数量有限。

你可能会觉得你班级中的一些微妙特征将它与'Foo'区分开来,并且由于这种微妙的差异而倾向于为它构成一些新的概念。如果80%的人使用它不会关心这种微妙的差异,那就坚持使用已知的术语。

4)在大多数OO语言中,自动完成很重要。如果可能,第一个词应该是人们在探索命名空间时最有可能输入的词。其他人认为用英语读得更好更重要,所以这有点值得商榷。

答案 2 :(得分:2)

选择简洁,信息丰富,适当的名称是编程中最难的部分之一。

没有公式。这是你获得经验的技能。

请注意强调简洁。 Java中的长名称是该语言的主要挫折之一。它基本上已经达到了这样的程度:如果没有具有自动完成功能的IDE,则无法在Java中进行编程。

缩写可以是您命名时的朋友。例如,'经理'而不是'经理'。当'经理'得到重点时,我真的需要每天输出一次“经理”吗?只要确保人们一致而明智地使用它们。

答案 3 :(得分:2)

我厌倦了看到如下命名的类:

XxxHandler XxxManager XxxController

Handler和Manager几乎不能描述一个类是什么。如果我们找不到一个好的名字,我们应该确保我们所做的课程是清楚的,而不是试图做太多的事情。较小的类通常使得更容易命名类,因为它们通常具有较窄的范围。

但是,有时候,我们没有创造性的东西来称呼事物,只是恢复到同样的旧事物。

答案 4 :(得分:1)

kekoav一样,我担心命名FooManager或FooController。它不仅表明存在身份危机的对象,而且还引入了歧义。我曾经在一个项目中工作,其中有一个“AccountManager”,它是一个域对象,代表管理帐户的人(Employee的子类型)。当然,有人制作了一个“AccountManagerManager”,其他人感到困惑,并创建了一个帐户域对象(这不是我们的应用程序正在处理的东西),然后混合到AccountManager来管理帐户。这有点乱。

Quis custodiet ipsos custodes? Quoque quis administro ipsos administratorum?

是的,我的拉丁语生锈了。

答案 5 :(得分:1)

当我发现难以选择一个有意义的名字时,它会提醒我该课程太大或者我并不真正理解我正在编码的领域。

当你最终想出一个好的设计来解决 Uncle Bob 清洁代码中提出的关于适当抽象等概念的问题,单一责任原则等等,然后名称变得更容易选择。

难以挑选名称几乎总是表明逻辑组织仍然需要工作。毕竟,编译器并不关心逻辑组织的好坏程度。组织只是为了帮助管理你的堕落开发人员的复杂性和理智。

答案 6 :(得分:0)

如果您使用的是.NET环境,则可以使用FxCop作为指导。至于命名一个类,我通常会使用名词/目的。你是完全正确的,Manager类有什么作用?如果它是控制器类,则将其命名为ManagerController。

答案 7 :(得分:0)

有一个你坚持的标准,然后就不会有任何混淆。如果您的页面名为AccountManager,然后使用我的标准,则表示“您管理帐户的页面”。

对类名,事件等做类似的事。

答案 8 :(得分:0)

一个好处是使用设计模式,你将完成所有工作:)

答案 9 :(得分:0)

清洁代码是一本好书,但不要遵循有关标识符名称和注释的建议。 (请参阅Self Describing CodeLong Identifiers Make Code Unreadable

例如,这里是鲍勃叔叔的保龄球示例(请参阅鲍勃叔叔的其他回复代码):

// Returns total score for a game of ten-pin bowling. On entry the number of fallen pins
// for each ball is provided in fallen[] and the number of balls bowled is in balls_bowled.
public int score()
{
  int points = 0;                                            // Cumulative count of points for the game
  int ball = 0;                                               // Current shot or "ball" (1 or 2 per frame)
  int frame;                                                  // Current frame of the game


  for (frame = 0; frame < max_frames; ++frame)
  {
    if (fallen[ball] == 10)
    {
        // Strike (all pins knocked over from 1 ball) gives bonus of next two balls
        points += 10 + fallen[ball + 1] + fallen[ball + 2];
        ++ball;                                                 // Move to next frame (no 2nd ball)
    }
    else if (fallen[ball] + fallen[ball + 1] == 10)
    {
        // Spare (all pins knocked over in 2 balls) gives bonus of following ball
        assert(fallen[ball + 1] > 0);
        points += 10 + fallen[ball + 2];
        ball += 2;                                             // Move to first ball of next frame
    }
    else
    {
        // Open frame just gives score of all fallen pins of both frame's balls
        assert(fallen[ball] + fallen[ball + 1] < 10);
        points += fallen[ball] + fallen[ball + 1];
        ball += 2;                                             // Move to first shot of next frame
    }
  }
  assert(frame == max_frames && ball == balls_bowled);
  assert(points <= max_frames*30);                // Maximum possible score
  return points;
}
相关问题