2016-10-19 1 views
6

나는이 두 규칙의 차이점을 알아 내려고하고있다. MergeSequentialChecks ReSharper`MergeSequentialChecks`와`MergeSequentialChecksWhenPossible`의 차이점은 무엇입니까?

  • MergeSequentialChecksWhenPossible
    • 문서

      는 두 번째에 대해 아무 말도하지 않습니다. https://www.jetbrains.com/help/resharper/2016.1/MergeSequentialChecks.html

      그리고 나에게 명확한 질문이 아닙니다. WhenPossible은 무엇을 의미합니까?

      ReSharper가 첫 번째 규칙을 적용하고 순차적 검사를 병합 할 것을 제안하면 실제로 가능합니다. 어떻게 가능하지 않을까요?

      다음은 확인할 코드 예제입니다. 와 코드 검사 뒤에

      public class Person 
      { 
          public string Name { get; set; } 
          public IList<Person> Descendants { get; set; } 
      } 
      
      public static class TestReSharper 
      { 
          // Here `MergeSequentialChecks` rule is triggered for both `&&` operands. 
          public static bool MergeSequentialChecks(Person person) 
          { 
           return person != null && person.Descendants != null && person.Descendants.FirstOrDefault() != null; 
          } 
      
          // Here `MergeSequentialChecksWhenPossible` rule is triggered. 
          public static bool MergeSequentialChecksWhenPossible1(Person person) 
          { 
           return person != null && person.Descendants.Any(); 
          } 
      
          // Here `MergeSequentialChecksWhenPossible` rule is triggered. 
          public static bool MergeSequentialChecksWhenPossible2(Person person) 
          { 
           return person.Descendants != null && person.Descendants.Any(); 
          } 
      } 
      
    +0

    "병합 순차적 검사"리팩토링은 대부분의 경우 깨져서 식의 논리를 뒤집습니다. –

    답변

    6

    아이디어 "(가능하다면)"라벨은 간단하다 : 우리가 생산 코드가 감소 가독성이 발생할 수 있으므로 기본 R 번호 설정을 가능 코드 변환을 제안하지 않기로 결정하거나 어렵게되었다 알다. 제안 할 것인지 아닌지에 대한 결정은 ad-hoc 경험적 방법을 통해 수행됩니다.

    처음 C# 6.0 관련 코드 제안 및 변환을 구현하고 그 결과를 우리에게 유용한 큰 솔루션으로 검토 한 결과 "순차 검사 병합"/ "널 전파 사용"과 같은 검사 발생의 거의 2/3 가량을 결정했습니다. 코드 변환을 제안해서는 안됩니다. 예를 들어, 우리는 생각과 같은 코드의 경우 :

    :

    if (node != null && node.IsValid()) { ... } 
    

    ... bool? 유형의 값 이상 operator==(bool, bool) 연산자 "해제"?. 연산자와의 도입을 사용하여 실제 혜택이 없습니다

    if (node?.IsValid() == true) { ... } 
    

    플러스 가지의 devs true을 되 유형 bool?의 값을 확인하는 방법에 대한 다른 관점을 가지고 (일부 대신 ?? false을 선호하지만, 그 결과 코드 even?.more ?? questionable를 만들 것입니다).

    순차적 병합 위의 경우는 분명히 "가능"하지만 기본 R # 설정 (적절한 기본 설정은 큰 책임 임)으로 권장하지 않으므로 사용자에게 능력을 남겨 둡니다. 동일한 코드 검사의 "가능하다면"버전을 활성화하여 모든 사례를 확인하십시오. 지금까지 내가 현재 우리는 단지 검사 "연속 검사를 병합"에 해제 여부를 확인을 생산하지를 확인 볼 수 있습니다, 다른 검사는 예를 들어, 더 추론이 :

    if (stringBuilder != null) { // "Use null propagation" 
        stringBuilder.Append("hello"); 
    } 
    

    코드 가치가 위의 조건 호출 연산자를 사용하는 제안 :

    stringBuilder?.Append("hello"); 
    

    순차적 두 배 이상의 조건부 호출 사용 중

    if (stringBuilder != null) { // no suggestion 
        stringBuilder.Append("hello"); 
        stringBuilder.Append("world"); 
        stringBuilder.Append("!!!"); 
    } 
    

    PS ... 의심 스럽다컨텍스트 작업 "병합 순차 ​​검사"/ "널 전파"는 입니다. 코드 검사 상태 및 심각도에도 불구하고 변환이 가능할 경우 항상이 활성화됩니다.

    +0

    p.p.s. 엄밀히 말하면, "가능한 경우 (가능하다면)"버전의 검사는 IntelliJ IDEA 계열의 IDE와 같이 검사 단위 설정이 없기 때문에 가능합니다. 우리는 향후 R # 버전에서 검사 단위 설정을 추가하고 해당되는 일반 검사와 함께 검사 버전을 병합 (가능한 경우)합니다. – ControlFlow

    관련 문제