"Hai, Amigo! Hari ini saya akan memberitahu anda tentang gaya kod dan kepentingan gaya kod."

"Saya akan mulakan dengan perkara yang paling penting.  Kod Java sepatutnya mudah dibaca.  Pendekatan umum untuk kod adalah ini: kod ditulis sekali tetapi dibaca seratus kali."

"Andaikan anda dan 10 pengaturcara lain sedang menulis permohonan. Anda mengusahakan permohonan itu selama tiga tahun, dengan keluaran pertengahan setiap tiga bulan."

"Sepanjang itu?"

"Ini Java, belalang muda saya! "Bagaimana pula dengan sistem perusahaan yang berjalan pada sedozen pelayan dan ditulis oleh 100 orang selama lebih daripada 6 tahun? Itu juga kadang-kadang berlaku."

"Wah."

"Bagaimanapun, peraturan utama, keperluan utama untuk kod ialah ia mesti mudah dibaca oleh pembangun lain."

"Dalam bahasa pengaturcaraan lain, orang sering bekerja sebagai pasukan kecil dalam tugas kecil, jadi mereka mungkin mempunyai peraturan utama lain, seperti 'Ia berfungsi? Cemerlang'."

"Sepanjang beberapa tahun, semua ahli pasukan anda akan membuat beberapa perubahan pada kod yang telah anda tulis. Dan setiap kali mereka perlu memahami cara kod itu berfungsi."

"Dan kod yang tidak dapat difahami yang berfungsi dengan sempurna adalah sukar untuk diubah.  Mereka akan membuangnya dan menulis semula dengan cara mereka sendiri.  Jadi, tulis kod yang boleh difahami oleh orang lain.  Jika anda boleh memperbaiki kod anda, maka perbaikinya. Jika ia boleh diperbaiki, maka ia perlu diperbaiki! "

"Jika anda menulis kod selama 15 minit dan kemudian menghabiskan dua jam untuk memperbaikinya, anda melakukannya dengan betul. Berapa banyak masa anda menyelamatkan pasukan?"

"'2 jam untuk memahami kod anda' x '100 kali orang perlu memahaminya' = 200 jam."

"Saya mengeluarkan angka-angka ini, tetapi saya mahu anda memahami masalah dan skopnya.  Kod anda dicipta untuk dibaca oleh pengaturcara lain.  Semua yang lain adalah kedua."

"Adakah kod itu tidak berfungsi dengan betul? Kami akan membetulkannya. Tidak dioptimumkan? Kami akan mengoptimumkannya. Tidak didokumenkan? Kami akan menambah ulasan."

" Adakah kod itu sukar dibaca? Buang sampah itu ke dalam tong sampah dan tulis semuanya semula dari awal! "

"Saya tidak fikir ia adalah masalah besar."

"Salah satu sebab Java ialah bahasa pengaturcaraan terkemuka ialah semua kod Java ditulis untuk dibaca oleh pengaturcara lain."

"Sekarang mari kita beralih kepada soalan kedua: bagaimana anda membuat kod anda semudah mungkin dibaca? "

"Sesiapa sahaja boleh memahami apabila seseorang bercakap perkataan biasa dalam bahasa ibundanya. Perkara yang sama berlaku di sini. Kod mudah dibaca apabila pengaturcara boleh meneka dengan mudah:

A)  Apakah yang dilakukan oleh setiap kaedah

B)  Tujuan setiap kelas

C)  Tepat apa yang disimpan oleh setiap pembolehubah.

Semua ini disampaikan dalam nama: nama kelas, nama kaedah dan nama pembolehubah. Di samping itu, terdapat gaya apabila ia datang untuk menamakan pembolehubah. Dan ada gaya kod."

"Saya sedia mendengar."

" Pengaturcaraan adalah berdasarkan bahasa Inggeris yang baik!  Program yang ditulis dengan baik berbunyi seperti dokumentasi teknikal biasa. "

" Mari kita mulakan dengan nama. "

"Nama kaedah harus menerangkan secara ringkas apa yang dilakukan oleh kaedah itu. Kemudian kod itu boleh dibaca seperti prosa mudah."

Program
public String downloadPhoto(String url)
{
 String resultFileName = TempHelper.createTempFileName();

 Downloader downloader = new SingleFileDownloader(new Url(url));
 downloader.setResultFileName(resultFileName)
 downloader.start();
 while(downloader.isDone())
 {
  Thread.sleep(1000);
 }

 if (downloader.hasError())
  return null;

 return resultFileName;
}

"Begini cara program sedemikian dibaca."

Baris 1.

"Kaedah itu dipanggil 'downloadPhoto'. Nampaknya ia memuat turun fail foto dari Internet. Di mana ia dimuat turun? Kami tidak tahu lagi. Dari mana? Kaedah ini mempunyai parameter bernama url — itu mungkin URL untuk muat turun."

Baris 3.

"Result ubahFileName diisytiharkan dan diberikan nilai oleh TempHelper.createTempFileName();"

