it-swarm-id.com

Haruskah kurung kurawal muncul di jalurnya sendiri?

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, mendukungnya dengan fakta dan referensi.

284
Tamara Wijsman

Ketika saya masih mahasiswa saya biasa memasang kurung kurawal pada baris yang sama, sehingga ada lebih sedikit garis, dan kode akan dicetak pada halaman yang lebih sedikit. 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, jadilah konsisten sehingga tidak menjadi overhead bagi otak Anda sendiri untuk memproses beberapa 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.

90
dbza

Anda seharusnya tidak pernah melakukan metode ketiga.

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.

251
rhettg

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

Menjadi konsisten adalah penting, meskipun. 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 bekerja pada 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 ini, 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.

Edit: Dua alternatif untuk solusi 'garis ekstra kosong' 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
}

/ Edit

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

206
Jay Bazuzi

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 dengan kejam.

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 peluang bagus bahwa Anda akan menyesalinya dalam beberapa tahun.

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

103
Stephen C

Manfaat dari metode pertama adalah lebih ringkas 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 membuang 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 dalam garisnya sendiri karena kita perlu sesuatu untuk menunjukkan ujung blok dan struktur lekukannya dengan cara yang terlihat.

72
EpsilonVector

Saya lebih memilih

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

lebih

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

karena baris you.postAnswer(); 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.

49
JD Isaacks

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

Masalahnya, kawat gigi itu tidak penting. Mereka hanya tempat sampah sintaksis, yang sama sekali tidak perlu untuk memahami untuk apa kode, untuk 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();
}
39
P Shved

Gunakan Python dan menghindari argumen sepenuhnya.

37
Mark Ransom

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.

28
Jonathan

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();
}

; { hanya terlihat lebih salah bagi saya daripada garis yang diakhiri dengan ; jadi saya lebih cenderung memperhatikannya.

19
bmb

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 #.

19
Robert Harvey

Saya lebih suka varian sedikit 1)

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

Mengapa?

  • Saya pikir selal menempatkan kawat gigi di jalur mereka 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 else untuk memulai pada baris baru karena if dan else milik bersama, secara visual. Jika ada braket di depan else, akan jauh lebih sulit untuk menemukan apa yang menjadi milik.

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

15

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).

10
ChrisF

Ah, the One True Brace Style .

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 tepat ketika datang ke kawat gigi.


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

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 debug itu.

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

9
Matthieu M.

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

9
Bryan Harrington

Bukan berarti siapa pun akan menyadarinya, tetapi inilah mengapa kawat gigi termasuk dalam baris yang sama sebagai kondisional (kecuali untuk kondisional yang sangat panjang, tetapi itulah kasus Edge):

Di C, ini adalah konstruk yang valid:

 while (true); 
 {
 char c; 
 getchar (); // Tunggu input 
} 

Cepat! Apa yang dilakukan kode ini? Jika Anda menjawab "loop tak terbatas meminta input", Anda salah! Bahkan tidak mendapatkan input. Itu tertangkap di 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. Karenanya, mereka termasuk dalam baris yang sama.

8
Christian Mann

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 ini bahkan lebih kecil/lebih rapi.

5
Ullallulloo

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 di Eclipse saya tidak tertarik untuk bertarung (atau mengkonfigurasi) gaya penyangga standar, jadi saya menggunakan bahasa Mesir dalam hal itu juga. Sekarang saya baik-baik saja dengan keduanya.

5
FeatureCreep

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 benar-benar 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 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 dimodifikasi 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
jkerian

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 garis 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 sebelah kondisional Anda.

4
Tim O'Neil

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

Untuk pernyataan if baris tunggal, saya akan menggunakan

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

Jika bukan you.postAnswer(); tetapi sesuatu yang jauh lebih lama, seperti you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType); Saya mungkin akan kembali ke tipe 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 pernyataan else.

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
TRiG

Saya pribadi suka cara kedua.

Namun, cara saya akan menunjukkan menurut saya yang terbaik karena menghasilkan keamanan kerja terbesar! Seorang rekan mahasiswa dari universitas saya meminta bantuan kepada saya untuk mengerjakan pekerjaan rumahnya dan seperti inilah bentuk kodenya. 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);
2
AndrejaKo

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 kelanjutan 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 telah dinyatakan, memungkinkan untuk memuat lebih banyak kode di layar, yang sebaliknya sedikit kontraproduktif.

2
Joanis

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 Java orang menggunakan gaya mereka dalam kode C # dan sebaliknya.

2
OscarRyz

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 pernyataan if sebelum menambahkan kondisinya, dan sebagian besar lingkungan memungkinkan Anda untuk melompat ke penjepit yang cocok).

Jika Anda melakukan 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 menggulir satu pernyataan if, itu kemungkinan besar terlalu besar dan perlu refactoring.

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

1
gablin

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

1
Phil Cohen

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.

0
AShelly

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).

0
Ming-Tang