Pernyataan Lini Tunggal & Praktek yang Baik

11

Saya baru-baru ini memperoleh kebiasaan yang saya tahu banyak dari Anda mungkin tidak suka, tetapi yang, pada akhirnya, membantu saya mengawasi struktur kode global daripada pada struktur metode berulang, (kadang-kadang) tunggal: pengelompokan angka pernyataan dalam satu baris, seperti ini:

textBox1.Text = "Something!"; textBox2.Text = "Another thing!"; textBox3.Text = "Yet another thing!";

sebagai lawan

textBox1.Text = "Something!";
textBox2.Text = "Another thing!";
textBox3.Text = "Yet another thing!";

Saya biasa melakukan itu untuk tugas yang berulang-ulang untuk menjaga kode keseluruhan "keindahan" dan untuk membantu saya melacak struktur program dengan mudah, tetapi saya akui itu mungkin bukan praktik yang baik. Saya benar-benar sering menggunakannya, jadi saya ingin tahu apa pendapat Anda tentang ini. Juga, apakah Anda berpikir bahwa siapa pun yang pernah harus mempertahankan kode saya memiliki masalah dengan pendekatan ini?

Pengguna
sumber
5
Ini mungkin pertanyaan yang bagus untuk codereview.stackexchange.com
1
Saya akan memiliki masalah jika saya ingin mempertahankan. Hal pertama yang akan saya lakukan adalah melakukan CTRL + F untuk ";" dan menempatkan garis istirahat. Tapi itu hanya aku :-). Saya suka satu baris saja jika saya memiliki alasan untuk, contoh menginisialisasi properti yang diaktifkan dari beberapa kotak teks dengan nilai default false: textBox1.Enabled = textBox2.Enabled = false;
Arun
2
Jika Anda mengajukan pertanyaan gaya pengkodean, itu akan membantu jika Anda menentukan bahasa.
Caleb
3
Meskipun mungkin tidak muncul dalam contoh yang diberikan, bagaimana Anda akan meletakkan breakpoint pada pernyataan kedua atau ketiga atau ... jika Anda menempatkan semuanya pada satu baris?
Marjan Venema
1
Dan juga, saya sudah terbiasa dengan pemformatan otomatis (Java), di mana kode tetap terlihat seragam.
Kwebble

Jawaban:

22

Saya benar-benar berpikir keterbacaan akan sangat menderita bagi Anda dan tentunya orang lain membaca kode Semua masuk akal ketika Anda menulisnya pertama kali karena itu aktif dalam pikiran Anda. Ini berbeda ketika Anda memindai kode untuk melihat variabel dan fungsi apa yang ada ... Anda menghancurkan kemampuan Anda sendiri untuk memindai kode Anda sendiri. Itu sangat tidak boleh, dan sangat buruk jika orang lain pernah membaca kode Anda.

Juga, pikirkan tentang bagaimana Anda membaca kode. Itu selalu dari atas ke bawah, gulir ke bawah. Metode Anda tidak cocok dengan ini, dan bahkan memperkenalkan salah satu masalah terburuk yang mungkin terjadi dalam membaca kode;gulir secara horizontal . Jangan pernah meremehkan betapa sulitnya membuat kode membaca. Anda tidak pernah menggulir secara horizontal, Anda tidak pernah membuat orang menggulir secara horizontal, dalam hampir semua konteks itu sangat tidak wajar.

Juga, jika masalah Anda adalah entri kode berulang-ulang ... jangan lupa Ctrl-C. Dari kode contoh Anda mungkin lebih efisien untuk mengetik semuanya secara manual, tetapi jika Anda harus menyalin banyak baris beberapa kali sepertinya akan sama efisiennya untuk menyalin satu baris ditambah satu baris baru, rekatkan x kali dan lakukan perubahan, kecil kemungkinannya untuk membuat kesalahan ketik.

Oh, dan salah ketik! Membahayakan pembacaan kode Anda seperti itu dapat membuatnya menjadi mimpi buruk untuk menemukan mana dari 50 deklarasi variabel yang Anda salah setel. Sebagian besar kompiler memberikan kesalahan pada nomor baris DAN kolom sekarang, tetapi menemukan kesalahan di baris adalah JAUH lebih mudah daripada menemukan kolom.

