Language agnostic 在命名布尔返回类型的方法时是否使用时态?

Language agnostic 在命名布尔返回类型的方法时是否使用时态?,language-agnostic,naming-conventions,Language Agnostic,Naming Conventions,那么,在编写布尔方法时,您是在返回方法命名中使用时态,如“has”或“was”,还是仅使用“is” 下面是我最近编写的一个Java方法,非常简单 boolean recovered = false; public boolean wasRecovered() { return recovered; } 在本例中,recovered是一种状态,在代码中的这一点上可能已经发生,也可能尚未发生,因此语法上的“was”是有意义的。但是它在代码中是否也有同样的意义,因为“是”的命名约定通常是

那么,在编写布尔方法时,您是在返回方法命名中使用时态,如“has”或“was”,还是仅使用“is”

下面是我最近编写的一个Java方法,非常简单

boolean recovered = false;

public boolean wasRecovered()
{
     return recovered;
}

在本例中,recovered是一种状态,在代码中的这一点上可能已经发生,也可能尚未发生,因此语法上的“was”是有意义的。但是它在代码中是否也有同样的意义,因为“是”的命名约定通常是标准的?

我更喜欢使用
IsFoo()
,而不考虑时态,因为这是一个非母语人士通常都能理解的通俗约定。非英语母语人士是当今全球发展行业经常考虑的问题。

我倾向于,是的。例如,在错误检查中:

$errors = false;
public function hasErrors()
{
  return $this->errors;
}

方法命名的好处在于,您正在检索有关该对象的信息。如果要用过去时态命名,它必须是关于对象先前状态的信息,而不是当前状态的信息


我能想到的使用过去时的唯一原因是,如果我正在检查以前发生但现在不再发生的事情的缓存结果。例如,在调用
swap()。它在设计为原子的操作中可能很有用。不过,在野外不太可能是真的。

我使用的时态与值的含义相符。否则,本质上会创建一种读取方式和另一种行为的代码。让我们看看.Net Framework中的一个真实示例:

这个属性用现在时态表示。这意味着该值指的是当前值,这使得下面的代码读起来非常好

if (thread.IsAlive ) {
  // Code that depends on the thread being alive
  ...
这里的问题是,属性并不表示对象的当前状态,而是表示过去的状态。一旦该值被计算为
true
,有问题的线程可以立即退出并使该值无效。因此,该值只能安全地用于标识线程的过去状态,而过去时态属性更合适。现在让我们重温一下读起来有点不同的示例

if ( thread.WasAlive ) {
  // Code that depends on the thread being alive
  ...
它们的行为相同,但其中一个读起来非常糟糕,因为它实际上表示糟糕的代码

这是一些其他罪犯的名单

  • File.Exists
  • 目录。存在
  • DriveInfo.IsReady
  • WeakReference.IsAlive

    • 我不介意
      恢复了那么多。恢复是一个过去的事件,可能发生过,也可能没有发生过——这会告诉你它是否发生过。但是如果你使用它是因为某种恢复的后果,我更喜欢
      isCached
      isValid
      ,或者其他一些关于这些后果的描述。仅仅因为你恢复了一些东西并不意味着你从那以后就再也没有失去过它


      一定要注意,在英语中,过去分词作为形容词在及物动词和不及物动词之间(可能在主动语态和被动语态之间)是不明确的
      isRecovered
      可能表示该对象已被其他对象恢复,也可能表示该对象已恢复。如果您的对象代表医院的患者,“isRecovered”是指患者身体健康,还是有人将患者从X光科接回来<代码>wasRecovered
      因此对后者可能更好。

      因为您的问题是特定于Java的,如果您的类是JavaBean,并且方法是属性的访问器方法,那么方法名称应该以“is”开头


      前缀isXxx
是一种广泛使用的命名约定,因此它通常是最佳选择

对于订单敏感的操作,
wasXxx
是合适的。例如,在JDBC中,当字段实际为NULL(unset)时,检索数据库列的值可能返回零;在这种情况下,对
wasNull
的后续调用将确定在执行实际检索之后它是哪个

对于检索属性设置,
hasXxx
可能更合适。这是一个语法首选项,如“对象的标志已设置”与“对象具有属性”


然后是能力测试
canXxx
。例如,调用
canWrite
,查看文件是否可写。但是像这样的名字可能会被重命名为
isXxx
形式,比如
iswriteable

我不确定您是否正确地考虑了这一点。使用
Recovered
属性的原因是因为对象现在处于这种状态,而不是因为对象过去处于这种状态。过去可能有一些过程(恢复)现在已经完成,但我们现在正在访问此属性这一事实意味着,已完成的过程改变了当前状态,当前状态很重要。对我来说,“恢复”抓住了这种状态的本质。对于本例(以及大多数类似情况),我将使用
IsRecovered
来命名指示此条件的谓词。(这也符合普通英语:“这是一个已恢复的文档。”)

在一个程序中,我很少使用现在时以外的任何东西来命名谓词(
IsDirty
hasToucon
)或布尔函数(
IsPrime(x)

一个例外情况是指示可能需要恢复的已更改状态(
DocumentWindow.wasmimalizedAtlastexit

我通常会用不定式来表示将来时态(
ToBeCopied
而不是
WillBeCopied
),因为软件的最佳计划有时会被修改(或者
    Past        Present     Future  
    =====       =======     =======  
 1. alive       alive       alive  
 2. alive       alive       dead  
 3. alive       dead        dead  
 4. dead        dead        dead
 5. dead        dead        alive
 6. dead        alive       alive
 7. dead        alive       dead
 8. alive       dead        alive