8

Hiện tại nếu tôi muốn kiểm tra các tham chiếu vòng tròn bên trong một giải pháp tôi chọn Architecture - Generate Dependency Graph - For Solution. Sau đó, từ tab mới mở ra, tôi chọn Layout - Analyzers - Circular References Analyzer. Cuối cùng nếu tôi đi sâu từ các hội đồng riêng lẻ và có các tham chiếu vòng tròn tôi có thể thấy chúng được đánh dấu bằng màu đỏ trên biểu đồ và chúng cũng xuất hiện dưới dạng cảnh báo trong Danh sách lỗi.Visual Studio 2012 - Tìm Tham khảo Thông tư hiệu quả

Vì tôi dự định phát hiện tham chiếu vòng tròn ngay cả giữa các phương thức của cùng một lớp, điều này khá dễ bị lỗi và tốn thời gian trên một codebase vừa phải lớn.

Tôi muốn biết liệu có cách nào để nhận tất cả các cảnh báo cùng một lúc mà không phải mở rộng các nút hoặc có thể bật đánh dấu cho các nút cha để tôi chỉ có thể xem chi tiết các tập hợp chứa thông tư tài liệu tham khảo.

NDepend sẽ có thể trợ giúp nhưng tôi muốn giữ mọi thứ càng đơn giản càng tốt để tôi luôn cảnh giác về việc áp dụng các công cụ bổ sung.

+0

Tiện ích liên quan để tìm nhanh tham khảo vòng tròn: http://stackoverflow.com/a/43374622/64334 –

Trả lời

6

Có NDepend thể Tìm Tài liệu tham khảo Thông tư hiệu quả cho tôi giải thích như thế nào vì nó có thể được dễ dàng hơn hơn bạn nghĩ (Disclaimer: Tôi là một trong những nhà phát triển trên NDepend). Cho đến nay bạn có thể tìm namespace phụ thuộc chu kỳ out-of-the-box, nhưng, như tôi giải thích dưới đây, nó rất dễ dàng để tìm cũng chu kỳ giữa loại trong một không gian tên, hoặc phương pháp của một kiểu.

Có một số default C# LINQ code rule liệt kê các không gian tên phụ thuộc vào chu kỳ phụ thuộc. Chu trình như vậy sau đó có thể được xuất sang biểu đồ phụ thuộc hoặc ma trận phụ thuộc. Dưới đây là một ảnh chụp màn hình của quy tắc được thực hiện trên cơ sở mã Roslyn CTP tháng 6 năm 2012 (thông báo chỉ mất 16 mili giây để chạy). Kết quả cho thấy 11 chu kỳ khác nhau, và như được hiển thị trên màn hình, bạn có thể đi sâu vào mỗi chu kỳ và xuất khẩu một chu kỳ để đồ thị:

Rule to match namespace dependency cycle

Đây là một đồ thị sự phụ thuộc của chu kỳ 7 namespace. Chú ý rằng nó trông phức tạp hơn chỉ là một chu kỳ O-ring cổ điển. Chìa khóa ở đây, là từ bất kỳ không gian tên nào trong số này, bạn có thể tiếp cận tất cả các không gian tên khác. Đây là khái niệm tổng quát của chu kỳ (vướng víu).

Match namespace dependency cycle Graph

Mã của default C# LINQ code rule liệt kê chu kỳ không gian tên phụ thuộc có thể nhìn nản chí ở cái nhìn đầu tiên. Nhưng một nhà phát triển C# nên hiểu nó trong một vài phút và sau đó có thể thích ứng với nó một cách dễ dàng để tìm thấy bất kỳ loại chu kỳ phụ thuộc nào.

Ví dụ, để tìm phương pháp của các loại cùng một chu kỳ (thay vì namespace của chu kỳ lắp ráp cùng) nó gần như là đơn giản như thay thế tất cả namespace từ bằng cách phương pháp, và lắp ráp từ bằng cách loại.

// <Name>Avoid methods of a type to be in cycles</Name> 
warnif count > 0 

from t in Application.Types 
       .Where(t => t.ContainsMethodDependencyCycle != null && 
          t.ContainsMethodDependencyCycle.Value) 

// Optimization: restreint methods set 
// A method involved in a cycle necessarily have a null Level. 
let methodsSuspect = t.Methods.Where(m => m.Level == null) 

// hashset is used to avoid iterating again on methods already caught in a cycle. 
let hashset = new HashSet<IMethod>() 


from suspect in methodsSuspect 
    // By commenting this line, the query matches all methods involved in a cycle. 
    where !hashset.Contains(suspect) 

    // Define 2 code metrics 
    // - Methods depth of is using indirectly the suspect method. 
    // - Methods depth of is used by the suspect method indirectly. 
    // Note: for direct usage the depth is equal to 1. 
    let methodsUserDepth = methodsSuspect.DepthOfIsUsing(suspect) 
    let methodsUsedDepth = methodsSuspect.DepthOfIsUsedBy(suspect) 

    // Select methods that are both using and used by methodSuspect 
    let usersAndUsed = from n in methodsSuspect where 
         methodsUserDepth[n] > 0 && 
         methodsUsedDepth[n] > 0 
         select n 

    where usersAndUsed.Count() > 0 

    // Here we've found method(s) both using and used by the suspect method. 
    // A cycle involving the suspect method is found! 
    let cycle = usersAndUsed.Append(suspect) 

    // Fill hashset with methods in the cycle. 
    // .ToArray() is needed to force the iterating process. 
    let unused1 = (from n in cycle let unused2 = hashset.Add(n) select n).ToArray() 

select new { suspect, cycle } 

... và đây là kết quả của quy tắc này (vẫn có khả năng xuất chu trình phương pháp sang biểu đồ phụ thuộc hoặc ma trận).Lưu ý rằng vì số lượng phương thức và loại cao hơn nhiều so với số không gian tên và hội đồng, truy vấn này mất 10 giây để chạy trên một cơ sở mã lớn như Roslyn (thay vì 16ms cho chu kỳ không gian tên) nên bạn có thể cần điều chỉnh CQLinq truy vấn thực hiện thời gian chờ (đó là 2 giây cho mỗi mặc định).

types dependency cycles

Để được hoàn thành, những gì tôi nhận thấy là chu kỳ mà phần lớn thời gian kích động bởi một vài tài liệu tham khảo hai chiều (nghĩa là A được sử dụng B, B đang sử dụng A). Do đó loại bỏ các tham chiếu hai chiều là điều đầu tiên cần làm để phá vỡ chu kỳ. Đây là lý do tại sao chúng tôi cung cấp quy tắc CQLinq mặc định Avoid namespaces mutually dependent, vẫn có thể được điều chỉnh theo loại hoặc phương thức chu kỳ.

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