Java boolean getters “is” so với “are”


90

Tôi biết rằng quy ước trong Java cho bộ lấy boolean là bao gồm tiền tố "is".

isEnabled
isStoreOpen

Nhưng nếu chủ ngữ là số nhiều thì sao? Đó là, điều gì sẽ xảy ra nếu thay vì muốn biết một cửa hàng có mở cửa hay không, tôi muốn biết liệu tất cả các cửa hàng có mở cửa hay không?

isStoresOpen() không có ý nghĩa trong tiếng Anh.

Tôi bị cám dỗ để viết những câu chuyện như:

areStoresOpen
areDogsCute
areCatsFuzzy

Và tôi nghĩ rằng điều đó sẽ có lý, nhưng tôi đã được những người khác nói rằng tôi nên bỏ qua và từ bỏ sự thỏa thuận và sử dụng động từ chủ ngữ isStoresOpen, isDogsCute, isCatsFuzzy.

Dù sao, tôi nên làm gì đối với bộ lấy boolean hoạt động trên một chủ đề số nhiều?


3
Tôi không bao giờ nhìn thấy trước một are*()getter.
rekire

21
Tôi luôn viết are*()getters nếu chúng đúng ngữ pháp.
Roddy of the Frozen Peas,

2
Nếu đối tượng của bạn là một bean, tôi nghĩ rằng bạn cần phải dính vào một trong hai ishoặc has...
assylias

4
Nếu bạn đang sử dụng are * () getter thì nó sẽ trả về boolean [] trong hầu hết các trường hợp, tôi nghĩ vậy.
Juvanis

2
Câu hỏi rất hay. Tự hỏi điều này bản thân mình, khá một chút. Như rất nhiều câu trả lời đã được chỉ ra, hầu hết các khuôn khổ, IDE và bất kỳ thứ gì dựa trên quy ước mà tôi gặp phải đều sử dụng mẫu "get" / "set" / "is". Ngay cả khi đây không phải là mối quan tâm trong ứng dụng của bạn, tôi sẽ tuân theo quy ước đó bất kể - mã của bạn sẽ dễ tuân theo hơn rất nhiều (ngay cả đối với bạn) nếu bạn duy trì một quy ước đặt tên nhất quán (ngay cả khi nó không có vẻ kỳ quặc về mặt ngữ pháp đôi khi ).
Paul Richter

Câu trả lời:


57

Tôi không thể nhớ cuốn sách này được viết từ cuốn sách nào, nhưng bản chất là mã sẽ được đọc nhiều lần hơn nó được viết. Viết để dễ đọc.


20
Sạch Mã - Robert Martin
John B

8
Nhưng hãy hết sức cẩn thận để không đi quá xa. storesAreOpen()có thể là sai ngữ pháp nhất (vì if(storesAreOpen())), nhưng phần boolean của tên hiện bị ẩn ở giữa tên phương thức, điều này phá vỡ các quy ước Java mã có thể đọc được.
Izkata

108
Tôi không hiểu làm thế nào đây là câu trả lời được chấp nhận. Nó thậm chí không cung cấp một câu trả lời chắc chắn cho câu hỏi.
Tamzin Blake

3
Anh ấy trả lời câu hỏi một cách rất chung chung. Đúng là anh ấy không giải quyết chi tiết cụ thể, nhưng đây là một câu trả lời. Nó có vẻ sáo mòn, nhưng nó có giá trị (ít nhất 24 người nghĩ như vậy).
George Stocker

4
Để làm rõ câu trả lời, tôi sẽ thêm nhận xét rằng areStoresOpen () là một lựa chọn tốt ở đây.
kiedysktos

94

Làm thế nào về việc có đủ tiếng Anh và theo tiêu chuẩn Java:

isEveryStoreOpen() hoặc là isEachCatCute()

Khi nghi ngờ về từ thích hợp, tôi luôn thích đánh vào từ điển đồng nghĩa.


18
+1, điều này truyền đạt rõ ràng liệu giá trị trả về có nghĩa là isEveryStoreOpen () hay isAnyStoreOpen () không giống như isStoresOpen () không rõ ràng.
Imre

