Quy ước đặt tên tốt cho các loại chung trong C # là gì? [đóng cửa]


16

Tôi quyết định đặt câu hỏi này ở đây thay vì trên stack stack vì nó khá chủ quan.

Trong C #, thông thường tôi thấy các loại chung có tên rất kém. Cụ thể, "T" thường được sử dụng nhưng bản thân nó không phải là một tên có ý nghĩa. Ví dụ:

class Fruit<T>
{
    T fruit;
}

Trong khi đây là cách tiếp cận điển hình, bất cứ ai sẽ đề nghị chống lại điều này? Và nếu vậy, một quy ước đặt tên hợp lý sẽ là gì đối với các kiểu chung trong ngữ cảnh của C # cho các hàm và các lớp chung?

Trong ví dụ trước của tôi, hãy giả sử rằng loại chung Tphải luôn là một loại trái cây, chẳng hạn như Applehoặc Orange. Loại Tcần phải làm rõ rằng đó là một loại trái cây, vì vậy có lẽ một cái tên tốt hơn sẽ là FruitType, vì vậy chúng tôi kết thúc với:

class Fruit<FruitType>
{
    FruitType fruit;
}

Đây chỉ là để cung cấp cho các bạn một ý tưởng về những gì tôi đang tìm kiếm. "Quy tắc ngón tay cái" nào được chấp nhận cho vấn đề này?


3
Đây không phải là một câu hỏi mang tính xây dựng. Nó sẽ chỉ nhận được câu trả lời với phong cách yêu thích của người đăng.
Michael K

1
Hãy xem các ràng buộc, xem xét ví dụ của bạn: msdn.microsoft.com/en-us/l Library / d5x73970.aspx
Matthieu

2
@Michael sẽ có một số câu trả lời và câu trả lời được chấp nhận sẽ là câu hỏi yêu thích của Robert, nhưng nhiều câu trả lời khác sẽ được bình chọn.
Người sử dụng Stuper

5
@Michael Một câu hỏi chủ quan nhận được câu trả lời chủ quan. Câu hỏi vẫn mang tính xây dựng vì nó đóng vai trò là điểm tham chiếu cho bất kỳ ai muốn có nhiều ý tưởng / giải pháp cho vấn đề cụ thể này. Câu tôi đánh dấu là câu trả lời không đại diện cho một và chỉ một chút thông tin hữu ích.
void.pulum

Có lẽ biến nó thành một wiki cộng đồng, như một nguồn tài nguyên tốt, mặc dù chủ quan?
tylermac

Câu trả lời:


22

Nó thực sự chủ quan ... ish .
Vì một số người tìm thấy ilà hoàn toàn hợp lệ cho một biến vòng lặp for, một số người cho rằng Thoàn toàn hợp lệ đối với một người giữ chỗ kiểu trong một lớp chung.

Cá nhân tôi tán thành cách tiếp cận này, đó là một quy ước chung và mọi người thường biết ý của bạn là gì.

Trường hợp loại có ý nghĩa Tôi sử dụng một tên có ý nghĩa, nhưng thường bắt đầu bằng T. Tôi gần đây đã phát triển một lớp từ điển chung (không hỏi) và khai báo là

public class Dictionary<TKey, TValue>

Tuy nhiên, đối với một cái gì đó như Tuple, trong đó các loại về cơ bản là vô nghĩa, tôi xem xét những điều sau đây là hoàn toàn chấp nhận được.

public class Tuple<T1, T2, T3>

2
Tôi không thấy chủ quan này chút nào. iTcông việc, và điều này có thể đo lường được về nguyên tắc (nghĩa là có thể đo lường được liệu mức độ hiểu của mã nguồn có tăng hay không, nếu, nói, các chỉ số vòng lặp có được các định danh khác nhau). Chỉ vì khó đo lường không có nghĩa là chúng ta phải gắn nhãn chủ quan của chủ đề vào tất cả mọi thứ. Với việc sử dụng rộng rãi mà không có vấn đề rõ ràng, sẽ khá hợp lý để nói ngay cả khi không đo lường rằng điều này thực sự hoạt động.
Konrad Rudolph

