Các phương thức trả về boolean nên được đặt tên theo một câu hỏi hoặc một khẳng định? [đóng cửa]


10

Nhiều quy ước đặt tên khuyến nghị rằng các phương thức trả về boolean (còn được gọi là phương thức vị ngữ ) nên được đặt tên theo một câu hỏi . Câu hỏi của tôi là: không thực sự có nghĩa là các phương pháp nên được đặt tên theo một khẳng định ?

Sự khác biệt có thể là tinh tế, nhưng bạn kết thúc với các tên khác nhau trong một số trường hợp:

  • câu hỏi : is_pixel_transparent (...)
  • khẳng định : pixel_is_transparent (...)

Đôi khi, điều này làm cho không có sự khác biệt và phrasing là như nhau:

  • câu hỏi : end_of_file (...)
  • khẳng định : end_of_file (...)

Bên cạnh đó, có vẻ như hầu hết thời gian, những gì mọi người gọi là "câu hỏi" thực sự là những lời khẳng định .

  • key_exists (...) -> đây không phải là một câu hỏi, đây là một khẳng định.
    Ví dụ sử dụng: if (key_exists (...)) ...
  • mảng_contains_element (...) -> đây không phải là một câu hỏi, đây là một khẳng định.
    Ví dụ sử dụng: if (Array_contains_element (...)) ...

Vì vậy, để đặt lại câu hỏi, tất cả mọi người có nghĩa là khẳng định khi họ nói câu hỏi ?


3
không phải tất cả những điều bạn gọi là xác nhận sẽ trở thành câu hỏi khi thêm dấu hỏi? Key_Exists?
Pieter B

1
"Jon Skeet thật tuyệt vời" là một khẳng định. 'Jon Skeet có tuyệt vời không?' là một câu hỏi Thấy sự khác biệt. Thấy sự khác biệt?
Steven A. Lowe

@Pieter, không, không đúng tiếng Anh. Các dấu hỏi làm cho một câu một câu hỏi?
rick

@Steven, tôi nghĩ ví dụ đầu tiên của tôi đề cập đến nửa đầu nhận xét của bạn và ví dụ thứ hai là nửa sau của bình luận. Tôi có thiếu thứ gì không?
rick

@rick: một xác nhận phải đúng, nếu không chương trình ở trạng thái không xác định / lỗi. Một câu hỏi có thể đúng hoặc không đúng. Tôi nghĩ về nó như kiểm soát thất bại so với kiểm soát dòng chảy.
Steven A. Lowe

Câu trả lời:


13

Điểm của quy ước đặt tên là không làm cho mã của bạn đọc giống như tiếng Anh, vì vậy bạn có thể phân tích quá mức một chút. Trong nhiều ngôn ngữ, theo thông lệ, tiền tố là một phương thức hoặc hàm trả về kết quả boolean hoặc biến boolean với is, khi nó có ý nghĩa. Có những truyền thống khác (ví dụ Lisp, Ruby), trong đó một hậu tố ?được sử dụng thay thế. (Một truyền thống Lisp cũ là hậu tố -pcho vị ngữ ).

  • Trong ví dụ về độ trong suốt pixel của bạn, is_transparentnên là một phương thức của đối tượng pixel. Nếu bạn đang ở một ngôn ngữ không có đối tượng, nhưng muốn mô phỏng kiểu OOP, thì loại thường sẽ là tiền tố : Pixel_is_transparent. Lưu ý rằng tiền tố ischỉ được sử dụng để làm nổi bật bản chất boolean của phương thức này; nó đã được ngụ ý bởi lệnh gọi phương thức (cũng pixel.transparenthoạt động, nhưng điều này có thể trở nên quá mơ hồ với các tên thuộc tính khác).
  • Để kiểm tra EOF, một phương thức có thể được đặt tên at_eof. Điều này diễn giải phần cuối của tệp là một vị trí trong luồng, trong khi đó stream.is_eofcũng sẽ hoạt động: ở đây, EOF là một trạng thái cụ thể.
  • Để kiểm tra xem một mục tồn tại, collection.exists(key)sẽ tốt hơn.
  • array_contains_elementkhông phải là một tên phương thức tốt, vì nó chứa một loại và không cần thiết element. Tốt hơn : array.contains(elem).

Tất cả các tên tôi đề xuất là xác nhận, hoặc chính xác hơn: vị ngữ. Sử dụng các câu hỏi không có ý nghĩa ngôn ngữ nào khi các vị từ này được sử dụng trong bối cảnh if-then- other. Từ này khẳng định, có lẽ không tối ưu ở đây, vì nó được sử dụng để mô tả việc kiểm tra các bất biến trong nhiều ngôn ngữ. Từ vị ngữ sẽ tốt hơn: một tuyên bố rằng là đúng hoặc sai. Một tuyên bố được đặt ra như thể nó là sự thật, không phải là một câu hỏi. Câu lệnh 1 ∈ {}- Lời nói 1là phần tử của tập hợp trống, hoặc tập hợp trống chứa tập tin 1là một câu lệnh sai. Câu hỏi là bộ trống có chứa số 1 không? có thể được trả lời hoặc không, nhưng nó không đúng hay sai.


1
+1 cho ghi chú về cách thuật ngữ "khẳng định" không phải là thuật ngữ phù hợp để sử dụng ở đây vì có thể nhầm lẫn.
Pieter B
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.