13

编辑: Smalltalkers 这样做似乎至少有两个正当理由(消息链接和范围问题期间的可读性),但也许这个问题可以保持更长时间以解决一般用法。

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

一个人,这辆车,一个物体

我想我觉得文章用无意义的信息弄脏了名字。当我看到使用此约定的同事的代码时,我的血压会略微升高。

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

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

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

这让我重新考虑了自己的立场。如果像 Smalltalkers 这样受人尊敬和有影响力的社区广泛采用了变量命名方面的文章,那也许是有充分理由的。

你用它吗?为什么或者为什么不?

4

9 回答 9

12

这种命名约定是 Kent Beck 的书Smalltalk Best Practice Patterns中的一种模式。恕我直言,这本书即使对于非小语者来说也是必不可少的,因为它确实有助于命名事物和编写自记录代码。另外,它可能是少数几个没有名字就能展示Alexander品质的模式语言之一。

另一本关于代码模式的好书是Smalltalk with Style,它以免费 PDF 的形式提供。

通常,惯例是实例变量和访问器使用裸名词,参数使用不定冠词加上角色或类型,或组合。临时变量可以使用裸名词,因为它们很少重复实例变量;或者,为了表明它们在控制流中的作用,更准确地命名它们而不是不定冠词是很常见的:eachFoo, nextFoo, randomChild...

于 2009-04-09T13:34:14.123 回答
10

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

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

anAddressBook add: aPerson fromTownNamed: aString
于 2009-04-09T12:32:44.053 回答
7

我想我刚刚找到答案。正如 Konrad Rudolph 所说,他们使用这种约定是出于技术原因:

...这意味着它 [方法变量] 不能重复实例变量、接口中定义的临时变量或另一个临时变量的名称。- IBM Smalltalk 教程

基本上,局部方法变量不能与对象/类变量命名相同。来自 Java,我假设方法的变量将是本地范围的,并且您可以使用以下方式访问实例变量:

self address

我仍然需要更多地了解 Smalltalk 中的方法/本地范围,但似乎他们别无选择;它们必须使用与实例不同的变量名,因此anAddress可能是最简单的方法。仅使用地址会导致:

Name is already defined ->address

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

于 2009-04-09T12:49:03.890 回答
2

我总觉得那些文章用毫无意义的信息把名字弄脏了。

确切地。这就是放弃文章的全部原因:它们不必要地使代码混乱,并且没有提供额外的信息。

我不了解 Smalltalk,也无法谈论“他们的”约定的原因,但在其他任何地方,上述情况都成立。Smalltalk 约定背后可能有一个简单的技术原因(例如ALL_CAPS在 Ruby 中,它不仅按照约定而且由于语言语义是一个常量)。

于 2009-04-09T12:28:29.633 回答
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 的习语。

于 2009-04-09T13:05:13.150 回答
0

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

无论如何,我认为只要变量的名称有意义,是否有文章并不重要,这取决于编码器自己的喜好。

于 2009-04-09T12:30:07.010 回答
0

没有。我觉得这是浪费字符空间并削弱了代码的可读性。我可能会根据上下文使用名词的变体,例如 Person vs People。例如

ArrayList People = new ArrayList();
Person newPerson = new Person();
People.add(newPerson);
于 2009-04-09T12:34:45.670 回答
0

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

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

var person = new Person();
var aPerson = GetSomeOtherPerson();
于 2009-04-09T12:39:05.817 回答
0

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

在 Java 中,我不得不说我更喜欢它而不是编写你取消引用this的设置器。

比较

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

相对

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

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

于 2009-04-09T13:04:15.833 回答