函数命名约定

Tow*_*wer 35 function naming-conventions

我正在写一个库,所以,我希望它的功能尽可能清晰明确地命名.目前,我使用以下原则:

  1. 不言自明的名称:函数getName()将告诉开发人员它返回的内容以及setAddress(),isMale()等.
  2. 简短:函数名称必须尽可能短,以便输入简单,易于记忆.函数getNumberOfPagesInTheBook()不好,像getBookPageCount()这样的东西更好.
  3. 使用前缀:我总是在函数中使用前缀,例如getName(),setName(),hasHair(),isBlond()等.

我很想知道是否有什么东西我不见了.另外,你能想到除了is,has,get和set之外的其他一些前缀吗?

Car*_*icz 58

其中一个更通用但更简单的规则是:如果函数改变了程序的状态,函数名应该是动词,如果它们用于返回某个值,则名词应该是名词.

  • 所以这意味着getter函数都被命名为错误?...即getSomeValue(); (21认同)
  • 在具有命名闭包和计算属性的语言中,这不是一个好的规则。对于具有这些功能的语言,更好的规则是始终将函数命名为动词或谓词。您必须考虑将函数存储为闭包时会是什么样子。名词没有意义;这给人的印象是它是调用的结果。 (5认同)
  • 动词意味着动作,函数则做事情。对所有函数名称使用动词是合理的。 (5认同)
  • 使用名词函数名称对我来说没有意义。`getHorse()` 返回 `horse`。`horse` 是一个变量,它不是你可以调用的。它可以是一个对象或字符串,但不能是函数。它也可以是 `makeHorse`、`editHorse`、`doAnythingWithHorse`,但绝不仅仅是 `horse()`。“Horse”可以是一个类,因此我们可以像“new Horse()”那样创建一个 horse 实例,但这不是调用函数。 (4认同)
  • @timh 是的,他们错了,这就是为什么 C# 用 get;set 属性修复了他们的问题 (2认同)

Mos*_*evi 10

编写库时要做的一件更重要的事情是每次都使用相同的词来描述相同的操作。不要在一个类中编写一个名为getName的函数,而在另一个类中编写另一个名为retrieveNumber 的函数。

  • 我通常在从类变量本地获取数据和/或进行计算时使用`get`(例如`circle.getArea()`),然后当它必须从外部获取这些数据时使用`retrieve`(例如来自数据库:`db.retrieveUserById(123)` (3认同)
  • @DavidCallanan,它如何与调用者相关的检索方法? (2认同)
  • @ThaJay 两年后看到这一点,它可能与数据来源的调用者无关,我可能会在任何地方使用 get 。 (2认同)

gam*_*ela 5

这是一个很好的资源,建议与卡尔的答案相同:努力流畅使用

根据函数和方法的副作用命名它们

  • 那些没有副作用的应该读作名词短语,例如x.distance(to: y)i.successor()

  • 那些有副作用的应该读作祈使动词短语, 例如print(x),,,,x.sort()x.append(y)

  • 我发现这是一个非常糟糕的约定,因为很多单词既是名词又是动词。即使在这个例子中:你可以“远离”某物,并使用某种“某种”纸张获得“打印”。在实践中,我不知道“x.view()”、“x.set()”或“x.route()”中的哪一个可能有副作用。 (6认同)