Konvensi penamaan untuk metode java yang mengembalikan boolean (Tanpa tanda tanya)

94

Saya suka menggunakan tanda tanya di akhir nama metode / fungsi dalam bahasa lain. Java tidak mengizinkan saya melakukan ini. Sebagai solusinya, bagaimana lagi saya bisa memberi nama metode pengembalian boolean di Java? Menggunakan is, has, should, candi depan sebuah suara metode apa-apa untuk beberapa kasus. Apakah ada cara yang lebih baik untuk menyebutkan metode seperti itu?

Misalnya, createFreshSnapshot?

letronje
sumber
2
Bahasa apa yang memungkinkan ?dalam nama metode?
SLaks
11
@SLaks, Scheme, Ruby ...
Skilldrick
dalam skema, kami selalu meletakkan pdi akhir nama metode
Erick Robertson
@Erick: tidak selalu, tetapi "p" adalah salah satu cara standar untuk menentukan predikat
Jason S
kami = kelas skema sarjana saya selalu melakukannya. Saya tidak akan pernah menggunakan konvensi ini di Jawa.
Erick Robertson

Jawaban:

123

Ketentuannya adalah mengajukan pertanyaan atas nama.

Berikut beberapa contoh yang dapat ditemukan di JDK:

isEmpty()

hasChildren()

Dengan begitu, nama-nama itu dibaca seolah-olah ada tanda tanya di akhir.

Apakah Koleksi tersebut kosong?
Apakah Node ini memiliki anak?

Dan, kemudian, trueberarti ya, dan falseberarti tidak.

Atau, Anda bisa membacanya seperti pernyataan:

Koleksi kosong.
Node tersebut memiliki anak

Catatan:
Terkadang Anda mungkin ingin memberi nama metode seperti createFreshSnapshot?. Tanpa tanda tanya, namanya menyiratkan bahwa metode tersebut harus membuat snapshot, daripada memeriksa untuk melihat apakah diperlukan.

Dalam hal ini Anda harus memikirkan kembali apa yang sebenarnya Anda tanyakan. Sesuatu seperti isSnapshotExpiredadalah nama yang jauh lebih baik, dan menyampaikan apa yang akan diberitahukan oleh metode saat dipanggil. Mengikuti pola seperti ini juga dapat membantu fungsi Anda lebih murni dan tanpa efek samping.

Jika Anda melakukan pencarian Google untuk isEmpty()di API Java, Anda mendapatkan banyak hasil.

jjnguy
sumber
bagaimana dengan createFreshSnapshot?
letronje
4
@letr, baiklah, saya mungkin akan mengganti namanya menjadi menyala isSnapshotExpiredatau sesuatu seperti itu. (berdasarkan kriteria Anda)
jjnguy
8
Saya mengatasi masalah 'createFrshSnapshot' dengan menggunakan kata 'should' - yaitu "shouldCreateFreshSnapshot ()" (meskipun dalam hal ini isSnapshotExpired () lebih baik)
DJClayworth
1
Saya memeriksa untuk melihat apakah pesan detak jantung harus dikirim dengan suatu shouldHeartbeat()metode.
Erick Robertson
Mengapa berpikir begitu isEmpty()dan hasChildren()merupakan pertanyaan , dan bukan pernyataan ? Ini sebenarnya terbaca sedikit lebih baik dalam bahasa Inggris jika Anda menganggap nama-nama itu sebagai pernyataan atau predikat.
rick
29

Jika Anda ingin kelas Anda kompatibel dengan spesifikasi Java Beans , sehingga alat yang memanfaatkan refleksi (misalnya JavaBuilders , JGoodies Binding ) dapat mengenali getter boolean, baik yang digunakan getXXXX()atau isXXXX()sebagai nama metode. Dari spesifikasi Kacang Jawa:

8.3.2 Properti Boolean

Selain itu, untuk properti boolean, kami mengizinkan metode pengambil untuk mencocokkan pola:

public boolean is< PropertyName > ();

Metode "is < PropertyName >" ini dapat diberikan sebagai pengganti metode "get < PropertyName >", atau dapat diberikan sebagai tambahan untuk metode "get < PropertyName >". Dalam kedua kasus, jika metode "is < PropertyName >" ada untuk properti boolean, maka kita akan menggunakan metode "is < PropertyName >" untuk membaca nilai properti. Contoh properti boolean mungkin:

