Mengandalkan inisialisasi bidang default - adalah gaya pemrograman yang buruk? [Tutup]

20

Saya diberi tautan ke dokumentasi oracle resmi: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

di mana dikatakan:

Nilai dasar

Tidak selalu perlu untuk menetapkan nilai saat bidang dideklarasikan. Kolom yang dideklarasikan tetapi tidak diinisialisasi akan ditetapkan ke default yang wajar oleh kompiler. Secara umum, standar ini akan menjadi nol atau nol, tergantung pada tipe data. Mengandalkan nilai-nilai default seperti itu, bagaimanapun, umumnya dianggap gaya pemrograman yang buruk.

Saya ingin menekankan bagian ini:

Mengandalkan nilai-nilai default seperti itu, bagaimanapun, umumnya dianggap gaya pemrograman yang buruk.

Tapi, oh boy, ini adalah, saya akan mengatakan, bagian mendasar dari spesifikasi bahasa mengetahui bahwa variabel instan memiliki nilai default. Mengapa ini adalah praktik pemrograman yang buruk jika banyak digunakan bahkan dalam kode sumber perpustakaan Java SE?

Andremoniy
sumber
5
Hah. Saya tidak pernah tahu pernyataan itu ada di sana. Saya benar-benar menganggap itu praktik yang baik untuk mengandalkan mereka. private int count = 0;adalah kode yang tidak melakukan apa-apa, dan kode yang tidak melakukan apa-apa berantakan. Ini seperti mengimpor kelas dari java.lang, atau mendeklarasikan kelas dengan extends Object.
VGR
2
... atau memiliki public abstractmetode di antarmuka.
mumpitz
1
apa yang salah dengan abstrak publik?
John Keates
1
Sepotong puzzle mungkin berasal dari C ++. Ini adalah bahasa yang populer, dan penanganan inisialisasi default versus inisialisasi nol adalah sumber bug yang berkelanjutan. Dalam C ++, itu adalah ide buruk langsung untuk mengandalkan default di semua kecuali kasus yang paling luar biasa. Itu mungkin telah bocor ke Jawa secara budaya.
Cort Ammon
@JohnKeates - Java saya agak berkarat, tetapi privatemetode dalam antarmuka tidak masuk akal, dan abstracttersirat.
Scott Smith

Jawaban:

6

Teks yang dikutip adalah:

"Mengandalkan nilai-nilai default seperti itu, umumnya dianggap gaya pemrograman yang buruk."

Secara sinis: "secara umum dianggap bahwa" sering merupakan cara untuk mengatakan bahwa penulis belum mencoba menemukan sumber otoritatif untuk pernyataan yang disajikan.

Dalam hal ini pernyataannya jelas dipertanyakan. Bukti: 5 dari 5 Panduan Gaya Java yang disampling TIDAK mengatakan apa-apa tentang apakah Anda harus atau harus mengandalkan nilai default:

(Catatan, metodologi saya untuk pengambilan sampel adalah melihat 5 hit pencarian Google yang berbeda untuk "panduan gaya java". Kemudian saya mencari setiap dokumen untuk "default". Ini bukan analisis menyeluruh, tetapi berfungsi untuk menjelaskan maksud saya. )


BAIK. Jadi apakah itu benar-benar membantu keterbacaan kode Java?

Ini bisa diperdebatkan.

Di satu sisi, seorang programmer Java pemula yang belum belajar tentang inisialisasi default dapat bingung tentang dari mana nol atau nol berasal. Tetapi jika mereka bersusah payah untuk mencari inisialisasi eksplisit dan menemukan tidak ada, itu cukup untuk membuat mereka membaca tutorial atau buku untuk mencari tahu tentang inisialisasi default. (Kamu akan berharap!)

Di sisi lain, kami biasanya tidak mengharapkan programmer Java pemula untuk mempertahankan basis kode produksi. Untuk programmer Java yang berpengalaman, inisialisasi yang berlebihan tidak meningkatkan keterbacaan. Itu adalah kebisingan (paling-paling).

Menurut saya, satu-satunya hal yang dicapai dengan inisialisasi berlebihan pada suatu bidang adalah memberi sinyal kepada pembaca kode Anda di masa mendatang bahwa Anda telah memikirkan nilai awal. (Seperti yang diungkapkan @GhostCat, inisialisasi default tidak menunjukkan maksud.)

