你在变量名中使用文章吗?

时间:2009-04-09 12:26:27

标签: coding-style smalltalk

编辑:似乎至少有两个正当理由说明为什么Smalltalkers会这样做(在消息链接和范围界定问题期间的可读性)但是问题可能会保持更长时间以解决一般用法问题。

原文:由于我早已忘记的原因,我从不在变量名中使用文章。例如:

  

aPerson,theCar,anObject

我想我觉得文章用无意义的信息弄脏了名字。当我使用这个惯例看到一个同事的代码时,我的血压会微微上升哦。

最近我开始学习Smalltalk,主要是因为我想学习Martin Fowler,Kent Beck和其他许多伟大成长并喜爱的语言。

然而,我注意到,Smalltalkers似乎在其变量名中广泛使用不定期文章( a,)。一个很好的例子是在下面的Setter方法中:

name: aName address: anAddress.
     self name: aName.
     self address: anAddress

这使我重新考虑我的立场。如果一个像Smalltalkers一样受到极大尊重和影响的社区已广泛采用变量命名的文章,那么可能有充分的理由。

你使用它吗?为什么或为什么不呢?

9 个答案:

答案 0 :(得分:10)

它在Smalltalk中作为无类型语言通常使用,因为它提示方法调用中的参数的类型。文章本身表明您正在处理某个指定类对象的实例

但请记住,在Smalltalk中,方法看起来不同,我们使用所谓的关键字消息,在这种情况下,文章实际上有助于提高可读性:

anAddressBook add: aPerson fromTownNamed: aString

答案 1 :(得分:8)

这个命名约定是Kent Beck的书 Smalltalk最佳实践模式中的模式之一。恕我直言这本书甚至对非小型人也是必须的,因为它确实有助于命名事物和编写自我记录代码。此外,它可能是展示Alexander's quality without a name的少数模式之一。

另一本关于代码模式的好书是 Smalltalk with Style ,它是available as a free PDF

通常,惯例是实例变量和访问器使用裸名词,参数使用不定冠词加上角色或类型或组合。临时变量可以使用裸名词,因为它们很少复制实例变量;或者,为了表明它们在控制流程中的作用,为了表明它们在控制流中的作用,将它们命名为更精确,这是非常频繁的:eachFoonextFoorandomChild ...

答案 2 :(得分:7)

我想我刚刚找到了一个的答案。正如Konrad Rudolph所说,由于技术原因,他们使用这个惯例:

  

...这意味着它[方法变量]不能复制实例变量的名称,接口中定义的临时变量或其他临时变量。    - IBM Smalltalk Tutorial

基本上,本地方法变量的名称不能与对象/类变量相同。来自Java,我假设一个方法的变量将是本地范围的,你可以使用类似的东西访问实例变量:

self address

我仍然需要了解Smalltalk中有关方法/本地作用域的更多信息,但似乎没有其他选择;他们必须使用与实例1不同的变量名,因此 anAddress 可能是最简单的方法。仅使用地址会产生:

Name is already defined ->address

如果您已经定义了实例变量地址 ......

答案 3 :(得分:2)

  

我总觉得这些文章在名字上弄脏了无意义的信息。

完全。这就是删除文章所需的全部理由:它们不必要地混乱代码并且不提供额外的信息。

我不知道Smalltalk并且不能谈论“他们的”惯例的原因,但在其他地方,上述情况仍然存在。 可能是Smalltalk约定背后的一个简单技术原因(例如Ruby中的ALL_CAPS,它不仅是常规,而且是语言语义的常量)。

答案 4 :(得分:1)

我在使用它时来回摆动。我认为这取决于我在任何特定时间项目中C ++与Objective C的比例。至于基础和推理,Smalltalk推广了对象是“事物”的概念。我认为YourdonCoad强烈推动了第一人称的课程。在Python中,它将类似于以下代码段。我真的希望我能够记住足够的SmallTalk来组合一个“正确”的例子。

class Rectangle:
    """I am a rectangle. In other words, I am a polygon
    of four sides and 90 degree vertices."""
    def __init__(self, aPoint, anotherPoint):
        """Call me to create a new rectangle with the opposite
        vertices defined by aPoint and anotherPoint."""
        self.myFirstCorner = aPoint
        self.myOtherCorner = anotherPoint

总的来说,它是程序可读性的对话方法。使用变量名称的文章只是整个习语的一部分。围绕命名参数和消息选择器IIRC还有一个习惯用法。类似的东西:

aRect <- [Rectangle createFromPoint: startPoint 
                    toPoint: otherPoint]

这只是另一种流行的时尚,仍然经常出现。最近我注意到像myHostName这样的成员名称在C ++代码中弹出,作为m_hostName的替代。我越来越迷恋这种用法,我认为这有点回归SmallTalk的习语。

答案 5 :(得分:0)

从未使用过,也许是因为在我的主要语言中没有任何文章:P

无论如何,我认为只要变量的名称是有意义的,如果有文章或不存在就不重要,这取决于编码人员自己的偏好。

答案 6 :(得分:0)

不。我觉得浪费了字符空间并侵蚀了代码的可读性。我可能会使用名词的变体,例如Person vs People,具体取决于上下文。例如

ArrayList People = new ArrayList();
Person newPerson = new Person();
People.add(newPerson);

答案 7 :(得分:0)

不,我没有。我觉得它不会增加我的代码库的可读性或可维护性,也不会以任何方式区分变量。

另一个缺点是如果你鼓励使用变量名称的文章,那么在你的代码库中有人这样做之前只是时间问题。

var person = new Person();
var aPerson = GetSomeOtherPerson();

答案 8 :(得分:0)

在我工作的地方,标准是在所有实例字段前加上“the-”,本地变量加上“my-”,方法参数加“a-”。我相信这是因为许多开发人员使用文本编辑器,如vi而不是IDE,每个范围可以显示不同的颜色。

在Java中,我不得不说我更喜欢写一些你取消引用这个的setter。

比较

public void setName(String name) {
    this.name = name;
}

public void setName(String aName) {
    theName = aName;
}

最重要的是要有一个标准,并且每个人都要遵守它。