Haruskah kurung kurawal muncul di jalurnya sendiri? [Tutup]


273

Haruskah kurung kurawal berada di jalurnya sendiri atau tidak? Apa yang Anda pikirkan?

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

atau seharusnya begitu

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

atau bahkan

if (you.hasAnswer())
    you.postAnswer();
else
    you.doSomething();

Harap bersikap konstruktif! Jelaskan mengapa, berbagi pengalaman, dukung dengan fakta dan referensi.


105
Saya menemukan "== true" lebih mengganggu daripada pilihan penempatan brace.
Dan Dyer

11
@Dan: Saya pikir bahwa selalu menjelaskan ekspresi kondisional sangat membantu dalam kejelasan.
Wizard79

4
Satu-satunya alasan ini akan menjadi masalah adalah jika IDE / editor Anda tidak mendukung pengenalan braket keriting yang cocok.
leeand00

4
@ leeand00: sebagian dari kita masih mencetak kode kompleks / asing untuk mempelajari / membubuhi keterangan. Printer cantik yang bagus mengurangi sebagian besar masalah.
Shog9

2
sedih pertanyaannya sudah ditutup. Setelah beberapa waktu penggunaan sintaks berdasarkan indentasi saya beralih ke (mungkin aneh) struktur kawat gigi lain. Seperti brace pertama Anda tetapi tutup di baris terakhir blok. (setelah kode baris)
cnd

Jawaban:


88

Ketika saya masih mahasiswa saya biasa memasang kurung kurawal pada baris yang sama, sehingga ada lebih sedikit garis, dan kode dicetak pada lebih sedikit halaman. Melihat satu karakter braket yang dicetak sebagai satu-satunya hal dalam satu baris mengganggu. (lingkungan, pemborosan kertas)

Tetapi ketika mengkode aplikasi besar, memungkinkan beberapa baris dengan hanya kawat gigi di dalamnya terjangkau, mengingat perasaan 'pengelompokan' yang diberikannya.

Gaya apa pun yang Anda pilih, konsistenlah sehingga tidak menjadi overhead bagi otak Anda sendiri untuk memproses banyak gaya dalam potongan kode terkait . Dalam skenario yang berbeda (seperti di atas) saya akan mengatakan tidak apa-apa untuk menggunakan gaya yang berbeda, lebih mudah untuk 'mengalihkan konteks' di tingkat tinggi.


6
Di sisi lain, kurung pada baris baru adalah STANDAR ANSI, K&R tidak. Tetapi keindahan tentang standar adalah, bahwa ada begitu banyak yang berbeda (lihat juga uncyclopedia.wikia.com/wiki/AAAAAAAAA ! On uncyclopedia).
Quandary

"ada lebih sedikit garis" Saya memiliki Terabytes Ruang dan banyak Pixel. Mengapa saya harus peduli menggunakan lebih banyak baris?
12431234123412341234123

1
@ 12431234123412341234123: Saya pikir maksudnya karena beberapa orang mencetak kode untuk tinjauan kode. Dan masing-masing baris yang tidak benar-benar diperlukan adalah kertas terbuang sia-sia, atau forrest km2 terbuang sia-sia. Namun, jika Anda tidak mencetaknya (tentu saja tidak), ANSI jauh lebih baik daripada K&R. Juga, siapa pun yang ingin mencetak mungkin harus menggunakan pemformat kode otomatis - jadi ini harus menjadi pertanyaan tentang perkakas, bukan gaya pengkodean.
Quandary

247

Anda seharusnya tidak pernah melakukan metode ke-3.

Skimping pada kawat gigi mungkin menyelamatkan Anda beberapa kali penekanan tombol, tetapi pembuat kode berikutnya yang datang, menambahkan sesuatu ke klausa Anda yang lain tanpa memperhatikan blok yang hilang kawat gigi akan ada untuk banyak rasa sakit.

Tulis kode Anda untuk orang lain.


113
Saya berharap saya tahu dari mana asal sedikit kebijaksanaan itu. Karena menulis kode Anda untuk orang-orang yang tidak mau repot membacanya adalah tentang hal-hal yang tidak berguna ...
Shog9

69
Programmer kedua dapat menambahkan kawat gigi sendiri ketika menambahkan sesuatu. Dia tidak bodoh, dan dalam konvensi pengkodean yang mendorong penghapusan kawat gigi untuk hal-hal sederhana seperti ini, dia akan tahu untuk melihatnya.
Ken Bloom

25
Kawat gigi opsional bukan opsional. Ada beberapa keputusan desain yang lebih buruk yang dibuat di C dan dibawa ke keturunannya. Bahwa ia hidup dalam bahasa baru seperti C # membuat saya marah.
Adam Crossland

28
Tidak masalah seberapa pintar Anda atau seberapa tertanam standar pengkodean pada satu garis ikal yang dihilangkan adalah: jika Anda ingin menyelesaikan masalah atau bug, Anda mungkin akan kehilangan bahwa ikal itu dihilangkan. Dan untuk total 2 detik kerja, apakah benar-benar buruk untuk eksplisit?
Jordan

11
Ada satu keuntungan dari gaya # 3 yang Anda semua hilang: Anda mendapatkan lebih banyak kode di layar Anda sekaligus.
Loren Pechtel

203

Untuk waktu yang lama saya berpendapat bahwa mereka bernilai sama, atau sangat dekat dengan sama sehingga kemungkinan mendapatkan dengan membuat pilihan yang tepat jauh, jauh, di bawah biaya berdebat tentang hal itu.

Menjadi konsisten itu penting . Jadi saya katakan, mari kita melempar koin dan mulai menulis kode.

Saya telah melihat programmer menolak perubahan seperti ini sebelumnya. Lupakan saja! Saya telah berganti karier berkali-kali. Saya bahkan menggunakan gaya yang berbeda di C # saya daripada di PowerShell saya.

Beberapa tahun yang lalu saya mengerjakan sebuah tim (~ 20 pengembang) yang memutuskan untuk meminta input, dan kemudian membuat keputusan, dan kemudian menegakkannya di semua basis kode. Kami punya 1 minggu untuk memutuskan.

