我应该何时开始获取具有“get-”前缀的属性的方法名称?

时间:2008-11-17 20:06:51

标签: oop naming-conventions accessor

返回对象的属性/属性/成员的命名方法有什么好的经验法则?如果一个对象具有一些不可变的质量“blarg”,那么返回该质量的方法应该被称为“blarg()”或“getBlarg()”吗?例如,Java API是不一致的:大多数属性是通过“get”方法访问的(即使那些没有相应“set”方法的方法),但我们还有Object.hashCode()而不是Object。 GetHashCode()方法。

更新:该属性是否属于某个字段(在实现中)是否应该是确定者?在二维空间中表示不可变点的类怎么样?无论该点是存储为(x,y)还是(r,theta),我仍然需要所有四个属性的访问器。它们应该是getX(),getY()等,还是只是x(),y()等?从用户的角度来看,不应该所有四个都具有相同的命名约定,因为我们不希望我们的用户知道/关心我们的实现吗?

12 个答案:

答案 0 :(得分:3)

取决于语言。

在Smalltalk中,惯例是getter和blarg的blarg:for setter。

在Java中,JavaBeans约定是getBlarg()和setBlarg()。对于布尔属性,加上isBlarg()。

你提到你没有getter和setter的情况。这是有道理的,因为有些属性是只读的。

遵循惯例时,您可以获得其他人可以更轻松阅读的代码。有时工具支持。例如,许多工具都能识别JavaBeans约定。

JavaBeans约定直到Java 1.1才被提升。所有Object方法(例如,hashCode())都早于此。并且不能为了向后兼容而改变。

答案 1 :(得分:2)

我认为最常用的惯例是:

GetBlarg() or getBlarg()

可以认为名称GetHashCode()不正确,因为该对象没有名为hashcode的字段并且已经计算出来。

这些当然是所有惯例,而不是规则,其中大部分已经发展了很长时间,因此并非100%一致。

问候
ķ

答案 2 :(得分:1)

如果该方法除了访问属性之外不执行任何操作,则坚持使用getProperty约定。此规则的常见例外是,如果您正在访问布尔值,则约定是使用isProperty

答案 3 :(得分:1)

为了不同意这里的其他海报,我通常更喜欢直接使用名称(“blarg”)作为属性的API。当您了解面向对象编程时,通常就是您所教授的内容 - 例如,在“汽车”类和“引擎”类的经典示例中,您会被告知汽车有引擎,看起来像:

car.engine

这就是他们使用的,因为它比

更容易理解
car.getEngine
大多数普通人都会说,“什么是getEngine?”。一辆车没有getEngine,它有一个引擎。根据我的经验,由于普通老人的可读性的整体改善,远远超过了由此引起的短暂混淆的情况。这只是我的意见,并且与一般的Java编程相悖,但老实说,这是我不喜欢Java编程的一部分。 ;)

答案 4 :(得分:1)

对于具有本机属性概念的语言(Java不具备),当访问者(get或set)没有副作用时,应该使用属性,相对高性能(不长时间运行),返回每次调用的值相同,或者不依赖于其他属性(上下文依赖性)。如果其中任何一个都是真的,你应该使用一个名为GetXxx或SetXxxx的方法,其中“Xxx”就是属性名称。

答案 5 :(得分:0)

如果它是布尔值,则约定为“isBlarg()”。

答案 6 :(得分:0)

IsFoo会议在我看来很糟糕。你正在添加匈牙利表示法。如果将其更改为使用2值逻辑的3值逻辑的类,则需要重命名方法。保持您在编译器中的输入和命名。

答案 7 :(得分:0)

我相信你会坚持使用getBlarg()(或isBlarg())约定,只要你意识到这不仅仅是为了获取属性。

它们被命名为get ...()的原因是代表 访问 对象特征的过程,无论它是简单的属性还是计算属性。

所以,IMO,应该是getHashCode();),但出于向后兼容的原因,正如John指出的那样,它将保持为hashCode()。

答案 8 :(得分:0)

在Objective-C中,命名访问器方法有“严格”约定,这使得类能够符合键值编码。

foo的setter总是被称为setFoo:

[obj setFoo:newFoo];

吸气剂可以是三种选择之一:

[obj foo];
[obj getFoo:otherFoo];
[obj isFoo];

第一个是访问者返回属性或属性副本的实例。第二个是访问者获取参数的位置,并将属性放入此变量(通常是指针引用),第三个是属性foo是布尔类型的位置。

使用它的Objective-C的优点是,您可以使用密钥路径访问属性,它将使用访问者 - 并将搜索不同形式的访问者,直到找到一个。

temp = obj.foo;

这将使用访问者,只要它遵循上面的命名方案。


在python中,我使用了不同的方案。对于我将通过属性表示法访问的属性:

class Class:

    def get_x(self):
        return self._x

    def set_x(self,x):
        self._x = x

    x = property(get_x, set_x)

在我想使用方法调用的实例中,我使用:

get_thing()

答案 9 :(得分:0)

我反对省略getter的“get”或“is”前缀,因为只使用字段名称会导致它被误解为实际执行实际操作的函数。

假设您有一个校对者类,并且您有一个名为_checkSpelling的bo​​ol字段 表示是否检查拼写:checkSpelling()

答案 10 :(得分:0)

约定通常是特定于语言的,最好的方法是遵循您使用的任何语言。 Java在C#中使用getter和setter(或访问器和mutator),你可能正在为你的类创建属性。了解您的语言的各种约定,以便与其他程序员进行交流。

答案 11 :(得分:0)

总结一下:

请注意,以下所有内容均为特定语言。它适用于Java和可能更多的语言,但并非适用于所有语言。第二:这只是一个惯例。当您遵循约定时,您将获得其他人可以更轻松地阅读的代码。有时工具支持(例如,许多工具识别JavaBeans约定)这仍然不意味着你不能选择坚持另一种约定。

  • 一个很好的经验法则,用于返回或设置对象具有的某个属性的命名方法,例如'hashCode'如下:getHashCode()用于获取它,setHashCode(...)用于设置它。 / LI>
  • 对于getHashCode(),当对象在调用函数时没有hashCode待命时,这也是正确的,而是在此时正确计算它,因为该方法提供的对象提供的服务保持不变两种情况:它都会给你一个hashCode。
  • Java方法名称与此不一致的事实可以解释为,在早期版本的Java中,这些命名约定尚未遵循,并且由于向后兼容性原因,它们无法更改。
  • 一些getter没有相应的setter是正常的,因为你可能不希望每个属性都被访问和更改。