4

私が言いたいのは、メソッドを書く良い方法はルールに従うことだと読んだことです: 1 つのメソッドは 1 つのタスクだけを実行するべきです。また、異なる順次操作がある場合は、メソッドをいくつかに分割する必要があります。これにより、コードがよりクリーンでシンプルになり、わかりやすいメソッド名になります。しかし、何かを実行してからブール値を返すメソッドを実装したい場合は、true が成功し、失敗した場合は false になります。たとえば、setObjectValue() というセッターがあるとします。[繰り返しますが、これは単なる例です]。

質問: この名前を使用してブール値を返すのがよいでしょうか、それとも isSuccessfullsetObjectValue()、setObjectValueAndCheckIsOk() のようなものにする必要がありますか、それとも 2 つのメソッドまたは何を使用する必要がありますか? 「setObjectValue()」という名前は、メソッドが値の設定以外に何かを行っていることを示していないためです。

4

7 に答える 7

11

正当な理由がない限り、通常は例外を使用してこれを示します。これには 2 つの利点があります。

  1. 1 つの方法と 1 つのアイデアの慣例に従います。
  2. (例外がチェックされている場合)失敗のケースを処理することを強制します。ブール値を返す場合、コードはこのケースを簡単に無視できます。

次のようなことをすると:

try{

  setObjectValue("foo")
} catch(SomeKindOfException e){
  //handle
} 

次に、英語のように読むことでさらに利点が得られます。「オブジェクトの値を設定してみてください。ただし、できない場合は...」

于 2013-03-11T19:37:55.157 に答える
1

私の意見では、ジェームズの答えはかなり良いです。しかし、いくつかのセッターとその結果の try-catch-blocks について考えてみてください。わずかに異なるアプローチは、バリデーターを介してこれらのセッターの値を処理することです。たとえば、ユーザーが何らかの入力を行った場合などです。

String userInput = ...;
if (myValidator.isValid(userInput)) {
   myObject.setObjectValue(userInput);
}

メソッドisValid(boolean valueToCheck)は、ブール値を返すことを示しています。setObjectValue(String newValue)値を返さずに仕事をしなければなりません。

セッターで newValue を引き続き確認できます。これが無効な入力である場合は、IllegalArgumentException(fail-fast) をスローします。

if (newValue==null || newValue.contains("foo")) {
  throw new IllegalArgumentException("Illegal value for newValue: "+newValue);
}
this.value = newValue;

したがって、コードでは、独自の値にセッターを使用できます。つまり、あなたはこのメソッドを作成し、入力を知っているはずなので、これで問題ないはずです。ユーザーが何らかの入力を行った場合は、セッターにバリデーターを使用します。奇妙な入力があるでしょう、信じてください!;-)

その結果、この量の try-catch ブロックを処理する必要がなくなり、例外が発生した場合 (バリデーターを使用しない場合) にどこを調べればよいかを知る必要がなくなります。

于 2013-03-11T19:50:38.423 に答える
1

それはあなたのコードが何をしているかに本当に依存しますが、あなたが説明したことから、それは完全に理にかなっており、おそらく望ましい動作です(コードが何をしているかによって異なります)。

たとえば、操作の結果として変更された場合、 Collectionはブール値を返します。この別の例はAtomicBooleanです。このような場合、何かが変更されたかどうかを知る必要がある場合があるため、ブール値を返すことは理にかなっています。メソッドの命名は、それが理にかなっている限り、実際には問題ではありません。

これらの例では、セットが成功したかどうかを知ることが非常に重要であり、これを現実的に行う唯一の場所です。ただし、他の多くの無関係な操作も行う値を設定するために使用されるメソッドはありません。

さらに、例で false を返す理由が何らかの検証エラーの結果である場合は、値を設定する前にそれを確認する必要があります。

于 2013-03-11T19:46:18.713 に答える
0

いくつかの条件をチェックしてブール値を返すメソッドと、いくつかの操作を実行する前に条件チェックを使用する別のメソッドを作成しても問題ありません。

boolean checkSomeCondition();

そして、あなたのコードは苦しむことはありません

if (checkSomeCondition()) {...}
else {...}

ただし、メソッドがその名前に示されているアクションを実行できなかった場合は、例外を使用する必要があります。それらは実際にそのために作成されました。

try {
   DoSmth();
} catch (ParticularError e) {
   ...
}

これは一般的に使用されるスタイルであり、関数の本体内で発生したエラーを処理するためのおそらく最良の方法です。

于 2013-03-11T20:31:33.420 に答える
0

通常、セッターは void (値を返さない) にする必要があります。セッターにブール値を返させずに目標を達成する方法はいくつかあります。1 つの方法は、特定の値を設定するたびに true に設定されるインスタンス変数としてブール フラグを設定することです。このフラグは、独自の getter を介してアクセスできます。

たとえば、Name 属性と Phone Number 属性を持つクラス Person があるとします。人の電話番号を設定し、後でこの電話番号が設定されているかどうかを判断できるようにしたいと考えています。

public class Person 
{
   private String name;
   private String phone;
   private boolean hasPhone;

   public void setName(String name)
   {
      this.name = name;
   }

   public String getName()
   {
      return name;
   }

   public void setPhone(String phone)
   {
      this.phone = phone;
      hasPhone = true;
   }

   public String getPhone()
   {
      return phone;
   }

   public boolean hasPhone()
   {
      return hasPhone;
   } 
}
于 2013-03-11T20:05:52.203 に答える
0

私の見解では、低速のストレージ デバイス (Web サービスなど) を呼び出さない限り、セッターは値を返すべきではありませんが、そのような場合に例外をスローすると、よりクリーンになります。

于 2013-03-11T19:39:50.713 に答える
0

JavaDocで戻り値が何に使用されるかを言及していれば、メソッドシグネチャで値が表すものを明示的に言わずにブール値を返すことは問題ないと思います。これは Java Collections API 全体で行われるため (Collections API がゴールド スタンダードであるというわけではありません)、Java でこれを行うことは一般的に受け入れられています。

于 2013-03-11T19:39:53.903 に答える