Banyak erangan & memutar mata. Banyak "Saya suka cara saya, karena itu lebih baik" tetapi tidak ada substansi.

Ketika kami mempelajari poin-poin penting dari pertanyaan, seseorang bertanya bagaimana menangani masalah ini dengan gaya brace-on-the-same-line:

void MyFunction(
    int parameterOne,
    int parameterTwo) {
    int localOne,
    int localTwo
}

Perhatikan bahwa tidak segera jelas di mana daftar parameter berakhir, dan tubuh dimulai. Dibandingkan dengan:

void MyFunction(
    int parameterOne,
    int parameterTwo) 
{
    int localOne,
    int localTwo
}

Kami melakukan beberapa bacaan tentang bagaimana orang-orang di seluruh dunia telah mengatasi masalah ini, dan menemukan pola menambahkan garis kosong setelah penjepit terbuka:

void MyFunction(
    int parameterOne,
    int parameterTwo) {

    int localOne,
    int localTwo
}

Jika Anda akan membuat jeda visual, Anda sebaiknya melakukannya dengan penjepit. Kemudian jeda visual Anda menjadi konsisten juga.

Sunting : Dua alternatif untuk solusi 'garis kosong ekstra' saat menggunakan K&R:

1 / Indent argumen fungsi berbeda dari fungsi tubuh

2 / Letakkan argumen pertama pada baris yang sama dengan nama fungsi dan sejajarkan argumen lebih lanjut pada baris baru dengan argumen pertama

Contoh:

1 /

void MyFunction(
        int parameterOne,
        int parameterTwo) {
    int localOne,
    int localTwo
}

2 /

void MyFunction(int parameterOne,
                int parameterTwo) {
    int localOne,
    int localTwo
}

/Sunting

Saya masih berpendapat bahwa konsistensi lebih penting daripada pertimbangan lain, tetapi jika kita tidak memiliki preseden yang mapan , maka brace-on-next-line adalah cara untuk pergi.


33
FYI, aku mungkin terdengar seperti orang yang berakal, tapi aku benar-benar gila. Untuk blok sederhana, baris tunggal, saya tidak akan menggunakan kawat gigi atau baris baru, membuat 'jika (foo) bar ()' semua satu baris. Saya berusaha membuat kode saya cukup sederhana sehingga tidak masalah.
Jay Bazuzi

38
Datang ke sini untuk memposting persis ini. Banyak orang yang menjaga brace pembuka pada baris yang sama menindaklanjutinya dengan garis kosong (terutama pada awal kelas dan metode) karena jika tidak, sulit untuk memisahkan header kelas / metode dari tubuh. Nah, jika Anda akan menggunakan saluran tambahan, Anda bisa meletakkan brace di sana dan mendapatkan manfaat tambahan dari lekukan yang lebih mudah dilihat.
Yevgeniy Brikman

27
Saya tidak melihat baris kosong - Saya lebih akrab dengan indentasi ganda dari parameter untuk MyFunction () ketika mereka menyimpang ke baris lain.
Armand

34
Membagi parameter ke beberapa baris seperti itu menjengkelkan.
Fosco

10
Argumen "parameter fungsi" adalah herring merah. Jelas bahwa argumen harus dibuat ganda. Tidak masalah apa pun untuk membedakannya dari kode berikut.
David Ongaro

99

Aturan utamanya adalah:

  1. Ikuti standar pengkodean proyek yang ada.
  2. Jika tidak ada standar pengkodean dan Anda mengedit basis kode yang ada yang dimiliki oleh orang lain - konsisten dengan gaya kode yang ada, tidak peduli seberapa banyak Anda suka / tidak suka.
  3. Jika Anda bekerja pada proyek lapangan hijau - diskusikan dengan anggota tim lain, dan datang ke konsensus tentang standar pengkodean formal atau informal.
  4. Jika Anda bekerja pada proyek lapangan hijau sebagai satu-satunya pengembang - buat keputusan sendiri, dan kemudian konsisten.

Bahkan jika Anda tidak memiliki kendala eksternal pada Anda, yang terbaik adalah (IMO) untuk mencari pedoman pengkodean atau gaya gaya (banyak digunakan) yang ada, dan coba dan ikuti itu. Jika Anda menggulung gaya Anda sendiri, ada kemungkinan besar Anda akan menyesalinya dalam beberapa tahun.

Akhirnya, gaya yang diimplementasikan / diimplementasikan menggunakan style checker dan pemformat kode yang ada lebih baik daripada yang perlu "ditegakkan" secara manual.


10
Jawaban ini layak mendapat lebih banyak suara.
AShelly

1
konsistensi adalah kunci
MediaVince

70

Manfaat dari metode pertama adalah lebih kompak secara vertikal, sehingga Anda dapat memasukkan lebih banyak kode di layar Anda, dan itulah sebabnya saya lebih suka. Satu-satunya argumen yang saya dengar mendukung metode kedua adalah membuatnya lebih mudah untuk memasangkan kurung buka dan tutup, tetapi sebagian besar IDE memiliki pintasan keyboard untuk itu, dan itu sebenarnya pernyataan salah - alih-alih memasangkan braket pembuka ke penutup braket Anda dapat memasangkan braket penutup dengan ekspresi "awal blok" (jika, selain itu, untuk, sementara) pada tingkat indentasi yang sama, sehingga mudah untuk menentukan di mana awal blok.

Saya tidak melihat alasan untuk menyia-nyiakan seluruh baris hanya untuk braket ketika sebelumnya untuk / sementara / jika konstruksi sudah secara visual menunjukkan awal blok.

Yang mengatakan, saya percaya bahwa braket penutup harus berada di jalurnya sendiri karena kita perlu sesuatu untuk menunjukkan ujung blok dan struktur lekukannya dengan cara yang terlihat.


12
Tidak ... Saya katakan mengapa mengurangi jumlah kode yang dapat ditampung di layar Anda dengan melakukan sesuatu yang tidak menambah kejelasan kode?
EpsilonVector

6
Ketika saya mulai mengkode, saya menyukai setiap kurung pada barisnya sendiri, sekarang saya lebih suka metode pertama
NimChimpsky

