Bagaimana Anda mendesain senyawa kompleks AND / OR jika pernyataan untuk keterbacaan maksimum? Bagaimana Anda indentasi dan di mana Anda menempatkan garis terputus? Situasi khusus saya adalah seperti berikut ini. Ini jelas lebih baik daripada menghancurkan semuanya menjadi satu baris, tetapi masih terlihat berantakan.
if (
(
x == y
&& a != b
&& p.isGood()
&& (
i + u == b
|| q >= a
)
)
|| k.isSomething()
|| m > n
) {
doSomething();
}
Jawaban:
Buat variabel boolean untuk setiap langkah kecil:
Ini tentu saja mirip dengan jawaban Lacrymology, kecuali dengan nama yang berbeda untuk setiap langkah.
Jika Anda menyebutkan
step1
,step2
danstep3
dengan cara yang masuk akal secara konseptual, ini seharusnya yang paling mudah dibaca.p.isGood()
dank.isSomething()
kadang-kadang dapat dipanggil dalam situasi di mana itu tidak ada dalam kode asli Anda, jadi ini tidak akan menjadi pilihan jika fungsi-fungsi itu mahal atau jika Anda menjalankan kode ini dalam loop yang sangat ketat.Di sisi lain, Anda tidak perlu khawatir tentang hit kinerja yang membuat variabel baru mungkin terjadi; kompiler yang baik akan mengoptimalkannya.
Contoh dengan deteksi tabrakan persegi panjang (yang mungkin tidak Anda gunakan karena hit kinerja yang disebutkan di atas):
Mungkin menjadi:
Juga, jika Anda ingin meninggalkan kode Anda apa adanya, saya pikir itu akan baik-baik saja juga. Jujur saya pikir kode Anda cukup terbaca. Jelas saya tidak tahu apa sebenarnya
a b x y i u p k m n
, tetapi sejauh struktur berjalan, itu terlihat baik bagi saya.sumber
Saya biasanya faktor ulang kode saya menjadi lebih modular jika kondisi saya menjadi rumit.
sumber
let x = a > b
ataulet f a b = a > b
.Saya akan melakukan sesuatu yang lebih seperti ini, pada tingkat kerumitan ini
itu jelek, tapi itu bisa dibaca dan saya cukup yakin kompiler akan tahu bagaimana cara membuatnya.
Di sisi lain, jika saya pernah melihat diri saya dalam situasi menulis pernyataan IF seperti itu, saya memikirkan kembali solusinya, karena saya TERTENTU ada cara untuk melakukannya secara lebih sederhana, atau setidaknya mengabstraksikan beberapa kondisi itu (misalnya: mungkin
x == y && a != b && p.isGood()
benar-benar hanya berartithis->isPolygon()
dan saya dapat membuat metode itu;sumber
Saya menjadi kurang terobsesi dengan perataan vertikal dari waktu ke waktu, tetapi bentuk umum saya dengan ekspresi multisaluran ...
Poin-poin penting ...
Terkadang, saya akan memformat
+
dan*
atau beberapa operator lain juga seperti ini. Cukup banyak ekspresi kompleks yang mengambil bentuk penjumlahan-produk-atau-jumlah-produk (yang dapat merujuk pada "jumlah" dan "produk" boolean) sehingga mungkin cukup umum bahwa gaya yang konsisten untuk itu bermanfaat.Berhati-hatilah dengan ini. Sering kali lebih baik untuk refactor (memindahkan bagian dari ekspresi ke dalam suatu fungsi, atau menghitung dan menyimpan bagian perantara dalam suatu variabel) daripada menggunakan lekukan untuk mencoba membuat ekspresi overcomplex lebih mudah dibaca.
Jika Anda lebih suka menumpuk parens dekat Anda di sisi kanan, saya tidak membencinya , tapi saya kira itu tidak terlalu buruk. Terlalu jauh, Anda mengambil risiko bahwa kesalahan dapat membuat lekukan salah menggambarkan apa yang dilakukan oleh kurung.
sumber
http://www.codinghorror.com/blog/2006/01/flattening-arrow-code.html
Saya setuju dengan jawaban JohnFx dan juga oleh Lacrymology. Saya akan membangun banyak fungsi (lebih disukai statis) yang mencapai tujuan kecil dan kemudian membangunnya dengan cara yang cerdas.
Jadi, bagaimana dengan yang seperti ini? Catatan, ini bukan solusi yang sempurna, tetapi berhasil. Ada cara untuk membersihkan ini lebih lanjut, tetapi informasi yang lebih spesifik diperlukan. Catatan: kode ini harus berjalan sama cepatnya, karena kompilernya pintar.
sumber
Untuk apa nilainya, saya terkejut melihat bahwa contoh Anda sangat mirip dengan predikat rumit yang saya tulis. Saya setuju dengan orang lain bahwa predikat yang rumit bukanlah yang terbaik untuk pemeliharaan atau keterbacaan, tetapi kadang-kadang muncul.
Biarkan saya menekankan bahwa Anda melakukan bagian ini dengan benar:
&& a != b
JANGAN PERNAH meletakkan konektor logis di akhir baris, terlalu mudah untuk dilewatkan secara visual. Tempat lain di mana Anda TIDAK PERNAH menempatkan operator di akhir baris adalah dalam rangkaian string, dalam bahasa dengan operator seperti itu.Melakukan hal ini:
Jangan lakukan ini:
sumber
Jika kondisasinya rumit, biasanya indikasi bahwa itu harus dipecah menjadi beberapa bagian. Mungkin satu klausa dapat ditugaskan ke variabel perantara. Mungkin satu klausa dapat diubah menjadi metode pembantu. Saya biasanya memilih untuk tidak memiliki banyak ands dan ors dalam satu baris.
sumber
Anda dapat memecah kode menjadi beberapa pernyataan, sehingga mudah dimengerti. Tapi ninja sungguhan akan melakukan hal seperti ini. :-)
sumber