Quy ước đặt tên tham số loại chung cho Java (có nhiều ký tự)?


124

Trong một số giao diện tôi đã viết, tôi muốn đặt tên cho các tham số loại chung có nhiều hơn một ký tự để làm cho mã dễ đọc hơn.

Cái gì đó như....

Map<Key,Value>

Thay vì ...

Map<K,V>

Nhưng khi nói đến các phương thức, các tham số kiểu trông giống như các lớp java cũng gây nhầm lẫn.

public void put(Key key, Value value)

Điều này có vẻ như Key và Value là các lớp. Tôi đã tìm thấy hoặc nghĩ về một số ký hiệu, nhưng không có gì giống như một quy ước từ Mặt trời hay một thực tiễn tốt nhất nói chung.

Các lựa chọn thay thế tôi đoán hoặc tìm thấy ...

Map<KEY,VALUE>
Map<TKey,TValue>

9
Tại sao bạn muốn tạo một quy ước mới?
Amir Afghani

13
@AmirAfghani Từ câu hỏi: để làm cho mã dễ đọc hơn.
SantiBailors

Về mặt kỹ thuật, màu sắc khác nhau của thuốc generic trong IDE sẽ đóng vai trò là một chỉ báo đủ tốt
Sudix

Câu trả lời:


181

Oracle khuyến nghị những điều sau đây trong Hướng dẫn Java> Generics> Các loại chung :

Loại quy ước đặt tên tham số

Theo quy ước, tên tham số loại là chữ cái đơn, chữ hoa. Điều này trái ngược hoàn toàn với biến quy ước đặt tên mà bạn đã biết và với lý do chính đáng: Nếu không có quy ước này, sẽ rất khó để phân biệt sự khác biệt giữa một biến loại và tên lớp hoặc tên giao diện thông thường.

Các tên tham số loại thường được sử dụng là:

  • Phần tử điện tử (được sử dụng rộng rãi bởi Khung sưu tập Java)
  • K - Chìa khóa
  • N - Số
  • T - Loại
  • V - Giá trị
  • S, U, V, v.v. - Loại 2, 3, 4

Bạn sẽ thấy những tên này được sử dụng trong suốt API Java SE và phần còn lại của bài học này.

Tôi sẽ bám vào nó để tránh sự nhầm lẫn giữa các nhà phát triển và các nhà bảo trì có thể.


14
Khung luồng mới cũng sử dụng Rcho kết quả và Acho bộ tích lũy.
vandale

32
Blech, đặt tên đơn. Tôi tuân theo quy ước này vì quy ước quan trọng hơn những cái tên mô tả, nhưng thật đáng buồn đây là điều tốt nhất họ có thể nghĩ ra.
warbaker

4
@warbaker: Tôi thấy đó là một cách tốt để phân biệt các loại tham số hóa với các lớp thực tế. Làm thế nào bạn có thể nói nếu ví dụ Elementtrong List<Element>là một loại tham số hoặc một lớp?
BalusC

1
Nó không giống như BiFunction<T, U, R>theo quy ước này. Nếu nó đã làm, nó sẽ được BiFunction<T, S, R>.
michaelsnowden

4
Tại sao lo lắng về việc phân biệt các loại tham số hóa với các lớp thực tế? Họ là những lớp học. Cho dù thế nào, bạn phải cuộn lên một nơi nào đó trong tệp để tìm hiểu xem chúng được định nghĩa là gì. Và nó sẽ là một kiểu nhập hoặc một kiểu tham số.
Vectorjohn

47

Nối Type

Một cuộc thảo luận tốt có thể được tìm thấy trong các bình luận trên trang DZone, Quy ước đặt tên cho các loại tham số .

Xem bình luận của Erwin Mueller. Gợi ý của anh ấy làm cho ý nghĩa rõ ràng hoàn hảo với tôi: Nối từType .