Ben Brocka
sumber
2
a) Membaca / Memindai kode - Kebanyakan orang ketika memindai kode membaca beberapa karakter pertama dari garis kemudian pindah kecuali itu "menarik", kemudian mereka membaca beberapa lagi. Kesalahan Kompiler: Sebagian besar waktu saya menafsirkan kesalahan kompiler sebagai "Masalah dengan baris <x>". hanya jika saya tidak bisa menyelesaikannya secara instan (jarang), jadi saya benar-benar membaca kesalahan.
mattnz
19

Satu pernyataan per baris juga memudahkan untuk melihat apa yang telah berubah dalam perbedaan berdampingan.

Hugo
sumber
2
Ini mungkin adalah alasan terbesar, jika seseorang harus menggabungkan kode itu, hampir semua alat menggabungkan akan membuatnya lebih mudah untuk mengisolasi dan memindahkan garis daripada substring baris.
anon
@anon Poin bagus tentang menggabungkan alat juga; satu pernyataan per baris berarti lebih sedikit menggabungkan konflik untuk dibersihkan.
Hugo
10

Meskipun contoh tidak menunjukkan ini, ada masalah lain dengan mengelompokkan beberapa pernyataan pada satu baris. Bagaimana jika salah satu dari lima pernyataan yang Anda miliki dalam satu baris memberikan pengecualian?

Jejak tumpukan Anda akan mengatakan "EBlah di baris N" ... dan sekarang Anda tidak tahu yang mana dari lima pernyataan yang melemparkan pengecualian.

(Hal yang sama terjadi dengan pernyataan yang terlalu panjang dalam bentuk apa pun.)