57
Ada banyak sekali penelitian, yang akan kembali ke Zaman Uap awal (Weinberg, "Psikologi Pemrograman Komputer"), yang menunjukkan bahwa pemahaman programmer secara DRAMATICALLY ketika jumlah kode yang harus dilihat lebih dari yang bisa dilihat pada satu waktu (yaitu, satu layar penuh, satu halaman printer). Fenomena ini berargumen KUAT untuk melihat ruang vertikal sebagai sumber daya yang berharga, tidak perlu disia-siakan, dan dengan demikian metode pertama lebih disukai.
John R. Strohm

10
LOL @ "membuang-buang garis SELURUH". YA TUHAN! Tidak!! = P
Nick Spreitzer

6
@Julio Di kampus saya sangat menyukai metode 1, dan tidak tahan membaca metode 2. Setelah bekerja di perusahaan yang menggunakan C #, di mana standarnya adalah metode 2, saya juga menyukainya. Sekarang saya bisa membaca atau menggunakan; tidak ada yang menggangguku. Orang-orang yang memiliki reaksi yang sangat menentang satu sama lain umumnya bereaksi berlebihan terhadap sesuatu yang mereka tidak kenal.
KChaloux

46

aku lebih memilih

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

lebih

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

karena garis you.postAnswer();itu jauh lebih mudah dibaca dan ditemukan pada pandangan pertama. Dengan cara kedua, itu akan tercampur dengan garis di atasnya ( you.hasAnswer()) membuat mata saya harus lebih fokus untuk membacanya.


7
Ini benar sampai program Anda melebihi ketinggian layar Anda. ;)
weberc2

13
@ weberc2 Saya pikir ketika program Anda melebihi ketinggian layar, dua baris lebih sedikit tidak akan banyak berubah.
Mageek

13
10 tahun yang lalu, saya akan setuju tentang ruang layar. Hari ini, saya menggunakan layar 1920 * 1200. Ini sesuai dengan BANYAK kode, lebih dari yang bisa diproses otak saya sekaligus. Metode pertama memungkinkan saya untuk menarik kembali dan melihat berbagai pembukaan / penutupan ruang lingkup tanpa harus membacanya.
LightStriker

3
Saya tidak pernah bisa mengerti mengapa saya lebih suka metode ini, tetapi memang untuk ini.
Declan McKenna

2
@Mageek Ini sudah terlambat, tapi ini bukan 2 baris, ini 2 baris untuk setiap ruang lingkup. Itu O (N), bukan O (1). Saya sebenarnya tidak merasa begitu kuat tentang hal itu; lebih penting Anda memilih gaya yang membuat daftar parameter panjang dapat dibaca.
weberc2

38

Saya lebih suka metode pertama. Kawat gigi sama sekali tidak layak terpisah.

Masalahnya, kawat gigi itu tidak penting. Itu hanya sampah sintaksis , yang sama sekali tidak perlu untuk memahami apa tujuan kode, tujuan itu dan cara penerapannya. Mereka hanya merupakan penghormatan kepada bahasa seperti C gaya lama di mana pengelompokan visual dari operator tidak mungkin karena ruang layar yang rendah tersedia.

Ada bahasa (Python, Haskell, Ruby) yang OK tanpa kawat sama sekali. Ini hanya mengonfirmasi bahwa kawat gigi adalah sampah, dan seharusnya tidak layak menerima saluran untuk mereka bila memungkinkan:

if (you.hasAnswer()){
    you.postAnswer();
}else{
    you.doSomething();
}

7
Saya tidak tahu tentang Haskell atau Ruby, tetapi Python sensitif spasi, itulah sebabnya mengapa tidak memerlukan kawat gigi atau pembatas lainnya untuk menunjukkan blok. Kawat gigi bukan hanya kebisingan sintaksis; mereka melayani tujuan aktual.
Robert Harvey

14
@ Robert, Dalam C Anda harus melakukan keduanya spasi dan kawat gigi. Dengan Python Anda hanya harus melakukan spasi putih. Mana yang lebih baik?
P Shved

5
@Pavel, di C 'Anda tidak perlu melakukan whitepace.
Ken Bloom

7
@KenBloom C program tanpa spasi tidak mungkin dibaca. Jadi, Anda harus tetap melakukannya.
P Shved

6
Terlepas dari apakah kawat gigi adalah ide yang baik atau tidak, keberadaan bahasa yang tidak menggunakannya tidak tampak seperti argumen untuk atau menentangnya. Ini hanya menunjukkan bahwa dimungkinkan untuk memiliki bahasa tanpa mereka, bukan bahwa itu adalah desain bahasa yang baik atau buruk.
Jason

37

Gunakan Python dan hindari argumen sepenuhnya.


17
+1SyntaxError: not a chance
Seth

6
Ini sama sekali bukan pilihan untuk sebagian besar proyek. Plus, indentation-for-grouping memiliki masalah.
Bryan Oakley

@Bryan, saya menyadari bahwa ini tidak terlalu praktis. Saya hanya berpikir itu adalah sudut pandang yang perlu ada di luar sana, lebih kuat dari sekedar komentar. Dan saya tidak pernah mengalami masalah yang disebabkan oleh indentasi yang Anda maksudkan, mungkin karena saya tidak mencampur tab dan spasi.
Mark Ransom

Gunakan Pergi dan hindari argumen sepenuhnya (ditambah pengetikan statis, kecepatan, dan kompiler!) :)
weberc2

4
Kemudian tekan bilah spasi terlalu sering dan lihat kompiler / penerjemah menertawakan Anda. Itu tidak akan terjadi dalam bahasa yang paling kuat.
Pharap

28

Posisi kurung kurawal seharusnya

meta data

dapat dikonfigurasi dalam IDE oleh programmer. Dengan begitu, kawat gigi sial di semua kode, terlepas dari penulis, terlihat sama.


7
Setuju. Itu presentasi dan bukan data.
Petruza

Masalahnya adalah bahwa jika Anda membiarkan semua orang mengatur sendiri, semuanya menjadi berantakan dengan sangat cepat ketika komit dilakukan.
Andy