4
+1 Đây phải là câu trả lời được chấp nhận! Có ý nghĩa về mặt ngữ pháp trong khi vẫn giữ quy ước tiền tố booleancủa Java is. Thêm vào đó, nó cung cấp một chút thông tin bổ sung sẽ thực sự hữu ích cho những người nói tiếng Anh không phải là bản ngữ mà tình cờ là người duy trì cơ sở mã.
higuaro

Câu trả lời này đã thay đổi cuộc đời tôi! Và nó phải là câu trả lời được chấp nhận.
Marcel Blanck

34

Quy ước là đặt tiền tố phương thức getter với "is" không phải là chính biến thể.

ví dụ

private boolean enabled;

public boolean isEnabled() {
    return enabled;
}

private boolean storesOpen;

public boolean isStoresOpen() {
    return storesOpen;
}

isStoresOpen () không có ý nghĩa trong tiếng Anh.

Nó có thể không có ý nghĩa về mặt ngữ pháp, nhưng nó tuân theo quy ước và trông đủ đọc.


Câu trả lời của bạn có ý nghĩa, và tôi đánh giá cao nó. Tôi nghĩ từ một vị trí có thẩm quyền đúng / sai, bạn đúng. Tôi chỉ không muốn một quy ước nhằm giúp chúng ta bằng cách hiển nhiên, rõ ràng và dễ hiểu từ bỏ mục đích đó vì lợi ích của việc tuân thủ các quy tắc của nó. Nhưng bạn nói đúng - nó là như thế này, và đó là những gì tôi đã hỏi về.
kodai

@kodai: Tôi nghĩ nó không nên được coi là quy tắc, mà chỉ là một quy ước. Nhưng tôi tin rằng, viết mã không tuân theo quy ước, nếu nó không được yêu cầu, để làm cho mã có thể đọc được là cách tốt nhất.
Bhesh Gurung

18

Đặc tả Java Bean cho biết sử dụng getcho getters trừ khi nó booleansử dụng sau đó is. arelà không chuẩn và sẽ không được công nhận bởi bất kỳ thứ gì mong đợi đặt tên Bean chuẩn.


17

Rất nhiều công cụ mong đợi ishoặc getvà có thể sẽ không nhận raare .

Hãy thử diễn đạt lại chúng, như getDogsAreFuzzy()hoặc getStoresAreOpen()hoặc những thứ tương tự để tương thích và quy ước tốt hơn.


Đúng. Các công cụ như tiện ích bean đếm trên từ tìm kiếm boolean.
nalply 19/10/12

4

- isEnabled() cũng có thể được viết như getEnabled()trong Java naming conventions.

- Nó chỉ là một thói quen tốt để tuân theo các quy ước đặt tên, giúp đỡ khi bạn đang làm việc với Java Beans.


3

Nói chung, tôi nghĩ rằng mã phải dễ đọc nhất có thể để một phương thức gần như có thể được đọc dưới dạng một đoạn văn (như đã tán thành Clean Code). Do đó, tôi sẽ đặt tên cho phương thức nghe / đọc dễ dàng nhất có thể và tuân theo quy tắc grammer are. Với các IDE hiện đại, thật dễ dàng tìm thấy các phương pháp mà không cần tìm kiếm cụ thể get/is .

Tuy nhiên, Kumar có một quan điểm tốt về đậu. Rất nhiều công cụ sẽ chỉ tìm kiếm get/ is. Trong trường hợp đó, tôi có thể xem xét có cả hai phương pháp. Một để dễ đọc và một để sử dụng công cụ.


3

Bạn viết ngôn ngữ nào tại: Tiếng Anh hoặc Java ?

Khi tôi đang đọc mã Java, tôi mong đợi mọi thứ sẽ ở đó, việc tôi phải tìm kiếm cả tiền tố getters, isare , sẽ phức tạp hơn là chỉ tìm kiếm một tiền tố.

Tuy nhiên, mặt khác, khi tôi đọc báo vào buổi sáng, tôi không tìm kiếm gì cả, vì vậy bạn có thể viết theo cách truyền thống của tiếng Anh.

trả về 0;


3

Trong câu hỏi của bạn, bạn đang hỏi rõ ràng về getters. Một getter trả về một số thông tin về một phiên bản của lớp của bạn. Ví dụ bạn có một lớp học Store. Bây giờ, isStoreOpenlà một tên phương thức hoàn toàn tốt cho getter.

