编辑:似乎至少有两个正当理由说明为什么Smalltalkers会这样做(在消息链接和范围界定问题期间的可读性)但是问题可能会保持更长时间以解决一般用法问题。
原文:由于我早已忘记的原因,我从不在变量名中使用文章。例如:
aPerson,theCar,anObject
我想我觉得文章用无意义的信息弄脏了名字。当我使用这个惯例看到一个同事的代码时,我的血压会微微上升哦。
最近我开始学习Smalltalk,主要是因为我想学习Martin Fowler,Kent Beck和其他许多伟大成长并喜爱的语言。
然而,我注意到,Smalltalkers似乎在其变量名中广泛使用不定期文章( a,)。一个很好的例子是在下面的Setter方法中:name: aName address: anAddress.
self name: aName.
self address: anAddress
这使我重新考虑我的立场。如果一个像Smalltalkers一样受到极大尊重和影响的社区已广泛采用变量命名的文章,那么可能有充分的理由。
你使用它吗?为什么或为什么不呢?答案 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。
通常,惯例是实例变量和访问器使用裸名词,参数使用不定冠词加上角色或类型或组合。临时变量可以使用裸名词,因为它们很少复制实例变量;或者,为了表明它们在控制流程中的作用,为了表明它们在控制流中的作用,将它们命名为更精确,这是非常频繁的:eachFoo
,nextFoo
,randomChild
...
答案 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推广了对象是“事物”的概念。我认为Yourdon和Coad强烈推动了第一人称的课程。在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;
}
最重要的是要有一个标准,并且每个人都要遵守它。