1
@Andy: Itulah intinya, IDE akan mengubah tampilannya, tetapi hanya di IDE! Sumber yang sebenarnya tidak akan disentuh. Untuk kontrol versi, Anda dapat menambahkan kait yang menerjemahkan pengaturan apa pun untuk kurung kurawal untuk situasi umum, sehingga semua orang memeriksa kode dengan cara yang sama.
klaar

@ klaar Setiap IDE modern yang saya gunakan akan mengubah tab untuk spasi dan memindahkan kawat ke baris mereka sendiri atau akhir dari baris "pembukaan"; Saya tidak yakin mengapa Anda berpikir sumbernya tidak tersentuh dalam kasus ini, dan itulah alasan komentar saya. Biasanya diubah oleh IDE tergantung pada pengaturan pengembang, yang berarti selama komit saya akan melihat banyak perubahan yang hanya berisik ketika kawat gigi dipindahkan ke jalur mereka sendiri, sehingga menyembunyikan perubahan SEBENARNYA yang dilakukan seseorang.
Andy

@Andy: Apakah tidak ada kemungkinan untuk menggunakan kait yang mengubah perbedaan-perbedaan tentang spasi dan kawat gigi ke standar komitmen yang seragam, untuk menghindari masalah kebisingan yang Anda jelaskan? Either way, sistem versi yang tepat harus melampaui hal-hal kecil seperti ruang kosong atau hal-hal yang tidak masuk akal lainnya.
klaar

19

Tergantung.

Jika saya mengkode dalam Javascript atau jQuery, saya menggunakan formulir pertama:

jQuery(function($) { 
    if ($ instanceOf jQuery) { 
        alert("$ is the jQuery object!"); 
    } 
}); 

Tetapi jika saya mengkode dalam C #, saya menggunakan bentuk kedua, karena itu adalah cara kanonik untuk melakukannya dalam C #.

public int CalculateAge(DateTime birthDate, DateTime now) 
{ 
    int age = now.Year - birthDate.Year; 
    if (now.Month < birthDate.Month 
        || (now.Month == birthDate.Month && now.Day < birthDate.Day)) 
        age--; 
    return age; 
} 

Perhatikan bahwa contoh Anda dapat ditulis

if (you.hasAnswer())
    you.postAnswer();
else
    you.doSomething();

dalam C #.


1
Itu dapat ditulis dalam banyak bahasa seperti itu, karena block-statement adalah pernyataan. Menambahkan! :-)
Tamara Wijsman

2
Menurut "Kerangka Desain Pedoman" "cara kanonik" adalah menempatkan brace pembuka pada baris yang sama (yaitu bentuk pertama). Katakan saja ...
Uwe Honekamp

3
@Uwe: Mungkin. Tetapi Microsoft mengadopsi pendekatan "aligned braces" untuk semua contoh MSDN C #, dan itu dimasukkan ke dalam Visual Studio, jadi ...
Robert Harvey

@Uwe: Itu buku Cwalina dan namanya sangat jauh lebih dari itu. FDG di MSDN tidak ada yang mengatakan tentang itu. Juga saya bertanya-tanya, mengapa Pedoman Kerangka Desain mengatakan sesuatu tentang praktik pengkodean C # ?
R. Martinho Fernandes

3
Anda seharusnya, sebenarnya, memasang kurung kurawal pada baris yang sama di Javascript. Anda dapat menyebabkan kesalahan jika kurung kurawal ada di jalurnya sendiri. Misalnya, lihat encosia.com/...
Joseph Hansen

18

Saya lebih suka yang pertama karena lebih sulit bagi saya untuk melihat kesalahan dalam contoh ini.

if (value > maximum);
{
    dosomething();
}

daripada dalam contoh ini

if (value > maximum); {
    dosomething();
}

The ; {hanya tampak lebih salah bagi saya daripada garis berakhir dengan ;jadi aku lebih mungkin untuk menyadarinya.


11
Anda membuat argumen yang bagus, tetapi secara pribadi, ini hanya terjadi pada saya sekali dalam 5 tahun pemrograman saya. Saya tidak tahu mengapa itu tidak dieksekusi, diposting di SO dan seseorang dengan cepat menunjukkan titik koma kepada saya. Namun, setiap kali itu kental untuk menggunakan 1 baris yang kurang, saya merasa lebih sulit untuk dibaca.
JD Isaacks

6
The "; {" terlihat seperti semacam wajah marah mengedipkan mata atau mungkin seseorang dengan kumis.
glenatron

+1 Contoh yang bagus dalam jawaban: kesalahan sangat halus, mudah diabaikan. Pikiran memprovokasi juga pada tata letak muncul ini.
therobyouknow

10
Tentu saja setiap IDE yang layak akan menandai pernyataan kontrol kosong dan setiap kompiler yang layak akan mengeluarkan peringatan.
Dunk

@Dunk Satu-satunya kelemahan dalam argumen Anda (yang saya setujui dengan penuh semangat) adalah bahwa begitu banyak orang menggunakan bahasa yang ditafsirkan hari ini (JavaScript, PHP, et al) yang banyak "programmer" tidak akan tahu kompiler dari double latte.
Craig

15

Saya lebih suka varian sedikit 1)

if (you.hasAnswer()) {
    you.postAnswer();
} // note the break here
else {
    you.doSomething();
}

Mengapa?

  • Saya pikir selalu menempatkan kawat gigi pada jalurnya sendiri mengurangi keterbacaan. Saya hanya bisa memasukkan sejumlah kode sumber pada layar saya. Gaya braket 2) membuat algoritma heave dengan banyak loop bersarang dan persyaratan lama sekali.

  • Namun, saya ingin elsememulai pada jalur baru karena ifdan elsemilik bersama, secara visual. Jika ada braket di depan else, itu jauh lebih sulit untuk menemukan milik apa.

  • 3) mendiskualifikasi dirinya sendiri. Kita semua tahu hal buruk apa yang bisa terjadi jika Anda meninggalkan tanda kurung dan melupakannya.


1
Saya telah melihat yang satu ini di sekitar tempat saya bekerja. Ini menarik.
Almo