Tiếp theo, bạn đề cập đến một phương pháp kiểm tra xem tất cả các cửa hàng đã mở cửa chưa. Phương thức này hoàn toàn không phải là một getter, bởi vì nó không trả về thông tin về một trường hợp mà là cho tất cả. Tất nhiên trừ khi có lớp họcStores . Nếu đúng như vậy, bạn nên suy nghĩ lại về thiết kế của mình, bởi vì Java đã có sẵn các cách để lưu trữ một số thể hiện, ví dụ mảng hoặc tập hợp, vì vậy bạn không cần phải viết thêm các lớp.

Nếu đây không phải là trường hợp, thì tên phương thức này hoàn toàn ổn. Một sự thay thế có thể chỉ làallStoresOpen không có 'là'.

TL; DR: Nếu bạn đang xử lý nhiều trường hợp, đó không phải là một vấn đề. Nếu đúng như vậy, thiết kế của bạn thật tệ.


2

Thành thật mà nói, tôi sẽ nói chắc chắn rằng hãy quên đi are*và gắn bó với is*. Hãy nghĩ về "is"ý nghĩa của biến và đặt tên tốt hơn nếu có thể.

Tôi muốn nói isStoresOpen nghe không tệ lắm, nhưng bạn có thể tạo isStoresAreOpen nếu điều đó nghe tốt hơn cho bạn.

Nhưng ý tưởng chung của tôi sẽ là tuân theo các quy ước. Trong đó sử dụng "get" cho getters và "is" cho các kiểu boolean. Cá nhân tôi nghĩ rằng việc sử dụng "is" đôi khi đã có vấn đề. Có - nó trông đẹp trong điều kiện "nếu", nhưng đôi khi tôi chỉ viết "get" khi viết mã và kiểm tra danh sách thả xuống cho biến cần thiết của tôi và bắt đầu tự hỏi có gì sai và tại sao tôi không thể tìm thấy nó, sau đó tôi nhận ra nó bắt đầu bằng "is" ...


1

Trong lập trình hướng đối tượng, điều này hiếm khi xảy ra kể từ khi Storehoặc Catbạn phải là một lớp riêng biệt, với phương thức isOpen()hoặc isFuzzy()phương thức riêng của nó . Nếu bạn có loại cao hơn, hãy xem xét chia nhỏ xuống cấp nguyên tử hơn mà bạn đang thực sự sử dụng. Nói chung, các đối tượng không nên ở dạng số nhiều ở mức thấp nhất.


1

isStoresOpen () in this StoresMpen giống như một số nhiều,

Khi bạn tuân theo Quy ước Đặt tên Java và Tiêu chuẩn Đậu Java, chúng đã xác định trước tiền tố cho boolean và kiểu khác, vì vậy bạn nên tuân theo Quy ước Đặt tên Đậu Java.

Hãy đi đến quan điểm của bạn Khi bạn thấy các cửa hàng Mở như trong một tương lai tiếng Anh, vâng, nó trông giống như số nhiều. Một lần nữa hãy quan sát sâu vào từ đó,

Đây

cửa hàng là số nhiều theo ngữ pháp tiếng Anh,

The out come from the isStoresOpen không phải là số nhiều, thay vào đó là số ít hoặc bạn có thể nói nó là vô hướng về mặt quy ước lập trình.

Nó đi ra là boolean, chỉ đúng hoặc sai

Không giống như câu lệnh số nhiều tiếng Anh của bạn true's hoặc false's

Không phải là một mảng đúng hoặc sai , hoặc không phải là một tập hợp đúng hoặc sai

Vì vậy, ở đây chúng ta có thể nói rằng, ở đây chúng ta quan tâm đến giá trị được trả về từ phương thức boolean bean đó, chứ không phải tên được đặt cho thuộc tính của thực thể lớp to trỏ trong thế giới thực.

Một điều quan trọng hơn là, bất cứ khi nào các thuộc tính boolean như vậy được sử dụng trong các lớp và chúng được sử dụng bởi các thư viện được xác định trước trong bất kỳ khung công tác nào, thì khung công tác có tiền tố sử dụng ' ' để truy xuất các giá trị boolean,

tại sao có nghĩa là nó không thông minh hơn bạn nhiều khi bạn biết ngữ pháp tiếng Anh như số nhiều / số ít, bộ ghép kênh, v.v.

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.