web-dev-qa-db-ja.com

タスクを実行し、ブール値をステータスとして返すメソッドに名前を付ける方法は?

メソッドがある場合

_bool DoStuff() {
    try {
        // doing stuff...
        return true;
    }
    catch (SomeSpecificException ex) {
        return false;
    }
}
_

むしろIsStuffDone()と呼ばれるべきですか?

両方の名前がユーザーによって誤って解釈される可能性があります。名前がDoStuff()の場合、なぜブール値を返すのですか?名前がIsStuffDone()の場合、メソッドがタスクを実行するのか、結果をチェックするだけなのかは明確ではありません。

この場合の慣例はありますか?または、これは欠陥があると考えられているので、別のアプローチですか?たとえば、C#などの出力パラメーターを持つ言語では、ブールステータス変数を1つとしてメソッドに渡すことができ、メソッドの戻り値の型はvoidになります。

編集:私の特定の問題では、メソッドはインターフェイス実装の一部であるため、例外処理を呼び出し元に直接委任することはできません。したがって、呼び出し元は、さまざまな実装のすべての例外を処理する責任を負うことはできません。それらの例外に精通していません。ただし、発信者は npintiの回答とコメント で提案されているように、StuffHasNotBeenDoneForSomeReasonExceptionのようなカスタム例外を処理できます。

34
Limbo Exile

.NETでは、多くの場合、メソッドのペアがあり、その1つが例外(DoStuff)をスローし、もう1つはブールステータスを返し、実行が成功すると、outパラメータ(TryDoStuff)。

(Microsoftはこれを "Try-Parse Pattern" と呼んでいます。おそらくこれの最も顕著な例は、さまざまなプリミティブ型のTryParseメソッドだからです。)

Try接頭辞がご使用の言語で一般的でない場合は、使用しないでください。

68
ne2dmar

呼び出し元のコードに例外を投げただけの場合はどうでしょうか?

このようにして、コードを使用しているユーザーに例外処理を委任します。将来、次のことを実行したい場合はどうなりますか?

  • 例外がスローされない場合は、アクションAを実行します
  • (たとえば)FileNotFoundExceptionがスローされた場合、アクションBを実行します
  • その他の例外がスローされた場合は、アクションCを実行します

例外をスローすると、上記の変更はsimplyに余分なcatchブロックが追加されることになります。そのままにしておくと、メソッドと、メソッドの呼び出し元を変更する必要があります。これは、プロジェクトの複雑さに応じて、複数の場所に存在する可能性があります。

18
npinti

DoStuff()で十分であり、関数の戻り値を文書化する必要があります。利用可能なAPIの多くを探して、関数名でそれを言及する必要はありません。

PHP

// this method update and return the number affected rows 
// called update instead of updateAndGetAffectedCount
$affected = $query->update(/* values */);

Cシャープ

// Remove item from the List
// returns true if item is successfully removed; otherwise, false.
public bool Remove( T item )
7
amd

