Khả năng đọc của phương thức Boolean


120

Câu hỏi đơn giản, từ quan điểm dễ đọc, bạn thích đặt tên phương thức nào cho phương thức boolean:

public boolean isUserExist(...)

hoặc là:

public boolean doesUserExist(...)

hoặc là:

public boolean userExists(...)

21
đầu tiên một âm thanh nhưisBabbyFormed

Phụ thuộc vào ngôn ngữ. Các ngôn ngữ khác nhau có các quy ước khác nhau; Java và Objective C có trong tâm trí. Cũng chủ quan biên giới.
Jed Smith

Chủ quan - đủ công bằng
Yuval Adam

2
Hoàn toàn chủ quan. getUserExistence, userIsNotExtinct, userHasExistentialStateVv ...
dreamlax

Sartre sẽ tự hào
Cornel Masson

Câu trả lời:


112
public boolean userExists(...)

Sẽ được ưa thích của tôi. Vì nó làm cho các bài kiểm tra có điều kiện của bạn giống tiếng Anh tự nhiên hơn nhiều:

if userExists ...

Nhưng tôi đoán không có quy tắc cứng và nhanh - chỉ cần kiên định


3
"làm cho {method call} của bạn giống tiếng Anh tự nhiên hơn nhiều" nghe giống như một bài kiểm tra tuyệt vời để đặt tên hợp lý trên toàn diện. làm sáng tỏ suy nghĩ của tôi về vấn đề này - cảm ơn!
cori

16
Mặt khác, trong trường hợp cô lập hoặc khi không theo sau "if" ngay lập tức, thì "userExists ()" nghe giống như một tuyên bố về thực tế, chứ không phải là câu hỏi mà nó dự định. Không giống như "IsUserExisting ()" hoặc "DoesUserExist ()", tuân theo quy tắc trật tự từ trong ngôn ngữ tự nhiên tiếng Anh cho các câu hỏi chuyển tiếp.
Oskar Berggren

4
..nhưng tại sao các phương thức trả về bool lại được sử dụng bên ngoài một if? Nếu chúng có tác dụng phụ thì càng có mùi. if IsUserExisting()if DoesUserExist()trông rất kinh khủng và nên tránh.
RJFalconer

@RJFalconer đôi khi bạn có thể cần sử dụng kết quả của phương thức đó ở một số nơi, vì vậy bạn sẽ gán nó cho biến. Vì phương thức được gọi userExists, bạn sẽ khai báo tên biến nào? userExistslà tốt cho các biến, không phải phương thức. Như @Oskar đã viết - nó giống như một tuyên bố, không phải là một câu hỏi.
Jarosław Wlazło

Đối với các tình huống phải có chủ ngữ, vị ngữ và đối tượng, chẳng hạn như UserSessionIsComplete hoặc IsUserSessionComplete, bạn thích cái nào hơn?
Yang

40

Tôi sẽ nói userExists, bởi vì 90% thời gian mã gọi điện của tôi sẽ giống như sau:

if userExists(...) {
  ...
}

và nó đọc theo nghĩa đen bằng tiếng Anh.

if isUserExistif doesUserExistcó vẻ thừa.


18

Cẩn thận với việc hy sinh độ rõ ràng trong khi theo đuổi khả năng đọc .

Mặc dù if (user.ExistsInDatabase(db))đọc đẹp hơn if (user.CheckExistsInDatabase(db)), hãy xem xét trường hợp của một lớp có mẫu trình tạo, (hoặc bất kỳ lớp nào bạn có thể đặt trạng thái trên đó):

user.WithName("Mike").ExistsInDatabase(db).ExistsInDatabase(db2).Build();

Không rõ liệu ExistsInDatabaseđang kiểm tra xem nó có tồn tại hay không hay đặt ra sự thật rằng nó có tồn tại hay không. Bạn sẽ không viết if (user.Age())hoặc if (user.Name())không có bất kỳ giá trị so sánh nào, vậy tại sao lại là if (user.Exists())một ý kiến ​​hay vì thuộc tính / hàm đó thuộc kiểu boolean và bạn có thể đổi tên hàm / thuộc tính để đọc giống tiếng Anh tự nhiên hơn? Làm theo cùng một mẫu mà chúng ta sử dụng cho các kiểu khác ngoài boolean có tệ đến vậy không?

