6

わかりました、これは少しハックかもしれませんが、我慢してください:)背景は、そのifステートメントがメソッド全体のインデントを台無しにするメソッドにうんざりしていることです。

public SomeClass DoStuff(string inputStr)
{
  SomeClass result =null;
  if (IsOpenFilter(inputStr))
  {
    ....
  }

  return result;
}

だから私は考えていたのですが、代わりに次のようなことができればいいのではないでしょうか:

public SomeClass DoStuff(string inputStr)
{
  Require(IsOpenFilter(inputStr),null);


  ....

  return result;
}

このケースは、何らかの形でコード コントラクトによってカバーされる可能性があります。その場合は、私を修正してください :)

ステートメントが true に評価されない場合、null が返されるという考え方です。メソッドの戻り値の型がない場合は、次のようになります: Require(IsOpenFilter(inputStr));

2つの質問があると思いますが、これはどうにかして行うことができますか? メソッドの呼び出しから条件付きリターンを行う方法に困惑しています。

他の質問は、これは良い考えですか? このように言語にモンキー パッチを適用するのは少し奇妙ですが、コードの読み取り方が好きです。メソッドの上の属性に入れることができれば、さらにきれいになります: [Require(IsOpenFilter(inputStr))]

4

2 に答える 2

8

私は Anders に同意します: 条件を逆にして、早期に戻ります。「単一のリターン ポイント」は、そのリターン ポイントで一連のリソースのクリーンアップを明示的に行う必要がある場合に価値がありました。finallyブロック、ステートメント、およびガベージ コレクションをusing使用すると、もはや有用なガイドラインでさえありません、IMO。単一のリターン ポイントを取得するためだけに何かをしていることに気付いた場合は、それが実際にコードを読みやすくしているのかどうかを検討してください。

ほとんどの場合、コードのある時点で戻り値が分かっていて、メソッド内で実行したいアクションが他にない場合、最善の方法はすぐに戻ることです。別のアクションがある場合に備えて、読者にメソッドの残りの部分に目を通すように強制することは、エレガントでも有用でもありません.IMO.

メソッドが呼び出し元を返す必要があることを示すことができないのは良いことだと思います-その機能は読みやすさの悪夢のように聞こえます。そうは言っても、新しい種類の条件付き return ステートメントを検討しました

return? expression;

expressionこれは、 null 以外の場合の評価値を返します。次のような null 非許容型に使用できます。

int Foo()
{
    return? Bar(); // Where Bar() has a return type of int?
    ...
}

基本的には、null 合体演算子に相当する return ステートメントになります。

これはあなたの場合には役に立たないでしょう、気をつけてください-あなたは早くnullを返したいです...

于 2010-04-03T09:19:17.330 に答える
3

最初の例を次のように書き直してはどうですか。

public SomeClass DoStuff(string inputStr) 
{ 
  if (!IsOpenFilter(inputStr)) 
      return null;

  SomeClass result =null; 

  // Some code .... 

  return result; 
} 

各関数で 1 つの戻りポイントの古い規則に固執しようとしているようです。簡潔に言うと、戻り値が 1 つであることは、明示的なリソース処理を備えた言語の遺産です。長い話は、いくつかの古い SO 投稿で利用できます。

于 2010-04-03T08:56:56.200 に答える