Quy ước đặt tên cho các phương thức java trả về boolean (Không có dấu chấm hỏi)


94

Tôi thích sử dụng dấu chấm hỏi ở cuối tên phương thức / hàm trong các ngôn ngữ khác. Java không cho phép tôi làm điều này. Để giải quyết vấn đề, tôi có thể đặt tên cho các phương thức trả về boolean trong Java như thế nào? Sử dụng một is, has,should , canở phía trước của một âm thanh phương pháp okay cho một số trường hợp. Có cách nào tốt hơn để đặt tên cho các phương thức như vậy không?

Ví dụ: createFreshSnapshot?


2
Ngôn ngữ nào cho phép một ?tên phương thức?
SLaks

11
@SLaks, Scheme, Ruby ...
Skilldrick

trong chương trình, chúng tôi luôn đặt một pở phần cuối của tên phương pháp
Erick Robertson

@Erick: không phải lúc nào, nhưng "p" là một cách tiêu chuẩn của các vị từ chỉ định
Jason S

we = lớp chương trình đại học của tôi luôn luôn làm. Tôi sẽ không bao giờ sử dụng quy ước này trong Java.
Erick Robertson

Câu trả lời:


123

Quy ước là đặt một câu hỏi trong tên.

Dưới đây là một số ví dụ có thể được tìm thấy trong JDK:

isEmpty()

hasChildren()

Bằng cách đó, tên được đọc giống như chúng sẽ có một dấu chấm hỏi ở cuối.

Bộ sưu tập có trống không?
Node này có con không?

Và, sau đó, truecó nghĩa là có, và falsecó nghĩa là không.

Hoặc, bạn có thể đọc nó như một khẳng định:

Bộ sưu tập trống.
Nút có con

Lưu ý:
Đôi khi bạn có thể muốn đặt tên một phương thức giống như vậy createFreshSnapshot?. Nếu không có dấu chấm hỏi, tên ngụ ý rằng phương pháp sẽ tạo ra một ảnh chụp nhanh, thay vì kiểm tra xem liệu phương pháp có được yêu cầu hay không.

Trong trường hợp này, bạn nên suy nghĩ lại những gì bạn thực sự đang hỏi. Cái gì đó nhưisSnapshotExpired là một cái tên hay hơn nhiều và truyền đạt những gì phương thức sẽ cho bạn biết khi nó được gọi. Làm theo một mô hình như thế này cũng có thể giúp giữ cho nhiều chức năng của bạn tinh khiết và không có tác dụng phụ.

Nếu bạn làm một Google Search cho isEmpty()trong API Java, bạn nhận được rất nhiều kết quả.


thế còn createFreshSnapshot?
letronje

4
@letr, tốt, tôi có thể sẽ đổi tên nó sáng isSnapshotExpiredhoặc một cái gì đó tương tự. (dựa trên tiêu chí của bạn)
jjnguy

8
Tôi có được vòng vấn đề 'createFrshSnapshot' bằng cách sử dụng từ 'nên' - tức là "shouldCreateFreshSnapshot ()" (mặc dù trong trường hợp này isSnapshotExpired () là tốt hơn)
DJClayworth

1
Tôi kiểm tra xem liệu tin nhắn nhịp tim có nên được gửi bằng một shouldHeartbeat()phương thức hay không.
Erick Robertson

Tại sao lại nghĩ như vậy isEmpty()hasChildren()là những câu hỏi chứ không phải khẳng định ? Nó thực sự đọc tốt hơn một chút bằng tiếng Anh nếu bạn coi những tên đó là khẳng định hoặc vị ngữ.
rick

29

Nếu bạn muốn lớp của mình tương thích với đặc tả Java Beans , để các công cụ sử dụng phản xạ (ví dụ: JavaBuilders , JGoodies Binding ) có thể nhận ra bộ lấy boolean, sử dụng getXXXX()hoặc isXXXX()dưới dạng tên phương thức. Từ thông số Java Beans:

8.3.2 Thuộc tính Boolean

Ngoài ra, đối với thuộc tính boolean, chúng tôi cho phép một phương thức getter khớp với mẫu:

public boolean is<Tên tài sản >() ;

Phương thức “is < PropertyName >” này có thể được cung cấp thay vì phương thức “get < PropertyName >” hoặc nó có thể được cung cấp ngoài phương thức “get < PropertyName >”. Trong cả hai trường hợp, nếu phương thức “is < PropertyName >” hiện diện cho một thuộc tính boolean thì chúng tôi sẽ sử dụng phương thức “is < PropertyName >” để đọc giá trị thuộc tính. Một thuộc tính boolean mẫu có thể là:

public boolean isMarsupial();
public void setMarsupial(boolean m);

Thật khó hiểu khi bạn nói public boolean is<PropertyName>(); Nó trông giống như một cái chung chung.
Erick Robertson

Này, tôi chỉ trích dẫn thông số kỹ thuật. Tôi sẽ in nghiêng theo thông số kỹ thuật.
Jason S