Với các kiểu khác, một ifcâu lệnh so sánh giá trị trả về của một hàm với một giá trị trong mã, vì vậy mã trông giống như sau:

if (user.GetAge() >= 18) ...

Câu nào đọc là "if user dot get age lớn hơn hoặc bằng 18 ..." đúng - đó không phải là "tiếng Anh tự nhiên", nhưng tôi sẽ tranh luận rằng object.verbkhông bao giờ giống tiếng Anh tự nhiên và đây chỉ đơn giản là một khía cạnh cơ bản của lập trình hiện đại (đối với nhiều ngôn ngữ chính thống). Các lập trình viên thường không gặp khó khăn khi hiểu câu lệnh trên, vậy câu lệnh sau có tệ hơn không?

if (user.CheckExists() == true)

Thường được rút ngắn thành

if (user.CheckExists())

Tiếp theo là bước quan trọng

if (user.Exists())

Mặc dù người ta đã nói rằng "mã được đọc thường xuyên hơn 10 lần so với được viết", điều rất quan trọng là các lỗi rất dễ phát hiện. Giả sử bạn có một hàm gọi là Exists () làm cho đối tượng tồn tại và trả về true / false dựa trên thành công. Bạn có thể dễ dàng nhìn thấy mã if (user.Exists())và không phát hiện ra lỗi - if (user.SetExists())ví dụ như lỗi sẽ rõ ràng hơn nhiều nếu đọc mã .

Ngoài ra, user.Exists () có thể dễ dàng chứa mã phức tạp hoặc không hiệu quả, di chuyển đến cơ sở dữ liệu để kiểm tra một cái gì đó. user.CheckExists () làm rõ rằng hàm thực hiện một điều gì đó.

Xem thêm tất cả các câu trả lời ở đây: Quy ước đặt tên : Đặt tên gì cho một phương thức trả về boolean?

Lưu ý cuối cùng - sau "Tell Don't Ask", rất nhiều hàm trả về true / false sẽ biến mất và thay vì hỏi một đối tượng về trạng thái của nó, bạn yêu cầu đối tượng làm điều gì đó, điều này có thể làm theo cách khác cách dựa trên trạng thái của nó.


2
> Suppose you had a function called Exists() which causes the object to existĐó đã là một vấn đề. Phương thức như vậy phải là một động từ, như Create. Ít nhất là như vậy Exist, nhưng "tồn tại" như một động từ hiếm khi được sử dụng. It's not clear if ExistsInDatabase is checking whether it does exist, or setting the fact that it does exist.Nó rất rõ ràng. Tôi khẳng định rằng hầu hết các nhà phát triển sẽ ngạc nhiên nếu điều đó làm bất cứ điều gì khác ngoài việc chỉ trả về một boolean.
RJFalconer,

@RJFalconer Most developerslà chìa khóa cho câu của bạn ở đó. Tôi sẽ nói all developerssẽ rất ngạc nhiên nếu CheckExists()làm bất cứ điều gì khác hơn là kiểm tra một cái gì đó tồn tại. Đó không phải Exists()là một cái tên khủng khiếp, chỉ là đó CheckExists()là một cái tên hay hơn , và câu hỏi này được đặt ra, như một nguyên tắc chung, cách đặt tên tốt nhất là gì? Câu trả lời là hãy xử lý nó giống như bất kỳ hàm nào khác, bắt đầu tên bằng một động từ và không sử dụng một mẫu khác chỉ vì nó trả về một boolean.
Michael Parker

Có, câu hỏi là về cách đặt tên tốt nhất NHƯNG cho các phương thức boolean. Các phương thức Bool là duy nhất và có tên chung - vị từ. Bạn không nên coi chúng như các chức năng khác. Đặt một động từ cùng với câu hỏi trong tên phương thức boolean là thừa. Và nó có tác động tiêu cực đến khả năng đọc mã. Đặt tên các phương pháp boolean dưới dạng câu hỏi, không có bất kỳ động từ nào được chấp nhận là phương pháp tốt nhất trong ngành. Ví dụ: docs.microsoft.com/en-us/dotnet/api/system.io.file.exists developer.android.com/reference/java/io/File#exists ()
Almir

@Almir File.Exists là một cách gọi cực kỳ cũ (ít nhất là dot net 1.1) và không phải là một ví dụ điển hình về các tiêu chuẩn khả năng đọc hiện đại. Nhìn vào chấm hiện đại API lõi ròng cho các ví dụ hiện đại hơn về cách Microsoft đồng ý: github.com/dotnet/sdk , một số ví dụ ngẫu nhiên liên kết liên kết liên kết
Michael Parker