Jadi ini mestilah laluan tempatan ke fail tempat kami akan menyimpan fail kami yang dimuat turun.

"Nama 'TempHelper' tidak memberitahu kami apa-apa. Akhiran 'Helper' mengatakan bahawa ini adalah sejenis kelas utiliti yang tidak mengandungi logik perniagaan yang penting, sebaliknya digunakan untuk memudahkan tugas rutin yang kerap berlaku."

"Nama kaedah 'createTempFileName' menunjukkan bahawa kaedah ini mencipta dan mengembalikan nama fail sementara (fail temp). Fail temp ialah fail sementara yang dicipta untuk seketika dan kemudian biasanya dipadamkan pada masa program ditutup. "

Baris 5.

"Objek SingleFileDownloader dicipta dan diberikan kepada pemuat turun berubah-ubah."

Ini adalah objek yang akan memuat turun fail kami dari Internet.

"Objek SingleFileDownloader diberikan kepada pemuat turun berubah-ubah. Daripada namanya, kita mungkin menganggap bahawa program ini mempunyai beberapa jenis kelas pemuat turun. Satu telah ditulis untuk memuat turun fail tunggal dan kita mungkin boleh mengharapkan untuk menemui pemuat turun lain dalam kod untuk kumpulan fail dengan nama seperti: MultiFileDownloader, FileGroupDownloader atau DirectoryDownloader"

Baris 6.

"Kami menetapkan sifat resultFileName objek pemuat turun sama dengan nilai pembolehubah resultFileName. Dalam erti kata lain, kami memberitahu pemuat tempat untuk menyimpan fail yang dimuat turun. Seperti yang anda jangkakan. Jadi, pada dasarnya kami meramalkan kod itu!"

Baris 7.

"Kami memanggil kaedah mula. Muat turun bermula. Itu masuk akal. Saya tertanya-tanya bagaimana muat turun berlaku: dalam bahagian-bahagian, pada urutan yang berasingan, atau semuanya di sini? Jika kami memuat turun semuanya di sini, ia mungkin memerlukan lama dan mempunyai akibat."

Baris 8-11.

"Ah. Di sini kita melihat gelung standard yang ditulis oleh seseorang yang menunggu muat turun selesai. Objek downloder mempunyai sifat selesai, yang dikembalikan oleh kaedah isDone(). Kerana kaedah itu dipanggil isDone(), dan bukannya getDone(). ), kami membuat kesimpulan bahawa pembolehubah yang dilakukan ialah boolean atau mungkin Boolean."

Baris 13-14.

"Jika ralat berlaku semasa muat turun, maka kaedah muat turunPhoto mengembalikan nol. Adalah baik ia mengendalikan ralat. Tidak baik ia hanya mengembalikan null-ia tidak jelas apakah ralatnya. Adalah lebih baik untuk membuang pengecualian dengan maklumat tentang kesalahan."

Baris 16.

"Kami mengembalikan laluan ke fail tempatan yang mengandungi fail yang dimuat turun."

"Wah!"

"Kod program ini menjadikan ia benar-benar jelas apa yang dilakukannya. Anda juga boleh membuat tekaan tentang cara program itu diatur dan kelas/kaedah lain yang akan kami temui."

"Sekarang saya faham betapa pentingnya nama."

"Lebih lanjut mengenai nama. Anda selalunya boleh meneka kaedah mana yang dimiliki oleh objek/kelas. Contohnya, jika objek ialah koleksi, maka kemungkinan besar ia akan mempunyai kaedah saiz() atau kiraan() untuk mendapatkan bilangan elemen. Juga , ia mungkin akan mempunyai kaedah add() atau insert(). Elemen diambil daripada kelas koleksi menggunakan kaedah get/getItem/getElement."

"Jika pembolehubah dipanggil i, j, atau k, maka kemungkinan besar ia adalah pembilang gelung."

"Jika pembolehubah dipanggil m atau n, maka kemungkinan besar saiz tatasusunan/koleksi."

"Jika pembolehubah dipanggil nama, maka kemungkinan besar ia adalah String yang mengandungi nama seseorang."

"Jika kelas dipanggil FileInputStream, maka secara serentak ia adalah fail dan aliran input."

"Lebih banyak kod yang anda lihat, lebih mudah untuk membaca kod orang lain."

"Tetapi kadangkala terdapat kod yang sangat sukar dibaca. Dalam kes ini, berikut ialah nasihat yang sangat praktikal:"

Petua
Tulis kod seolah-olah ia akan dikekalkan oleh psikopat ganas yang tahu di mana anda tinggal .

"Itu kelakar dan tidak lucu pada masa yang sama."

"Sekarang sedikit tentang gaya yang digunakan untuk menamakan pembolehubah."

"Pembangun Java cuba memberikan nama yang sangat bermaklumat kepada pembolehubah dan kaedah. Akibatnya, nama selalunya terdiri daripada beberapa perkataan. Terdapat 4 gaya untuk penggunaan huruf besar nama majmuk."

1) Huruf kecil  - Semua perkataan ditulis dengan huruf kecil. Sebagai contoh:

