3

问题描述

我经常发现自己在考虑要编写的函数的方法名称。像settergetter一样改变或获取对象的状态。也许我没有以正确的方式使用对象,但我经常发现自己处于使用 setter 和 getter 似乎不太适合的情况。我有几个具体的问题。

问题

  1. 是更喜欢使用标准化的方法名称还是使用您正在解决的问题领域中的方法名称?(例如,在游戏中您可以使用 boolean won,isWinner())。
  2. 什么时候适合缩写?你应该如何缩写?当我不得不写很多东西时,我经常会发现自己在创建缩写词,但这似乎是一个糟糕的标准,因为在我看来,代码审查员应该放弃一种方法并了解正在发生的事情。“你应该如何缩写”我的意思是:应该message是;msg, mes, 例如average; avg, av, 或initializing,initinitialize
  3. 是否有理由将方法的主要功能放在最后?例如,welcomeMsg()(最后的功能),msgWelcome()(前面的功能)。
  4. 你只有3种不同的方法吗?Setter(用于更新、初始化)、getter 和条件测试?所以你基本上可以看到细分这3个之间的所有方法?

特殊情况

特别是在我创建刽子手游戏的这种情况下,我在命名方面遇到了一些问题。其中隐藏的字符串由下划线屏蔽,每次用户输入正确的字母时,屏蔽的字符串都会在正确的位置用正确的字母更新。以下是我使用的一些方法名称,并且有以下问题:

  • welcomeMessage() {} //could be either msgWelcome, welcomeMsg, there will be many more messages. What is a good way for message method names?

  • initialiseGame() {} //could as well be initGame or setupGame changing, ugh.

  • checkIfWon() {} //hasWon() is probably better.

  • askUserInput() {} //seems like a common thing to do, what is a good way to do this, is creating a method for this common or do people often do this inline within an other method? The userinput should match specific conditions.

  • countMatches() {}//to check how many of the letters given by the userInput match the hidden word. calculateMatches(), enumMatches(), enumerateMatches(), getMatches all seem plausible alternatives.

  • containsOnlyLetters(String string) {}//checks if input contains only letters. isOnlyLetters() makes it more clear that it is a boolean, but seems to be further away from problem description.

4

2 回答 2

3

好问题。请注意,我所说的某些内容是我的观点。无论你的风格是什么,最好在你自己的代码中保持一致,并且与其他人的做事方式大部分标准化。

  1. 是更喜欢使用标准化的方法名称还是使用您正在解决的问题领域中的方法名称?

如果可以,我会使用领域语言作为方法名称,并尝试使这些名称成为动词。例如,bankAccount.Deposit(new Money(200));而不是bankAccount.setMoney(new Money(200));

使用领域语言通常读起来更好,并使您的对象感觉更抽象,更接近您实际建模的内容。当您想不出一个好的域特定名称的方法时,我通常会使用标准前缀(get、set、is/has/etc)。

  1. 什么时候适合缩写?你应该如何缩写?

我几乎从不缩写。当然,看到和编写长方法名称会让人头疼,但您通常需要自动完成 IDE 的帮助。我个人觉得看到缩写的变量/方法/类名很烦人。它让我停顿一秒,并试图解读其中的含义。我喜欢可读性好的代码,而且我认为缩写会降低可读性。不过有些缩写还是不错的。NHL、NFL 等。还有一些常见的缩写,例如 msg 表示消息,num 表示数字等。我不一定介意这些,但为了保持一致性,我通常根本不使用缩写。我会说是一致的,但更倾向于不缩写。

  1. (a) 是否有理由将方法的主要功能放在最后?

在这些情况下,我选择读起来更好的东西。在代码中使用这种方法,它读起来像:System.out.println(hangmanGame.welcomeMessage());还是System.out.println(hangmanGame.msgWelcome());?我更喜欢前者。如果我写这个,我会把这个方法变成一个动词,它可能是System.out.println(hangmanGame.getWelcomeMessage());

  1. (b) 你只有 3 种不同的方法吗?Setter(用于更新、初始化)、getter 和条件测试?

是的,这些是您仅有的 3 种方法。从技术上讲,您只有两种类型:修改器和访问器(setter、getter),因为返回布尔值是 getter。因此,您要么调用对象上的方法来更改其状态,要么获取其状态。

Bullet1:在 3(a) 中回答

Bullet2:没关系,但如果你想发表意见,我喜欢 setupGame。在游戏领域中,游戏是设置的,而不是初始化的:)。

Bullet3:我更喜欢 hasWon()。如果(player.hasWon())不是if (player.checkIfWon()).

Bullet4:我更喜欢这里的 getMatches(),但更喜欢 getMatchCount()(如果计数是你所追求的)。我喜欢 get 前缀,因为它告诉程序员该方法正在返回一些东西。从 countMatches() 中,如果不查看方法签名,您真的不知道它是否会返回某些内容。

Bullet5:我对这个很纠结,但如果必须选择,我会选择 containsOnlyLetters,因为 Java String 类有一个函数 contains。只要方法名称听起来像是在询问类,那么假设它返回一个布尔值是合理的。也就是说,您不必使用is 前缀。

希望这可以帮助。

于 2014-11-26T01:51:49.743 回答
1
  1. 在您所在的域中。它使您的代码更容易理解,这对您和其他人都有好处。

  2. 只需根据您的喜好缩写并保持一致。例如:msg/mes、init、alloc、avg/average、min & max。如果它可以理解,但更短,那么它很好用。

  3. 我会将其设为命令式命令,例如 showWelcomeMsg() 或 showMsg(WELCOME),这样会更清楚实际会发生什么。如果它不是一个函数,我会选择welcomeMsg,因为它读起来更好。

initGame (更像是初始化游戏状态,但不创建它)或 setupGame (多合一功能)会做。hasWon,不需要不必要的冗长。getMatchesCount 可以只获取计数,但是,因为您还需要显示它们,所以我会让 getMatches 返回一个包含所有匹配字母的数组。countMatches 的返回值并不清楚。它也可以是 void 并设置内部变量等。 isOnlyLetters(公共)或 lettersOnly(私有/本地)。

但是,您似乎过度分析了,使任务变得不必要的复杂。只关注一致性、可读性和可理解性,而不是过于复杂。

于 2014-11-26T02:21:42.087 回答