2010-05-04 39 views
6

Here's giải thích quy tắc mà tôi đang cố gắng hiểu. Dưới đây là mã được đơn giản hóa mà Trình phân tích mã đã phàn nàn về:CA1034: Các loại lồng nhau không được hiển thị

Public Class CustomerSpeed 

    Public Enum ProfitTypeEnum As Integer 
     NotSpecified = 0 
     FlatAmount = 1 
     PercentOfProfit = 2 
    End Enum 

    Private _ProfitTypeEnum As ProfitTypeEnum 

    Public Sub New(ByVal profitType As ProfitTypeEnum) 

     _ProfitTypeEnum = profitType 

    End Sub 

End Class 

Nếu enum chỉ liên quan đến lớp học, tại sao điều xấu là làm cho nó trở thành loại chứa trong lớp? Có vẻ gọn gàng với tôi ...

Có ai biết những gì có nghĩa là dòng sau ?:

loại lồng nhau bao gồm các khái niệm về khả năng tiếp cận thành viên, trong đó một số lập trình viên không hiểu rõ

Sử dụng Không gian tên để nhóm lớp và Enum không có vẻ giống như một cách hữu ích để giải quyết cảnh báo này, vì tôi muốn cả hai enum thuộc về cùng cấp cha mẹ như tên lớp.

Trả lời

4

Ngoài các vấn đề về tính khả dụng và khả năng phát hiện đã được đề cập trong các phản hồi khác, cũng có vấn đề về khả năng bảo trì tiềm năng. Điều gì xảy ra vào ngày bạn khám phá ra rằng enum của bạn cũng có khả năng hữu ích ở nơi khác? Di chuyển nó ra khỏi lớp cha mẹ của nó sẽ là một thay đổi phá vỡ, sao chép nó sẽ giới thiệu các vấn đề bảo trì riêng của mình, và yêu cầu người tiêu dùng API sử dụng nó với lớp khác bắt đầu trở nên xấu xí. Tại sao không tránh những vấn đề tiềm ẩn này bằng cách tránh các enums lồng nhau một cách hệ thống?

+0

Như bạn biết nếu bạn đọc đủ những gì tôi đã viết, tôi đã không mua đối số khả năng khám phá hoặc khả năng sử dụng, bởi vì với Intellisense làm việc như trong VS2005 thay vì năm 2010, tôi không nghĩ rằng đó là một vấn đề.Nhưng pt mới của bạn, tôi hoàn toàn đồng ý. Tôi đã xem xét nó một thời gian ngắn trên của riêng tôi nhưng bị mất tập trung vì nó không được đưa lên bởi bất cứ ai. Tôi phải thừa nhận không có một sự bảo vệ cho lập luận đó và không mong đợi để có một sau này, vì vậy ... Tôi tin chắc trên cơ sở này một mình. Điều đó dường như với tôi là đủ lý do để không nhúng enums vào các lớp học. Cảm ơn! – ChadD

1

Tôi đoán nó chỉ ra rằng loại lồng nhau có thể bị nhầm lẫn với biến tĩnh bởi vì cả hai đều sẽ xuất hiện trong intellisense (tự động hoàn thành) sau ".".

Thậm chí nếu bạn nhìn thấy BCL (Thư viện lớp cơ sở) của .NET, tất cả các enums, ngay cả khi chúng chỉ được sử dụng trong một lớp, chúng không được lồng nhau, lý do là, khi bạn muốn so sánh hoặc khởi tạo, lớp tên + "." + tên enum sẽ gây nhầm lẫn như hình dưới đây, còn Microsoft là đúng là nó sẽ gây nhầm lẫn cho mọi người.

- Ví dụ

class RootClass 
{ 
    enum NestedEnum 
    { 
     StaticItem = 0  
    } 

    static string NestedString = ""; 
} 


RootClass.NestedEnum <-- represents enum, 
RootClass.NestedString <-- represents static variable 

Một là một loại và khác có thể thay đổi, hầu hết các cảnh báo MS Mã Analyzer là dành cho thiết kế tốt hơn, tuy nhiên nó có một ngoại lệ lớn cho @George, nếu bạn không thích nó, không sử dụng nó, chỉ cần đi trước và vô hiệu hóa các cảnh báo. Bạn chắc chắn có thể sử dụng tên lớp lớn thay vì không gian tên, nó chỉ đơn giản là sự lựa chọn của bạn. Nhưng kỹ năng lập trình tốt là về cách người khác tránh được mã của bạn chứ không phải những gì bạn thích !!!

Và không gian tên ở đó để tổ chức và tổ chức chúng tôi nhập ít hơn, đó là tất cả những gì để làm nhiều việc hơn với ít nỗ lực hơn. Nhưng nếu bạn thích những tên tuổi lớn, không ai ngăn bạn lại.

