Getter boolean Java "adalah" vs "adalah"

92

Saya tahu bahwa konvensi di Java untuk getter boolean menyertakan awalan "adalah".

isEnabled
isStoreOpen

Tetapi bagaimana jika subjeknya jamak? Artinya, bagaimana jika alih-alih ingin tahu apakah sebuah toko buka, saya ingin tahu apakah semua toko buka?

isStoresOpen() tidak masuk akal dalam bahasa Inggris.

Saya tergoda untuk menulis getter seperti:

areStoresOpen
areDogsCute
areCatsFuzzy

Dan saya pikir itu akan masuk akal, tapi saya telah diberitahu oleh orang lain bahwa saya hanya harus menyedot itu dan meninggalkan subjek kata kerja perjanjian dan penggunaan isStoresOpen, isDogsCute, isCatsFuzzy.

Bagaimanapun, apa yang harus saya lakukan untuk pengambil boolean yang beroperasi pada subjek jamak?

kodai
sumber
3
Saya tidak pernah melihat sebelumnya seorang are*()getter.
rekire
21
Saya selalu menulis are*()getter jika secara tata bahasa benar.
Roddy of the Frozen Peas
2
Jika objek Anda adalah kacang, saya pikir Anda harus tetap berpegang pada salah satu isatau has...
assylias
4
jika Anda menggunakan are * () getter maka itu harus mengembalikan boolean [] dalam banyak kasus, saya kira.
Juvanis
2
Pertanyaan yang sangat bagus. Saya sendiri agak heran. Seperti yang telah ditunjukkan oleh banyak jawaban, kebanyakan framework, IDE, dan apa pun yang mengandalkan konvensi yang saya temui menggunakan pola "get" / "set" / "is". Bahkan jika ini bukan masalah dalam aplikasi Anda, saya akan mengikuti konvensi itu terlepas - kode Anda akan jauh lebih mudah diikuti (bahkan oleh Anda) jika Anda mempertahankan konvensi penamaan yang konsisten (bahkan jika itu tidak terdengar aneh secara tata bahasa di kali ).
Paul Richter

Jawaban:

58

Saya tidak dapat mengingat dari buku mana ini, tetapi intinya adalah bahwa kode akan dibaca lebih banyak daripada yang tertulis. Menulis agar mudah dibaca.

John
sumber
21
Kode Bersih - Robert Martin
John B
John B: Saya belum membaca buku itu; mungkin saya membaca referensi untuk itu. Buku lain untuk daftarku. :)
Yohanes
8
Tetapi berhati-hatilah agar Anda tidak melangkah terlalu jauh. storesAreOpen()mungkin akan menjadi yang paling gramatikal (karena if(storesAreOpen())), tetapi bagian boolean dari nama tersebut sekarang tersembunyi di tengah nama metode, yang melanggar konvensi Java dan kode yang dapat dibaca.
Izkata
3
Dia menjawab pertanyaan itu dengan cara yang sangat umum. Memang benar dia tidak membahas secara spesifik, tetapi ini adalah jawabannya. Ini mungkin tampak basi, tetapi ada nilainya (setidaknya 24 orang berpikir demikian).
George Stocker
4
untuk memperjelas jawaban saya akan menambahkan komentar bahwa areStoresOpen () adalah pilihan yang baik di sini.
kiedysktos
96

Bagaimana kalau memiliki bahasa Inggris yang cukup baik dan mengikuti standar Java:

isEveryStoreOpen() atau isEachCatCute()

Jika ragu dengan kata yang tepat, saya selalu ingin mempelajari tesaurus.

satur9nine
sumber
19
+1, ini dengan jelas menyampaikan apakah nilai yang dikembalikan berarti isEveryStoreOpen () atau isAnyStoreOpen () tidak seperti isStoresOpen () yang ambigu.
Imre
5
+1 Ini harus menjadi jawaban yang diterima! Makes merasakan gramatikal sambil menjaga Java booleans iskonvensi awalan. Selain itu, ini memberikan sedikit info tambahan yang akan sangat berguna bagi penutur bahasa Inggris non-asli yang kebetulan merupakan pengelola basis kode.
higuaro
1
Jawaban ini mengubah hidup saya! Dan itu harus menjadi jawaban yang diterima.
Marcel Blanck
34

