2017-09-19 7 views
0

私は、真偽条件に基づいてフィルタを2つ以上選択する方法を書いています。私は複数のフィルタを選択する方法です。リファクタリング複数の場合代理人を使用してelse ifステートメント

public T SetPropertyTypes<T>(bool residential, bool commercial) where T : IPage, new() 
    { 

     // Residential Property Type Check logic 
     if (residential && (ElementIsNotActive(() => FindElement(By.CssSelector(propertyTypeResidentialCss))).Invoke(Driver))) 
      ClickButton(() => FindElement(By.CssSelector(propertyTypeResidentialCss)), "Residential"); 
     else if (ElementIsActive(() => FindElement(By.CssSelector(propertyTypeResidentialCss))).Invoke(Driver)) 
      ClickButton(() => FindElement(By.CssSelector(propertyTypeResidentialCss)), "Residential"); 

     // Commercial Property Type Check logic 
     if (commercial && (ElementIsNotActive(() => FindElement(By.CssSelector(propertyTypeCommercialCss))).Invoke(Driver))) 
      ClickButton(() => FindElement(By.CssSelector(propertyTypeCommercialCss)), "Commercial"); 
     else if (ElementIsActive(() => FindElement(By.CssSelector(propertyTypeCommercialCss))).Invoke(Driver)) 
      ClickButton(() => FindElement(By.CssSelector(propertyTypeCommercialCss)), "Commercial"); 
    } 

後、私は、コードが冗長であり、私がC#に新しいそれは単純かつ非ambiguous.I'm作る場合、私は多くの特徴を認識していないよより良いかもしれない、どのような方法があることを見出しC#の機能を使ってこれをリファクタリングするには?

if-else-ifを使って変数をチェックしてみましたが、意図したとおりの動作ができませんでした。

+3

あなたのコードは、現在機能しているようですし、あなたはそれを改善するために探しています。一般的に、これらの質問はこのサイトでは強すぎますが、[CodeReview.SE](// codereview.stackexchange.com/tour)のほうが良いかもしれません。このサイトよりも少し厳密であるため、[必要条件](// codereview.stackexchange.com/help/on-topic)を必ずお読みください。 – kayess

+0

ReSharperツールを試す必要があります。 –

+0

このコードで意図した論理ステップを英語で説明しておけば助かります。あなたは余分なチェックをしているようです。説明は: 'resididential'が' true'の場合、 'propertyTypeResidentialCss'で見つかった要素をクリックしてください。 – JeffC

答えて

1

、簡単なリファクタリングは次のようになります。

public T SetPropertyTypes<T>(bool residential, bool commercial) where T : IPage, new() 
    { 
     TryClick(residental, propertyTypeResidentialCss, "Residential"); 
     TryClick(commercial, propertyTypeCommercialCss, "Commercial"); 
    } 

    private void TryClick(bool clickIfNotActive, object propType, string btnName) 
    { 
     var elem = FindElement(By.CssSelector(propType)); 
     bool isActive = ElementIsActive(() => elem).Invoke(Driver); 
     if (clickIfNotActive && !isActive || isActive) 
      ClickButton(() => elem, btnName); 
    } 
1

コードは良好です!あなたがちょうどコードをきれいにすることを探しているなら、あなたができるいくつかのことがあります。

  1. 両方のオプション(住宅用と商業用)にはboolメソッドのパラメータがありますが、2つのオプションしかないようです。あなたは偽の場合、他のオプションが商業的であることを知っています。

  2. 私はIPageインターフェースとドライバを見ていますので、あなたはセレンをベースにしたアプリケーションを書くつもりです。あなたはwebdriverでCSSルックアップを行っているコードを抽象化することができます。要素の状態を確認してボタンをクリックするという2つの機能が既にあるようです。 Webdriverを直接呼び出すことでコードを少し縮めることができます。

私はあなたが他の関数呼び出しでやってますが、あなたのコードは次のようになります。そのわずか呼び出すドライバ方式を想定しているか知らない:

public void SetPropertyTypes(bool residential) 
{ 

    IWebElement _resident = Driver.FindElement(By.CssSelector(propertyTypeResidentialCss)); 
    IWebElement _commercial = Driver.FindElement(By.CssSelector(propertyTypeCommercialCss)); 

    // Residential Property Type Check logic 
    if (residential || _resident.Enabled) // or _resident.Displayed depending on what you are doing 
     _resident.Click(); 
    else 
     _commercial.Click(); 
} 

・ホープ、このことができます!多くの詳細がなく

関連する問題