Apa perbedaan antara gaya K&R dan One True Brace Style (1TBS)?

48

Saya telah membaca artikel Wikipedia tentang Indent Styles , tetapi saya masih tidak mengerti. Apa perbedaan antara K&R dan 1TBS?

GavinR
sumber
Saya membaca di suatu tempat bahwa gaya dalam K&R diatur oleh pertimbangan ruang - yaitu untuk mengurangi ruang vertikal yang digunakan kode dalam buku.
ChrisF
@ ChrisF juga mengurangi ruang vertikal di layar. Ketika kami memiliki terminal baris 80 col x 25, itu sangat berharga!
Martin Beckett
7
"Goto fail" Apple adalah contoh yang bagus dari bug serius yang pasti dapat dicegah dengan menggunakan 1TBS: imperialviolet.org/2014/02/22/applebug.html
4
Bug Apple juga bisa dicegah dengan meletakkan pernyataan pada satu baris, proofreading, menggunakan pemeriksa kode mati, atau menggunakan bahasa indent-sensitif.
Cees Timmerman
1
@CeesTimmerman, .. atau menjalani tes ...
thoni56

Jawaban:

76

Perbedaan terbesar antara K & R dan Benar Brace Style One (1TBS) adalah bahwa dalam 1TBS, semua if, else, while, dan forpernyataan memiliki membuka dan menutup kawat gigi, bahkan jika mereka tidak diperlukan. Tujuannya adalah untuk memudahkan memasukkan pernyataan baru dan tahu persis bagaimana mereka akan dikelompokkan.

Sebagai contoh:

K&R:

int i;
for (i = 0; i < 10; i++)
  printf("Hi.");

1TBS:

int i;
for (i = 0; i < 10; i++) {
  printf("Hi");
}
Thomas Owens
sumber
20

K&R seperti ini:

if (x) 
    a();
else {
    b();
    c();
}

Yaitu: kawat gigi yang hanya digunakan jika diperlukan, membuka brace pada baris yang sama dengan pernyataan kontrol, menutup brace pada jalurnya sendiri.

"One true brace style" (1TBS atau OTBS) mengubah pernyataan terkontrol tunggal menjadi pernyataan majemuk dengan melampirkannya dalam kurung:

if (x) {
    a();
} else {
    b();
    c();
}

Gaya Allman sedikit lebih jauh dari 1TBS, dan memaksa spasi vertikal dengan menempatkan brace pembuka pada sebuah garis dengan sendirinya juga:

if (x) 
{
    a();
}
else 
{
    b();
    c();
}

Sunting:

Saya masih mencoba mencari tahu persis bagaimana itu memenuhi syarat sebagai "sombong" untuk mengatakan "Dennis Ritchie adalah orang yang sangat cerdas yang tidak hanya menemukan bahasa yang baik, tetapi juga muncul dengan gaya penjepit yang sangat bagus untuk itu."

Bagi mereka yang bersikeras bahwa itu sombong, inilah tantangan kecil: pergi ke Sourceforge, Github (dll) dan memilih proyek menggunakan gaya penjepit K&R. Telusuri catatan bug dan komitmen mereka, dan cobalah untuk menemukan satu bug yang disebabkan oleh gaya kurung yang mereka gunakan.

Jika Anda tidak ingin melakukan banyak pekerjaan, coba lakukan analisis statistik sederhana. Bandingkan proyek-proyek yang menggunakan gaya penyangga yang berbeda, dan lihat apakah Anda dapat menunjukkan "bimodality" - perbedaan yang signifikan secara statistik dalam jumlah bug (keparahan, dll.) Yang berkorelasi dengan gaya penyangga.

Saya melakukan keduanya ini beberapa tahun yang lalu, dan tidak dapat menemukan satu bug pun yang dapat saya kaitkan dengan gaya menguatkan, saya juga tidak dapat menemukan apa pun yang mendekati korelasi yang signifikan secara statistik antara keduanya. Rata-rata, mereka yang menggunakan K & R bracing memiliki sedikit lebih sedikit bug, tapi perbedaan itu jauh terlalu kecil untuk memenuhi syarat sebagai signifikan secara statistik.

Sejak itu muncul, saya akan mengomentari situasi dengan makro multi-pernyataan. Makro yang mencakup beberapa pernyataan tetapi tidak mengelilinginya dengan kawat gigi itu sendiri, memiliki bug. Pekerjaan saya bukanlah menulis kode yang menutupi bug itu. Justru sebaliknya, tugas saya adalah menemukan dan memberantas bug itu secepat mungkin.

Menulis kode dengan harapan menutupi bug sehingga mereka tetap tidak terdiagnosis dan tidak diperbaiki benar-benar jahat. Sebut itu sombong jika Anda suka, tapi saya tidak melihat ini sebagai hampir bisa dinegosiasikan. Bug harus ditemukan dan diperbaiki, tidak ditutup-tutupi. Semakin lama ada, semakin besar kemungkinan mereka akan menjadi jauh lebih sulit dan mahal untuk diperbaiki.

Jerry Coffin
sumber
1
Menghapus semua komentar seperti yang telah terjadi pertengkaran dan kebisingan. Jika Anda memiliki poin yang valid maka posting sebagai jawaban. Jika Anda ingin diskusi, bawa ke obrolan
ChrisF
8
bukankah 1tbs meletakkan} dan yang lainnya pada satu baris? Menghemat ruang vertikal sambil mempertahankan simetri indah yang menakjubkan adalah intinya!
Martin Beckett
4
@ Jerry - yah perang suci yang baik membutuhkan beberapa perpecahan ;-)
Martin Beckett
6
gagal; gagal;
Jamie Pate
9
Ya untuk menindaklanjuti komentar @ JamiePate yang merupakan bug SSL Apple yang dianalisis di sini . Ada ifpernyataan dengan pernyataan lekukan setelahnya, sehingga tampak bahwa keduanya dieksekusi secara kondisional. Tapi tidak ada kawat gigi! Pernyataan kedua benar-benar di luar ifdan akan selalu dieksekusi, dengan demikian bug.
Colin D Bennett
9

Masalahnya, secara umum dengan gaya penjepit KR adalah dalam kode refactoring. Ketika memindahkan kode di sekitar itu mudah untuk dilewatkan bahwa tidak ada kawat gigi di sekitar sesuatu, pindahkan salah (atau pindahkan sesuatu di bawahnya dengan berpikir bahwa itu dijalankan secara kondisional) dan kemudian garuk-garuk kepala Anda ketika sesuatu tidak lagi berfungsi, atau disayangkan dan berada di area kode tidak diuji dengan baik dan bug tidak diketahui sampai topi hitam menemukan cara untuk mengeksploitasinya. Perjalanan cepat ke debugger dengan mudah menemukan masalah jika Anda menyadarinya, tetapi jika Anda tidak ...

Justin Swanhart
sumber
2
ini sepertinya hanya mengulangi poin yang dibuat dan dijelaskan dalam jawaban sebelumnya
nyamuk
1
Saya tidak berpikir jawaban lain menjelaskan dengan tepat bagaimana masalah muncul dalam kode sehari-hari. Mereka menjelaskan apa itu OTB, tetapi bukan mengapa itu sebenarnya penting. Komentar mungkin membahas itu, tetapi bukan jawabannya.
Justin Swanhart