1
Saya juga menyukai gaya ini dengan lebih baik, karena memungkinkan saya untuk memberikan komentar di atas elsegaris ketika dibutuhkan, dan / atau menempatkan garis kosong antara if-block dan the-block lain untuk membuat segala sesuatu terlihat kurang dijejalkan. Gaya braket # 2 tidak melakukan apa pun selain menjauhkan tindakan dari kondisi. Dengan itu, favorit saya jelas bukan gaya braket python :)
sayap

4
Jika memaksimalkan jumlah baris kode pada layar adalah penting, maka cukup hapus baris baru. Anda bisa mendapatkan banyak garis pada satu layar. Saya lebih suka tidak memiliki apa pun yang menyebabkan saya berhenti dan berpikir saat membaca, yaitu. definisi saya lebih mudah dibaca. Dengan kawat gigi, pikiran saya mengabaikannya. Tanpa kawat gigi, pikiran saya harus berhenti dan meluruskan blok kontrol. Bukan jeda yang panjang, tapi jeda yang tidak kalah.
Dunk

1
Ya, jika dan yang lain menjadi satu, TETAPI demikian {dan} dan karena} berada pada baris yang terpisah, {juga harus pada baris yang terpisah. "Saya hanya bisa memasukkan sejumlah kode sumber pada layar saya" Dan itulah mengapa mengatakan 3) akan "mendiskualifikasi dirinya sendiri" sama sekali bukan pilihan. Setelah satu dekade bekerja dengan 3) Saya tidak lupa menambahkan tanda kurung ketika menambahkan baris kode baru, dan saya juga tidak kenal siapa pun yang pernah memilikinya. Jika saya harus menyesuaikan kode dengan orang-orang, yang tidak bisa membaca dengan benar, di mana itu berakhir? Berhenti menggunakan fitur bahasa tertentu, karena beberapa kode pembaca mungkin tidak memahaminya?
Kaiserludi

10

Saya memang membaca di suatu tempat bahwa penulis beberapa buku ingin kode mereka diformat seperti ini:

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

Tetapi kendala ruang dari penerbit mereka berarti mereka harus menggunakan ini:

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

Sekarang saya tidak tahu apakah itu benar (karena saya tidak dapat menemukannya lagi), tetapi gaya yang terakhir sangat lazim dalam buku.

Pada tingkat pribadi saya lebih suka tanda kurung pada baris terpisah sebagai:

a) mereka menunjukkan ruang lingkup baru
b) lebih mudah dikenali ketika Anda memiliki ketidakcocokan (meskipun ini bukan masalah dalam IDE yang menyoroti kesalahan untuk Anda).


... Pilihan kedua juga memfasilitasi kedua poin Anda (dengan lekukan saja yang melayani tujuan kombo / lekukan). :)
weberc2

10

Ah, Gaya Pelindung Sejati .

Ini memiliki segalanya untuk Jalan Suci - bahkan seorang nabi (Richard "jalan saya atau jalan raya" Stallman).

Orang itu sangat salah tentang banyak hal, tetapi GNU sangat tepat dalam hal kawat gigi.


[Update] Saya telah melihat cahaya, dan sekarang menyembah Allman


9
Saya tidak melihat titik dari gaya GNU, selain itu memodelkan kode lisp. Sepertinya banyak pekerjaan untuk sedikit manfaat.
Robert Harvey

Saya tahu tidak ada orang yang menggunakan gaya GNU. 1TBS sepanjang jalan.
Jé Queue

Anda tidak dapat melakukan yang lebih buruk dari dua level indentasi per blok, kecuali untuk gaya lisp, tentu saja, itu tidak perlu dikatakan.
ergosys

4
+1 untuk tautan pada gaya brace. Ini menunjukkan bahwa apa pun gayamu, banyak orang hebat tidak setuju denganmu.
Florian F

@RobertHarvey Tidak ada pekerjaan tambahan, jika ya, Anda tidak menggunakan alat yang tepat untuk menulis kode atau tidak mengkonfigurasinya dengan benar. Keuntungannya adalah kode yang jauh lebih mudah dibaca, Anda melihat setiap kesalahan di braket sangat cepat dan Anda dapat dengan mudah membaca hanya kode dari sementara mengabaikan subblok.
12431234123412341234123

9

Contoh kedua, saya sangat besar dalam keterbacaan. Saya tidak tahan melihat apakah ada cara lain yang menghalangi = (


1
Penelitian menunjukkan bahwa lebih mudah untuk membaca kode ringkas begitu basis kode melebihi ketinggian layar.
weberc2

5
@ weberc2, bisakah Anda memberikan DOI ke makalah penelitian itu?
Grzegorz Adam Kowalski

9

Jawaban sederhana: apa yang lebih mudah di-debug?

// Case 1:
void dummyFunction() {
  for (i = 0; i != 10; ++i) {
    if (i <= 10)
      std::cout << "i is: " << i << "\n";
      std::cout << 10 - i << " steps remaining\n";

      // Some hard work here
      // which is really hard
      // and does take some screen estate
    }
    else
      std::cout << "We'll never get there";
  }
} // COMPILER ERROR HERE


// Case 2:
void dummyFunction()
{
  for (i = 0; i != 10; ++i)

    if (i <= 10)
    {
      std::cout << "i is: " << i << "\n";
      std::cout << 10 - i << " steps remaining\n";

      // Some hard work here
      // which is really hard
      // and does take some screen estate
    }
    else
      std::cout << "We'll never get there\n";
  }
} // COMPILER ERROR HERE

Dalam kasus apa Anda mendiagnosis masalah terlebih dahulu?

Saya tidak terlalu peduli dengan preferensi pribadi (ada banyak gaya lain, termasuk whitesmith dan al.) Dan saya tidak terlalu peduli ... selama itu tidak menghambat kemampuan saya membaca kode dan men - debug- nya.

Mengenai argumen "ruang pemborosan", saya tidak membelinya: Saya cenderung menambahkan garis kosong di antara grup logis untuk membuat program lebih jelas ...


1
Keduanya mudah di-debug, terutama karena itu adalah kode pendek. Indentasi konsisten sehingga memudahkan untuk memvisualisasikan blok kode yang sebenarnya.
Htbaa

