麻烦为功能提供良好的名称

时间:2009-06-11 03:08:10

标签: language-agnostic coding-style

因此,我经常无法用简洁的名称描述函数。在重用的函数中通常不是问题,但通常需要将大型过程分解为子函数。通常这些名称会有奇怪的名称,例如connectionsToAccessLineshandleWallVisionSplit或类似名称。虽然这些功能只做一件事,但很难为它们提供一个好名字,因为它们只是一个更大算法的一部分。

在这种情况下你做了什么?这非常令人沮丧。

11 个答案:

答案 0 :(得分:19)

有时候,如果你不能提出一个好的功能名称,那么这表明该功能没有一个漂亮,清晰的焦点,需要重构。如果它是一个类方法,也许这个类也需要重构。

但是找到最好的名字是非常值得的,因为它使你的代码更容易理解和使用。

更新:许多软件工程作者都谈到了命名的重要性。 Henry F. Ledgard的Programming Proverbs(1975)和Brian Kernighan以及P.J.Plaugher的Elements of Programming Style(1978)是早期的,仍然值得一读。史蒂夫麦康奈尔的精彩Code Complete(2005年第2版)是一个更近期的例子,专门讨论了这一主题。

编程风格的元素部分地模仿了Strunk和White的Elements of Style,其实际上具有惊人的相关性。他们强调散文清晰,非常简洁,适用于我们的技术写作和评论(以及命名),但我一直认为它类似于我们在重构和改进代码时所做的工作。

答案 1 :(得分:14)

我宁愿在较大算法的上下文中使用冗长的方法名称,因为它减少了查看函数实现的需要。

ReadPropertiesFromFileThenWriteToSession 这样的名称比 ReadProps 更好。

答案 2 :(得分:9)

已故,伟大的Phil Karlton讽刺地说:计算机科学中只有两个难题 - 命名和缓存失效。我的经历使我相信这有很多道理。

将事物命名为一门艺术,就像它是一门科学一样,因此没有任何硬性规定。也就是说,我有时会阅读Ottinger's rules for Variable and Class Naming,它有一些很好的启发式记忆。我最喜欢的一个是使用名词短语,例如 - person.getName()或bitTorrentClient.findPeersFromTracker()。在这两种情况下,代码行的意图类似于英语中的短语。

答案 3 :(得分:6)

有时您可以通过简单地重写名称来减少函数的名称长度。而不是:

void RetrievePropertiesFromRemoteStore()

您可以使用:

void RetrieveRemoteProperties()

而不是:

bool CheckToSeeIfUserIsAuthorized()

使用:

bool IsUserAuthorized()

减少它的另一种方法是重新考虑函数的作用。而不是像这样的一个函数:

void GetUserProfileAndSetUpSession()

你可以:

void GetUserProfile()
void SetupSession()

答案 4 :(得分:2)

每当我碰到砖墙试图命名一个功能或程序时,我会回过头来仔细思考我的想法。通常,如果一个名字不容易表明自己,那么这是一个暗示,我没有想过函数或程序应该做什么。

你有一个需要做A,B,C,......,X,Y和Z的过程;你不能将程序命名为doABCDEFGHIJKLMNOPQRSTUVWXYZ。您必须找到一些逻辑中级分组(可能是几层分组),以便将过程分开。

有时候找到正确的名称需要移动代码,使其处于更合理的块状态。

另一个帮助是封装函数/过程(取决于您正在使用的语言的特性),以便名称可以更短(因为它的名称可以在其容器的上下文中解释)。例如,“openFile”程序通常应该只打开一个文件进行读取;但是在“UserPrefsFile”类的上下文中,它可能具有更具体的含义。

答案 5 :(得分:1)

嘿。在阅读问题标题时,让我印象深刻的是,编程行为可以被描述为“为功能提出好名字的麻烦”。

答案 6 :(得分:1)

当你的名字用完时,只需使用字母表中的字母即可。一旦用完了,请从字典中选择随机单词。通过这种方式,他们永远不会解雇您,因为您是唯一了解代码的人。

答案 7 :(得分:0)

你的功能应该说明他们的所作所为!但不是过于冗长的方式。这是你将随着时间的推移掌握的东西,需要一些练习才能正常运行。

快速阅读this以查看我之前写过的有关此类事情的一些内容:)确保您完成了other article,这启发我写下它并查看评论。

答案 8 :(得分:0)

重构书籍的一个建议是查看长算法,并且在每个地方你都觉得代码中有一个块,你可以用一行注释将这个块重构为私有函数并使用单行作为函数的名称。 这可能会很长,但如果它能帮助您快速阅读算法,那就非常好了。代码完整提到了9到15个字符之间的良好范围。

如果它是私人帮助函数,请不要担心以后重构名称是没有问题的

答案 9 :(得分:0)

通过使用面向对象的方法,它有助于减少这个问题。 connectionsToAccessLines - > connexion.connect(System.getAccessLines());

handleWallVisionSplit - >这个,我不确定它的作用:D 但是,我会说:wall.handleVision(Wall.split);或者其他什么,我想你明白我的意思。

另外,有时候,当命名太具体的功能真的很难时,可能是因为代码不够高。例如: readSecondWordOfLine(a_line) - > line.split()[1]。

或者,sort(sortWithSecondWordOfLine())可以成为,排序(line => split(line)[1])..我知道它并不总是像所有语言一样干净,但你明白我的观点。例如,使用C ++,您可以使用bind和stl复合来构建一个线性表达式,而不是创建一个新方法。

所以,我可以总结一下,如果你有一个太技术的方法 - 这通常很短,因为否则通过抽象功能很容易找到名称 - 创建一个更通用的新函数/类是好的使用抽象名称并直接在第一个函数中使用它。

答案 10 :(得分:-3)

您可以使用编号和后缀“_ *”来避免代码中包含太多名称:

void DoX()
void DoX_Decode1()           <-- this name shows that this function is only used by DoX()
void DoX_Decode2()
void DoX_Decode3()
void DoX_Find1()
void DoX_Find2()
void DoX_Find3()

您还可以将类似功能与前缀分组:

void tcpip_ShowConnectDialog()
void tcpip_AcceptConnections()
void logging_WriteToFile()
void logging_UpdateLogWindow()

通过这种方式,您可以获得独特的功能名称(有助于搜索和搜索和替换)并且仍然保持相对较短的功能。您还可以避免将它们提取到单独的类和单独的代码文件中的麻烦。只需保持前缀短,以便您可以轻松忽略并查看它们。