2
@Konrad: Bạn có một điểm. . . tuy nhiên câu hỏi không được gắn thẻ là chủ quan, người hỏi thừa nhận đây là một chủ đề chủ quan giả sử rằng mọi người có xu hướng có sở thích riêng của họ về quy ước đặt tên. Vì vậy, trong khi câu hỏi có thể không chủ quan (và thực tế thì không phải là có câu trả lời đúng, tức là câu trả lời liên quan đến hướng dẫn chính thức của Microsoft), chủ đề này mang tính chủ quan, vì tôi chắc chắn ai đó sẽ đăng " iTxấu xa . Người ta không bao giờ phải sử dụng tên một chữ cái bao giờ". Đã thêm một ish để giúp satisify tất cả mọi người :)
Binary Worrier

1
Tôi nghĩ rằng các ý kiến ​​một mình thêm vào bài đăng này làm cho nó một phản hồi rất có giá trị, mặc dù bản thân câu trả lời là rất hữu ích. Tcó ý nghĩa khi chúng ta nói về một loại không có ràng buộc, TFruitcó ý nghĩa bởi vì nó nói với tôi "Bất kỳ loại nào có ràng buộc rằng đó là một loại trái cây". Đây có vẻ như là một "quy tắc tốt" để đặt tên cho các tham số loại chung. Cảm ơn!!
void.pulum

1
Chỉ cần lưu ý, điều này phù hợp với Nguyên tắc thiết kế .NET Framework cho các nhà phát triển Thư viện từ MSDN. Xem: Tên của các tham số loại chung .
Grant Thomas

7

Tôi nghĩ bạn đã đúng, mặc dù T đã trở thành một tiêu chuẩn. Nó có lẽ bắt nguồn từ thời C ++ cũ và từ "loại T". Tôi coi đó là một thực hành tốt để được mô tả càng tốt, nhưng đó là chủ quan.

Bạn có thể chọn T làm tiền tố, giống như nhiều người chọn I cho giao diện. Như vậy

class Juice<TFruit> where TFruit...

sẽ là một cái tên tốt trong quan điểm khiêm tốn của tôi. Tôi thích tiền tố hơn hậu tố trong hầu hết các trường hợp, vì nó ngay lập tức rõ ràng những gì bạn đang thấy khi bạn vấp phải nó và dễ dàng tìm kiếm những thứ như Intellisense. Đó cũng là một cách thực hành tốt cho Điều khiển giao diện người dùng, khi bạn rất có thể luôn biết loại (ví dụ TextBox) nhưng không chắc chắn 100% về tên mô tả mà bạn đã đặt cho nó.

Mặt tiêu cực của nó là, nó trông tệ khi loại chính nó bắt đầu bằng T. Vì vậy, tôi nghĩ rằng sẽ là một điều tốt để bổ sung cho loại chung trong các trường hợp đặc biệt, như kiểu dưới đây.

class SomeAlgorithm<TypeT> where TypeT : Type

Xin lưu ý rằng đây chỉ là ý kiến ​​của tôi và rất chủ quan. Nhưng tôi nghĩ rằng tôi đã có một điểm nhỏ với việc thích tiền tố hơn là hậu tố.


Việc sử dụng Ttiền tố cho các tham số loại và Icho tên giao diện được yêu cầu rõ ràng ( quy tắc " DO ...") trong Nguyên tắc thiết kế khung.
Richard

1
Đó là câu hỏi những gì sử dụng TFruitở đây mang lại cho bảng trên T. Sử dụng tên như TTypehoặc TypeTchắc chắn là vô nghĩa. Nó không thêm thông tin gì hơn T. Các thông tin chính xác tương tự được truyền đạt.
Konrad Rudolph

@Konrad Rudolph: Hãy nhìn kỹ vào ví dụ của tôi về TypeT, nó bao gồm một trường hợp đặc biệt khi giao dịch với System.Type. Tôi nghĩ rằng tên của tôi có một entropy cao hơn so với việc chỉ sử dụng T cho loại, đặc biệt là nếu tên chung cũng bị hạn chế.
Falcon

7

Microsoft có một hướng dẫn chính thức liên quan đến khái quát: Tên của các lớp, cấu trúc và giao diện (được trích dẫn ở đây và ở dạng sách: Nguyên tắc thiết kế khung ).

Về câu hỏi cụ thể của bạn, nó nói:

Đặt tên tham số loại chung với tên mô tả, trừ khi tên một chữ cái hoàn toàn tự giải thích và tên mô tả sẽ không thêm giá trị.

IDictionary<TKey, TValue> 

là một ví dụ về giao diện tuân theo hướng dẫn này.

