3

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

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

4

12 回答 12

3

取决于语言。

在 Smalltalk 中,对于 getter 的约定是 blarg,对于 setter 是 blarg:。

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

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

当您遵循约定时,您会获得其他人更容易阅读的代码。有时工具支持。例如,许多工具识别 JavaBeans 约定。

JavaBeans 约定直到 Java 1.1 才出现。所有 Object 方法(例如,hashCode())都早于此。并且不能更改以实现向后兼容性。

于 2008-11-17T20:26:48.567 回答
2

我相信最常用的约定是:

GetBlarg() or getBlarg()

可能会争辩说名称GetHashCode()不正确,因为该对象没有被调用的字段hashcode并且它是计算出来的。

当然,这些都是惯例,而不是规则,而且它们中的大多数已经发展了很长时间,因此并不是 100% 一致的。

问候
K

于 2008-11-17T20:12:21.513 回答
1

如果该方法除了访问属性之外什么都不做,那么请遵守getProperty约定。此规则的常见例外是,如果您正在访问布尔值,则约定是使用isProperty.

于 2008-11-17T20:15:25.360 回答
1

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

car.engine

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

car.getEngine

大多数正常人会说,“什么是getEngine?”。汽车没有getEngine,它有一个引擎。以我的经验,这可能导致暂时混乱的情况远远超过普通人类可读性的整体改进。这只是我的观点,与一般的 Java 编程背道而驰,但老实说,这是我不喜欢 Java 编程的部分原因。;)

于 2008-11-17T20:21:34.897 回答
1

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

于 2008-11-17T20:43:59.810 回答
0

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

foo 的 setter 总是称为 setFoo:

[obj setFoo:newFoo];

getter 可以是以下三种选择之一:

[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()
于 2008-11-18T01:47:07.233 回答
0

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

于 2008-11-17T20:16:00.647 回答
0

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

于 2008-11-17T20:23:36.200 回答
0

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

假设您有一个校对器类,并且您有一个名为 _checkSpelling 的 bool 字段,它指示是否检查拼写: checkSpelling()

于 2009-05-21T21:37:01.753 回答
0

我相信你应该坚持 getBlarg()(或 isBlarg())约定,只要你意识到这不仅仅是为了获得财产。

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

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

于 2008-11-17T20:34:42.887 回答
0

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

于 2009-06-20T17:04:49.273 回答
0

总结一下:

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

  • 命名返回或设置对象具有的某个属性的方法的一个好的经验法则,例如“hashCode”如下:getHashCode() 用于获取它,setHashCode(...) 用于设置它。
  • 对于 getHashCode() 而言,当对象在调用函数时没有备用 hashCode 而是立即计算它时,这也是正确的,因为对象通过此方法提供的服务在两种情况下都保持不变:它给你一个hashCode。
  • Java 方法名称在这方面不一致的事实可以通过以下事实来解释:在早期版本的 Java 中,尚未遵循此命名约定,并且出于向后兼容性的原因无法更改它们。
  • 有些 getter 没有相应的 setter 是正常的,因为您可能不希望每个属性都被访问和更改。
于 2009-06-20T17:19:51.517 回答