否定を強調する


13

かなり長いプロパティ名でifステートメントを書いていたところ、この問題に遭遇しました。

次のようなifステートメントがあるとします。

if(_someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue &&
   !_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant)
{
    //Do something
}

2番目のプロパティはブール型であり、次のようなステートメントを持つことは意味がありません

if(boleanValue == true)

否定を強調するより良い方法はあり!ますか?私には、コードを読み取るときにこれが簡単に監視され、デバッグで問題が発生する可能性があるようです


7
意味のある名前のメソッドに条件を抽出します。
ヨアヒムザウアー

2
...または無効な値を意味のある名前の変数に割り当て、代わりにif条件で使用します。
scrwtp

照会されるオブジェクトのメソッドが...この場合、全体の状態は上の方法でカプセル化される可能性置けば@JoachimSauerは、言った1_someViewModelNameThatIsLong
MattDavey

2
私がよく行う一般的なことは、否定を各側にスペースで囲み、それをより見やすくすることです。if( ! something)if(!something)
Svish

否定を強調している場合、使用しないのはなぜ... && model.Prop == false)ですか?個人的に私はめったに使用しませんが!、見逃すのは簡単すぎます。

回答:


22
if(_someViewModelNameThatIsLong.NeedsMeToDoSomething(someValue))
{
    //Do something
}

そして、ビューモデルオブジェクトで

public bool NeedsMeToDoSomething(string someValue)
{
    return AnotherPropertyINeedToCheck == someValue &&
        !ThisIsABooleanPropertyThatIsImportant;
}

(someValueが文字列であり、モデルオブジェクトによって認識されていない場合)

これは、!演算子ですが、一般的に読みやすくします。これで、呼び出し元のメソッドに1つの条件が表示されます。これは、呼び出し元オブジェクトのコンテキストで条件を説明するために名前を付ける必要があります。また、モデルオブジェクトでは、モデルオブジェクトのコンテキストでそれが何を意味するかを確認できます。


1
+1、これは情報エキスパートの原則の良い応用です。
MattDavey

1
注目に値するが、状況に応じsomeValueて、NeedsMeToDoSomethingメソッドのパラメーターである必要があります。
MattDavey

@MattDavey:いいですね。
pdr

@pdrおそらく、同じブール値でそのビューモデルのプロパティを作成し、より多くの場所でそのフラグを再利用する必要があります。私はあなたがそれを手軽に見つけると確信しています。
ラドゥフロレスク

5

重要度の低い条件を評価する前に、それを独自のifブロックに入れます。他の条件の混乱なしに読みやすくなるだけでなく、プログラマーが最初に読む条件でもあります。これを、@ scrwtpで既に述べたアイデアと組み合わせて、意味のある名前の変数に割り当てて、次のようにします。

var isValid = !_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant;
if( isValid ) 
{
    if( _someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue ) 
    {
        //Do something
    }
}

コンパイラ言語でプログラミングしている場合、外側のifと内側のifの間にコードを挿入しない限り、ほとんどの場合、これらのネストされたifブロックは最終的に結合されます。ケース。


2

C / C ++を使用している場合は、プリプロセッサで読みやすくすることができます。

#define NOT !

if(_someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue &&
    NOT _someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant)
{
    //Do something
}

または多分... function not(x){return!x; } // javascript-
アレックスアレックス

2
CおよびC ++の演算子さまざまな演算子の標準的な同義語が既にあります。
ジョエル

0

私はちょうど抽出したい

`!_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant`

これを返すメソッド内。このメソッドにNotThisIsABooleanPropertyThatIsImportantという名前を付けた場合、問題ありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.