Xem xét sử dụng chữ T làm tên tham số loại cho các loại có một tham số loại một chữ cái.

Làm tên tham số loại mô tả tiền tố với chữ T.

Xem xét chỉ ra các ràng buộc được đặt trên một tham số loại trong tên của tham số. Ví dụ: một tham số bị ràng buộc với ISession có thể được gọi là TSession.


Một tài liệu tham khảo tốt hơn sẽ là cuốn sách Hướng dẫn thiết kế khung hoặc (tóm tắt) trên MSDN, đáng chú ý là Tên của các lớp, cấu trúc và giao diện .
Richard

@Richard: điều chỉnh câu trả lời của tôi khi xem xét nhận xét của bạn, Cảm ơn!
Matthieu

2

Toàn bộ quan điểm của khái quát là ủy thác chức năng - lớp chung làm một việc, đối số của nó làm một việc khác. Ví dụ trong sách giáo khoa là một bộ sưu tập chung: bộ sưu tập lưu trữ 'những thứ', nhưng nó không quan tâm những thứ này là gì. Do đó, một tên chung (sic!) Có một logic nhất định - chúng tôi không muốn nó được mô tả, bởi vì không có gì để mô tả ngoài "đó là đối số kiểu chung", mà tên này Tbao hàm một cách triệt để (xem xét quy ước). Được mô tả là tốt, nhưng mô tả quá mức cho thấy những hạn chế không có ở đó.

Tuy nhiên, đôi khi, một lớp hoặc phương thức chung có nhiều hơn một tham số loại và tại thời điểm này, việc đặt cho chúng các tên mô tả nhiều hơn để vai trò của chúng trở nên rõ ràng. Một ví dụ điển hình sẽ là loại thu thập khóa-giá trị, trong đó cả khóa và giá trị đều chung chung; gọi họ TS(hoặc Qbất cứ điều gì) sẽ ít hữu ích hơn so với gọi họ, nói, KeyTypeValueType, TKeyTVal.


1

Câu trả lời thực sự là chủ quan. Tuy nhiên, nó có giá trị như một câu hỏi, vì mã nên tự viết tài liệu và tất cả chúng ta có thể học một số cách tốt hơn để làm điều đó.

Sau đây là những quy ước tôi đã học và làm theo:

  • Các tham số loại chung sẽ không bao giờ có thể bị nhầm lẫn với các lớp cụ thể. Điều này thường khuyến khích một lời nói đầu Tbất kể điều gì xảy ra sau đó, giống như các giao diện thường được mở đầu bằng I.

  • Một tham số loại chung duy nhất trên một lớp hoặc phương thức thường phải được dán nhãn T. Đây là quy ước được hiểu gần như phổ biến từ các mẫu C ++.

  • Nhiều tham số kiểu chung trên cùng một khai báo lớp hoặc phương thức nên bắt đầu bằng T, nhưng được phân biệt bằng một số phương tiện ngắn gọn nhưng dễ hiểu. TInTOut, ví dụ, là các GTP phổ biến và được hiểu rõ cho một phương thức chấp nhận đầu vào chung được gõ mạnh và tạo ra đầu ra chung được gõ mạnh.

  • Nhiều loại khác biệt nhưng không đáng chú ý, chẳng hạn như đối với một lớp có chứa như. Tuple của Net hoặc các loại đại biểu như Func, Dự đoán và Hành động, có thể được gắn nhãn T1, T2, T3, v.v. Tuy nhiên, khai báo GTP "đáng chú ý" (có mục đích xác định và / hoặc hạn chế loại rất cụ thể) nên có một cái gì đó mô tả hơn.

  • Một kiểu chung duy nhất trên một phương thức, khác với kiểu chung của một lớp chứa, có thể theo quy tắc trước đó liên quan đến nhiều loại trong một lớp hoặc phương thức, HOẶC nếu loại này không đáng chú ý khác với loại khác thì nó có thể được cung cấp khác thư đơn, thường Uhoặc V. Đây là một lần nữa quy ước có từ các mẫu C ++.

  • Dù bạn chọn làm gì, hãy giữ nó nhất quán; không gắn nhãn GTP cho một lớp Tvà lớp tiếp theo TParam, trừ khi lớp thứ hai được lồng trong lớp thứ nhất Tkhông có sẵn để sử dụng trong lớp thứ hai.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.