@ Htbaa: memang :) Jadi mengapa repot-repot?
Matthieu M.

@ MatthieuM. Blok pertama lebih masuk akal bagi saya, karena baris baru (di blok kedua) antara tanda tangan fungsi, untuk-pernyataan dan jika-pernyataan membuat saya percaya mereka tidak terkait, tetapi jelas mereka tidak. Baris kosong adalah untuk memisahkan bit kode yang tidak terkait; kode yang dekat dengan baris kode lainnya berarti bahwa mereka terkait dengan fakta. Ini semua tentu saja 'imo', tetapi saya bertanya-tanya apa maksud Anda. EDIT: juga setiap IDE yang tepat akan melihat ada penyangga yang hilang dan memberi Anda sedikit kesalahan setelah menafsirkan kode Anda.
klaar

7

Bukan berarti siapa pun akan menyadarinya, tetapi inilah mengapa kawat gigi memiliki garis yang sama dengan kondisional (kecuali kondisional yang sangat panjang, tetapi itu merupakan kasus tepi):

Di C, ini adalah konstruk yang valid:

sementara (benar);
{
    char c;
    getchar (); // Tunggu input
}

Cepat! Apa yang dilakukan kode ini? Jika Anda menjawab "loop tak terbatas meminta input", Anda salah! Bahkan tidak sampai ke input. Itu tertangkap while(true). Perhatikan titik koma di bagian akhir. Pola ini sebenarnya lebih umum dari yang seharusnya; C mengharuskan Anda untuk mendeklarasikan variabel Anda di awal blok, itulah sebabnya variabel baru dimulai.

Garis kode adalah pemikiran. Kawat gigi adalah bagian dari pikiran yang mengandung kondisional atau loop. Karena itu, mereka termasuk dalam jalur yang sama.


Sejauh ini, ini adalah argumen terbaik untuk gaya K&R yang saya lihat, sisanya menggelikan dengan sistem IDE saat ini dengan dukungan kode lipat. Ini hanya berlaku untuk bahasa gaya C yang mendukung ;ujung blok. Ini juga mengapa saya membenci sistem akhir blok ini yang IMHO sudah ketinggalan zaman dan bahasa Go membuktikannya. Saya telah melihat masalah ini berkali-kali walaupun tidak dalam skenario ini. Ini biasanya terjadi di mana mereka berniat untuk menambahkan sesuatu ke pernyataan dan lupa.
Jeremy

5

Saya suka metode pertama. Tampaknya IMO lebih rapi, dan lebih kompak, yang saya suka.

EDIT: Ah, yang ketiga. Saya suka yang terbaik jika memungkinkan, karena bahkan lebih kecil / lebih rapi.


5

Anda bisa menulisnya:

you.hasAnswer() ? you.postAnswer() : you.doSomething();

Untuk menjawab pertanyaan; Saya dulu lebih suka kurung kurawal pada baris mereka sendiri, tetapi, untuk menghindari harus memikirkan bug dari penyisipan titik koma otomatis di browser saya mulai menggunakan gaya Mesir untuk javascript. Dan ketika mengkode java dalam gerhana saya tidak tertarik untuk bertarung (atau mengonfigurasi) gaya brace default, jadi saya menggunakan bahasa Mesir dalam hal itu juga. Sekarang saya baik-baik saja dengan keduanya.


untuk digunakan seperti itu, postAnswer()dan doSomething()harus mengembalikan nilai untuk operator ternary, yang sering tidak terjadi: mereka dapat mengembalikan dengan baik kekosongan (tidak ada nilai). dan juga (setidaknya dalam c #) hasil ?:harus ditugaskan ke beberapa variabel
ASh

4

Hampir semua tanggapan di sini mengatakan beberapa variasi pada "Apa pun yang Anda lakukan, tetap dengan satu atau dua".

Jadi saya memikirkannya sejenak, dan harus mengakui bahwa saya tidak menganggapnya penting. Adakah yang bisa dengan jujur ​​memberi tahu saya bahwa yang berikut ini sulit diikuti?

int foo(int a, Bar b) {
    int c = 0;
    while(a != c)
    {
        if(b.value[a] == c) {
            c = CONST_A;
        }
        c++;
    }
    return c;
}

Saya tidak yakin tentang orang lain ... tapi saya sama sekali tidak memiliki masalah mental bolak-balik antara gaya. Memang butuh beberapa saat bagi saya untuk mengetahui apa yang kode lakukan, tapi itulah hasil dari saya hanya mengetik sintaks seperti C secara acak. :)

Menurut pendapat saya yang tidak terlalu rendah hati, membuka kawat gigi hampir sepenuhnya tidak relevan dengan keterbacaan kode. Ada beberapa kasus sudut yang tercantum di atas di mana satu gaya atau yang lain membuat perbedaan, tetapi untuk sebagian besar, penggunaan garis kosong secara bijaksana membersihkannya.

FWIW, gaya pengkodean kami di tempat kerja menggunakan bentuk yang sedikit lebih terstruktur 1 dan bentuk yang diubah 3. (C ++)

            // blank line is required here
if (x) {
            //This blank line is required
   y = z;
}
            // blank line is required here too, unless this line is only another '}'

if (x) y = z; //allowed

if (x)
    y = z;  // forbidden

Saya ingin tahu apakah mereka yang lebih suka bentuk 2 akan menemukan versi bentuk 1 ini lebih baik, hanya karena garis kosong memberikan pemisahan visual yang lebih kuat.


4
Seperti yang ditunjukkan oleh contoh Anda, indentasi jauh lebih penting daripada kurung kurawal untuk kode yang dapat dibaca. Bahkan, beberapa bahasa membuat lekukan satu - satunya cara untuk membuat pernyataan sarang!

1
Ok, sejujurnya saya menemukan contoh yang tidak konsisten sulit untuk dibaca. Tidak BENAR-BENAR keras, tetapi lebih keras daripada jika konsisten.
Almo