Ketentuannya adalah mengawali metode pengambil dengan "adalah" bukan variale itu sendiri.

misalnya

private boolean enabled;

public boolean isEnabled() {
    return enabled;
}

dan

private boolean storesOpen;

public boolean isStoresOpen() {
    return storesOpen;
}

isStoresOpen () tidak masuk akal dalam bahasa Inggris.

Ini mungkin tidak masuk akal secara gramatikal, tetapi mengikuti konvensi dan terlihat cukup mudah dibaca.

Bhesh Gurung
sumber
Jawaban Anda masuk akal, dan saya menghargainya. Saya pikir dari posisi benar / salah yang berwibawa, Anda benar. Saya hanya tidak ingin konvensi yang dimaksudkan untuk membantu kita dengan menjadi jelas, jelas dan mudah dipahami untuk meninggalkan tujuan itu demi menaati aturannya. Tapi Anda benar - begitulah adanya, dan itulah yang saya tanyakan.
kodai
@kodai: Saya pikir itu tidak boleh dianggap sebagai aturan, tetapi hanya konvensi. Tetapi saya percaya sementara, menulis kode tidak mengikuti konvensi, jika tidak diperlukan, membuat kode dapat dibaca adalah cara yang harus dilakukan.
Bhesh Gurung
18

Spesifikasi Java Bean mengatakan untuk digunakan getuntuk getter kecuali jika itu booleandigunakan is. aretidak standar dan tidak akan dikenali oleh apa pun yang mengharapkan penamaan Bean standar.

Steve Kuo
sumber
17

Banyak alat yang diharapkan isatau getdan tidak mungkin dikenali are.

Cobalah menyusun ulang kata-kata tersebut, seperti getDogsAreFuzzy()atau getStoresAreOpen()atau hal-hal seperti itu untuk kompatibilitas dan konvensi yang lebih baik.

Kevin Rubin
sumber
Iya. Alat seperti utilitas kacang mengandalkan kata tersebut untuk menemukan getter boolean.
nalply
4

- isEnabled() juga bisa ditulis seperti getEnabled()pada Java naming conventions.

- Ini hanya kebiasaan yang baik untuk mengikuti konvensi penamaan, membantu saat Anda bekerja Java Beans.

Kumar Vivek Mitra
sumber
3

Secara umum saya pikir kode harus dapat dibaca semudah mungkin sehingga sebuah metode hampir dapat dibaca sebagai sebuah paragraf (seperti yang didukung oleh Clean Code). Oleh karena itu, saya akan memberi nama metode untuk membunyikan / membaca semudah mungkin dan mengikuti aturan grammer are. Dengan IDE modern, mudah untuk menemukan metode tanpa mencari get/ is.

Namun, Kumar membuat poin bagus tentang kacang. Banyak alat yang hanya akan mencari get/ is. Dalam hal ini saya mungkin mempertimbangkan untuk memiliki kedua metode tersebut. Satu untuk kemudahan membaca dan satu lagi untuk penggunaan alat.

John B
sumber
3

Anda menulis di bahasa apa : Inggris atau Jawa ?

Ketika saya membaca kode Java, saya berharap semuanya ada di sana, meminta saya untuk mencari kedua getter, dengan awalan is dan are , akan lebih rumit daripada mencari hanya satu awalan.

Namun di sisi lain, ketika saya membaca koran di pagi hari, saya tidak mencari apa-apa, jadi Anda bisa menulis dalam bahasa Inggris yang lebih tradisional.

kembali 0;

Ilya Gazman
sumber
3

Dalam pertanyaan Anda, Anda secara eksplisit bertanya tentang getter. Seorang getter mengembalikan beberapa informasi tentang satu instance kelas Anda. Misalnya Anda punya kelas Store. Sekarang, isStoreOpenadalah nama metode yang sangat bagus untuk seorang pengambil.