Gọi một quả táo là một quả táo, một chiếc xe hơi. Tên trong câu hỏi là tên của một loại dữ liệu, phải không? (Trong OOP , một lớp về cơ bản xác định một kiểu dữ liệu mới.) Vì vậy, hãy gọi nó là Kiểu Loại.

Ví dụ của Mueller, được rút ra từ bài viết gốc của bài viết:

public interface ResourceAccessor < ResourceType , ArgumentType , ResultType > {
    public ResultType run ( ResourceType resource , ArgumentType argument );
}

Nối T

Một câu hỏi trùng lặp cung cấp câu trả lời này của Andy Thomas. Lưu ý đoạn trích từ hướng dẫn về phong cách của Google cho thấy tên loại nhiều ký tự sẽ kết thúc bằng một chữ hoa T.


3
Tôi thích câu trả lời này. Thêm "Loại" rất rõ ràng và cho phép bạn có tên mô tả. Tôi phát ngán với việc mọi người nói, "hãy làm điều đó vì đó là quy ước", không có lý do nào khác. Nếu đó là một quy ước tồi tệ, có lẽ chúng ta cần một quy ước mới.
vẽ

16

Lý do tại sao quy ước đặt tên chính thức giới thiệu bằng cách sử dụng một chữ cái như sau:

Nếu không có quy ước này, sẽ rất khó để phân biệt sự khác biệt giữa một biến loại và một tên giao diện hoặc lớp thông thường.

Tôi nghĩ với các IDE hiện đại rằng lý do không còn giá trị như vd. IntelliJ Idea hiển thị các tham số loại chung với màu sắc khác với các lớp thông thường.

Mã với loại chung như được hiển thị trong IntelliJ Idea 2016.1 Mã với loại chung như được hiển thị trong IntelliJ Idea 2016.1

Do sự khác biệt đó, tôi sử dụng các tên mô tả dài hơn cho các loại chung của mình, với quy ước giống như các loại thông thường. Tôi tránh thêm các tiền tố và hậu tố như T hoặc Type vì tôi coi chúng là tiếng ồn không cần thiết và không còn cần thiết để phân biệt trực quan các loại chung.

Lưu ý: Vì tôi không phải là người dùng Eclipse hoặc Netbeans, tôi không biết liệu họ có cung cấp tính năng similliar hay không.


Tôi sẽ không căn cứ các quy ước đặt tên xung quanh khả năng giả định của các công cụ mà mỗi người từng đọc / sửa đổi cùng một tệp sẽ có. Cá nhân tôi thích sử dụng trình soạn thảo văn bản cho mã hóa của mình (Sublime Text) không phải là IDE. Các trình soạn thảo văn bản ngày nay thường có màu cú pháp, nhưng không hiểu sâu về cấu trúc mã cơ bản mà tôi nghĩ sẽ được yêu cầu để tô màu tên biến chính xác. Và dựa trên lập luận này về màu sắc vốn chỉ dành riêng cho những người có thị lực kém (tôi là một phần của 8% nam giới bị mù màu đỏ-xanh lá cây)
joonas.fi

1
Điểm tốt liên quan đến những người có tầm nhìn màu sắc kém. Về việc không sử dụng IDE - nếu mọi người thích sử dụng các trình soạn thảo văn bản đơn giản thì cũng không sao, nhưng họ tự nguyện hy sinh các tính năng mà IDE cung cấp cho họ để ủng hộ công cụ nhẹ hơn. Đây có thể chỉ là một trong những tính năng bị thiếu. Cuối cùng, nếu một tên mô tả được sử dụng thay vì một chữ cái, bạn sẽ có thể nói ý nghĩa dựa trên tên mà không có IDE và không có mã màu. Mã màu chỉ làm cho điều này nhanh hơn.
Vojtech Ruzicka

16

Có, bạn có thể sử dụng tên nhiều ký tự cho các biến loại, miễn là chúng được phân biệt rõ ràng với tên lớp.

