K&R ve One True Brace Style (1TBS) stilleri arasındaki fark nedir?


48

Indent Styles hakkındaki Wikipedia makalesini okudum , ancak hala anlamıyorum. K&R ve 1TBS arasındaki fark nedir?


Bir yerde K&R'deki tarzın uzay düşüncelerine tabi olduğunu - yani kodun kitapta aldığı dikey alanı azaltmak için - okudum.
ChrisF

@ChrisF ayrıca ekrandaki dikey alanı da azaltır. 80 adet col x 25 hatlı terminalimiz olduğunda buna değdi!
Martin Beckett,

7
Apple'ın "goto fail" i, 1TBS kullanarak kesinlikle önlenebilecek ciddi bir hata örneğidir: imperialviolet.org/2014/02/22/applebug.html

4
Apple'ın hatası, ifadeyi tek bir satıra yerleştirerek, prova okumayı, bir ölü kod denetleyicisini kullanarak veya girintiye duyarlı bir dil kullanarak da önlenebilirdi.
Cees Timmerman

1
@CeesTimmerman, .. veya test
yaptırıyor

Yanıtlar:


76

K & R ve One True Brace Stil (1TBS) arasındaki en büyük fark 1TBS içinde, hepsi bu mu if, else, while, ve forgerekli olmasa bile, ifadeleri açılış ve kapanış diş telleri var. Amaç, yeni ifadeler eklemeyi ve tam olarak nasıl gruplandırılacağını bilmeyi kolaylaştırmaktır.

Örnek olarak:

K & R:

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

1TBS:

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

20

K & R şöyle:

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

Yani: yalnızca gerektiğinde kullanılan diş telleri, kontrol ifadesiyle aynı satırda destek açma, kendi satırında destek açma.

"Gerçek bir ayraç stili" (1TBS veya OTBS), denetimli bir ifadeyi ayraç içine alarak bileşik bir ifadeye dönüştürür:

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

Allman stili 1 TB'dan biraz daha ileri gider ve açılış ayracını bir çizgiye kendi başına yerleştirerek dikey boşluğu zorlar:

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

Düzenle:

Hala söyleyecek "kibirli" olarak nitelendirir tam olarak nasıl anlamaya çalışıyorum "Dennis Ritchie bir oldu son derece sadece iyi bir dil icat değil, aynı zamanda bunun için gerçekten iyi bir bağ stili ile geldi değil zeki çocuk."

Yine de kibirli olmak konusunda ısrar edenler için, işte size biraz zorluk: Sourceforge, Github (vb.) 'E gidin ve K&R brace stilini kullanarak projeler seçin. Hata ve taahhüt kayıtlarını inceleyin ve kullandıkları ayraç stilinin neden olduğu tek bir hata bulmaya çalışın .

Bu kadar iş yapmak istemiyorsanız, basit bir istatistiksel analiz yapmayı deneyin. Farklı ayraç stilleri kullanarak projeleri karşılaştırın ve "çiftçilik" gösterip gösteremeyeceğinizi görün - böcek sayma stilinde (önem derecesi vb.) Destekleme stiliyle ilişkilendirilen istatistiksel olarak önemli bir fark.

Bunların her ikisini de birkaç yıl önce yaptım ve canlandırıcı stillere atfettiğim tek bir hata bulamadım ya da ikisi arasında istatistiksel olarak anlamlı bir korelasyona yaklaşan bir şey bulamadım. Ortalama olarak, kullananlara K & R takviye biraz daha az hata vardı, ancak aradaki fark çok anlamlı olarak tanımlanamayacak kadar küçük.

Bu ortaya çıktığından beri, çok-durumlu makroların bulunduğu durum hakkında yorum yapacağım. Birden fazla ifade içeren ancak bunları parantez içine almayan bir makroda bir hata vardır. Benim işim o hatayı kapsayan bir kod yazmak değil . Aksine, benim işim bu hatayı olabildiğince çabuk bulmak ve ortadan kaldırmak.

Kodlama hatalarını ümit etmek umuduyla, teşhis edilmeden kalmaları ve düzeltilmemeleri, düpedüz kötülüktür. İsterseniz o kibirli olarak adlandırın, ancak bunu pazarlığa yakın bile görmüyorum. Hatalar örtülmemeli, bulunmalı ve düzeltilmelidir. Var olan ne kadar uzun olursa, düzeltilmesi çok daha zor ve pahalı hale gelecektir.


1
Tüm yorumları, çekişme ve gürültüye inerken olduğu gibi sildi. Geçerli bir puanınız varsa, cevap olarak gönderin. Bir tartışma isterseniz sohbete
katılın

8
1 tbs} ve başkasını bir satıra koymaz mı? Muhteşem güzel simetriyi koruyarak dikey alandan tasarruf etmektir!
Martin Beckett

4
@Jerry - Her iyi kutsal savaşın birkaç mekanizmaya ihtiyacı vardır ;-)
Martin Beckett

6
goto başarısız; goto başarısız;
Jamie Pate

9
@ JamiePate'in burada incelenen Apple SSL hatası olan yorumunu takip etmek için Evet . ifOndan sonra girintili ifadelere sahip bir ifade var, bu yüzden her ikisinin de şartlı olarak yürütüldüğü görülüyor. Ama hiç parantez yok! İkinci ifade, gerçekte ötesindedir ifve daima çalıştırılacaktır, böylelikle böcek.
Colin D Bennett,

9

Genel olarak KR brace stiliyle ilgili sorun kod yeniden düzenleme şeklindedir. Bir kod etrafında hareket ettirildiğinde, bir şeyin etrafında hiç parantez bulunmadığını kaçırmak kolaydır, yanlış hareket ettirin (veya koşullu olarak yürütüldüğünü düşünerek bir şeyi hareket ettirin) ve sonra artık bir şey çalışmadığında kafanızı çizin ya da talihsiz olun ve olun. iyi test edilmemiş bir kod alanı ve siyah şapka onu kullanmanın bir yolunu bulana kadar hata fark edilmeden gider. Hata ayıklayıcısına hızlı bir yolculuk, onu fark ederseniz kolayca sorunu bulur, ancak bunu yapmazsanız ...


2
bu sadece önceki cevaplarda yapılan ve açıklanan noktayı tekrar ediyor gibi görünüyor
gnat

1
Diğer cevapların problemin günlük kodda nasıl ortaya çıktığını tam olarak açıkladığını sanmıyorum. OTB'nin ne olduğunu açıklar, ancak neden önemli olduğunu değil. Yorumlar buna cevap verebilir ama cevapları değil.
Justin Swanhart
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.