Quy tắc StyleCop SA1600 yêu cầu mọi thành viên loại đều có tiêu đề tài liệu riêng. Tôi nghĩ nó khá hợp lý và tôi thích quy tắc này. Nhưng giả sử chúng ta có hệ thống phân cấp sau:Quy tắc StyleCop SA1600 và giao diện thực hiện
/// <summary>
/// Documentation for interface ISomeModule.
/// </summary>
interface ISomeModule
{
/// <summary>
/// Documentation for DoA.
/// </summary>
void DoA();
/// <summary>
/// Documentation for DoB.
/// </summary>
void DoB();
}
/// <summary>
/// Documentation for StandardModule.
/// </summary>
class StandardModule : ISomeModule
{
private readonly SomeCoolType _value;
/// <summary>
/// Documentation for constructor.
/// </summary>
public StandardModule(SomeCoolType value)
{
_value = value;
}
// SA1600 violation here!
public void DoA()
{
// realisation of DoA().
}
// SA1600 violation here!
public void DoB()
{
// realisation of DoB().
}
/// <summary>
/// Documentation for MyOwnDoC.
/// </summary>
public void MyOwnDoC()
{
// realisation of MyOwnDoC().
}
}
Ở đây, tôi đã làm rõ các phương thức này từ tài liệu giao diện. VS Intellisence cũng biết nó và chúng ta có thể thấy mô tả các phương thức bằng cách di chuột qua các phương thức này ngay cả trong lớp StandardModule. Vì vậy, không cần phải sao chép tài liệu từ giao diện sang lớp dẫn xuất. Nhưng StyleCop yêu cầu làm điều đó. Tại sao? Có ai biết không?
Nếu chúng ta cố gắng giải quyết vấn đề này, chúng ta có thể đi 4 cách khác nhau:
1. Sao chép tài liệu từ giao diện. Vấn đề ở đây là nếu chúng ta sao chép tài liệu, chúng ta sẽ gặp vấn đề cập nhật tài liệu trong tất cả các lớp dẫn xuất nếu thay đổi hành vi giao diện.
2. Ngăn thông báo bằng SuppressMessageAttribute. Vâng, giả sử chúng tôi nói "Ok, tôi có thể sử dụng SuppressMessageAttribute" để ngăn chặn vi phạm này mà tôi không đồng ý. Và tôi chuẩn bị lớp StandardModule với SuppressMessageAttribute cho quy tắc SA1600. Nhưng bây giờ StyleCop dừng kiểm tra cho các tiêu đề tài liệu trong lớp StandardModule ở tất cả. Tôi không muốn nó, bởi vì chúng tôi có nhà xây dựng và một số phương pháp khác.
3. Chia lớp thành các vùng, Chúng ta có thể chia lớp StandardModule thành 2 vùng và chỉ sử dụng triệt tiêu thông báo trên phần triển khai giao diện ISomeModule. Và tôi nghĩ rằng tất cả các phần nên được đặt vào một tập tin. Tôi thích cách tiếp cận này nhất (sau con đường # 4), nhưng bây giờ chúng ta phải đối phó với nhiều phần của một lớp.
4. Sửa đổi quy tắc SA1600. Có thể thực hiện quy tắc SA1600 của riêng tôi để nó có tính đến việc các thành viên của lớp có được ghi lại trong một lớp cơ sở hay trong giao diện không? (ở đây tôi không hỏi liệu chúng ta có thể viết quy tắc của riêng mình cho StyleCop, tôi biết chúng ta có thể, nhưng ý tôi là động cơ StyleCop có thể kiểm tra xem một số thành viên đến từ giao diện hay lớp cơ sở).
Cách thích hợp nhất để giải quyết vấn đề SA1600 khi thực hiện giao diện là gì?
+1 cho câu hỏi chất lượng, được viết tốt. –