Saya setuju dengan Almo. Ini bukan kasus "apakah ini benar-benar sulit". Ini adalah kasus "pasti lebih sulit", bahkan jika tidak sulit. Jadi mengapa membuat segalanya lebih sulit? Dalam contoh "mainan" yang diberikan orang tentu saja ada sedikit perbedaan. Dalam pengalaman saya, Ketika saya mewarisi kode jahat dari orang lain dan mereka menggunakan metode 1, cukup sering menjadi perlu untuk melanjutkan dan mengubahnya menjadi metode 2 hanya untuk dapat mengikuti logika. Karena kenyataan bahwa itu menjadi sering diperlukan; secara otomatis menjawab pertanyaan metode mana yang lebih baik dan lebih mudah dipahami.
Dunk

@Dunk: Saya tidak dapat memahami kode yang akan terasa lebih baik dengan menukar detail yang tidak relevan di sekitar.
jkerian

@ jkerian-Rupanya Anda belum mewarisi banyak kode dari orang lain yang telah lama meninggalkan proyek atau perusahaan. Saya tidak dapat membayangkan tidak mengalami situasi itu oleh siapa pun dengan pengalaman bertahun-tahun. Tetapi sekali lagi, situasi kerja setiap orang berbeda. Juga, jika Anda harus melakukan tinjauan kode "formal", pemformatan akan membuat perbedaan. Mampu membaca kode secara alami sangat penting. Tentu saya bisa berhenti dan berpikir untuk mencocokkan kawat gigi, tapi itu memperlambat prosesnya. Satu cara tidak memerlukan jeda, yang lain lakukan. Itu sebabnya saya tidak mengerti mengapa pilihan lain bisa direkomendasikan.
Dunk

4

Saya terkejut ini belum dinaikkan. Saya lebih suka pendekatan kedua karena memungkinkan Anda untuk memilih blok lebih mudah.

Ketika kawat gigi mulai dan berakhir pada kolom yang sama dan pada baris mereka sendiri, Anda dapat memilih dari margin atau dengan kursor pada kolom 0. Ini umumnya berjumlah daerah yang lebih murah hati dengan pilihan mouse atau lebih sedikit penekanan tombol dengan pemilihan keyboard.

Saya awalnya bekerja dengan kawat gigi pada baris yang sama dengan kondisional, tetapi ketika saya beralih saya menemukan itu mempercepat tingkat di mana saya bekerja. Ini bukan siang dan malam tentu saja, tetapi sesuatu yang akan memperlambat Anda sedikit bekerja dengan kawat gigi di samping kondisional Anda.


Penghitung waktu lama seperti saya menggunakan tiga penekanan tombol untuk memilih blok di mana pun kawat gigi sialan itu berada.
ergosys

2

Saya pribadi suka cara kedua.

Namun, cara saya akan menunjukkan menurut saya yang terbaik karena menghasilkan keamanan kerja terbesar! Seorang mahasiswa dari universitas saya meminta saya untuk membantu mengerjakan pekerjaan rumahnya dan beginilah tampilannya. Seluruh program tampak seperti satu blok tunggal. Yang menarik adalah bahwa 95% bug dalam program yang dibuatnya berasal dari kawat gigi yang tidak cocok. 5% lainnya jelas setelah kawat gigi dicocokkan.

while(1){
i=0;
printf("Enter coded text:\n");
while((s=getchar())!='\n'){
         if(i%1==0){
            start=(char*)realloc(input,(i+1)*sizeof(char));
if(start==NULL){
printf("Memory allocation failed!");
exit(1);}
input=start;}
      input[i++]=s;}
start=(char*)realloc(input,(i+1)*sizeof(char));
if(start==NULL){
printf("Memory allocation failed!!!");
exit(1);}
input=start;
input[i]='\0';
                puts(input);

8
Buruk, buruk, maksud saya contoh mengerikan, mengerikan. Masalahnya bukan kawat gigi! Ini lekukan gila!
R. Martinho Fernandes

@ Martinho Fernandes Saya pikir menempatkan kawat gigi dan lekukan berjalan bersama ...
AndrejaKo

2
belum tentu ... lakukan indentasi yang benar pada yang di atas dan kemudian secara acak mengganti brace-style, Anda akan menemukan bahwa itu dapat dimengerti.
jkerian

Sebenarnya, memikirkan hal ini memotivasi jawaban saya sendiri untuk pertanyaan ini.
jkerian

"95% bug dalam program yang dibuatnya berasal dari kawat gigi yang tidak cocok" - hanya dalam bahasa yang ditafsirkan, tidak dikompilasi.
Mawg

2

Preferensi pribadi saya adalah untuk metode pertama, mungkin karena itulah cara saya pertama kali belajar PHP.

Untuk ifpernyataan satu baris , saya akan menggunakan

if (you.hasAnswer()) you.postAnswer();

Jika bukan you.postAnswer();sesuatu tetapi lebih lama, seperti you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);saya mungkin akan kembali ke jenis pertama:

if (you.hasAnswer) {
    you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);
}

Saya tidak akan pernah menggunakan line-break, dan saya tidak akan pernah menggunakan metode ini jika ada juga elsepernyataan.

if (you.hasAnswer()) you.postAnswer();
else you.doSomething()

adalah kemungkinan teoretis, tetapi bukan yang pernah saya gunakan. Ini harus diubah menjadi

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

2

Mereka seharusnya tidak; metode pertama untukku.

Ketika saya melihat yang kedua, karena garis-garis yang tidak terpakai (yang hanya memiliki kurung kurawal, selain kurung kurawal yang terakhir), rasanya seperti merusak kesinambungan kode. Saya tidak dapat membacanya dengan cepat karena saya perlu memperhatikan baris kosong yang biasanya berarti pemisahan dalam tujuan kode atau sesuatu seperti ini, tetapi tidak ada dalam kasus "baris ini milik kurung kurawal" (yang hanya mengulangi makna dari indentasi).

Bagaimanapun, sama seperti ketika Anda menulis teks ... menambahkan lekukan pada awal paragraf adalah berlebihan jika ada baris kosong sebelum (tanda ganda dari perubahan paragraf), tidak perlu membuang garis untuk kawat gigi ketika kita indentasi dengan benar.

