2009-04-29 27 views
38

Tôi muốn có thể phân biệt giữa phiên bản chung và thường (không chung chung) của một lớp. Giống như .NET framework, với các phiên bản chung và không chung chung của một số giao diện và các lớp sưu tập của nó. (Queue, Queue(T))Công ước về tên tệp của các lớp chung

Tôi thường theo quy ước của một lớp cho mỗi tệp (như trong Java). Có quy ước chung nào để đặt tên tệp có chứa một lớp chung duy nhất không? Tôi chủ yếu quan tâm đến Windows (đặc biệt là NTFS) nhưng có vẻ như một quy ước tốt sẽ là (ít nhất một chút) xách tay.

+0

bạn có thể đưa ra một ví dụ về một lớp học mà cả một loại hình cụ thể và generic có cùng tên (mà có lẽ không phải là một ý tưởng tuyệt vời để bắt đầu với?) .NET phi các loại chung chung chỉ có khả năng tương thích ngược. –

+2

"Bạn có thể đưa ra ví dụ về một lớp mà cả một loại cụ thể và chung chung có cùng tên" - bạn đã tự cung cấp một câu trả lời: một thư viện lớp cần khả năng tương thích ngược! – Joe

Trả lời

29

Tại Microsoft, họ sử dụng ClassNameOfT.cs

+0

Như thế này, khá rõ ràng. Mặc dù tôi có lẽ vẫn sẽ đặt tên cho lớp giống như phiên bản không chung chung. –

+3

Tôi đoán tôi sẽ tự hỏi làm thế nào họ sẽ làm một cái gì đó giống như một từ điển. DictionaryOfKT? – user7116

+8

Trong mã nguồn ASP.NET MVC 1.0, họ sử dụng quy ước Dictionary'2.cs. – mckamey

1

Làm thế nào về:

Type.cs 

TypeGeneric.cs 

Bất cứ khi nào tôi đã làm điều này trong quá khứ tôi đã luôn đặt cả hai loại trong một tập tin với các loại phi generic như tên tập tin. Tôi nghĩ rằng điều này làm cho mọi thứ khá rõ ràng như .NET không có quy ước/hạn chế về một loại cho mỗi tệp như Java. Nhưng nếu bạn phải sau đó tôi sẽ đề nghị một cái gì đó như tôi đã ở trên, và sử dụng một hậu tố sẽ làm cho các tập tin hiển thị cùng nhau trong bất kỳ danh sách theo thứ tự bảng chữ cái (Solution Explorer, Windows Explorer, vv).

Dưới đây là một ý tưởng:

