2011-01-20 32 views
14

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

+1 cho câu hỏi chất lượng, được viết tốt. –

Trả lời

7

Phiên bản StyleCop 4.4.1 sắp ra đời được cho là hỗ trợ thẻ inheritdoc. Nếu bạn sẵn sàng sử dụng công cụ tạo tài liệu hỗ trợ thẻ này (ví dụ: Sandcastle hoặc FiXml), bạn có thể có giải pháp làm việc giải quyết cả hai mối quan tâm của bạn.

+0

+1 Không biết điều đó - âm thanh tốt. Sẽ tự mình thử. – Filburt

+1

Tuyệt vời! BTW, đây là liên kết đến tính năng này: http://stylecop.codeplex.com/workitem/6637. Và tin tốt là chúng tôi có thể sử dụng 4.4.1 Xem trước ngay bây giờ! –

+0

Có vẻ như VS 2008 Intellisence không thích thẻ inheritdoc, bởi vì nếu tôi thêm trước thành viên bằng thẻ inheritdoc, VS 2008 không hiển thị tài liệu từ giao diện trên các thành viên lơ lửng bằng chuột, nó chỉ hiển thị chữ ký thành viên (tên, tham số, kiểu trả về). Có lẽ VS 2010 biết cách xử lý inheritdoc đúng cách? Những gì có thể được thực hiện? –

8

Nó không bao giờ xảy ra với tôi rằng đây sẽ là một vấn đề bởi vì tôi luôn coi các tài liệu của khai của một giao diện như một cái gì đó khác biệt so với các tài liệu của thực hiện của giao diện này.

Tôi có thể sai nhưng tôi rất vui khi được học.

Câu trả lời thực tế của tôi cho câu hỏi của bạn sẽ là: 1) Sao chép Dịch tài liệu từ giao diện.

+0

sau đó tôi sẽ cần phải giữ tài liệu lớp học đồng bộ hóa với tài liệu giao diện, do đó thêm một bước nữa trong quá trình thay đổi và viết mã. Tôi nghĩ rằng việc tăng gấp đôi tài liệu đang tăng gấp đôi và nếu chúng ta cố gắng tránh tăng gấp đôi mã, thì tại sao chúng tôi muốn giới thiệu gấp đôi trong tài liệu khác như tài liệu. Gấp đôi là ác :) –

+0

@ Dmitry Tôi hoàn toàn đồng ý rằng tăng gấp đôi là điều ác. Nhưng việc thay đổi giao diện sẽ dẫn đến việc cập nhật tài liệu của bạn giống như việc thay đổi triển khai. Tôi thấy cái đầu tiên là ghi lại những gì được cho là sẽ xảy ra trong lần thứ hai về cách nó làm cho nó xảy ra. Nếu bạn cảm thấy mạnh mẽ chống lại lặp đi lặp lại chính mình và suy nghĩ dọc theo dòng chữ "Clean Code" của Robert "Chú Bob" C. Martin "sự lựa chọn tốt nhất của bạn sẽ là ngăn chặn thông điệp. – Filburt

+0

@Dmitry Nếu bạn nhìn vào nó theo cách bạn phải tuân thủ quy tắc thực sự không thêm bất kỳ giá trị nào vào mã của bạn, câu trả lời phải rõ ràng: Tắt/chặn quy tắc này thay vì hướng tới làm việc xung quanh và kết thúc với tài liệu nằm. – Filburt

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