15

Mục tiêu cho tính dễ đọc phải luôn là viết mã gần với ngôn ngữ tự nhiên nhất có thể. Vì vậy, trong trường hợp này, userExistscó vẻ là sự lựa chọn tốt nhất. Ví dụ, việc sử dụng tiền tố "is" có thể đúng trong các tình huống khác isProcessingComplete.


1
Đối với ví dụ thứ hai của bạn, có ProcessingIsCompletegần với ngôn ngữ tự nhiên hơn không? Ví dụ: if (ProcessingIsComplete ())
Yang

9

Tôi sẽ sử dụng userExists () vì 1) nó có ý nghĩa trong ngôn ngữ tự nhiên và 2) nó tuân theo các quy ước của các API mà tôi đã thấy.

Để xem nó có hợp lý trong ngôn ngữ tự nhiên hay không, hãy đọc to. "Nếu người dùng tồn tại" nghe giống một cụm từ tiếng Anh hợp lệ hơn là "nếu người dùng tồn tại" hoặc "nếu người dùng tồn tại". "Nếu người dùng tồn tại" sẽ tốt hơn, nhưng "cái" có thể là thừa trong tên phương thức.

Để xem liệu một tệp có tồn tại trong Java SE 6 hay không, bạn sẽ sử dụng File.exists () . Điều này có vẻ như nó sẽ giống trong phiên bản 7 . C # sử dụng cùng một quy ước , cũng như PythonRuby . Hy vọng rằng đây là một bộ sưu tập đủ đa dạng để gọi đây là một câu trả lời bất khả tri về ngôn ngữ. Nói chung, tôi sẽ sử dụng các phương pháp đặt tên để phù hợp với API ngôn ngữ của bạn.


5

Có những điều cần xem xét mà tôi nghĩ đã bị bỏ sót bởi một số câu trả lời khác ở đây

  1. Nó phụ thuộc nếu đây là một phương thức lớp C ++ hay một hàm C. Nếu đây là một phương thức thì nó có thể sẽ được gọi if (user.exists()) { ... }hoặc if (user.isExisting()) { ... }
    không if (user_exists(&user)). Đây là lý do đằng sau các tiêu chuẩn mã hóa rằng các phương thức bool phải bắt đầu bằng một động từ vì chúng sẽ đọc giống như một câu khi đối tượng ở trước mặt chúng.

  2. Thật không may, rất nhiều hàm C cũ trả về 0 cho thành công và khác 0 cho thất bại, vì vậy có thể khó xác định kiểu đang được sử dụng trừ khi bạn làm theo tất cả các hàm bool bắt đầu bằng động từ hoặc luôn so sánh với true như vậy if (true == user_exists(&user))


5

Quy tắc đơn giản của tôi cho câu hỏi này là:

Nếu phương thức boolean đã CÓ một động từ, đừng thêm một động từ. Nếu không, hãy xem xét nó. Vài ví dụ:

$user->exists()
$user->loggedIn()
$user->isGuest() // "is" added

2

Hoàn toàn chủ quan.

Tôi thích hơn userExists(...)vì sau đó các câu lệnh như thế này đọc tốt hơn:

if ( userExists( ... ) )

hoặc là

while ( userExists( ... ) )

1

Trong trường hợp cụ thể này, ví dụ đầu tiên là tiếng Anh kinh khủng đến mức khiến tôi nhăn mặt.

Tôi có lẽ sẽ chọn số ba vì âm thanh của nó khi đọc nó trong câu lệnh if. "Nếu người dùng tồn tại" nghe hay hơn "Nếu người dùng tồn tại".

Điều này giả định rằng nó sẽ được sử dụng trong các bài kiểm tra câu lệnh if tất nhiên ...


1

Tôi thích bất kỳ cái nào trong số này:

userExists(...)
isUserNameTaken(...)
User.exists(...)
User.lookup(...) != null

0

Tên phương thức phục vụ cho việc dễ đọc, chỉ những tên phù hợp với toàn bộ mã của bạn sẽ là tốt nhất mà hầu hết các trường hợp nó bắt đầu với các điều kiện do đó subjectPredicate tuân theo cấu trúc câu tự nhiên.


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.