2009-03-19 37 views

Trả lời

18

Tôi nghi ngờ rằng sự khác biệt có thể là do thực thi hoãn lại. Khi bạn sử dụng LINQ với các biểu thức lambda, bạn chỉ định mã sẽ chạy nếu bạn sau đó lặp qua bộ sưu tập.

Cá nhân tôi không quá lo lắng về độ phức tạp của chu trình, nhưng tôi hoàn toàn chắc chắn rằng (khi được sử dụng một cách thích hợp) LINQ cải thiện khả năng đọc. Đó là những gì tôi thực sự quan tâm về :)

1

Tôi chỉ đến với cùng một câu hỏi và, trên thực tế, lambda có thể làm tăng độ phức tạp của chu trình. Tôi đã thử nghiệm và các mệnh đề Where() có thể tăng nó một cách hợp lý.

Khả năng đọc thực sự là một trong những ưu tiên hàng đầu của bạn.

Nhưng không mất nhiều thời gian để thay thế một số truy vấn LINQ bằng phương thức Get() cung cấp cho tôi cùng dữ liệu và lợi ích bổ sung.


Tôi giữ Fxcop trên tập lệnh xây dựng/xuất bản của mình vì vậy tôi không bao giờ triển khai một cái gì đó mà không đạt mục tiêu 25 cho độ phức tạp của chu trình.

Thật khó khăn, nhưng tôi nghĩ nó đáng để nỗ lực.

Điều này cho tôi một số điểm trong các cuộc thảo luận khi bạn tình của tôi đến với một mã rất xấu nói rằng: hoạt động, đó là những gì quan trọng.


mũi của tôi là: giữ phức tạp cyclomatic của bạn dưới đây 25. này có thể giúp bạn để giữ cho mọi phương pháp đơn giản, đủ để bảo trì tốt.

1

Jon Skeet trả lời khá nhiều câu hỏi ngắn gọn. Tôi muốn thêm rằng trong kinh nghiệm của tôi với các ngôn ngữ cấp cao như C#, giá trị đo độ phức tạp của chu trình giảm do giá trị mà các gói đường cú pháp như LINQ thêm vào để phát triển. Trong vòng mười năm qua, khi các ngôn ngữ đã phát triển, nhiều người trên mạng đã minh họa mối tương quan chặt chẽ giữa độ phức tạp của chu trình và các dòng mã, khiến nhiều người trong số họ đặt câu hỏi giá trị thực sự mang lại. Một cách khác để xem xét nó là sự mất giá của CC như một thước đo về chất lượng mã thực sự là một sự khẳng định tầm quan trọng của khả năng đọc, vì nó thường là nghịch đảo của cái kia.

Ví dụ: nếu tôi đặt điều kiện bên trong vòng lặp foreach, điều kiện được đánh giá là mã của tôi và số đường dẫn mã thích hợp được tính. Mặt khác, nếu tôi áp dụng một cây chức năng cho bộ sưu tập, tôi đang lặp lại (ví dụ: Where (evalStr => evalStr == origStr) Tôi đang chuyển điều kiện sang bên ngoài vòng lặp và vào mã do trình biên dịch tạo ra. vẫn có cùng số nhánh, tuy nhiên các điều kiện không phải là một phần của vòng lặp, nhưng CC tăng vượt quá vòng lặp foreach, với "hình phạt" cho việc sử dụng các phương thức nặc danh (lambdas và delegate) ở phía trên số nhánh thực tế. Trong trường hợp hàm cho phép tôi điều kiện trước bộ sưu tập được lặp lại để vòng lặp chỉ lặp lại nếu nó cần.

Tuy nhiên, mã ở xa và dễ đọc hơn.

Cuối cùng, nếu một người quyết định rằng biểu thức Boolean được sử dụng bên trong hàm LINQ IQueryable không cần phải được kiểm tra đơn vị, bề ngoài bởi vì nếu có ngoại lệ, nó là một thứ tự cao hơn (còn gọi là cấp doanh nghiệp) giá trị được kiểm tra, toán tử sai, toán hạng sai, vv) trái ngược với việc sử dụng ngôn ngữ ít hơn lý tưởng (sử dụng công tắc thay vì nếu, nếu thay vì số ba, vv) thì đo lường độ phức tạp của chu trình : Hàm Where() không nên tăng CC của tôi. Đo độ phức tạp của chu trình sẽ không giúp tạo mã tốt hơn; nếu bất cứ điều gì, nó sẽ tăng giả tạo xu hướng đơn giản hóa để đơn giản hóa nơi không cần đơn giản hóa hoặc mong muốn.

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