2016-06-13 7 views
1

私はC#の新機能で、スクリプトがウェブページ上でどのようなオプションを選択するべきかをチェックする条件文を作成しようとしています。今私はこのようにしています。それぞれのオプションについて個別のbool文を作成し、それぞれの文をチェックする長いelse文があります。複数のオプションの中で最も効率的な条件文ですか?

bool PersonalPolicy = true; 
bool FarmOwnersPolicy = true; 

if (PersonalPolicy) 
{ 
    driver.FindElement(By.Id("cphMain_ctl_WorkflowManager_Quote_Farm_ctl_Farm_Basic_Policy_Info_radioListCommOrPersonal_0")).Click(); 
} 
else 
{ 
    driver.FindElement(By.Id("cphMain_ctl_WorkflowManager_Quote_Farm_ctl_Farm_Basic_Policy_Info_radioListCommOrPersonal_1")).Click(); 
} 
if (FarmOwnersPolicy) 
{ 
    driver.FindElement(By.Id("cphMain_ctl_WorkflowManager_Quote_Farm_ctl_Farm_Basic_Policy_Info_rdoPolicyType_0")).Click(); 
} 
else if (SelectoMaticPolicy) 
{ 
    driver.FindElement(By.Id("cphMain_ctl_WorkflowManager_Quote_Farm_ctl_Farm_Basic_Policy_Info_rdoPolicyType_1")).Click(); 
} 
else 
{ 
    driver.FindElement(By.Id("cphMain_ctl_WorkflowManager_Quote_Farm_ctl_Farm_Basic_Policy_Info_rdoPolicyType_2")).Click(); 
} 

問題は、私は私が百万ブール文を作りたいと本当に長い他のif文はありませんオプションのトンがあります確認したいいくつかのもののためです。これを簡単にフォーマットする方法はありますか?

+0

POMごとに要素を定義します(例: '[FindsBy(How = How.ID、Using =" cphMain_BLAHBLAHBLAHType_1 ")] public IWebElement RandomClickableElement;'。それでは 'RandomClickableElement.Click(); 'で呼び出す –

+0

これは多くの条件を使わないように書き直すことができるのかどうかわかりませんが、if elseの中のコードを抽出して書く必要があるコードを最小限に抑えることができたと思いますdriver.find ...を実行し、クリックするために使用する既存の文字列にパラメータ文字列を追加する別個のメソッド内のステートメント。この方法でコードを少なく書くことができます。 – meJustAndrew

+0

@meJustAndrewええ、問題の一部は、コードがどれほど長い間、私はどれだけ書くべきかを最小限に抑えるために多くの方法を見つけようとしています。 –

答えて

1

実際のロジックによって異なります。 そして、私はこの質問が「あまりにも一般的」なのでフラグが立てられるかもしれないと思います。

まだ、複数の州のチェックにアプローチする方法はたくさんあります。

複数のチェック(つまり、PersonalPolicy、FarmOwnersPolicy、またはSelectoMaticPolicyのいずれかが返されると予想される)で単一の結果しか期待していない場合は、個人的に私は "PolicyType"変数を設定し、switch文を実行します。例:

switch(PolicyType){ 
    case "PersonalPolicy": 
     // Code specific to PersonalPolicy 
     break; // Don't forget to break unless you want to use "fallthrough logic" 
    case "FarmOwnersPolicy": 
     // Code specific to PersonalPolicy 
     break ; 
    case default: 
     // Code for "any-other-than" cases :) 
     break; 
} 

しかし、このアプローチは、あなたのケースで実現可能にするために、あなたは別のboolsの実行レベルまたはエラーレベルのいくつかの同等に解決持っている必要があるだろう。

ただし、複数の条件文を1つの大きな文にリンクすることもできます。 最も一般的に発生する例は、& &または||各ステートメントの間に「AND」または「OR」を含めることができます。 OR-文に特に逆のロジックを適用することにより、複数のbools

を比較する際の強力なことを証明することができ

例:

if (PersonalPolicy) { } 
else { } 

if (FarmOwnersPolicy && !SelectomaticPolicy) { 
    //Will only be executed if FarmOwnersPolicy is True AND SelectomaticPolicy is NOT true. 
} 

if (!FarmOwnersPolicy && !SelectomaticPolicy) { 
    // Will only be executed if FarmOwnersPolicy AND SelectomaticPolicy are both unset 
} 

if (!FarmOwnersPolicy || !SelectomaticPolicy) { 
    // Will be executed if either FarmOwnersPolicy OR SelectomaticPolicy is unset 
} 

この後者のアプローチは、一度にかつをチェックする複数の条件を持って、より便利であってもよいですif-elseの無限のストリークとは対照的に潜在的な可読性を提供します。

私は、「無限の量のチェックをしているように見える」場合、私は通常、ブールチェックのブロックとその結果の変数を分割しようとします。

これは良い例ではありませんが、簡単な例として、アドレスセクションなどがあると思いますが、最初にすべてのアドレス情報を確認したいさらなるセクションでの読みやすさを向上させるためだけの "AddressValid"ブール:) また、シーケンシャルなboolロジックの一部が壊れても、そうでないときに "このコードがやっていたこと"を読み返すのは簡単ではありませんそのコードに少し触れました。

編集:

条件付き(3値)演算子もあります。次の例で使用した場合 :

TestCase ? Value1 : Value2; 

それは以下のロジックになり:

If (TestCase){ 
    return Value1; 
} 
Else { 
    return Value2; 
} 

私は、デフォルト値を設定、またはdefault-する特定の変数を返すために、「すべての時間を」これを使用します私が期待していた値が含まれていないときの値。

+0

これは参考になっており、私があなたに感謝したいと思うようです。 –

+0

大歓迎です。 また、「デフォルト値」を取得することについては、非常に便利な演算子について言及することを忘れてしまいました。 "三元演算子"、私は数分でこれを含めるために私の答えを編集します:) – Annihlator

関連する問題