【问题标题】:determining which verb to use for method names in Java确定在 Java 中为方法名使用哪个动词
【发布时间】:2026-01-14 05:35:01
【问题描述】:

我知道命名约定很重要,原因有很多,主要是为了使您的代码更易读,更容易集成到更大的项目中,等等。在 Java 中,大多数约定要求方法名称在 lowerCamelCase以动词开头。

我的问题是:如何选择方法名开头的动词?

为了使这个问题不那么含糊,我经常遇到这样的情况:方法名称的首选是描述输出的名词。在这些情况下,我通常会在名词字体中附加通用动词(如getgeneratecalculate 等)以符合动词规则时感到困惑。是否有关于何时使用哪个的一般准则?

这是一个例子。我有一个方法,它采用double[] array 和一个int k 并返回double[] newArray,这是k 的长度array,即newArray[i] = (array[i-k+1]+...+array[i])/k 与一些捏造使newArray 与@ 相同的长度987654332@。我的倾向是调用这个方法movingAverage,因为它返回的是这个方法,但是因为它不是以动词开头的,所以就没有了。我应该将此方法称为getMovingAveragegenerateMovingAveragecalculateMovingAverage 还是无关紧要?

【问题讨论】:

  • 在我看来,命名约定不是“法律”,因此虽然您应该尝试以动词开头的方法名称,但我看不出您不能以它开头的原因一个名词,如果它具有足够的描述性(movingAverage 非常具有描述性)。不要忘记,虽然现在人们并没有真正抱怨过长的方法名称,但我会选择 movingAverage 而不是 computeMovingAverage 任何一天。顺便说一句,我想不出一个不通用的动词,在编程方面更是如此。
  • 即使是原生 java 方法也不会盲目地遵循“第一个词是动词”的约定。例如Collection#size()Collection#toArray()。如果您觉得它足够清楚,我会说随意使用movingAverage() [并且没有人可能认为它意味着别的]。
  • @amit 标准 Java 库不是一个很好的例子,它是高度不一致的 - 例如一些类有一个 length() 方法,其他有一个 getLength() 方法,有些甚至有 getter 和 setter具有相同名称的方法(例如 ByteBuffer.position() 获取位置和 ByteBuffer.position(int) 设置位置 - 我不鼓励你这样命名你的方法!)。
  • @Link 动词中还有有用的信息。当您必须执行(可能很长)计算工作时,将使用 computeMovingAverage - getMovingAverage 意味着仅检索已经计算的值。
  • @DJClayworth 这是一个非常好的观点。将它与 Evan 的动词摘要结合起来,给了我一个很好的指导。谢谢。

标签: java methods naming-conventions


【解决方案1】:

我通常会问自己:

这个方法是做什么的?

答案决定了应该调用什么方法。当然,它完全独立于程序员。

注意:如果您不能简洁地描述该方法正在做什么,则它可能做得太多,应该拆分。

选择方法的动词:

  • 执行计算:计算
  • 检索数据:getretrieve
  • 变异数据:setchange
  • 删除数据:deleteremove
  • 转换:转换
  • 启动操作:startinitiate
  • 停止操作:stopcancel

现在,并非所有方法都以动词开头;但他们真的不需要。如果您阅读:

... myString.length();

... myArray.size();

您确切地知道发生了什么 - 不需要动词。对于 Java 层次结构中更高层的许多类方法都是如此。集合、数学等。只要名称准确地传达了方法的作用,就可以了。

【讨论】:

  • 另外,如果我的方法在一个对象上设置了一个属性,我喜欢将方法命名为 populateWith[PropertyName]() 而不是 set[PropertyName] 因为 set/get 应该只用于 getter 和 setter
  • 不错的答案!此外,我喜欢用于计算的动词 generate 比动词“calculate”所暗示的数学要少,例如从模板生成 URL。
  • 为什么是calculate而不是compute
  • @light imo,get 前缀意味着轻量级操作,不像 calculate 等意味着“更大”的工作量。
  • 我知道你来自哪里。但是在 OOP 上下文中,通过适当的封装原则,调用该方法的人无需知道它是否是轻量级的。此外,正如我所解释的,太多不同的前缀会导致不一致,至少从使用您的 API 的其他程序员的角度来看是这样。
【解决方案2】:

我的观点)如果对象没有状态,你不需要在方法名称中使用动词,比如数学库。比较 computeSquareRoot(x) 和 getJoin(listOfStrings) 与 squareRoot(x) 和 join(listOfStrings)。