Plus, seperti yang sudah dinyatakan, ini memungkinkan untuk memuat lebih banyak kode di layar, yang sebaliknya sedikit kontraproduktif.


2

Itu tergantung pada platform / bahasa / konvensi

Di Jawa:

void someMethod() { 
     if (you.hasAnswer()) {
         you.postAnswer();
     } else {
       you.doSomething();
     }
}

Dalam C #

void someMethod() 
{ 
     if (you.hasAnswer()) 
     {
         you.postAnswer();
     } 
     else 
     {
       you.doSomething();
     }
}

Dalam C:

void someMethod() 
{ 
     if (you_hasAnswer()) {
         you.postAnswer();
     } else {
       you_doSomething();
     }
}

Saya benci ketika orang Jawa menggunakan gaya mereka dalam kode C # dan sebaliknya.


3
Gaya C selalu mengganggu saya. Bersikaplah konsisten!
Christian Mann

1

Yang bisa saya katakan adalah bahwa jika Anda seorang penggemar metode # 3, Anda akan dianiaya oleh setiap pemformat kode IDE di bumi.


1

Saya menggunakan metode pertama hanya karena lebih kompak dan memungkinkan lebih banyak kode di layar. Saya sendiri tidak pernah memiliki masalah dengan pemasangan kawat gigi (saya selalu menuliskannya, bersama dengan ifpernyataan sebelum menambahkan kondisi, dan sebagian besar lingkungan memungkinkan Anda untuk melompat ke penjepit yang cocok).

Jika Anda memang perlu memasangkan kawat gigi secara visual, maka saya akan memilih metode kedua. Namun itu memungkinkan lebih sedikit kode pada satu waktu yang mengharuskan Anda untuk menggulir lebih banyak. Dan itu, setidaknya bagi saya, memiliki dampak yang lebih besar pada membaca kode daripada memiliki kawat gigi yang tertata rapi. Saya benci scrolling. Kemudian lagi, jika Anda perlu menelusuri satu ifpernyataan, kemungkinan besar terlalu besar dan perlu refactoring.

Tapi; yang paling penting dari semuanya adalah konsistensi. Gunakan satu atau yang lain - tidak pernah keduanya!


0

Ketika saya pertama kali belajar pemrograman pada usia 12 tahun, saya memasang kawat gigi pada baris berikutnya karena tutorial pengkodean Microsoft seperti itu. Saya juga menjorok dengan TABS 4-ruang saat itu.

Setelah beberapa tahun, saya belajar Java dan JavaScript, dan melihat lebih banyak kode kurung pada baris yang sama, jadi saya berubah. Saya juga mulai indent dengan spasi 2 spasi.


5
+1, -1. Mengapa Anda TIDAK indentasi dengan tab karena editor mana pun dapat menyesuaikan panjang tab dengan panjang sewenang-wenang Anda? Jika tidak, Anda memimpin banyak dari kita yang menyukai indentasi sejati pada 8 untuk mengutuk kode Anda.
Jé Queue

0

Ada opsi ke-4 yang menjaga kawat gigi tetap lurus, tetapi tidak membuang-buang ruang:

if (you.hasAnswer())
{    you.postAnswer();
     i.readAnswer();
}
else
{   you.doSomething();
}

Satu-satunya masalah adalah sebagian besar autoformatt IDE mencekik ini.


9
... seperti halnya kebanyakan programmer yang akan tersedak ini.
Jé Queue

4
Itu tampak menghebohkan. Pikirkan upaya ekstra yang harus Anda lalui jika Anda ingin memasukkan garis di atas, atau menghapus garis atas. Anda tidak bisa hanya menghapus garis dan melanjutkan, Anda harus ingat untuk memasukkan kembali kurung kurawal.
Bryan Oakley

lol ini luar biasa! :) lebih baik dari gaya pertama!
nawfal

Ternyata itu bahkan punya nama. Horstman Syyle disebutkan dalam wikipedia . Saya telah bekerja dengan basis kode seperti ini, itu benar-benar tidak buruk untuk digunakan.
AShelly

-1

Itu semua tergantung pada Anda selama Anda tidak bekerja pada suatu proyek di mana beberapa kendala pengkodean atau beberapa standar telah ditetapkan oleh manajer proyek yang harus diikuti oleh semua programmer yang mengerjakan proyek tersebut saat melakukan pengkodean.

Saya pribadi lebih suka metode 1.

Juga saya tidak mendapatkan apa yang ingin Anda tunjukkan dengan metode ke-3?

Bukankah itu cara yang salah? Sebagai contoh, pertimbangkan sebuah situasi sebagai ..

if (you.hasAnswer())
  you.postAnswer();
else
  you.doSomething();

Sekarang bagaimana jika seseorang ingin menambahkan beberapa pernyataan lagi di blok if ?

Dalam hal ini jika Anda menggunakan metode ke-3, kompiler akan membuang kesalahan sintaksis.

if (you.hasAnswer())
   you.postAnswer1();
   you.postAnswer2();
else
   you.doSomething();

2
Lebih buruk lagi jika seseorang datang dan melakukannya: if (you.hasAnswer ()) you.postAnswer (); lain Anda.melakukan sesuatu (); you.doSomethingElse (); - Ini adalah resep untuk serangga halus yang mata dapat dengan mudah tergelincir dan kompiler tidak akan membantu
FinnNk

@FinnNk: Tepat!
Chankey Pathak

2
Jika seseorang ingin menambahkan pernyataan lain, mereka dapat memasang kawat gigi sendiri. Setiap programmer yang memiliki nilai garamnya harus dapat mengetahuinya.
Robert Harvey

Saya ingin mengatakan bahwa metode ke-3nya salah.
Chankey Pathak

3
@ Robert Harvey, saya telah melihat coders yang sangat berpengalaman ketinggalan menambahkan kawat gigi saat memodifikasi kode yang ada. Saya pikir masalahnya adalah bahwa lekukan adalah petunjuk yang jauh lebih kuat untuk makna daripada kawat gigi (terutama karena ada beberapa gaya penyangga,) sehingga cukup mudah untuk mengabaikan penyangga yang hilang jika lekukan seperti apa yang Anda harapkan.
AShelly
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.