Câu hỏi Phương thức đặt tên phương thức Boolean


Câu hỏi đơn giản, từ một quan điểm có thể đọc được, bạn muốn sử dụng tên phương thức nào cho một phương thức boolean:

public boolean isUserExist(...)

hoặc là:

public boolean doesUserExist(...)

hoặc là:

public boolean userExists(...)

76
2017-10-14 14:42


gốc


người đầu tiên nghe như isBabbyFormed - Will
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 đến với tâm trí. Ngoài ra borderline chủ quan. - Jed Smith
Chủ quan - đủ công bằng - Yuval Adam
Hoàn toàn chủ quan. getUserExistence, userIsNotExtinct, userHasExistentialState v.v ... - dreamlax


Các câu trả lời:


public boolean userExists(...)

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

if userExists ...

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


69
2017-10-14 14:45



"làm cho {method call} của bạn giống như tiếng Anh tự nhiên" giống như một bài kiểm tra tuyệt vời cho đặt tên hợp lý trên bảng. làm rõ suy nghĩ của tôi về vấn đề này - cảm ơn! - cori
Mặt khác, trong sự cô lập hoặc khi không ngay lập tức theo dõi "if", thì "userExists ()" giống như một tuyên bố của sự kiện, chứ không phải là câu hỏi mà nó được dự định là. Không giống như "IsUserExisting ()" hoặc "DoesUserExist ()", tuân theo các quy tắc thứ tự từ tiếng Anh tự nhiên cho các câu hỏi thẳng về phía trước. - Oskar Berggren
.. nhưng tại sao các phương thức trả về một bool được sử dụng bên ngoài một if? Nếu chúng có tác dụng phụ thậm chí còn nhiều mùi hơn. if IsUserExisting() và if DoesUserExist() trông khủng khiếp và nên tránh. - RJFalconer


tôi sẽ nói userExistsbởi vì 90% thời gian mã gọi của tôi sẽ trông như sau:

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

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

if isUserExist và if doesUserExist có vẻ dư thừa.


31
2017-10-14 14:46



+1 cho khả năng đọc - Abram Simon


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


14
2017-10-14 14:53





Cẩn thận với hy sinh trong trẻo trong khi đuổi theo khả năng đọc.

Mặc dầu 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 với một mẫu trình xây dựng (hoặc bất kỳ lớp nào mà bạn có thể thiết lập trạng thái):

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

Nó không rõ ràng nếu ExistsInDatabase đang kiểm tra xem nó có tồn tại không, hoặc thiết lập sự thật là nó tồn tại. Bạn sẽ không viết if (user.Age()) hoặc là if (user.Name()) không có bất kỳ giá trị so sánh nào, vậy tại sao if (user.Exists()) một ý tưởng tốt hoàn toàn bởi vì thuộc tính / chức năng đó thuộc loại boolean và bạn có thể đổi tên hàm / thuộc tính để đọc nhiều hơn như tiếng Anh tự nhiên? Có phải là xấu như vậy để làm theo các mô hình tương tự, chúng tôi sử dụng cho các loại khác hơn là booleans?

Với các loại khác, một if câ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) ...

Mà đọc là "nếu dấu chấm của người dùng có tuổi 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 cho rằng object.verb không bao giờ giống như tiếng Anh tự nhiên và điều này chỉ đơn giản là một khía cạnh cơ bản của lập trình hiện đại (cho nhiều ngôn ngữ chính thống). Các lập trình viên nói chung không có vấn đề gì trong việc hiểu được câu nói trên, vì vậy điều gì sau đây tồi tệ hơn?

if (user.CheckExists() == true)

Thường được rút ngắn xuống

if (user.CheckExists())

Tiếp theo là bước gây tử vong

if (user.Exists())

Trong khi nó đã được nói rằng "mã được đọc 10x thường xuyên hơn so với văn bản", nó cũng rất quan trọng là 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 - lỗi sẽ rõ ràng hơn nhiều nếu đọc mã if (user.SetExists()) ví dụ.

Ngoài ra, user.Exists () có thể dễ dàng chứa mã phức tạp hoặc không hiệu quả, vòng vấp tới cơ sở dữ liệu để kiểm tra điều gì đó. user.CheckExists () làm cho nó rõ ràng rằng hàm thực hiện đ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 cho phương thức trả về boolean là gì?

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


11
2017-09-09 15:59



> Suppose you had a function called Exists() which causes the object to exist Đó là một vấn đề. Một phương pháp như vậy nên là một động từ, như Create. Ít nhất nó sẽ là 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 sẽ 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 hơn là chỉ trả lại một boolean. - RJFalconer
@RJFalconer Most developers là chìa khóa cho câu của bạn ở đó. tôi sẽ nói all developers sẽ 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 vậy Exists() là một tên khủng khiếp, chỉ là CheckExists() là một tốt hơn và câu hỏi này đặt ra, như một nguyên tắc chung, mô hình đặt tên tốt nhất là gì? Câu trả lời là xử lý nó giống như bất kỳ hàm nào khác, bắt đầu tên bằng động từ, và không sử dụng một mẫu khác chỉ vì nó trả về một boolean. - Michael Parker


Tôi sẽ đi với 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ó ý nghĩa trong ngôn ngữ tự nhiên hay không, hãy đọc to. "Nếu người dùng tồn tại", âm thanh giống như cụm từ tiếng Anh hợp lệ hơn "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 "the" có lẽ là thừa trong một 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 (). Có vẻ như nó sẽ giống nhau trong phiên bản 7. C # sử dụng cùng một quy ước, làm giống như Python và Ruby. 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ẽ phụ với các phương pháp đặt tên phù hợp với API ngôn ngữ của bạn.


8
2018-01-15 03:19





Có những điều cần lưu ý rằng tôi nghĩ rằng đã bị bỏ lỡ bởi một số câu trả lời khác ở đây

  1. Nó phụ thuộc nếu đây là phương thức lớp C ++ hoặc hàm C. Nếu đây là một phương pháp thì nó có thể sẽ được gọi if (user.exists()) { ... } hoặc là if (user.isExisting()) { ... }
    không phải if (user_exists(&user)) . Đây là lý do đằng sau các tiêu chuẩn mã hóa cho biết các phương thức bool sẽ bắt đầu bằng một động từ vì chúng sẽ đọc như một câu khi đối tượng ở phía trước 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 không cho thất bại nên khó có thể xác định kiểu đượ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 luôn so sánh với đúng như vậy if (true == user_exists(&user))


5
2017-09-22 04:56





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ó độ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
2017-07-07 19:56