Type`1.cs 

này sẽ cho phép bạn để thoát ra khỏi kiểu generic khác nhau bởi số lượng các tham số kiểu generic họ chấp nhận. Nó chỉ là một suy nghĩ mặc dù tôi vẫn nghĩ rằng nó sẽ đơn giản hơn để chỉ cần đặt tất cả các loại trong một tập tin.

0

Tôi có thể có hai thư mục trong dự án, giống như Gereric, NonGeneric hoặc một cái gì đó tương tự. Họ vẫn có thể ở trong cùng một không gian tên, và sau đó cả hai đều có cùng tên tệp. Chỉ là một ý tưởng ...

+5

Cá nhân tôi cố gắng tránh các lớp trong cùng một không gian tên trong các thư mục khác nhau. Tôi thích hệ thống phân cấp thư mục để phù hợp với phân cấp không gian tên, vì lợi ích của các nhà phát triển ngày mai. – Joe

+0

Đủ công bằng. Tôi có lẽ sẽ có họ trong một tên riêng biệt anyway. Một cái gì đó như MyProj. và MyProj.Generic. – BFree

0

Tất cả các lớp Microsoft mới sử dụng Generics. Các QueueArrayList đã có trước khi generics xuất hiện. Generics là con đường phía trước.

Quy ước đối với tệp một lớp cho mỗi tệp là đặt tên tệp sau tên lớp (cho dù chung là không). Đối với MyClass, bạn sẽ có MyClas.cs. Đối với mỗi không gian tên mới, bạn sẽ cần phải tạo một thư mục mới. Đây là cách Visual Studio cũng hoạt động.

1

Tôi có thể đặt chúng vào các thư mục và sử dụng cơ chế không gian tên thay thế. Bạn có thể so sánh với System.Collections so với System.Collections.Generic. Mặt khác, nếu nó phổ biến hơn không phải là các lớp học sử dụng Generics, có lẽ nó là tốt hơn để chỉ ra những người không. Đó là nếu bạn thực sự muốn tách các lớp chung từ các lớp khác. Cá nhân tôi thường không bận tâm để làm điều đó, vì tôi không thực sự thấy một lợi ích thiết thực từ nó.

1

Từ phản hồi cho đến nay có vẻ như không có sự đồng thuận.

Sử dụng cùng một tên tệp trong một không gian tên phụ (và thư mục con) "Generics" (như System.Collecctions.Generics) là một tùy chọn. Nhưng không phải luôn luôn mong muốn tạo ra một không gian tên mới. Ví dụ, trong một không gian tên hiện có với các lớp không chung chung được duy trì để tương thích ngược, nhưng được đánh dấu bằng ObsoleteAttribute, có lẽ tốt hơn là giữ các phiên bản chung trong cùng một không gian tên.

Tôi nghĩ hậu tố là một cách hợp lý để đi. Tôi đã áp dụng một quy ước của việc sử dụng các thông số loại như một hậu tố (như vậy: MyClassT cho MyClass < T> hoặc MyDictionaryKV cho MyDictionary < K, V>

36

Chỉ.. thấy câu hỏi này sau khi tìm kiếm những gì ước người khác sử dụng cho tên tập tin lớp generic

Gần đây tôi đã sử dụng ClassName[T].cs tôi thực sự thích Công ước này, và tôi nghĩ đó là vượt trội so với những người khác vì những lý do sau đây:..

  • Các thông số loại nhảy ra ngoài với bạn ít hơn so với thông số Microsoft (ví dụ: ClassNameOfT.cs).
  • Nó cho phép bạn có nhiều tham số loại mà không cần quá nhiều nhầm lẫn: Dictionary[TKey, TValue].cs
  • Nó không yêu cầu bạn phải tạo ra bất kỳ thư mục đặc biệt, hoặc có lớp học chung của bạn trong một không gian tên đặc biệt. Nếu bạn chỉ có một vài lớp chung chung, có một không gian tên đặc biệt dành riêng cho họ chỉ là không thực tế.

Tôi đã mượn quy ước này từ cú pháp chung của Boo, mặc dù được sửa đổi đôi chút (Boo sử dụng ClassName[of T]).

Một số nhà phát triển dường như có một nỗi ám ảnh về tên tệp có chứa bất kỳ thứ gì ngoài chữ cái và dấu gạch dưới, nhưng một khi bạn có thể vượt qua, quy ước này dường như hoạt động rất tốt.

+35

+1 Tôi đã sử dụng DOS/Windows trong gần 30 năm và tôi chưa bao giờ gặp ai với các quả bóng để sử dụng dấu phẩy trong tên tệp. –

+7

@ I.J.Kennedy REAL men sử dụng dấu chấm phẩy (;) trong tên thư mục của họ và đặt chúng trong các biến môi trường (PATH). – enzi

+0

Tôi thích quy ước này khi tôi đọc nó lần đầu tiên, nhưng vì lý do nào đó, một số phần mở rộng (ahem, CodeMaid) không hoạt động khi bạn có các tệp được đặt tên theo quy ước này, chẳng hạn như 'IFoo.cs' và' IFoo [T] .cs'. Khi phần mở rộng chạy để làm sạch tài liệu không chung chung, nó luôn ảnh hưởng đến tài liệu chung chung ... Hành vi lạ. – Dan

8

tôi thấy rằng chủ đề này đã bị hủy bỏ hơn một năm trước, nhưng tôi vẫn muốn chia sẻ quan điểm của tôi về quy ước này.

Trước hết, có nhiều lớp có cùng tên nhưng chỉ khác nhau về lượng tham số kiểu không phải lúc nào cũng là trường hợp tương thích ngược. Chắc chắn, bạn không nhìn thấy nó rất thường xuyên, nhưng các lớp Action- và Func mới của .NET đã được thiết kế theo cách này, và tôi hiện đang thực hiện một cái gì đó tương tự.

Để rõ ràng và distinguishability, tôi sử dụng quy ước sau mà chỉ xác định số lượng đối số chung cho một loại nhất định:

  • MyClass.cs
  • MyClass.T1.cs
  • MyClass.T2 .cs

Bằng cách này, tên tệp của tôi vẫn ngắn gọn và đơn giản trong khi vẫn giao tiếp rõ ràng tên lớp và số lượng thông số loại khác với chi phí của dấu chấm đơn giản (đó là, theo kinh nghiệm của tôi, một điều được chấp nhận phổ biến để làm trong một tên tệp và trông đẹp hơn nhiều so với các ký tự không phải chữ cái và chữ số khác, nhưng đây chỉ là vấn đề về hương vị mà tôi đoán).Đặt tên (hoặc từ viết tắt) của các tham số kiểu chỉ kéo dài tên tập tin trong khi ở cấp độ này, tôi không thực sự quan tâm đến tên thật của các tham số kiểu ...

+0

Tôi vẫn chú ý. Cảm ơn các đầu vào. :-) –

+0

+1, Thực sự thích điều này! Nó đơn giản, ngắn gọn, đủ rõ ràng/đủ thông tin (ở cấp tên tệp) và không nên kích hoạt quá nhiều "biểu tượng-phobians" ở ngoài đó. Tuy nhiên, dưới dạng biến thể, dấu chấm đầu tiên có thể được thay thế bằng dấu gạch dưới cho những trường hợp mà nhiều dấu chấm không được mong muốn. Hoặc như trường hợp của tôi: Tôi sử dụng nhiều dấu chấm cho các lớp bên trong (trừ khi chúng nhỏ hơn ~ 10 dòng). Vì vậy, ví dụ: 'MyClass.InnerClass.cs' hoặc một ví dụ kết hợp với điều này cho generics' MyClass_T2.InnerClass.cs'. (Tôi thích sử dụng dấu chấm cho các lớp bên trong vì nó phản ánh cách chúng được tham chiếu trong mã.) – AnorZaken

0

Cá nhân tôi sẽ không sử dụng dấu nghiêm trọng ký hiệu:

Foo.cs 
Foo`1.cs 

Vì lý do đơn giản là tôi sợ giọng nghiêm trọng. Nó không chỉ có một tên đáng sợ, nhưng tôi không chắc chắn nó sẽ được xử lý như thế nào bởi các hệ thống tập tin khác nhau, các hệ thống điều khiển phiên bản và trong các URL. Do đó, tôi muốn dính vào các ký tự chữ và số phổ biến.

NameOfT.cs dường như được sử dụng trong ASP.NET Core MVC theo tìm kiếm trên GitHub. 12 kết quả. Reference.

Cũng hạn chế sử dụng trong CoreFX. 3. Kết quả. Reference.

Ví dụ:

Foo.cs 
FooOfT.cs 
Các vấn đề liên quan