'Rumah hijau'  menjadi 'rumah hijau'

'Gadis Hollywood'  menjadi  'gadis hollywood'

Gaya ini digunakan untuk nama pakej.

2) Huruf Besar  – Semua perkataan ditulis dengan huruf besar dan dipisahkan dengan garis bawah. Sebagai contoh:

'Nilai maksimum'  menjadi MAX_VALUE

'Kiraan kucing'  menjadi CAT_COUNT

"Gaya ini digunakan untuk nama pemalar (medan statik akhir)."

3) CamelCase  - Semua perkataan ditulis dengan huruf kecil, kecuali huruf pertama setiap perkataan adalah huruf besar. Sebagai contoh:

'Rumah Hijau'  menjadi  'Rumah Hijau'

'Gadis Hollywood'  menjadi 'Gadis Hollywood'

Gaya ini digunakan untuk nama kelas dan antara muka.

4) Lower CamelCase (huruf bercampur)  – Semua perkataan ditulis menggunakan huruf kecil, kecuali huruf pertama setiap perkataan kecuali huruf pertama huruf besar. Sebagai contoh:

'Dapatkan lebar' menjadi 'getWidth'

'Dapatkan nama gadis Hollywood' menjadi  'getHollywoodGirlName'

"Gaya ini digunakan untuk nama pembolehubah dan kaedah."

"Jadi, tidak ada terlalu banyak peraturan."

1)  Semuanya ditulis dalam Lower CamelCase.

2)  Nama kelas dan antara muka sentiasa menggunakan huruf besar.

3)  Nama pakej sentiasa huruf kecil.

4)  Pemalar sentiasa huruf besar.

"Terdapat beberapa nuansa, tetapi secara umum itulah ia."

"Sekarang mengenai kaedah.  "Nama kaedah hampir selalu bermula dengan kata kerja! 'count' ialah nama yang tidak baik untuk sesuatu kaedah. Lebih baik memanggilnya getCount(). Kaedah melakukan beberapa tindakan pada objek:  startDownload , interrupt  , sleep  , loadPirateMusic ."

"Seperti yang anda sedia maklum, terdapat getter dan setter untuk bekerja dengan sifat/medan objek:  getName / setName , getCount / setCount , dll."

"Satu-satunya pengecualian adalah untuk boolean. Untuk boolean, nama getter menggunakan 'is', bukan 'get', cth isDone, isEmpty. Dengan cara ini ia lebih hampir kepada pertuturan biasa."

"Bagaimana kalau bekerja selama dua jam sehari bukannya 8? Tergoda?"

"Ya!"

"Seperti yang sepatutnya. Bagi pembangun Java junior, keperluan asas ialah pemahaman yang sangat baik tentang asas Java, iaitu Java Core."

"Saya ada soalan lain. Mengapa kita mempunyai kaedah yang berbeza ini untuk mendapatkan bilangan elemen?"

Kelas Kaedah/sifat untuk mendapatkan bilangan elemen
Tali panjang ()
Susunan panjang
ArrayList saiz ()
ThreadGroup Kiraan aktif ()

"Pertama sekali, Java telah dicipta lebih daripada 20 tahun yang lalu, sebelum keperluan seperti setCount / getCount telah diwujudkan, dan terdapat pendekatan biasa yang diambil daripada bahasa C untuk 'menjadikannya sesingkat mungkin'."

"Kedua, semantik memainkan peranan di sini. Apabila bercakap tentang tatasusunan, kita bercakap tentang panjangnya. Apabila bercakap tentang koleksi, kita bercakap tentang saiznya."

"Pelajaran yang menarik."

"Saya ingin memberitahu anda lebih lanjut, tetapi saya khuatir anda tidak akan mengingati semuanya sekali gus. Adalah lebih baik untuk menyampaikannya kepada anda dalam hidangan kecil."

"Tetapi saya ingin menyentuh gaya berkenaan penggunaan kurungan kerinting: {}. Terdapat dua pendekatan:"

1)  Kurungan berjalan pada baris baharu setiap kali

2)  Tanda kurung buka pergi pada penghujung baris sebelumnya, manakala kurung tutup pergi pada baris baru. Gaya ini dipanggil 'braces Mesir'.

"Sejujurnya, anda boleh memilih cara untuk membuat kod. Ramai orang menggunakan pendakap pembukaan pada baris yang sama. Ramai orang meletakkannya pada baris baharu. Ia seperti perdebatan mengenai hujung telur yang mana untuk dipecahkan: hujung kecil atau besar berakhir."

"Satu-satunya perkara yang boleh saya cadangkan ialah berpegang pada apa-apa gaya yang digunakan dalam projek yang anda kerjakan. Jangan tukar kod orang lain untuk sepadan dengan gaya pilihan anda.  Orang ramai tidak sempurna. Saya memberitahu anda ini sebagai Doktor Bilaabo. "

"Terima kasih untuk pelajaran yang menarik, Bilaabo. Saya akan pergi untuk merenungkan apa yang awak katakan."