4
Tôi không quan tâm tương thích đậu Java abt, tôi chỉ muốn tên phương pháp của tôi để đúng :) âm thanh
letronje

4
Ngay cả khi bạn không quan tâm đến khả năng tương thích của Javabeans, quy ước đặt tên vẫn đáng tuân theo, bởi vì nó đã phát triển vượt quá phạm vi ban đầu của 'bean' được định cấu hình trong IDE. Ví dụ: nếu bạn sử dụng isEmpty làm tên phương thức, bạn có thể gọi phương thức này từ JSP bằng object.empty, tuy nhiên bạn không thể gọi phương thức với các tiền tố khác, vì vậy bạn không thể sử dụng object.children để gọi object.hasChildren (). Vì vậy, JSP và EL (Ngôn ngữ biểu thức) cho phép bạn truy cập Thuộc tính Javabeans. Một chiến thắng lớn nếu bạn hỏi tôi.
Stijn de Witt

JavaBeans rất cụ thể, cảm ơn bạn đã nhắc nhở điều đó. Tôi thường tự hỏi và có xu hướng nghĩ rằng tôi bị mắc kẹt với tiền tố 'là', nhưng thực sự không phải vậy.
Snicolas

26

Tôi muốn đăng liên kết này vì nó có thể giúp ích hơn nữa cho những người xem kiểm tra câu trả lời này và tìm kiếm thêm quy ước kiểu java

Nguyên tắc về kiểu lập trình Java

Mục "2.13 tiền tố nên được sử dụng cho các biến và phương thức boolean." có liên quan cụ thể và gợi ý tiền tố is .

Hướng dẫn phong cách tiếp tục đề xuất:

Có một số lựa chọn thay thế cho tiền tố is phù hợp hơn trong một số trường hợp. Đây là các tiền tố , có thểnên :

boolean hasLicense();
boolean canEvaluate();
boolean shouldAbort = false;

Nếu bạn tuân theo Nguyên tắc, tôi tin rằng phương pháp thích hợp sẽ được đặt tên là:

shouldCreateFreshSnapshot()

2
FYI, có các hướng dẫn là Dịch vụ phần mềm địa kỹ thuật bản quyền. Điều đó nói rằng, họ đã tham khảo nguồn ở phía dưới để cho thấy chúng hợp pháp.
Donal Lafferty

11

Đối với các phương thức có thể không thành công, tức là bạn chỉ định boolean làm kiểu trả về, tôi sẽ sử dụng tiền tố try:

if (tryCreateFreshSnapshot())
{
  // ...
}

Đối với tất cả các trường hợp khác, hãy sử dụng các tiền tố như is.. has.. was.. can.. allows....


15
Nhưng thử không truyền đạt rằng đó là một câu hỏi (có giá trị trả về).
Steve Kuo

Không bao giờ trả về boolean để cho biết một phương thức có bị lỗi hay không. Nếu phương pháp không thành công, hãy ném một ngoại lệ. Hãy tưởng tượng phương pháp không thành công và bạn nhận được sai, làm thế nào bạn sẽ xác định chính xác điều gì đã sai?
Wouter van Koppen

5

Tiêu chuẩn là sử dụng 'is' hoặc 'has' làm tiền tố. Ví dụ isValid, hasChildren.


2

islà một trong những tôi đã xem qua nhiều hơn bất kỳ khác. Mặc dù vậy, bất cứ điều gì có ý nghĩa trong tình hình hiện tại là lựa chọn tốt nhất.


0

Tôi muốn đưa ra một quan điểm khác về quy ước đặt tên chung này , ví dụ:

xem java.util.Set :boolean add​(E e)

cơ sở lý luận là ở đâu:

thực hiện một số xử lý sau đó báo cáo xem nó có thành công hay không .

Trong khi returnthực sự là một booleanphương thức, tên của phương thức phải chỉ ra quá trình hoàn tất thay vì kiểu kết quả (boolean cho ví dụ này).

createFreshSnapshotĐối với tôi, ví dụ của bạn có vẻ liên quan nhiều hơn đến quan điểm này vì dường như có nghĩa là: tạo một ảnh chụp nhanh mới sau đó báo cáo xem thao tác tạo có thành công hay không. Xem xét lý do này, tên createFreshSnapshotcó vẻ là tốt nhất cho tình huống của bạn.


1
Tôi không chắc tại sao bạn lại bị phản đối, tôi đồng ý. Mặc dù tôi tránh sử dụng nó, vì nó không có ngữ nghĩa gì cả, nó là một quy ước được sử dụng bởi nhiều API java nội bộ.
Kamil Bęben

1
Tôi đoán vì ban đầu tôi chỉ viết "Set: boolean add (E e)" nên mọi người đã không nhận thấy điều đó về java.util.Set nổi tiếng; hoặc có thể do tiếng anh của mình quá tệ: D. Cảm ơn vì đã ủng hộ :)
adrhc
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.