2017-09-19 8 views
0

필자는 참/거짓 조건에 따라 두 개 이상의 필터를 선택하는 방법을 작성했습니다. 아래는 여러 필터를 선택하는 데 사용한 방법입니다.Refactor multiple Delegates를 사용하는 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 메서드 매개 변수가 있지만 두 가지 옵션 만있는 것 같습니다. 당신은 주거용으로 단지 하나의 bool에 대한 메소드 서명을 단순화 할 수있다. 만약 false라면, 다른 옵션이 상업적이라는 것을 안다.

  2. IPage 인터페이스와 드라이버를 볼 수 있으므로 셀렌 기반 응용 프로그램 작성을 맡을 것입니다. webdriver를 사용하여 CSS 조회를 수행하는 코드를 추상화 할 수 있습니다. 요소 상태를 확인하고 버튼을 클릭하는 몇 가지 기능이 이미있는 것처럼 보입니다. 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(); 
} 

희망! 더 자세한 내용은없이