public boolean isMarsupial();
public void setMarsupial(boolean m);
Jason S
sumber
Ini membingungkan ketika Anda mengatakan public boolean is<PropertyName>(); Ini terlihat seperti generik.
Erick Robertson
Hei, saya hanya mengutip spesifikasinya. Saya akan mencetak miring sesuai spesifikasi.
Jason S
4
Saya tidak peduli tentang kompatibilitas kacang Java, saya hanya ingin nama metode saya terdengar benar :)
letronje
4
Meskipun Anda tidak peduli tentang kompatibilitas Java, konvensi penamaan tetap layak diikuti, karena telah berkembang jauh di luar cakupan origina 'kacang' yang dikonfigurasi dalam IDE. Misalnya jika Anda menggunakan isEmpty sebagai nama metode, Anda dapat memanggil metode ini dari JSP menggunakan object.empty, namun Anda tidak dapat memanggil metode dengan awalan lain, sehingga Anda tidak dapat menggunakan object.children untuk memanggil object.hasChildren (). Jadi JSP dan EL (Expression Language) memungkinkan Anda mengakses Javabeans Properties. Kemenangan besar jika Anda bertanya kepada saya.
Stijn de Witt
JavaBeans sangat spesifik, terima kasih telah mengingatkannya. Saya sering bertanya-tanya dan cenderung berpikir saya terjebak dengan awalan 'ada', tetapi sebenarnya tidak sama sekali.
Snicolas
26

Saya ingin memposting tautan ini karena dapat membantu lebih jauh untuk peeps yang memeriksa jawaban ini dan mencari konvensi gaya java lainnya

Panduan Gaya Pemrograman Java

Item "2.13 adalah awalan yang harus digunakan untuk variabel dan metode boolean." secara khusus relevan dan menyarankan awalan is .

Panduan gaya selanjutnya menyarankan:

Ada beberapa alternatif untuk prefiks is yang lebih cocok dalam beberapa situasi. Ini adalah awalan has , can dan should :

boolean hasLicense();
boolean canEvaluate();
boolean shouldAbort = false;

Jika Anda mengikuti Panduan, saya yakin metode yang sesuai akan dinamai:

shouldCreateFreshSnapshot()
kommradHomer
sumber
2
FYI, ada pedoman hak cipta Layanan Perangkat Lunak Geoteknik. Konon, mereka merujuk sumber di bagian bawah untuk menunjukkan bahwa mereka sah.
Donal Lafferty
11

Untuk metode yang mungkin gagal, yaitu Anda menentukan boolean sebagai tipe kembalian, saya akan menggunakan awalan try:

if (tryCreateFreshSnapshot())
{
  // ...
}

Untuk semua kasus lain gunakan awalan seperti is.. has.. was.. can.. allows....

codymanix.dll
sumber
15
Tetapi mencoba tidak menyampaikan bahwa itu adalah pertanyaan (memiliki nilai balik).
Steve Kuo
Jangan pernah mengembalikan boolean untuk menunjukkan apakah suatu metode gagal atau tidak. Jika metode tersebut gagal, lemparkan pengecualian. Bayangkan metode ini gagal dan Anda mendapatkan kesalahan, bagaimana Anda menentukan apa yang sebenarnya salah?
Wouter van Koppen
5

Standar yang digunakan adalah 'is' atau 'has' sebagai awalan. Misalnya isValid, hasChildren.

BillThor
sumber
2

isadalah salah satu yang saya temui lebih dari yang lain. Apapun yang masuk akal dalam situasi saat ini adalah pilihan terbaik.

Skilldrick
sumber
0

Saya ingin menunjukkan pandangan berbeda tentang konvensi penamaan umum ini , misalnya:

lihat java.util.Set :boolean add​(E e)

dimana alasannya adalah:

lakukan beberapa proses kemudian laporkan apakah berhasil atau tidak .

Meskipun returnmemang booleannama metode harus menunjukkan pemrosesan ke selesai, bukan jenis hasil (boolean untuk contoh ini).

createFreshSnapshotContoh Anda bagi saya lebih terkait dengan sudut pandang ini karena tampaknya berarti ini: buat snapshot baru lalu laporkan apakah operasi pembuatan berhasil. Mempertimbangkan alasan ini, nama tersebut createFreshSnapshottampaknya yang terbaik untuk situasi Anda.

adrhc
sumber
1
Saya tidak yakin mengapa Anda tidak disukai, saya setuju. Meskipun saya menghindari menggunakannya, karena ini sama sekali tidak semantik, ini adalah konvensi yang digunakan oleh banyak API java internal.
Kamil Bęben
1
Saya kira karena awalnya saya hanya menulis "Set: boolean add (E e)" sehingga orang tidak memperhatikan bahwa itu tentang java.util.Set yang terkenal; atau mungkin karena bahasa Inggris saya sangat buruk: D. Terima kasih atas upvote-nya :)
adrhc