Điều này khác với quy ước được đề xuất bởi Sun với việc giới thiệu thuốc generic vào năm 2004. Tuy nhiên:

  • Nhiều hơn một quy ước tồn tại.
  • Tên nhiều ký tự phù hợp với các kiểu Java khác, chẳng hạn như kiểu của Google cho Java .
  • Các tên dễ đọc là (ngạc nhiên!) Dễ đọc hơn.

Dễ đọc

Trong một số giao diện tôi đã viết tôi muốn đặt tên tham số loại chung với nhiều hơn một ký tự để làm cho mã dễ đọc hơn.

Khả năng đọc là tốt.

Đối chiếu:

    public final class EventProducer<L extends IEventListener<E>,E> 
            implements IEventProducer<L,E> {

đến:

    public final class EventProducer<LISTENER extends IEventListener<EVENT>,EVENT> 
           implements IEventProducer<LISTENER, EVENT> {

hoặc, với quy ước đa ký tự của Google:

    public final class EventProducer<ListenerT extends IEventListener<EventT>,EventT> 
           implements IEventProducer<ListenerT, EventT> {

    public final class EventProducer<ListenerT extends IEventListener<EventT>,EventT> 
           implements IEventProducer<ListenerT, EventT> {

Phong cách Google

Các Google Java Style Guide cho phép cả hai tên đơn thư và đa nhân vật tầm cỡ như tên kết thúc bằng T.

5.2.8 Tên biến

Mỗi biến loại được đặt tên theo một trong hai kiểu:

  • Một bức thư vốn duy nhất, tùy theo sau là một số duy nhất (ví dụ như E, T, X, T2)

  • Một tên trong biểu mẫu được sử dụng cho các lớp (xem Phần 5.2.2, Tên lớp ), theo sau là chữ in hoa T (ví dụ : RequestT, FooBarT).

Các vấn đề

Nếu không có quy ước này, sẽ rất khó để phân biệt sự khác biệt giữa một biến loại và một tên giao diện hoặc lớp thông thường. - từ các hướng dẫn của Oracle, các loại Nói chung

Tên một ký tự không phải là cách duy nhất để phân biệt các tham số loại với tên lớp, như chúng ta đã thấy ở trên.

Tại sao không chỉ ghi lại ý nghĩa tham số loại trong JavaDoc?

Đúng là các @paramphần tử JavaDoc có thể cung cấp một mô tả dài hơn. Nhưng cũng đúng là JavaDocs không nhất thiết phải nhìn thấy. (Ví dụ: có một hỗ trợ nội dung trong Eclipse hiển thị tên tham số loại.)

Tên tham số loại nhiều ký tự không tuân theo quy ước của Oracle!

Nhiều quy ước ban đầu của Sun được tuân theo gần như phổ biến trong lập trình Java.

Tuy nhiên, quy ước đặc biệt này là không.

Sự lựa chọn tốt nhất trong số các công ước cạnh tranh là một vấn đề quan điểm. Hậu quả của việc chọn một quy ước khác với Oracle trong trường hợp này là không đáng kể. Bạn và nhóm của bạn có thể chọn một quy ước đáp ứng tốt nhất nhu cầu của bạn.


15

Bạn có thể sử dụng javadoc để ít nhất cung cấp cho người dùng của lớp chung của bạn một manh mối. Tôi vẫn không thích nó (tôi đồng ý với @ chaper29) nhưng các tài liệu trợ giúp.

ví dụ,

/**
 * 
 * @param <R> - row
 * @param <C> - column
 * @param <E> - cell element
 */
public class GenericTable<R, C, E> {

}

Một điều khác mà tôi đã biết là sử dụng IDE của mình để cấu trúc lại một lớp phá vỡ quy ước. Sau đó làm việc với mã và tái cấu trúc trở lại các chữ cái duy nhất. Làm cho nó dễ dàng hơn cho tôi dù sao nếu nhiều tham số loại được sử dụng.


1
Tôi muốn nói các bình luận Javadoc cho các tham số loại thường là phải.
Migu
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.