メソッドがある場合
_bool DoStuff() {
try {
// doing stuff...
return true;
}
catch (SomeSpecificException ex) {
return false;
}
}
_
むしろIsStuffDone()
と呼ばれるべきですか?
両方の名前がユーザーによって誤って解釈される可能性があります。名前がDoStuff()
の場合、なぜブール値を返すのですか?名前がIsStuffDone()
の場合、メソッドがタスクを実行するのか、結果をチェックするだけなのかは明確ではありません。
この場合の慣例はありますか?または、これは欠陥があると考えられているので、別のアプローチですか?たとえば、C#などの出力パラメーターを持つ言語では、ブールステータス変数を1つとしてメソッドに渡すことができ、メソッドの戻り値の型はvoid
になります。
編集:私の特定の問題では、メソッドはインターフェイス実装の一部であるため、例外処理を呼び出し元に直接委任することはできません。したがって、呼び出し元は、さまざまな実装のすべての例外を処理する責任を負うことはできません。それらの例外に精通していません。ただし、発信者は npintiの回答とコメント で提案されているように、StuffHasNotBeenDoneForSomeReasonException
のようなカスタム例外を処理できます。
.NETでは、多くの場合、メソッドのペアがあり、その1つが例外(DoStuff
)をスローし、もう1つはブールステータスを返し、実行が成功すると、outパラメータ(TryDoStuff
)。
(Microsoftはこれを "Try-Parse Pattern" と呼んでいます。おそらくこれの最も顕著な例は、さまざまなプリミティブ型のTryParse
メソッドだからです。)
Try
接頭辞がご使用の言語で一般的でない場合は、使用しないでください。
呼び出し元のコードに例外を投げただけの場合はどうでしょうか?
このようにして、コードを使用しているユーザーに例外処理を委任します。将来、次のことを実行したい場合はどうなりますか?
FileNotFoundException
がスローされた場合、アクションBを実行します例外をスローすると、上記の変更はsimplyに余分なcatch
ブロックが追加されることになります。そのままにしておくと、メソッドと、メソッドの呼び出し元を変更する必要があります。これは、プロジェクトの複雑さに応じて、複数の場所に存在する可能性があります。
DoStuff()
で十分であり、関数の戻り値を文書化する必要があります。利用可能なAPIの多くを探して、関数名でそれを言及する必要はありません。
// this method update and return the number affected rows
// called update instead of updateAndGetAffectedCount
$affected = $query->update(/* values */);
// Remove item from the List
// returns true if item is successfully removed; otherwise, false.
public bool Remove( T item )
Javaでは、コレクション [〜#〜] api [〜#〜] は、ブール値を返す 追加メソッド を定義します。基本的には、追加によってコレクションが変更されたかどうかを返します。したがって、List
の場合、アイテムが追加されたため、通常はtrueを返しますが、Set
の場合、アイテムがすでに存在する場合、Set
sが許可されているため、falseを返す可能性があります。ユニークなアイテムごとに最大1回。
つまり、コレクションで許可されていないアイテム(null値など)を追加すると、falseを返すのではなく、NullPointerException
がスローされます。
ケースに同じロジックを適用すると、なぜブール値を返す必要があるのですか?例外を非表示にする場合は、非表示にしないでください。例外を投げるだけです。そうすれば、何が問題だったかを確認できます。ブール値が必要な場合は、例外が発生した以外の理由でブール値が実行されなかった可能性があるため、メソッドにDoStuff()
という名前を付けます。これは動作を表すためです。それは何かをします。
通常、メソッドはOperationResult
(または_OperationResult<T>
_)を返し、IsSuccess
のOperationResult
プロパティを適切に設定します。 'usual'メソッドがvoidの場合はOperationResult
を返し、 'usual'メソッドがオブジェクトを返す場合は_OperationResult<T>
_を返し、Item
プロパティをOperationResult
に適切に設定します。また、.Failed(string reason)
や.Succeeded(T item)
などのOperationResult
にメソッドを含めることをお勧めします。 OperationResult
はすぐにシステムで使い慣れた型になり、開発者はその処理方法を知るようになります。
例外、通常の状態など、さまざまな理由で失敗する可能性があるため、これを使用します。
boolean doStuff() - returns true when successful
重要なのは、ブール値の意味を文書化することです。
メソッドの主な役割に基づいて名前を選びます。そのメソッドがブール値を返すという事実は、「Is」接頭辞を要求しません。いくつかのJavaコード、 'Is'接頭辞を広範囲に使用しています。Java.io.File.delete()
を見てください。boolean
が返されますが、呼び出されませんisFileDeleted()
。これは、メソッドの主な役割がファイルを削除することであるからです。誰かがファイルを削除する目的でこのメソッドを呼び出しています。
ブール値は、作業の結果を伝えるためだけにあります。一方、Java.util.Map.isEmpty()
を見てみましょう。明らかに、そのようなメソッドを呼び出して、コレクションが空かどうかを調べます。あなたは何かをしたくありません。現在の状態を知りたいだけです。
だから個人的には、私は間違いなくDoStuff()
を使い続けます。
これは私にとって幾分非常に重要な問題です。多くの場合、レガシーコードを維持するとき、私は個人的に「嘘つき方法」と呼んでいるものに遭遇します。名前はアクションAを示していますが、ボディはアクションBを示しています。データベース内のデータを変更するゲッターメソッドを使用した最も奇妙な例です。
それは本当にあなたが使っている言語に依存します。一部の言語と同様に、多くの言語やまったく存在しない規則やプロトコルがあります。
たとえば、Objective-C言語とiOS/Mac OS X SDKでは、メソッド名は通常次の行に沿っています。
- (returndatatype) viewDidLoad {
- (returndatatype) isVisible {
- (returndatatype) appendMessage:datatype variablename with:datatype variablename {
ご覧のとおり、viewDidLoadというメソッドがあります。私は自分のアプリケーションを作成するときはいつでも、このタイプの命名を使用することを好みます。これは、あなたが言ったように何かが起こるはずだったかどうかを確認するために使用できます。私はあなたがそれがあなたのメソッドにどのような名前を付けているかについて深く考えすぎていると思います。ほとんどのメソッドは、それが何をしているのかというステータスを返します。例を挙げましょう。
PHPでは、接続が失敗した場合、mysql_connect()はfalseを返します。それがそうであるとは言わないが、それはそうであり、そしてドキュメントはそれがそうであると言っているので、それはプログラマーが誤って解釈することができない。
'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.