+0

Lớn hơn để nhập? Con người, khung công tác .NET là một cái cây khổng lồ của các không gian tên. Tại sao sử dụng không gian tên ở tất cả khi điều này làm cho một loại hơn?Câu trả lời là, tôi sẽ nghĩ, "Để sắp xếp chúng để bạn có thể tìm được thứ!" Tại sao enums trong một lớp học khác nhau? Giải pháp được đề xuất của họ là sử dụng Không gian tên để sắp xếp. Cách tiếp cận này không làm giảm bớt việc nhập văn bản bắt buộc nhưng vì một lý do nào đó nó được "ưa thích". Vì vậy, trên điểm đánh máy của bạn, tôi không mua nó. Theo như gây nhầm lẫn loại lồng nhau với một loại tĩnh - không chắc tôi hiểu. Bởi ttype tĩnh, làm u có nghĩa là, ví dụ, một hằng số? Enum là một hằng số! – ChadD

+0

Vâng, tôi nhận ra tôi có thể vô hiệu hóa nó và tôi đang đặt câu hỏi này và sử dụng phân tích Mã để tôi có thể cải thiện kỹ năng lập trình của mình. Bạn có thấy màn hình truyền của tôi không? Trong VS2005 intellisense đã gõ cho bạn. Tôi không nhận được bạn pt về enum vs tĩnh var. Như với bất kỳ phương pháp nào, bạn phải xem kiểu trả về của hàm, được hiển thị trong chú giải công cụ. Bạn có thể có một hàm lớp RootClass trả về kiểu đối tượng anotehr, điều này có gây nhầm lẫn và chúng ta nên cảnh báo nó? Quái gì không. MS chỉ cần làm cho công việc intellisense như nó đã làm trong, diễn viên màn hình được đăng của tôi. Nó hữu ích .. – ChadD

+0

..feature để nhúng. Và giải pháp giải pháp của họ là sử dụng không gian tên, do đó, quan điểm của bạn về việc nhập quá nhiều không giữ được. Tôi nghi ngờ của bạn có lẽ đúng (chỉ vì tôi là thiểu số ở đây) nhưng tôi không nghĩ rằng bạn đã làm một trường hợp tốt hoặc tôi hiểu lầm. – ChadD

6

Enumerations thường không được đặt trong các lớp có sử dụng chúng, vì vậy mọi người không quen với việc xác định nơi liệt kê là:

Dim speed As New CustomerSpeed(CustomerSpeed.ProfitTypeEnum.FlatAmount) 

Đặt liệt kê bên ngoài lớp học làm cho nó dễ dàng hơn để sử dụng:

Dim speed As New CustomerSpeed(ProfitTypeEnum.FlatAmount) 

Điều tra vẫn được chứa trong cùng một không gian tên như lớp. Khi giải thích phân tích chỉ ra, bạn nên sử dụng không gian tên để nhóm thành viên công khai thay vì lồng chúng vào nhau.

+0

Vâng, tôi thích câu trả lời của bạn tốt hơn, nhưng tôi đoán tôi không đồng ý với bạn và MS rằng điều này nhúng enums trong một lớp học là xấu bởi vì nó sẽ gây nhầm lẫn cho những người không được sử dụng để có enums nhúng trong các lớp học. Tôi nghĩ rằng giải pháp là để làm cho nó rõ ràng rằng enum được nhúng (nếu đó là trường hợp) chứ không phải là advsing chống lại nó. Dường như với tôi như những intellisense cho enums không phải là tự động nữa. Ví dụ: trong dòng đầu tiên của mã bạn đã nhập vào nơi bạn khởi tạo obj CustomerSpeed ​​mới, bất kể enum có được nhúng hay không, intellisense không hiển thị danh sách chọn thu hẹp – ChadD

+0

.. chỉ với các giá trị enum. Mặc dù intellisense cho bạn thấy sự thừa kế không gian tên đủ điều kiện của param mong đợi, nó cũng có thể giúp bạn bằng cách cung cấp một danh sách lựa chọn các giá trị duy nhất của loại ProfitTypeEnum. Có vẻ như Intellisense đã lùi lại một bước với VS2010 (trong trường hợp này, thường được cải thiện) – ChadD

+0

Tốt intellisense (ngoài các thông tin tooltip param đã cung cấp) sẽ giải quyết vấn đề với người dùng không mong đợi để đủ điều kiện enum. HEY ... Chỉ cần thử này là 2008. Tôi khá chắc chắn nó hoạt động trong năm 2008 như tôi mô tả nó nên trong năm 2010. – ChadD

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