2016-10-19 19 views
6

Tôi đang cố gắng tìm ra sự khác biệt giữa hai quy tắc này là gì?Sự khác nhau giữa ReSharper `MergeSequentialChecks` và` MergeSequentialChecksWhenPossible` là gì?

  • MergeSequentialChecks
  • MergeSequentialChecksWhenPossible

Các tài liệu không nói bất cứ điều gì về một giây. https://www.jetbrains.com/help/resharper/2016.1/MergeSequentialChecks.html

Và điều đó không có ý nghĩa rõ ràng đối với tôi, nghĩa là gì WhenPossible?

Nếu ReSharper đề xuất áp dụng quy tắc đầu tiên và hợp nhất các kiểm tra tuần tự của tôi, thì thực sự IS có thể thực hiện được. Làm thế nào nó có thể là không thể?

Đây là ví dụ về mã để kiểm tra.

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

lưu ý rằng quá trình tái cấu trúc "Hợp nhất tuần tự kiểm tra" được chia nhỏ trong nhiều trường hợp, đảo ngược logic của biểu thức của bạn. –

Trả lời

6

Ý tưởng đằng sau kiểm tra mã với "(khi có thể)" nhãn rất đơn giản: chúng tôi quyết định không đề nghị chuyển đổi mã có thể với # thiết lập mặc định R, vì mã sản xuất có thể dẫn đến giảm khả năng đọc hoặc trở nên khó khăn hơn để hiểu không. Quyết định này về những gì để đề xuất hay không được thực hiện thông qua chẩn đoán đặc biệt.

Khi lần đầu tiên chúng tôi triển khai các đề xuất và chuyển đổi liên quan đến C# 6.0 và xem xét kết quả của chúng trong các giải pháp lớn có sẵn cho chúng tôi, chúng tôi đã quyết định gần 2/3 lần kiểm tra như "Kết hợp kiểm tra tuần tự"/"Sử dụng truyền bá null" không nên đề xuất thực hiện các phép biến đổi mã. Ví dụ, chúng tôi nghĩ rằng trong trường hợp của mã như thế này:

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

... không có lợi ích thực sự của việc sử dụng ?. điều hành và giới thiệu "nâng lên" operator==(bool, bool) điều hành trên giá trị của bool? loại:

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

Thêm vào khác nhau devs có quan điểm khác nhau về cách kiểm tra giá trị của loại bool? cho là true (một số thích có ?? false thay vào đó, nhưng điều đó sẽ làm cho mã kết quả even?.more ?? questionable). Vì vậy, trong trường hợp trên, việc kết hợp kiểm tra tuần tự chắc chắn là "có thể", nhưng chúng tôi sẽ không giới thiệu nó với cài đặt mặc định R # (cài đặt mặc định thích hợp là trách nhiệm lớn), để người dùng có khả năng để xem tất cả các trường hợp bằng cách bật "(khi có thể)" - phiên bản của cùng một kiểm tra mã. Theo tôi có thể thấy, hiện tại chúng tôi chỉ kiểm tra cho không sản xuất dỡ bỏ kiểm tra boolean trong "Hợp nhất kiểm tra tuần tự" kiểm tra, thanh tra khác có nhiều chẩn đoán, ví dụ:

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

Mã trên giá trị gợi ý để sử dụng toán tử gọi có điều kiện :

stringBuilder?.Append("hello"); 

trong khi sử dụng gọi có điều kiện hai lần hoặc nhiều lần liên tục là vấn đề ...

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

psCác hành động theo ngữ cảnh "Kết hợp kiểm tra tuần tự"/"Để truyền bá null" là luôn bật khi có thể chuyển đổi, mặc dù trạng thái kiểm tra mã và mức độ nghiêm trọng của chúng.

+0

p.p.s. Nói đúng ra, sự tồn tại của các phiên bản kiểm tra "(nếu có thể)" là kết quả của việc thiếu các thiết lập kiểm tra, như trong họ IDE của IntelliJ IDEA. Chúng tôi đang tìm cách thêm các thiết lập kiểm tra trong các phiên bản R # trong tương lai và hợp nhất "(nếu có thể)" - các phiên bản kiểm tra với các kiểm tra thông thường tương ứng của chúng. – ControlFlow

Các vấn đề liên quan