Tetapi sebaliknya jika saya adalah pembaca itu, saya tidak perlu mempercayai pemikiran penulis kode. Jadi nilai "sinyal" ini juga dipertanyakan.


Bagaimana dengan keandalan?

Di Jawa tidak ada bedanya. JLS menentukan bahwa inisialisasi default memang terjadi untuk bidang. Dan sebaliknya, untuk variabel lokal adalah kesalahan kompilasi untuk mencoba menggunakan variabel yang belum diinisialisasi dengan pasti.

Singkatnya, perilaku runtime dari variabel yang tidak diinisialisasi secara eksplisit sepenuhnya dapat diprediksi.

Dengan kontras dalam bahasa seperti C atau C ++ di mana variabel mungkin tidak diinisialisasi, perilaku tidak ditentukan , dan dapat menyebabkan crash, dan perbedaan perilaku pada platform yang berbeda. Kasus untuk selalu menginisialisasi variabel secara eksplisit jauh lebih kuat di sini.


Bagaimana dengan kinerja?

Seharusnya tidak ada bedanya. Kompiler JIT harus dapat memperlakukan inisialisasi yang berlebihan dan inisialisasi default sebagai sama.

Stephen C
sumber
19

Sederhana: mengandalkan nilai default tidak mengomunikasikan maksud.

Apakah Anda benar-benar ingin bidang itu dimulai dengan 0, atau Anda lupa memberikan nilai ?!

Dan tentu saja, referensi nol adalah setengah dari dua hal yang Anda perlukan untuk menjadi pengecualian nullpointer.

Akhirnya, menggunakan default menyiratkan bahwa Anda memiliki bidang non final. Yang Anda hindari jika memungkinkan.

Satu-satunya argumen yang bertentangan adalah: mengapa menuliskan hal-hal yang tidak harus Anda lakukan? Tapi saya pikir kerugian terompet yang terdaftar itu, sehingga menetapkan 0 ke bidang secara eksplisit lebih baik daripada menyerahkannya ke kompiler.

GhostCat memberi hormat Monica C.
sumber
3
yaitu re: not berkomunikasi maksud - Bagaimana jika "Manny the maintainer" melihat kode Anda dan tidak tahu apa default untuk tipe data tertentu. Dia mengasumsikan 0 ketika benar-benar NULL dan itulah seluruh bug pada cek === (atau apa pun yang setara dengan pemeriksaan nilai & tipe di java, equals ()?). Jam pencarian (untuk programmer yang tidak berpengalaman) dapat menjadi hasil dari sesuatu yang sangat sederhana. PS mencoba bermain advokat iblis. Saya katakan gunakan default sepanjang hari (meskipun saya tidak pernah melakukannya) dan dapatkan orang yang lebih pintar (atau setidaknya perhatian terhadap detail) untuk menjaga kode Anda.
TCooper
@Cooper ketika mannie the maintainer tidak tahu banyak tentang Java, maka dia tidak memiliki bisnis yang menyentuh kode Java dunia nyata. Tapi saya setuju dengan gagasan yang mendasarinya. Itu membuat segalanya menjadi lebih sulit bagi pemula.
GhostCat memberi hormat Monica C.
12

Mengapa ini adalah praktik pemrograman yang buruk

Idenya adalah jika Anda mengandalkan nilai default, maka tidak segera jelas bagi siapa pun yang membaca kode jika Anda sengaja membiarkannya sebagai nilai default, atau Anda hanya lupa untuk menetapkannya.

... jika banyak digunakan bahkan di kode sumber perpustakaan Java SE ??

Kode sumber Java sebenarnya bukan sesuatu yang harus Anda andalkan sebagai contoh praktik pengkodean yang patut dicontoh. Ada banyak kasus di mana aturan seperti itu dilanggar (kadang-kadang sengaja untuk peningkatan kinerja kecil, dan kadang-kadang secara tidak sengaja atau karena gaya yang diterima telah berubah selama bertahun-tahun.)

Michael Berry
sumber
2
Ini mungkin benar, meskipun saya tidak setuju dengan itu.
VGR
3
@ VGR Seperti halnya saya cenderung setuju dengan klaim bahwa mengandalkan nilai default adalah kurang optimal, saya berhati-hati untuk mengatakannya dengan cara netral karena alasan itu. Kualitas kode bersifat subyektif, dan saya sangat sadar ini bukan pandangan yang dipegang secara universal.
Michael Berry