2010-05-18 28 views
5

Gần đây tôi đã nâng cấp dự án của mình từ Visual Studio 2008 lên Visual Studio 2010.Tôi có nên chặn CA2204: Chữ viết phải được viết đúng chính tả không?

Bằng cách bật Phân tích mã, tôi nhận được rất nhiều cảnh báo dẫn đến quy tắc CA2204: Văn học phải được viết đúng chính tả.

EDIT:

Hãy nói rằng tôi có một phương pháp gọi là GetResult(), và trong đó tôi muốn ném một ngoại lệ đối với một số lý do. Tôi muốn ngoại lệ để nói "GetResult() has failed for some reason". Điều này sẽ cho tôi cảnh báo vì GetResult không phải là một từ. Tôi sẽ không nhận được cảnh báo về tên phương thức GetResult(), chỉ khi tôi đặt nó vào một chuỗi. Điều này là do Nhận và Kết quả là các từ hợp pháp.

Tôi không tin rằng viết GetResult() has failed for some reason là giải pháp.

EDIT: Trong MSDN nó nói:

Quy tắc này phân tích các chuỗi chữ diễn tả bằng lời, tokenizing từ ghép, và kiểm tra chính tả của mỗi từ/thẻ.

Điều đó có nghĩa là GetResult phải được kiểm tra là hai từ: "Nhận" và "Kết quả" không?

Tôi có nên chặn CA2204 không?

+3

Tôi không hiểu chỉnh sửa của bạn. Bạn nhận được một cảnh báo cho GetResult, nhưng bạn không nhận được một cảnh báo cho GetResult? Vui lòng làm rõ. – Gabe

+1

Tôi nghĩ bạn nên xem lại bản chỉnh sửa của mình, bây giờ nó không có ý nghĩa. – fortran

+0

Tôi đã chỉnh sửa rõ ràng hơn, vấn đề là phương thức GetResult() là một tên tốt cho một phương thức và tôi không nhận được cảnh báo cho nó. Nhưng nếu tôi đặt tên đó trong một chuỗi, tôi sẽ nhận được một cảnh báo. – brickner

Trả lời

5

"Can't initialize MyClass" không phải là thông điệp tốt để nhà phát triển giới thiệu về mã. Nó hiếm khi hỗ trợ gỡ lỗi và nó chỉ gây nhầm lẫn cho người dùng cuối nếu nó được hiển thị.

Nói chung, tôi có thể nói không chặn thông báo vì lỗi chính tả khiến cho chúng trông có vẻ nhiều hơn so với thực tế và đó không phải là thông điệp bạn muốn truyền đạt với ứng dụng của mình.

Trong trường hợp cụ thể này, nó thực sự là cảnh báo về thông báo lỗi kém - cho người dùng biết cách sửa, tự động sửa hoặc đưa lý do thực sự mà nó không khởi chạy trong nhật ký lỗi của bạn.

EDIT: Bao gồm chỉnh sửa OP của
Something bạn có thể mất từ ​​cảnh báo này là bạn không nên tiết lộ chi tiết mã như là một phần của một thông báo lỗi (chủ yếu là bởi vì họ sẽ được đưa vào các cuộc gọi stack khi bạn đăng nhập sự ngoại lệ).

GetResult() has failed for some reason
Giả sử "một số lý do" là quyền.Tin nhắn có thể đọc:

Bạn không có quyền xem kết quả này.

Không cần phải đề cập đến phương pháp cụ thể không thành công do theo dõi ngăn xếp có thể được ghi nhật ký tự động.

+0

ArgumentNullException và ArgumentException xuất hiện là ngoại lệ cho lời khuyên này –

2

Có thể bạn không nên đặt tên lớp thành chữ? Điều gì về việc sử dụng hoặc xác định ngoại lệ có thể được ném như thế này:

throw new CantInitializeClassException(innerException, typeof(MyClass); 

Ý tưởng của tôi là di chuyển nhiều thông tin hơn đến nhiều trường hợp ngoại lệ cụ thể hơn. Tôi khuyên bạn nên sử dụng mẫu ở trên thay vì throw new ApplicationException("Cant initialize MyClass");

+0

Thử tốt. Điều này cũng xảy ra khi tôi sử dụng tên phương thức ... Nhìn vào chỉnh sửa của tôi. – brickner

+3

@brickner - điều tương tự. tên phương thức được bao gồm trong dấu vết ngăn xếp. nên có ít nhất là nếu chuỗi ngăn xếp của bạn là ok. thông tin này nên được mô tả bởi đối tượng ngoại lệ. – Andrey

+0

@Andrey, bạn nói đúng. Bạn có nghĩ rằng tôi nên sử dụng MethodBase.GetCurrentMethod(). Tên thay vì viết tên? Bạn có thể có một điểm nhưng có vẻ như nó chỉ làm phức tạp mã số ... – brickner

4

Một cách để khắc phục điều này là không thêm tên loại vào chuỗi trực tiếp. Thay vào đó, hãy chuyển nó thành một tham số. Ví dụ:

var msg = String.Format("Can't initialize {0}", typeof(MyClass).Name); 

Điều này có lợi cho cả việc đi lại quy tắc FxCop và an toàn cho việc tái cấu trúc.

+0

Thử tốt. Điều này cũng xảy ra khi tôi sử dụng tên phương thức ... Nhìn vào chỉnh sửa của tôi. – brickner

+0

Tôi nghĩ rằng anh ta sẽ cần cung cấp một cách rõ ràng IFormatProvider hoặc FXCop sẽ ném một cảnh báo Globalization. 'String.Format (CultureInfo.CurrentCulture," Không thể khởi tạo {0} ", typeof (MyClass) .Name)' nên thực hiện thủ thuật. – Timothy

+0

Trong C# 6, bạn có thể sử dụng 'nameof' cho cùng một hiệu ứng, ngoại trừ CodeAnalysis bây giờ thấy chuỗi chữ và than phiền tên kiểu không phải là một từ hợp lệ. Đây là một cảnh báo nên bị chặn nếu nó nói về tên kiểu, imo. – Dai

0

CA2204 là tất cả về chính tả. Thật không may ngay cả trong VS2012 nó vẫn còn có một lỗi gây phiền nhiễu cũ, nơi nó không tokenize từ ghép: http://connect.microsoft.com/visualstudio/feedback/details/521030

Điều này khiến tôi tắt quy tắc này trong bộ quy tắc phân tích mã của chúng tôi.

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