Selanjutnya, Anda menyebutkan metode yang memeriksa apakah semua toko buka. Metode ini sama sekali bukan pengambil, karena tidak mengembalikan informasi tentang satu contoh tetapi untuk semua. Tentu saja kecuali ada kelas Stores. Jika demikian, Anda harus memikirkan kembali desain Anda, karena Java sudah memiliki cara untuk menyimpan sejumlah instance, misalnya array atau koleksi, jadi Anda tidak perlu menulis kelas tambahan.

Jika tidak demikian, maka nama metode ini baik-baik saja. Sebuah alternatif mungkin hanya allStoresOpentanpa 'ada'.

TL; DR: Jika Anda berurusan dengan banyak contoh, itu bukan pengambil. Jika ya, desain Anda buruk.

Kirill Rakhman
sumber
2

Sejujurnya saya akan mengatakan pasti melupakan are*dan tetap dengan is*. Pikirkan "is"sebagai makna variabel dan buat nama yang lebih baik jika memungkinkan.

Saya akan mengatakan isStoresOpen tidak terdengar terlalu buruk, tetapi Anda dapat membuat isStoresAreOpen jika itu terdengar lebih baik untuk Anda.

Tapi ide umum saya adalah berpegang pada konvensi. Yang menggunakan "get" untuk getter dan "is" untuk tipe boolean. Secara pribadi saya pikir menggunakan "adalah" terkadang sudah bermasalah. Ya - memang terlihat bagus dalam kondisi "jika", tetapi terkadang saya hanya menulis "get" saat membuat kode dan memeriksa daftar tarik-turun untuk variabel yang saya butuhkan dan mulai bertanya-tanya apa yang salah dan mengapa saya tidak dapat menemukannya, lalu saya menyadarinya dimulai dengan "adalah" ...

Arturas M
sumber
1

Dalam pemrograman berorientasi objek, ini seharusnya jarang, jika pernah, terjadi sejak Storeatau Catatau apa yang Anda harus menjadi kelas terpisah, dengan metode isOpen()atau sendiri isFuzzy(). Jika Anda memiliki tipe yang lebih tinggi, pertimbangkan untuk membagi ke tingkat yang lebih atomik yang sebenarnya Anda gunakan. Secara umum, objek tidak boleh jamak pada level terendah.

asteri
sumber
1

isStoresOpen () di StoresOpen ini sepertinya jamak,

Ketika Anda mengikuti Konvensi Penamaan Java dan Standar Biji Java, mereka memiliki awalan yang telah ditentukan sebelumnya untuk boolean dan jenis lainnya, jadi Anda harus mengikuti Konvensi Penamaan Kacang Java.

Mari kita ke poin Anda Ketika Anda melihat toko Buka seperti dalam bahasa Inggris prospektif, ya sepertinya jamak. Sekali lagi perhatikan kata itu,

Sini

storeOpen berbentuk jamak menurut tata bahasa Inggris,

Hasil dari isStoresOpen bukanlah jamak, melainkan tunggal atau Anda dapat mengatakan itu skalar dalam hal konvensi pemrograman.

Hasilnya adalah boolean, benar atau salah

Tidak seperti pernyataan jamak bahasa Inggris Anda benar atau salah

Bukan larik benar atau salah , atau bukan kumpulan benar atau salah

Jadi, di sini kita dapat mengatakan bahwa, di sini kita prihatin dengan nilai yang dikembalikan dari metode kacang boolean itu, bukan nama yang diberikan ke properti kelas untuk menunjukkan entitas dunia nyata.

Satu hal yang lebih penting adalah, setiap kali properti boolean tersebut digunakan di kelas dan properti tersebut digunakan oleh library yang telah ditentukan sebelumnya dalam kerangka kerja apa pun, maka kerangka kerja dengan awalan use ' is ' untuk mengambil nilai boolean,

mengapa berarti itu tidak jauh lebih pintar dari Anda karena Anda tahu tata bahasa Inggris seperti jamak / tunggal, multiplekser dll ...

Anil Kumar
sumber