【讨论】:

    【解决方案3】:

    正如您所说,正如我们在答案中看到的那样,方法名称开头使用的动词几乎是相同的动词。我认为,如果在编写相关文档上花费相同的精力,方法就会变得更易于理解和集成:)

    看了题后我也意识到,我写的大部分方法都是从getretrievecreate开始的。所以看起来动词选择并不重要。

    最好的

    【讨论】:

      【解决方案4】:

      我认为要找到任何可能成为问题“解决方案”的东西,我们应该首先提取在选择名称方面发挥任何作用的标准,例如:

      • 可读性(琐碎:getValue 而不是 transferValueFromThisObjectToYou)
      • 方便(琐碎:getCoordValue 代替)
      • 方法的语义(get和calculate不一样)
      • 使用上下文(在 IDE 中,我通常键入 aaa.get_ 并按 Ctrl+Space 来检查我可以从对象中得到什么)
      • 代码指南(或其他“指南”,例如强制您使用某些名称的 Java Bean 约定)

      ...

      但是正如 suat 所说 - 最好花一些精力在您的方法的文档上。

      【讨论】:

        【解决方案5】:

        我不认为 java 方法名称应该“以动词开头”,我认为它们应该描述动作。这通常需要一个动词,因为动词描述了动作。通常,它们是描述的重要部分(getVar 和 setVar 的含义完全不同)。有时,它们不会在描述中添加任何内容(您能想到除了 get/calculate/generate 之外的任何可以在movingAverage 上运行的东西吗?)并且应该被删除。

        【讨论】:

          【解决方案6】:

          不要忘记在 boolean 方法中使用这个动词“is, has or can”,例如:isOn(), isFull(),等等。

          【讨论】:

          • 是的。我使用的另一个前缀是“应该”,例如shouldConvertLineEndings.
          【解决方案7】:

          关于属性访问器使用getset 方法仅限information hiding 的全部意义在于 API 的用户(即调用代码)不应该需要了解或依赖于财产是即时存储还是计算。只要 API 保持不变,实现应该可以随时更改。

          【讨论】:

          • 这是很多人不理解的。他们将 getset 视为使私有/受保护字段表现得像公开一样的简写,并且教条地保留这些动词仅用于实现这种反模式。
          【解决方案8】:

          其实有一个清单:

          Verb        Group
          ----        -----
          Exit        Common
          Enter       Common
          Find        Common
          Pop         Common
          Remove      Common
          Rename      Common
          Push        Common
          Redo        Common
          Format      Common
          Move        Common
          New         Common
          Join        Common
          Lock        Common
          Optimize    Common
          Get         Common
          Hide        Common
          Open        Common
          Reset       Common
          Close       Common
          Clear       Common
          Skip        Common
          Split       Common
          Step        Common
          Unlock      Common
          Watch       Common
          Switch      Common
          Undo        Common
          Add         Common
          Copy        Common
          Resize      Common
          Search      Common
          Select      Common
          Show        Common
          Set         Common
          Write       Communications
          Send        Communications
          Read        Communications
          Receive     Communications
          Connect     Communications
          Disconnect  Communications
          Restore     Data
          ConvertTo   Data
          Backup      Data
          Edit        Data
          Dismount    Data
          Unpublish   Data
          Compress    Data
          Compare     Data
          Checkpoint  Data
          Sync        Data
          Save        Data
          ConvertFrom Data
          Convert     Data
          Update      Data
          Import      Data
          Initialize  Data
          Export      Data
          Group       Data
          Limit       Data
          Out         Data
          Mount       Data
          Merge       Data
          Expand      Data
          Publish     Data
          Test        Diagnostic
          Ping        Diagnostic
          Debug       Diagnostic
          Measure     Diagnostic
          Repair      Diagnostic
          Resolve     Diagnostic
          Trace       Diagnostic
          Suspend     Lifecycle
          Wait        Lifecycle
          Uninstall   Lifecycle
          Submit      Lifecycle
          Unregister  Lifecycle
          Assert      Lifecycle
          Invoke      Lifecycle
          Approve     Lifecycle
          Stop        Lifecycle
          Deny        Lifecycle
          Request     Lifecycle
          Restart     Lifecycle
          Disable     Lifecycle
          Install     Lifecycle
          Enable      Lifecycle
          Register    Lifecycle
          Complete    Lifecycle
          Confirm     Lifecycle
          Start       Lifecycle
          Resume      Lifecycle
          Use         Other
          Grant       Security
          Unblock     Security
          Protect     Security
          Revoke      Security
          Unprotect   Security
          Block       Security
          

          【讨论】: