これは一般的なプログラミングですが、違いが生じる場合は、objective-cを使用しています。値を返し、いくつかのアクションも実行するメソッドがあるとしますが、それが返す値は気にせず、それが行うものだけを気にします。メソッドを無効であるかのように呼び出しますか?または、結果を変数に入れてから削除するか、忘れますか?あなたの意見を述べてください、あなたがこの状況にあったらあなたは何をしますか。
6 に答える
この一般的な例は、intを返すprintfです...しかし、これはめったに表示されません。
int val = printf("Hello World");
ええ、それが無効であるかのようにメソッドを呼び出すだけです。あなたはおそらくそれに気付かずにいつもそれをします。代入演算子'='は実際には値を返しますが、使用されることはめったにありません。
それは環境(言語、ツール、コーディング標準など)によって異なります。
たとえば、Cでは、値を使用せずに関数を呼び出すことは完全に可能です。intを返すprintfのようないくつかの関数では、それは常に実行されます。
値を使用しないと警告が発生することがありますが、これは望ましくありません。値を変数に割り当ててから使用しないと、未使用の変数について別の警告が表示されます。この場合の解決策は、呼び出しの前に(void)を付けて、結果をvoidにキャストすることです。
(void) my_function_returning_a_value_i_want_to_ignore().
ここには、実際には2つの別個の問題があります。
- 戻り値を気にする必要がありますか?
- 使用しない変数に割り当てる必要がありますか?
#2の答えは、はっきりとした「いいえ」です。もちろん、それが違法となる言語で作業している場合を除きます(初期のTurbo Pascalが思い浮かびます)。変数を破棄するためだけに変数を定義しても意味がありません。
最初の部分はそれほど簡単ではありません。一般に、値が返される理由があります。べき等関数の場合、結果は関数の唯一の目的です。非べき等の場合、これは通常、操作が正常に完了したかどうかを示すある種の戻りコードを表します。もちろん、例外もあります-メソッドチェーンのように。
これが.Netで一般的である場合(たとえば)、CQSを壊すコードに問題がある可能性があります。
無視した値を返す関数を呼び出すとき、それは通常、動作を検証するためのテストで実行しているためです。C#の例を次に示します。
[Fact]
public void StatService_should_call_StatValueRepository_for_GetPercentageValues()
{
var statValueRepository = new Mock<IStatValueRepository>();
new StatService(null, statValueRepository.Object).GetValuesOf<PercentageStatValue>();
statValueRepository.Verify(x => x.GetStatValues());
}
戻り値のタイプはあまり気にしません。偽のオブジェクトでメソッドが呼び出されたことを確認したいだけです。
Cでは非常に一般的ですが、そうしてもよい場所とそうでない場所があります。GCCの新しいバージョンには関数属性があるため、関数が使用されたときに戻り値を確認せずに警告を受け取ることができます。
この
warn_unused_result
属性を持つ関数の呼び出し元がその戻り値を使用しない場合、この属性により警告が発行されます。これは、結果をチェックしないことがセキュリティの問題であるか、reallocなどの常にバグである関数に役立ちます。int fn () __attribute__ ((warn_unused_result)); int foo () { if (fn () < 0) return -1; fn (); return 0; }
5行目に警告が表示されます。
前回これを使用したとき、生成された警告をオフにする方法はありませんでした。これにより、変更したくないサードパーティのコードをコンパイルするときに問題が発生します。また、もちろん、ユーザーが実際に戻り値に対して適切なことを行っているかどうかを確認する方法はありません。