Javaでは、コレクション [〜#〜] api [〜#〜] は、ブール値を返す 追加メソッド を定義します。基本的には、追加によってコレクションが変更されたかどうかを返します。したがって、Listの場合、アイテムが追加されたため、通常はtrueを返しますが、Setの場合、アイテムがすでに存在する場合、Setsが許可されているため、falseを返す可能性があります。ユニークなアイテムごとに最大1回。

つまり、コレクションで許可されていないアイテム(null値など)を追加すると、falseを返すのではなく、NullPointerExceptionがスローされます。

ケースに同じロジックを適用すると、なぜブール値を返す必要があるのですか?例外を非表示にする場合は、非表示にしないでください。例外を投げるだけです。そうすれば、何が問題だったかを確認できます。ブール値が必要な場合は、例外が発生した以外の理由でブール値が実行されなかった可能性があるため、メソッドにDoStuff()という名前を付けます。これは動作を表すためです。それは何かをします。

6
mrjink

通常、メソッドはOperationResult(または_OperationResult<T>_)を返し、IsSuccessOperationResultプロパティを適切に設定します。 'usual'メソッドがvoidの場合はOperationResultを返し、 'usual'メソッドがオブジェクトを返す場合は_OperationResult<T>_を返し、ItemプロパティをOperationResultに適切に設定します。また、.Failed(string reason).Succeeded(T item)などのOperationResultにメソッドを含めることをお勧めします。 OperationResultはすぐにシステムで使い慣れた型になり、開発者はその処理方法を知るようになります。

1
Scott Rickman

例外、通常の状態など、さまざまな理由で失敗する可能性があるため、これを使用します。

boolean doStuff() - returns true when successful

重要なのは、ブール値の意味を文書化することです。

1
user136354

メソッドの主な役割に基づいて名前を選びます。そのメソッドがブール値を返すという事実は、「Is」接頭辞を要求しません。いくつかのJavaコード、 'Is'接頭辞を広範囲に使用しています。Java.io.File.delete()を見てください。booleanが返されますが、呼び出されませんisFileDeleted()。これは、メソッドの主な役割がファイルを削除することであるからです。誰かがファイルを削除する目的でこのメソッドを呼び出しています。

ブール値は、作業の結果を伝えるためだけにあります。一方、Java.util.Map.isEmpty()を見てみましょう。明らかに、そのようなメソッドを呼び出して、コレクションが空かどうかを調べます。あなたは何かをしたくありません。現在の状態を知りたいだけです。

だから個人的には、私は間違いなくDoStuff()を使い続けます。

これは私にとって幾分非常に重要な問題です。多くの場合、レガシーコードを維持するとき、私は個人的に「嘘つき方法」と呼んでいるものに遭遇します。名前はアクションAを示していますが、ボディはアクションBを示しています。データベース内のデータを変更するゲッターメソッドを使用した最も奇妙な例です。

0
Jacek Prucia

それは本当にあなたが使っている言語に依存します。一部の言語と同様に、多くの言語やまったく存在しない規則やプロトコルがあります。

たとえば、Objective-C言語とiOS/Mac OS X SDKでは、メソッド名は通常次の行に沿っています。

- (returndatatype) viewDidLoad {
- (returndatatype) isVisible {
- (returndatatype) appendMessage:datatype variablename with:datatype variablename {

ご覧のとおり、viewDidLoadというメソッドがあります。私は自分のアプリケーションを作成するときはいつでも、このタイプの命名を使用することを好みます。これは、あなたが言ったように何かが起こるはずだったかどうかを確認するために使用できます。私はあなたがそれがあなたのメソッドにどのような名前を付けているかについて深く考えすぎていると思います。ほとんどのメソッドは、それが何をしているのかというステータスを返します。例を挙げましょう。

PHPでは、接続が失敗した場合、mysql_connect()はfalseを返します。それがそうであるとは言わないが、それはそうであり、そしてドキュメントはそれがそうであると言っているので、それはプログラマーが誤って解釈することができない。

0
Gergy008

'Try'プレフィックスを使用することをお勧めします。これは、メソッドが成功するかどうかにかかわらず、よく知られているパターンです。この命名パターンは、Microsoftが 。NET Framework(たとえば、TryParseInt)で使用しています。

しかし、多分これは命名についてではありません。それは、メソッドの入力/出力パラメーターを設計する方法についてです。

私の考えでは、メソッドに戻り値がある場合、そのメソッドを呼び出す目的は、その戻り値を取得することです。したがって、戻り値の型を使用して操作のステータスを示すことは避けてください。

C#では、出力パラメーターを使用することを好みます。 outを使用して、パラメーターをサイドパラメーターとしてマークしています。特に、C#6はインライン変数宣言をサポートします。

DoStuff(out var isStuffDone); // The out parameter name clearly states its purpose.
DoStuff(out var _); // I use _ for naming parameters that I am ignoring.
0
000