Frank Shearar
sumber
2
Konsep yang sama berlaku untuk debugging, di mana sekali lagi granularity biasanya berupa nomor baris.
David Hammen
2
Ya ampun, ini bisa menjadi masalah. "Favorit" adalah ketika Anda mendapatkan null pointer yang longgar di sesuatu seperti foo.bar[grill.boo].flip.flap[flop].mickey(minnie).marshmallow(sintaks Java / C #). Memilah-milah kekacauan semacam itu selalu lebih baik dengan garis tambahan (dan variabel sementara ... dan 2D Of Brick Clue untuk pengembang asli).
Donal Fellows
7

One-statement-per-line adalah gaya pengkodean yang banyak digunakan. Akibatnya, sebagian besar pengembang yang melihat kode Anda di masa depan mungkin akan meringis ketika mereka melihat beberapa pernyataan per baris. Ketika Anda terbiasa melihat sesuatu dengan satu cara, itu bisa membingungkan untuk melihatnya dengan cara lain.

Untuk alasan ini saya menyarankan untuk tidak melakukannya, kecuali dalam keadaan langka.

Igby Largeman
sumber
4

Saya terakhir melakukan ini 25 tahun yang lalu menggunakan bahasa yang ditafsirkan pada micros kecil yang berjalan dengan kecepatan clock rendah, di mana setiap ruang atau carriage return dihilangkan memberikan peningkatan kinerja.

Saya meringis sekarang memikirkan hal itu (meskipun itu dilakukan untuk alasan yang baik).

Sayangnya kode seperti itu sulit dibaca, dan karenanya sulit dipertahankan.

dengan cepat_now
sumber
1
Jadi Anda menulisnya dengan benar, kemudian menghapus spasi dan persiapan lain untuk "salinan mesin" Anda. Sama seperti meminimalkan javascript saat ini.
CaffGeek
1
Ya - saya menulis sebuah program untuk memproses ulang kode sumber seperti itu juga - kembali pada tahun 1986. Hal lain yang saya harap tidak perlu dilakukan lagi.
cepat_now
1

Secara sintaksis, sebenarnya tidak ada yang salah dengan itu. Itu benar-benar tergantung pada gaya pengkodean tim Anda.

Karena sebagian besar kode yang saya lihat (termasuk kode yang ada di dalam header c ++ standar) dilakukan dengan cara ini, saya akan menggunakan metode pertama Anda.

textBox1.Text = "Something!";
textBox2.Text = "Another thing!";
textBox3.Text = "Yet another thing!";
George yang penasaran
sumber
0

Ini benar-benar gaya pengkodean yang tidak biasa.

Saya akan merekomendasikan Anda untuk menggunakan baris kosong untuk membatasi bagian logis dari kode.

svick
sumber
0

Pergi terlalu jauh ke kanan dapat menciptakan banyak masalah seperti banyak baris.

Saya harus berurusan dengan beberapa pernyataan sql dengan banyak bidang. Biasanya, saya meletakkan satu per baris, tetapi pada beberapa kesempatan, saya telah mengkonsolidasikan 3 atau 4 berturut-turut. Ini sepertinya ide bagus selama pengembangan ketika Anda harus menggulir ke atas dan ke bawah beberapa kali.

Saya menyesal kembali ke kode ini. Memiliki baris tambahan sepertinya tidak menimbulkan banyak masalah, jadi saya biasanya membersihkannya.

JeffO
sumber
0

Juga, apakah Anda berpikir bahwa siapa pun yang pernah harus mempertahankan kode saya memiliki masalah dengan pendekatan ini?

Setelah meletakkan tangannya di atas kepala sebentar, ia akan menggunakan fungsionalitas IDE Regex favoritnya untuk secara otomatis memisahkan semua kode yang tidak dapat dibaca itu menjadi satu pernyataan per baris.

Hanya dengan melihat sekilas pada contoh yang Anda perlihatkan sudah cukup untuk memahami betapa jauh lebih mudah dibaca adalah pendekatan kedua.

Jauh lebih mudah untuk mengikuti aliran halaman vertikal, tanpa mata Anda bergerak horizontal selamanya.

Lihatlah contoh Anda: Anda segera tahu kode itu semua tentang Textproperti textBoxobjek yang berbeda , dan mereka berisi string sebagai nilai. Cukup mudah.

Jose Faeti
sumber
0

Saya pribadi tidak akan menggunakan gaya seperti itu. Untuk meringkas

Pro

  • lebih sedikit baris kode untuk digulir
  • dapat digunakan untuk mengelompokkan kode secara semantik untuk mengekspresikan: "banyak tugas tugas". TETAPI Anda selalu dapat mengubah blok seperti itu menjadi suatu fungsi jika itu terlalu mengganggu Anda.

Cons

  • sulit dibaca, umumnya lebih mudah membaca kode secara horizontal (membaca sekilas, tidak ada gerakan mata, ...)
  • diff dengan mudah menjadi mimpi buruk, termasuk penggabungan
  • lebih sulit diubah (salin & tempel, beri komentar, ...)
  • debugging bisa menjadi masalah di banyak IDE karena mereka bekerja pada baris, bukan ekspresi individu.
Merusak
sumber
Beberapa "kontra" kadang-kadang mungkin pro. Misalnya, seandainya sepotong kode memiliki delapan operasi berturut-turut dari formulir if (x > maxX) {x=maxX; peggedAny = true;}. Jika setiap operasi seperti itu akan cocok dengan mudah pada satu baris, saya lebih suka memiliki delapan baris seperti itu daripada lusinan baris yang membagi pernyataan. Jika perbandingan semacam itu digunakan di tempat yang cukup, empat pernyataan formulir peggedAny |= pegValueMinMax(ref x, minX, maxX);mungkin lebih baik, tetapi seseorang yang membaca harus membaca pegValueMinMaxuntuk melihat apa fungsinya.
supercat
Selanjutnya, jika sepotong kecil garis berubah, "diff" akan menganggap itu sebagai perubahan ke seluruh baris. Jika garis harus berperilaku secara fungsional sebagai satu kesatuan, itu akan menjadi hal yang baik. Jika tidak, jika operasi semantik dibagi di antara beberapa baris, perubahan pada beberapa baris dapat memengaruhi operasi dengan cara yang tidak akan terlihat.
supercat