3

問題の説明

関数のメソッド名について考えることがよくあります。オブジェクトの状態を変更または取得するセッターゲッターのように。オブジェクトの使用方法が間違っているのかもしれませんが、setter と getter の使用がうまくいかない場合がよくあります。具体的な質問がいくつかありました。

質問

  1. 標準化されたメソッド名を使用するのが好ましいですか、それとも解決している問題のドメインにあるメソッド名を使用するのが好まれますか? (例えば、ゲームでは boolean の win、isWinner() を使用できます)。
  2. 略語が適切なのはいつですか? また、どのように略す必要がありますか?たくさん書かなければならないときに略語を作成していることに気付くことがよくありますが、それは悪い基準のように思えます。私の意見では、コードレビュー担当者はメソッドに立ち寄って、何が起こっているのかを理解する必要があるからです。「どのように省略すべきか」とは、次のことを意味しmessageます。msgmes、そして例えばaverage; avgav、またはinitializinginitinitializeなど.
  3. メソッドの主な機能を最後に配置する必要がある理由はありますか? たとえば、welcomeMsg()(最後にある機能)、msgWelcome()(前にある機能)。
  4. 3種類の方法しかありませんか?セッター (更新、初期化に使用)、ゲッター、および条件テスト? つまり、基本的にこれら 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種類の方法しかありませんか? セッター (更新、初期化に使用)、ゲッター、および条件テスト?

はい、それらはあなたが持っている唯一の3種類の方法です. 技術的には、ブール値を返すのはゲッターであるため、ミューテーターとアクセサー (セッター、ゲッター) の 2 つのタイプしかありません。したがって、オブジェクトのメソッドを呼び出して状態を変更するか、状態を取得します。

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 に答える