一般的なプログラミング-非voidメソッドを呼び出しますが、値は使用しません
-
22-07-2019 - |
質問
これは一般的なプログラミングですが、違いがある場合は、objective-cを使用しています。値を返すメソッドがあり、いくつかのアクションも実行するとしますが、返される値は気にせず、値だけを返します。単に無効であるかのようにメソッドを呼び出しますか?または、結果を変数に入れてから削除するか、それを忘れますか?この状況が発生した場合にどうするか、あなたの意見を述べてください。
解決
これの一般的な例はprintfです。これはint ...を返しますが、めったに表示されません:
int val = printf("Hello World");
他のヒント
ええ、単にメソッドがvoidであるかのように呼び出します。気づかないうちにいつもやっているでしょう。代入演算子「=」は実際に値を返しますが、使用されることはほとんどありません。
環境(言語、ツール、コーディング標準など)に依存します。
たとえばCでは、値を使用せずに関数を呼び出すことは完全に可能です。 intを返すprintfなどの一部の関数では、常に実行されます。
値を使用しない場合、警告が表示されることがありますが、これは望ましくありません。値を変数に割り当ててから使用しないと、未使用の変数に関する別の警告が発生します。この場合の解決策は、呼び出しの前に(void)を付けることで結果をvoidにキャストすることです。例:
(void) my_function_returning_a_value_i_want_to_ignore().
実際には2つの問題があります:
- 戻り値を気にしますか?
- 使用しない変数に割り当てますか?
#2への答えは、圧倒的な「いいえ」です。 -もちろん、それが違法となる言語で作業しているのでなければ(Turbo Pascalが思い浮かぶ)。変数を破棄するためだけに定義することはまったく意味がありません。
最初の部分はそれほど簡単ではありません。通常、値が返される理由があります- idempotent 関数の場合、結果は関数の唯一の目的です。べき等でない場合は、通常、操作が正常に完了したかどうかを示す何らかのリターンコードを表します。もちろん、例外もあります-メソッドチェーンのように。
これが.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の以降のバージョンには、 function属性がありますを使用すると、関数が使用されたときに戻り値を確認せずに警告を受け取ることができます。
warn_unused_result
属性は、この属性を持つ関数の呼び出し元が戻り値を使用しない場合に警告を発行します。これは、結果を確認しないことがセキュリティ上の問題または常にバグである関数(reallocなど)に役立ちます。int fn () __attribute__ ((warn_unused_result)); int foo () { if (fn () < 0) return -1; fn (); return 0; }
5行目で警告が発生します。
これを使用した前回は、生成した警告をオフにする方法がありませんでした。これは、変更したくないサードパーティのコードをコンパイルしているときに問題を引き起こします。また、もちろん、ユーザーが実際に戻り値を使用して賢明なことを行っているかどうかを確認する方法はありません。